[U-Boot] itest: Add bitwise and operator

Submitted by Eric Nelson on May 3, 2013, 6:47 p.m.

Details

Message ID 1367606863-14846-1-git-send-email-eric.nelson@boundarydevices.com
State Rejected
Delegated to: Wolfgang Denk
Headers show

Commit Message

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(-)

Comments

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 hide | download patch | download mbox

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; ...