* [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 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
* [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
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.