Patchwork [U-Boot] itest: Add bitwise and operator

login
register
mail settings
Submitter Eric Nelson
Date May 3, 2013, 6:47 p.m.
Message ID <1367606863-14846-1-git-send-email-eric.nelson@boundarydevices.com>
Download mbox | patch
Permalink /patch/241367/
State Rejected
Delegated to: Wolfgang Denk
Headers show

Comments

Eric Nelson - May 3, 2013, 6:47 p.m.
Signed-off-by: Eric Nelson <eric.nelson@boundarydevices.com>
---
 common/cmd_itest.c        |    4 ++++
 doc/README.commands.itest |   10 +++++++++-
 2 files changed, 13 insertions(+), 1 deletion(-)
Wolfgang Denk - May 3, 2013, 7:08 p.m.
Dear Eric Nelson,

In message <1367606863-14846-1-git-send-email-eric.nelson@boundarydevices.com> you wrote:
> Signed-off-by: Eric Nelson <eric.nelson@boundarydevices.com>
> ---
>  common/cmd_itest.c        |    4 ++++
>  doc/README.commands.itest |   10 +++++++++-
>  2 files changed, 13 insertions(+), 1 deletion(-)
> 
> diff --git a/common/cmd_itest.c b/common/cmd_itest.c
> index 2c8e5d0..0629b09 100644
> --- a/common/cmd_itest.c
> +++ b/common/cmd_itest.c
> @@ -38,6 +38,7 @@
>  #define GT	3
>  #define LE	4
>  #define GE	5
> +#define AND	6

It does not make much sense to me to add AND, when you not also add
OR (and eventually XOR).

Also, now the help message is no longer correct - it says:

189 U_BOOT_CMD(
190         itest, 4, 0, do_itest,
191         "return true/false on integer compare",
192         "[.b, .w, .l, .s] [*]value1 <op> [*]value2"
193 );

but we no longer compare...


Hm, re-reading this I think this is the wrong approach.  This stuff
does not belong into the "itest" command which really is for
comparing, and NOT for operations on the arguments.

If you need operations, then please use "setexpr" - which already has
all of this, and more.

Best regards,

Wolfgang Denk
Eric Nelson - May 3, 2013, 7:22 p.m.
Hi Wolfgang,

On 05/03/2013 12:08 PM, Wolfgang Denk wrote:
> Dear Eric Nelson,
>
> In message <1367606863-14846-1-git-send-email-eric.nelson@boundarydevices.com> you wrote:
>> Signed-off-by: Eric Nelson <eric.nelson@boundarydevices.com>
>> ---
>>   common/cmd_itest.c        |    4 ++++
>>   doc/README.commands.itest |   10 +++++++++-
>>   2 files changed, 13 insertions(+), 1 deletion(-)
>>
>> diff --git a/common/cmd_itest.c b/common/cmd_itest.c
>> index 2c8e5d0..0629b09 100644
>> --- a/common/cmd_itest.c
>> +++ b/common/cmd_itest.c
>> @@ -38,6 +38,7 @@
>>   #define GT	3
>>   #define LE	4
>>   #define GE	5
>> +#define AND	6
>
> It does not make much sense to me to add AND, when you not also add
> OR (and eventually XOR).
>

I only needed to test a bit.

> Also, now the help message is no longer correct - it says:
>
> 189 U_BOOT_CMD(
> 190         itest, 4, 0, do_itest,
> 191         "return true/false on integer compare",
> 192         "[.b, .w, .l, .s] [*]value1 <op> [*]value2"
> 193 );
>
> but we no longer compare...
>
> Hm, re-reading this I think this is the wrong approach.  This stuff
> does not belong into the "itest" command which really is for
> comparing, and NOT for operations on the arguments.
>
> If you need operations, then please use "setexpr" - which already has
> all of this, and more.
>

As always, thanks for the guidance.

I hadn't noticed that setexpr supported indirection.

In case this helps someone else, I was looking for
a way to detect Android "recovery" mode, which is
flagged by bit seven in the SRC_GPR10 register
(address 0x020d8044).

And setexpr can be used like so:

	U-Boot > md.l 0x020d8044
	020d8044: 00000080                               ....
	U-Boot > setexpr rval *0x020D8044 \& 0x80
	U-Boot > print rval
	rval=80
	U-Boot > setexpr rval *0x020D8044 \& 0x40
	U-Boot > print rval
	rval=0

Regards,


Eric

Patch

diff --git a/common/cmd_itest.c b/common/cmd_itest.c
index 2c8e5d0..0629b09 100644
--- a/common/cmd_itest.c
+++ b/common/cmd_itest.c
@@ -38,6 +38,7 @@ 
 #define GT	3
 #define LE	4
 #define GE	5
+#define AND	6
 
 struct op_tbl_s {
 	char	*op;		/* operator string */
@@ -60,6 +61,8 @@  static const op_tbl_t op_table [] = {
 	{ ">=" , GE },
 	{ "-le", LE },
 	{ "<=" , LE },
+	{ "-and", AND },
+	{ "&" , AND },
 };
 
 static long evalexp(char *s, int w)
@@ -126,6 +129,7 @@  static int arithcomp (char *s, char *t, int op, int w)
 	case GT: return (l > r);
 	case LE: return (l <= r);
 	case GE: return (l >= r);
+	case AND: return (l & r);
 	}
 	return (0);
 }
diff --git a/doc/README.commands.itest b/doc/README.commands.itest
index 5e0fe86..0058155 100644
--- a/doc/README.commands.itest
+++ b/doc/README.commands.itest
@@ -2,7 +2,7 @@  A slow day today so here is a revised itest command with provisional
 support for comparing strings as well :-))
 
 Now table driven to allow the operators
--eq, -ne, -lt, -gt, -le, -ge, ==, !=, <>, <, >, <=, >=
+-eq, -ne, -lt, -gt, -le, -ge, -and, ==, !=, <>, <, >, <=, >=, &
 
 Uses the expected command modifier for integer compares of width 1, 2 or
 4 bytes of .b, .w, .l and the new modifer of .s for a string compare.
@@ -14,3 +14,11 @@  if itest.l *40000 == 12345678 then; ....
 if itest.w *40000 != 1234 then; ....
 if itest.b *40000 >= 12 then; ....
 if itest.s *40000 -eq hello then; ....
+
+Note that "&" (-and) operator only operates on integers and
+that the '&' will need to be quoted.
+
+e.g.:
+	if itest.l 0x80 '&' *0x020D8044 then; ...
+or
+	if itest.l 0x80 -and *0x020D8044 then; ...