summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWolfram Sang <w.sang@pengutronix.de>2011-06-03 09:32:56 +0000
committerWolfram Sang <w.sang@pengutronix.de>2011-06-03 09:32:56 +0000
commit0407136054a26e2636ae2875313aa5fd884a93af (patch)
tree2220869e99ac0ac97083cbe96bd7ca79263db76f
parent209736af44aa332a8f62ecfb86b9786d58b9044c (diff)
downloadmemedit-0407136054a26e2636ae2875313aa5fd884a93af.tar.gz
memedit-0407136054a26e2636ae2875313aa5fd884a93af.tar.xz
memedit: add mf (memory fill) function
Signed-off-by: Wolfram Sang <w.sang@pengutronix.de>
-rw-r--r--memedit.l6
-rw-r--r--memedit.y33
2 files changed, 38 insertions, 1 deletions
diff --git a/memedit.l b/memedit.l
index 0cbe02e..7cbcf32 100644
--- a/memedit.l
+++ b/memedit.l
@@ -117,7 +117,7 @@ printenv {
return ENV;
}
-m[dm](\.[biw])* {
+m[dmf](\.[biw])* {
if (strlen (yytext) == 2) yylval.val = 4;
else switch (*(yytext + 3)) {
case 'b': yylval.val = 1; break;
@@ -129,6 +129,10 @@ m[dm](\.[biw])* {
if (debug > 4) printf ("MD %ld-bit\n",yylval.val*8);
return MD;
}
+ else if (*(yytext + 1) == 'f') {
+ if (debug > 4) printf ("MF %ld-bit\n",yylval.val*8);
+ return MF;
+ }
else {
if (debug > 4) printf ("MM %ld-bit\n",yylval.val*8);
return MM;
diff --git a/memedit.y b/memedit.y
index fd52d63..61f242a 100644
--- a/memedit.y
+++ b/memedit.y
@@ -35,6 +35,7 @@ variable *vlist;
void set_variable (char *param, int val);
int get_variable (char *param);
int hex_output (unsigned long offset, unsigned long len, unsigned long count);
+int fill_mem (int offset, int len, int count, int val);
void print_help (void);
extern void yyerror (const char *s);
@@ -66,6 +67,7 @@ char *tptr;
%left <val> UNMAP
%left <val> MD
%left <val> MM
+%left <val> MF
%left <val> EQ
%left <val> AT
%token <val> EXIT
@@ -192,6 +194,12 @@ mem: MD {
else
printf ("no region mapped\n");
}
+ | MF num num num {
+ if (mem)
+ fill_mem($2, $1, $3, $4);
+ else
+ printf ("no region mapped\n");
+ }
| MM { printf ("mm <offset> <value1> [<value2> ...]\n"); }
| mm exp
;
@@ -253,6 +261,7 @@ void print_help (void) {
printf ("md [[@]<start> [<length>]] mem display from current position\n");
printf (" or from <start> for <length>\n");
printf ("mm <offset> <val1> .. <valN> modify from value <offset>\n");
+ printf ("mf <start> <length> <value> fill from <offset> for <length> with <value>\n");
printf ("env print all currently defined variables\n");
printf ("<var> = <expr> set variable <var> to <expr>\n");
printf ("<var> print variable <var>\n");
@@ -390,6 +399,30 @@ int hex_output (unsigned long offset, unsigned long len, unsigned long count) {
}
}
+int fill_mem (int offset, int len, int count, int val) {
+
+ int i;
+
+ for (i = offset; i < offset + count; i += len) {
+ switch (len) {
+ case 1:
+ val &= 0xff;
+ *(volatile unsigned char *)(mem + i) = val;
+ break;
+ case 2:
+ val &= 0xffff;
+ *(volatile unsigned short *)(mem + i) = val;
+ break;
+ case 4:
+ *(volatile unsigned long *)(mem + i) = val;
+ break;
+ }
+
+ }
+
+ return 0;
+}
+
int yylex (void) {
in_line++;
return zzlex ();