diff mbox series

[v2,05/14] test: lib: add initjmp() test

Message ID 6eb03993def0d868874fa3fca05e1d08ddc6afd6.1740499185.git.jerome.forissier@linaro.org
State New
Headers show
Series Uthreads | expand

Commit Message

Jerome Forissier Feb. 25, 2025, 4:34 p.m. UTC
Test the initjmp() function when HAVE_INITJMP is set.

Signed-off-by: Jerome Forissier <jerome.forissier@linaro.org>
---
 test/lib/Makefile  |  1 +
 test/lib/initjmp.c | 72 ++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 73 insertions(+)
 create mode 100644 test/lib/initjmp.c

Comments

Ilias Apalodimas Feb. 28, 2025, 12:38 p.m. UTC | #1
On Tue, 25 Feb 2025 at 18:35, Jerome Forissier
<jerome.forissier@linaro.org> wrote:
>
> Test the initjmp() function when HAVE_INITJMP is set.
>
> Signed-off-by: Jerome Forissier <jerome.forissier@linaro.org>
> ---
>  test/lib/Makefile  |  1 +
>  test/lib/initjmp.c | 72 ++++++++++++++++++++++++++++++++++++++++++++++
>  2 files changed, 73 insertions(+)
>  create mode 100644 test/lib/initjmp.c
>
> diff --git a/test/lib/Makefile b/test/lib/Makefile
> index 0e4cb8e3dfd..bf04685dae1 100644
> --- a/test/lib/Makefile
> +++ b/test/lib/Makefile
> @@ -14,6 +14,7 @@ obj-y += hexdump.o
>  obj-$(CONFIG_SANDBOX) += kconfig.o
>  obj-y += lmb.o
>  obj-$(CONFIG_HAVE_SETJMP) += longjmp.o
> +obj-$(CONFIG_HAVE_INITJMP) += initjmp.o
>  obj-$(CONFIG_CONSOLE_RECORD) += test_print.o
>  obj-$(CONFIG_SSCANF) += sscanf.o
>  obj-$(CONFIG_$(PHASE_)STRTO) += str.o
> diff --git a/test/lib/initjmp.c b/test/lib/initjmp.c
> new file mode 100644
> index 00000000000..52bbda8cc60
> --- /dev/null
> +++ b/test/lib/initjmp.c
> @@ -0,0 +1,72 @@
> +// SPDX-License-Identifier: GPL-2.0+
> +/*
> + * Copyright 2025 Linaro Limited
> + *
> + * Unit test for initjmp()
> + */
> +
> +#include <compiler.h>
> +#include <asm/setjmp.h>
> +#include <stdbool.h>
> +#include <test/lib.h>
> +#include <test/ut.h>
> +#include <vsprintf.h>
> +
> +static bool ep_entered;
> +static jmp_buf return_buf;
> +
> +static void __noreturn entrypoint(void)
> +{
> +       ep_entered = true;
> +
> +       /* Jump back to the main routine */
> +       longjmp(return_buf, 1);
> +
> +       /* Not reached */
> +       panic("longjmp failed\n");
> +}
> +
> +static int lib_initjmp(struct unit_test_state *uts)
> +{
> +       int ret;
> +       void *stack;
> +       jmp_buf buf;
> +       int stack_sz = 1024;
> +
> +       ep_entered = false;
> +
> +       stack = malloc(stack_sz);
> +       ut_assertnonnull(stack);
> +
> +       ut_assert(!ep_entered);
> +
> +       /*
> +        * Prepare return_buf so that entrypoint may jump back just after the
> +        * if()
> +        */
> +       if (!setjmp(return_buf)) {
> +               /* return_buf initialized, entrypoint not yet called */
> +
> +               /*
> +                * Prepare another jump buffer to jump into entrypoint with the
> +                * given stack
> +                */
> +               ret = initjmp(buf, entrypoint, stack + stack_sz);
> +               ut_assertok(ret);
> +
> +               /* Jump into entrypoint */
> +               longjmp(buf, 1);
> +               /*
> +                * Not reached since entrypoint is expected to branch after
> +                * the if()
> +                */
> +               ut_assert(false);
> +       }
> +
> +       ut_assert(ep_entered);
> +
> +       free(stack);
> +
> +       return 0;
> +}
> +LIB_TEST(lib_initjmp, 0);
> --
> 2.43.0
>

Reviewed-by: Ilias Apalodimas <ilias.apalodimas@linaro.org>
Heinrich Schuchardt Feb. 28, 2025, 1:04 p.m. UTC | #2
On 25.02.25 17:34, Jerome Forissier wrote:
> Test the initjmp() function when HAVE_INITJMP is set.
>
> Signed-off-by: Jerome Forissier <jerome.forissier@linaro.org>
> ---
>   test/lib/Makefile  |  1 +
>   test/lib/initjmp.c | 72 ++++++++++++++++++++++++++++++++++++++++++++++
>   2 files changed, 73 insertions(+)
>   create mode 100644 test/lib/initjmp.c
>
> diff --git a/test/lib/Makefile b/test/lib/Makefile
> index 0e4cb8e3dfd..bf04685dae1 100644
> --- a/test/lib/Makefile
> +++ b/test/lib/Makefile
> @@ -14,6 +14,7 @@ obj-y += hexdump.o
>   obj-$(CONFIG_SANDBOX) += kconfig.o
>   obj-y += lmb.o
>   obj-$(CONFIG_HAVE_SETJMP) += longjmp.o
> +obj-$(CONFIG_HAVE_INITJMP) += initjmp.o
>   obj-$(CONFIG_CONSOLE_RECORD) += test_print.o
>   obj-$(CONFIG_SSCANF) += sscanf.o
>   obj-$(CONFIG_$(PHASE_)STRTO) += str.o
> diff --git a/test/lib/initjmp.c b/test/lib/initjmp.c
> new file mode 100644
> index 00000000000..52bbda8cc60
> --- /dev/null
> +++ b/test/lib/initjmp.c
> @@ -0,0 +1,72 @@
> +// SPDX-License-Identifier: GPL-2.0+

GPL-2.0-or-later

Best regards

Heinrich

> +/*
> + * Copyright 2025 Linaro Limited
> + *
> + * Unit test for initjmp()
> + */
> +
> +#include <compiler.h>
> +#include <asm/setjmp.h>
> +#include <stdbool.h>
> +#include <test/lib.h>
> +#include <test/ut.h>
> +#include <vsprintf.h>
> +
> +static bool ep_entered;
> +static jmp_buf return_buf;
> +
> +static void __noreturn entrypoint(void)
> +{
> +	ep_entered = true;
> +
> +	/* Jump back to the main routine */
> +	longjmp(return_buf, 1);
> +
> +	/* Not reached */
> +	panic("longjmp failed\n");
> +}
> +
> +static int lib_initjmp(struct unit_test_state *uts)
> +{
> +	int ret;
> +	void *stack;
> +	jmp_buf buf;
> +	int stack_sz = 1024;
> +
> +	ep_entered = false;
> +
> +	stack = malloc(stack_sz);
> +	ut_assertnonnull(stack);
> +
> +	ut_assert(!ep_entered);
> +
> +	/*
> +	 * Prepare return_buf so that entrypoint may jump back just after the
> +	 * if()
> +	 */
> +	if (!setjmp(return_buf)) {
> +		/* return_buf initialized, entrypoint not yet called */
> +
> +		/*
> +		 * Prepare another jump buffer to jump into entrypoint with the
> +		 * given stack
> +		 */
> +		ret = initjmp(buf, entrypoint, stack + stack_sz);
> +		ut_assertok(ret);
> +
> +		/* Jump into entrypoint */
> +		longjmp(buf, 1);
> +		/*
> +		 * Not reached since entrypoint is expected to branch after
> +		 * the if()
> +		 */
> +		ut_assert(false);
> +	}
> +
> +	ut_assert(ep_entered);
> +
> +	free(stack);
> +
> +	return 0;
> +}
> +LIB_TEST(lib_initjmp, 0);
Jerome Forissier Feb. 28, 2025, 1:09 p.m. UTC | #3
On 2/28/25 14:04, Heinrich Schuchardt wrote:
> On 25.02.25 17:34, Jerome Forissier wrote:
>> Test the initjmp() function when HAVE_INITJMP is set.
>>
>> Signed-off-by: Jerome Forissier <jerome.forissier@linaro.org>
>> ---
>>   test/lib/Makefile  |  1 +
>>   test/lib/initjmp.c | 72 ++++++++++++++++++++++++++++++++++++++++++++++
>>   2 files changed, 73 insertions(+)
>>   create mode 100644 test/lib/initjmp.c
>>
>> diff --git a/test/lib/Makefile b/test/lib/Makefile
>> index 0e4cb8e3dfd..bf04685dae1 100644
>> --- a/test/lib/Makefile
>> +++ b/test/lib/Makefile
>> @@ -14,6 +14,7 @@ obj-y += hexdump.o
>>   obj-$(CONFIG_SANDBOX) += kconfig.o
>>   obj-y += lmb.o
>>   obj-$(CONFIG_HAVE_SETJMP) += longjmp.o
>> +obj-$(CONFIG_HAVE_INITJMP) += initjmp.o
>>   obj-$(CONFIG_CONSOLE_RECORD) += test_print.o
>>   obj-$(CONFIG_SSCANF) += sscanf.o
>>   obj-$(CONFIG_$(PHASE_)STRTO) += str.o
>> diff --git a/test/lib/initjmp.c b/test/lib/initjmp.c
>> new file mode 100644
>> index 00000000000..52bbda8cc60
>> --- /dev/null
>> +++ b/test/lib/initjmp.c
>> @@ -0,0 +1,72 @@
>> +// SPDX-License-Identifier: GPL-2.0+
> 
> GPL-2.0-or-later

Ack.

Thanks,
diff mbox series

Patch

diff --git a/test/lib/Makefile b/test/lib/Makefile
index 0e4cb8e3dfd..bf04685dae1 100644
--- a/test/lib/Makefile
+++ b/test/lib/Makefile
@@ -14,6 +14,7 @@  obj-y += hexdump.o
 obj-$(CONFIG_SANDBOX) += kconfig.o
 obj-y += lmb.o
 obj-$(CONFIG_HAVE_SETJMP) += longjmp.o
+obj-$(CONFIG_HAVE_INITJMP) += initjmp.o
 obj-$(CONFIG_CONSOLE_RECORD) += test_print.o
 obj-$(CONFIG_SSCANF) += sscanf.o
 obj-$(CONFIG_$(PHASE_)STRTO) += str.o
diff --git a/test/lib/initjmp.c b/test/lib/initjmp.c
new file mode 100644
index 00000000000..52bbda8cc60
--- /dev/null
+++ b/test/lib/initjmp.c
@@ -0,0 +1,72 @@ 
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright 2025 Linaro Limited
+ *
+ * Unit test for initjmp()
+ */
+
+#include <compiler.h>
+#include <asm/setjmp.h>
+#include <stdbool.h>
+#include <test/lib.h>
+#include <test/ut.h>
+#include <vsprintf.h>
+
+static bool ep_entered;
+static jmp_buf return_buf;
+
+static void __noreturn entrypoint(void)
+{
+	ep_entered = true;
+
+	/* Jump back to the main routine */
+	longjmp(return_buf, 1);
+
+	/* Not reached */
+	panic("longjmp failed\n");
+}
+
+static int lib_initjmp(struct unit_test_state *uts)
+{
+	int ret;
+	void *stack;
+	jmp_buf buf;
+	int stack_sz = 1024;
+
+	ep_entered = false;
+
+	stack = malloc(stack_sz);
+	ut_assertnonnull(stack);
+
+	ut_assert(!ep_entered);
+
+	/*
+	 * Prepare return_buf so that entrypoint may jump back just after the
+	 * if()
+	 */
+	if (!setjmp(return_buf)) {
+		/* return_buf initialized, entrypoint not yet called */
+
+		/*
+		 * Prepare another jump buffer to jump into entrypoint with the
+		 * given stack
+		 */
+		ret = initjmp(buf, entrypoint, stack + stack_sz);
+		ut_assertok(ret);
+
+		/* Jump into entrypoint */
+		longjmp(buf, 1);
+		/*
+		 * Not reached since entrypoint is expected to branch after
+		 * the if()
+		 */
+		ut_assert(false);
+	}
+
+	ut_assert(ep_entered);
+
+	free(stack);
+
+	return 0;
+}
+LIB_TEST(lib_initjmp, 0);