All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/2] riscv: simply longjmp()
@ 2021-03-21 10:19 Heinrich Schuchardt
  2021-03-21 10:19 ` [PATCH 1/2] riscv: simply longjmp Heinrich Schuchardt
  2021-03-21 10:19 ` [PATCH 2/2] test: unit test for longjmp Heinrich Schuchardt
  0 siblings, 2 replies; 5+ messages in thread
From: Heinrich Schuchardt @ 2021-03-21 10:19 UTC (permalink / raw)
  To: u-boot

The implementation of longjmp() is simplified.
A unit test for longjmp() is provided.

For testing use

    CONFIG_UNIT_TEST=y
    CONFIG_CMD_SETEXPR=n

and execute

    ut lib

Heinrich Schuchardt (2):
  riscv: simply longjmp
  test: unit test for longjmp

 arch/riscv/lib/setjmp.S |  8 ++------
 test/lib/Makefile       |  1 +
 test/lib/longjmp.c      | 45 +++++++++++++++++++++++++++++++++++++++++
 3 files changed, 48 insertions(+), 6 deletions(-)
 create mode 100644 test/lib/longjmp.c

--
2.30.2

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH 1/2] riscv: simply longjmp
  2021-03-21 10:19 [PATCH 0/2] riscv: simply longjmp() Heinrich Schuchardt
@ 2021-03-21 10:19 ` Heinrich Schuchardt
  2021-03-22  4:56   ` Sean Anderson
  2021-03-21 10:19 ` [PATCH 2/2] test: unit test for longjmp Heinrich Schuchardt
  1 sibling, 1 reply; 5+ messages in thread
From: Heinrich Schuchardt @ 2021-03-21 10:19 UTC (permalink / raw)
  To: u-boot

The value returned by setjmp must be nonzero. If zero is passed as
parameter it must be replaced by 1.

This patch reduces the code size a bit.

Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
---
 arch/riscv/lib/setjmp.S | 8 ++------
 1 file changed, 2 insertions(+), 6 deletions(-)

diff --git a/arch/riscv/lib/setjmp.S b/arch/riscv/lib/setjmp.S
index 72bc9241f6..99d6195827 100644
--- a/arch/riscv/lib/setjmp.S
+++ b/arch/riscv/lib/setjmp.S
@@ -54,12 +54,8 @@ ENTRY(longjmp)
 	LOAD_IDX(sp, 13)

 	/* Move the return value in place, but return 1 if passed 0. */
-	beq a1, zero, longjmp_1
-	mv a0, a1
-	ret
-
-	longjmp_1:
-	li a0, 1
+	seqz a0, a1
+	add a0, a0, a1
 	ret
 ENDPROC(longjmp)
 .popsection
--
2.30.2

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [PATCH 2/2] test: unit test for longjmp
  2021-03-21 10:19 [PATCH 0/2] riscv: simply longjmp() Heinrich Schuchardt
  2021-03-21 10:19 ` [PATCH 1/2] riscv: simply longjmp Heinrich Schuchardt
@ 2021-03-21 10:19 ` Heinrich Schuchardt
  1 sibling, 0 replies; 5+ messages in thread
From: Heinrich Schuchardt @ 2021-03-21 10:19 UTC (permalink / raw)
  To: u-boot

Provide a unit test for the longjmp() library function

Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
---
 test/lib/Makefile  |  1 +
 test/lib/longjmp.c | 44 ++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 45 insertions(+)
 create mode 100644 test/lib/longjmp.c

diff --git a/test/lib/Makefile b/test/lib/Makefile
index 97c11e35a8..a30f615aa9 100644
--- a/test/lib/Makefile
+++ b/test/lib/Makefile
@@ -7,6 +7,7 @@ obj-$(CONFIG_EFI_LOADER) += efi_device_path.o
 obj-$(CONFIG_EFI_SECURE_BOOT) += efi_image_region.o
 obj-y += hexdump.o
 obj-y += lmb.o
+obj-y += longjmp.o
 obj-$(CONFIG_CONSOLE_RECORD) += test_print.o
 obj-$(CONFIG_SSCANF) += sscanf.o
 obj-y += string.o
diff --git a/test/lib/longjmp.c b/test/lib/longjmp.c
new file mode 100644
index 0000000000..7571540ffc
--- /dev/null
+++ b/test/lib/longjmp.c
@@ -0,0 +1,44 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Test setjmp(), longjmp()
+ *
+ * Copyright (c) 2021, Heinrich Schuchardt <xypron.glpk@gmx.de>
+ */
+
+#include <common.h>
+#include <test/lib.h>
+#include <test/test.h>
+#include <test/ut.h>
+#include <asm/setjmp.h>
+
+/**
+ * test_longjmp_ret() - get longjmp() return value
+ *
+ * @i:		value passed to longjmp()
+ * Return:	value returned by longjmp()
+ */
+int test_longjmp_ret(int i)
+{
+	jmp_buf env;
+	int ret;
+
+	ret = setjmp(env);
+	if (ret)
+		return ret;
+	longjmp(env, i);
+	/* We should not arrive here */
+	return 0x1000;
+}
+
+static int lib_test_longjmp(struct unit_test_state *uts)
+{
+	int i;
+
+	for (i = -3; i < 0; ++i)
+		ut_asserteq(i, test_longjmp_ret(i));
+	ut_asserteq(1, test_longjmp_ret(0));
+	for (i = 1; i < 4; ++i)
+		ut_asserteq(i, test_longjmp_ret(i));
+	return 0;
+}
+LIB_TEST(lib_test_longjmp, 0);
--
2.30.2

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [PATCH 1/2] riscv: simply longjmp
  2021-03-21 10:19 ` [PATCH 1/2] riscv: simply longjmp Heinrich Schuchardt
@ 2021-03-22  4:56   ` Sean Anderson
  2021-03-22 10:03     ` Heinrich Schuchardt
  0 siblings, 1 reply; 5+ messages in thread
From: Sean Anderson @ 2021-03-22  4:56 UTC (permalink / raw)
  To: u-boot

On 3/21/21 6:19 AM, Heinrich Schuchardt wrote:
> The value returned by setjmp must be nonzero. If zero is passed as
> parameter it must be replaced by 1.
> 
> This patch reduces the code size a bit.
> 
> Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
> ---
>   arch/riscv/lib/setjmp.S | 8 ++------
>   1 file changed, 2 insertions(+), 6 deletions(-)
> 
> diff --git a/arch/riscv/lib/setjmp.S b/arch/riscv/lib/setjmp.S
> index 72bc9241f6..99d6195827 100644
> --- a/arch/riscv/lib/setjmp.S
> +++ b/arch/riscv/lib/setjmp.S
> @@ -54,12 +54,8 @@ ENTRY(longjmp)
>   	LOAD_IDX(sp, 13)
> 
>   	/* Move the return value in place, but return 1 if passed 0. */
> -	beq a1, zero, longjmp_1
> -	mv a0, a1
> -	ret
> -
> -	longjmp_1:
> -	li a0, 1
> +	seqz a0, a1
> +	add a0, a0, a1
>   	ret
>   ENDPROC(longjmp)
>   .popsection
> --
> 2.30.2
> 

Reviewed-by: Sean Anderson <seanga2@gmail.com>

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH 1/2] riscv: simply longjmp
  2021-03-22  4:56   ` Sean Anderson
@ 2021-03-22 10:03     ` Heinrich Schuchardt
  0 siblings, 0 replies; 5+ messages in thread
From: Heinrich Schuchardt @ 2021-03-22 10:03 UTC (permalink / raw)
  To: u-boot

On 22.03.21 05:56, Sean Anderson wrote:
> On 3/21/21 6:19 AM, Heinrich Schuchardt wrote:
>> The value returned by setjmp must be nonzero. If zero is passed as
>> parameter it must be replaced by 1.
>>
>> This patch reduces the code size a bit.
>>
>> Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
>> ---
>> ? arch/riscv/lib/setjmp.S | 8 ++------
>> ? 1 file changed, 2 insertions(+), 6 deletions(-)
>>
>> diff --git a/arch/riscv/lib/setjmp.S b/arch/riscv/lib/setjmp.S
>> index 72bc9241f6..99d6195827 100644
>> --- a/arch/riscv/lib/setjmp.S
>> +++ b/arch/riscv/lib/setjmp.S
>> @@ -54,12 +54,8 @@ ENTRY(longjmp)
>> ????? LOAD_IDX(sp, 13)
>>
>> ????? /* Move the return value in place, but return 1 if passed 0. */
>> -??? beq a1, zero, longjmp_1
>> -??? mv a0, a1
>> -??? ret
>> -
>> -??? longjmp_1:
>> -??? li a0, 1
>> +??? seqz a0, a1
>> +??? add a0, a0, a1
>> ????? ret
>> ? ENDPROC(longjmp)
>> ? .popsection
>> --
>> 2.30.2
>>
>
> Reviewed-by: Sean Anderson <seanga2@gmail.com>

The title should be corrected to "Simplify longjmp".

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2021-03-22 10:03 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-03-21 10:19 [PATCH 0/2] riscv: simply longjmp() Heinrich Schuchardt
2021-03-21 10:19 ` [PATCH 1/2] riscv: simply longjmp Heinrich Schuchardt
2021-03-22  4:56   ` Sean Anderson
2021-03-22 10:03     ` Heinrich Schuchardt
2021-03-21 10:19 ` [PATCH 2/2] test: unit test for longjmp Heinrich Schuchardt

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.