diff mbox series

[V3] selftests/x86: Fix error: variably modified 'altstack_data' at file scope

Message ID 20210824024358.4183342-1-jun.miao@windriver.com
State New
Headers show
Series [V3] selftests/x86: Fix error: variably modified 'altstack_data' at file scope | expand

Commit Message

Jun Miao Aug. 24, 2021, 2:43 a.m. UTC
Based on glibc 2.33 -> 2.34, there is one new feature:

NEWS for version 2.34

Comments

Jun Miao Sept. 2, 2021, 8:45 a.m. UTC | #1
Hi all,

What about this patch?

Thanks
Jun


On 8/24/21 10:43 AM, Jun Miao wrote:
> Based on glibc 2.33 -> 2.34, there is one new feature:

>

> NEWS for version 2.34

> =====================

> Major new features:

>   * Add _SC_MINSIGSTKSZ and _SC_SIGSTKSZ.  When _DYNAMIC_STACK_SIZE_SOURCE

>     or _GNU_SOURCE are defined, MINSIGSTKSZ and SIGSTKSZ are no longer

>     constant on Linux.  MINSIGSTKSZ is redefined to sysconf(_SC_MINSIGSTKSZ)

>     and SIGSTKSZ is redefined to sysconf (_SC_SIGSTKSZ).  This supports

>     dynamic sized register sets for modern architectural features like

>     Arm SVE.

> =====================

>

> If _SC_SIGSTKSZ_SOURCE or _GNU_SOURCE are defined, MINSIGSTKSZ and SIGSTKSZ

> are redefined as:

>

> /* Default stack size for a signal handler: sysconf (SC_SIGSTKSZ).  */

>   # undef SIGSTKSZ

>   # define SIGSTKSZ sysconf (_SC_SIGSTKSZ)

>

> /* Minimum stack size for a signal handler: SIGSTKSZ.  */

>   # undef MINSIGSTKSZ

>   # define MINSIGSTKSZ SIGSTKSZ

>

> Compilation will fail if the source assumes constant MINSIGSTKSZ or

> SIGSTKSZ.

>

> Build error with the GNU C Library 2.34:

> DEBUG:	| sigreturn.c:150:13: error: variably modified 'altstack_data' at file scope

> | sigreturn.c:150:13: error: variably modified 'altstack_data' at file scope

> DEBUG:	|   150 | static char altstack_data[SIGSTKSZ];

> |   150 | static char altstack_data[SIGSTKSZ];

> DEBUG:	|       |             ^~~~~~~~~~~~~

>

> DEBUG:  | single_step_syscall.c:60:22: error: variably modified 'altstack_data' at file scope

> DEBUG:  |   60 | static unsigned char altstack_data[SIGSTKSZ];

> DEBUG:  |      |                      ^~~~~~~~~~~~~

>

> Link: https://sourceware.org/pipermail/libc-alpha/2021-January/121996.html

> Link: https://sourceware.org/pipermail/libc-alpha/2021-August/129718.html

> Suggested-by: Jianwei Hu <jianwei.hu@windriver.com>

> Signed-off-by: Jun Miao <jun.miao@windriver.com>

> ---

>   tools/testing/selftests/x86/mov_ss_trap.c         | 4 ++--

>   tools/testing/selftests/x86/sigreturn.c           | 7 +++----

>   tools/testing/selftests/x86/single_step_syscall.c | 4 ++--

>   tools/testing/selftests/x86/syscall_arg_fault.c   | 7 +++----

>   4 files changed, 10 insertions(+), 12 deletions(-)

>

> diff --git a/tools/testing/selftests/x86/mov_ss_trap.c b/tools/testing/selftests/x86/mov_ss_trap.c

> index 6da0ac3f0135..cc3de6ff9fba 100644

> --- a/tools/testing/selftests/x86/mov_ss_trap.c

> +++ b/tools/testing/selftests/x86/mov_ss_trap.c

> @@ -47,7 +47,6 @@

>   unsigned short ss;

>   extern unsigned char breakpoint_insn[];

>   sigjmp_buf jmpbuf;

> -static unsigned char altstack_data[SIGSTKSZ];

>   

>   static void enable_watchpoint(void)

>   {

> @@ -250,13 +249,14 @@ int main()

>   	if (sigsetjmp(jmpbuf, 1) == 0) {

>   		printf("[RUN]\tMOV SS; SYSENTER\n");

>   		stack_t stack = {

> -			.ss_sp = altstack_data,

> +			.ss_sp = malloc(sizeof(char) * SIGSTKSZ),

>   			.ss_size = SIGSTKSZ,

>   		};

>   		if (sigaltstack(&stack, NULL) != 0)

>   			err(1, "sigaltstack");

>   		sethandler(SIGSEGV, handle_and_longjmp, SA_RESETHAND | SA_ONSTACK);

>   		nr = SYS_getpid;

> +		free(stack.ss_sp);

>   		/* Clear EBP first to make sure we segfault cleanly. */

>   		asm volatile ("xorl %%ebp, %%ebp; mov %[ss], %%ss; SYSENTER" : "+a" (nr)

>   			      : [ss] "m" (ss) : "flags", "rcx"

> diff --git a/tools/testing/selftests/x86/sigreturn.c b/tools/testing/selftests/x86/sigreturn.c

> index 57c4f67f16ef..5d7961a5f7f6 100644

> --- a/tools/testing/selftests/x86/sigreturn.c

> +++ b/tools/testing/selftests/x86/sigreturn.c

> @@ -138,9 +138,6 @@ static unsigned short LDT3(int idx)

>   	return (idx << 3) | 7;

>   }

>   

> -/* Our sigaltstack scratch space. */

> -static char altstack_data[SIGSTKSZ];

> -

>   static void sethandler(int sig, void (*handler)(int, siginfo_t *, void *),

>   		       int flags)

>   {

> @@ -771,7 +768,8 @@ int main()

>   	setup_ldt();

>   

>   	stack_t stack = {

> -		.ss_sp = altstack_data,

> +		/* Our sigaltstack scratch space. */

> +		.ss_sp = malloc(sizeof(char) * SIGSTKSZ),

>   		.ss_size = SIGSTKSZ,

>   	};

>   	if (sigaltstack(&stack, NULL) != 0)

> @@ -872,5 +870,6 @@ int main()

>   	total_nerrs += test_nonstrict_ss();

>   #endif

>   

> +	free(stack.ss_sp);

>   	return total_nerrs ? 1 : 0;

>   }

> diff --git a/tools/testing/selftests/x86/single_step_syscall.c b/tools/testing/selftests/x86/single_step_syscall.c

> index 120ac741fe44..9a30f443e928 100644

> --- a/tools/testing/selftests/x86/single_step_syscall.c

> +++ b/tools/testing/selftests/x86/single_step_syscall.c

> @@ -57,7 +57,6 @@ static void clearhandler(int sig)

>   

>   static volatile sig_atomic_t sig_traps, sig_eflags;

>   sigjmp_buf jmpbuf;

> -static unsigned char altstack_data[SIGSTKSZ];

>   

>   #ifdef __x86_64__

>   # define REG_IP REG_RIP

> @@ -210,7 +209,7 @@ int main()

>   		unsigned long nr = SYS_getpid;

>   		printf("[RUN]\tSet TF and check SYSENTER\n");

>   		stack_t stack = {

> -			.ss_sp = altstack_data,

> +			.ss_sp = malloc(sizeof(char) * SIGSTKSZ),

>   			.ss_size = SIGSTKSZ,

>   		};

>   		if (sigaltstack(&stack, NULL) != 0)

> @@ -219,6 +218,7 @@ int main()

>   			   SA_RESETHAND | SA_ONSTACK);

>   		sethandler(SIGILL, print_and_longjmp, SA_RESETHAND);

>   		set_eflags(get_eflags() | X86_EFLAGS_TF);

> +		free(stack.ss_sp);

>   		/* Clear EBP first to make sure we segfault cleanly. */

>   		asm volatile ("xorl %%ebp, %%ebp; SYSENTER" : "+a" (nr) :: "flags", "rcx"

>   #ifdef __x86_64__

> diff --git a/tools/testing/selftests/x86/syscall_arg_fault.c b/tools/testing/selftests/x86/syscall_arg_fault.c

> index bff474b5efc6..461fa41a4d02 100644

> --- a/tools/testing/selftests/x86/syscall_arg_fault.c

> +++ b/tools/testing/selftests/x86/syscall_arg_fault.c

> @@ -17,9 +17,6 @@

>   

>   #include "helpers.h"

>   

> -/* Our sigaltstack scratch space. */

> -static unsigned char altstack_data[SIGSTKSZ];

> -

>   static void sethandler(int sig, void (*handler)(int, siginfo_t *, void *),

>   		       int flags)

>   {

> @@ -104,7 +101,8 @@ static void sigill(int sig, siginfo_t *info, void *ctx_void)

>   int main()

>   {

>   	stack_t stack = {

> -		.ss_sp = altstack_data,

> +		/* Our sigaltstack scratch space. */

> +		.ss_sp = malloc(sizeof(char) * SIGSTKSZ),

>   		.ss_size = SIGSTKSZ,

>   	};

>   	if (sigaltstack(&stack, NULL) != 0)

> @@ -233,5 +231,6 @@ int main()

>   	set_eflags(get_eflags() & ~X86_EFLAGS_TF);

>   #endif

>   

> +	free(stack.ss_sp);

>   	return 0;

>   }
Shuah Khan Sept. 2, 2021, 9:05 p.m. UTC | #2
On 9/2/21 2:45 AM, Jun Miao wrote:
> Hi all,

> 

> What about this patch?

> 

> Thanks

> Jun

> 

> 

> On 8/24/21 10:43 AM, Jun Miao wrote:

>> Based on glibc 2.33 -> 2.34, there is one new feature:

>>


Please don't top post.

It is applied to linux-kselftest next for Linux 5.15-rc1

https://git.kernel.org/pub/scm/linux/kernel/git/shuah/linux-kselftest.git/log/?h=next

thanks,
-- Shuah
diff mbox series

Patch

=====================
Major new features:
 * Add _SC_MINSIGSTKSZ and _SC_SIGSTKSZ.  When _DYNAMIC_STACK_SIZE_SOURCE
   or _GNU_SOURCE are defined, MINSIGSTKSZ and SIGSTKSZ are no longer
   constant on Linux.  MINSIGSTKSZ is redefined to sysconf(_SC_MINSIGSTKSZ)
   and SIGSTKSZ is redefined to sysconf (_SC_SIGSTKSZ).  This supports
   dynamic sized register sets for modern architectural features like
   Arm SVE.
=====================

If _SC_SIGSTKSZ_SOURCE or _GNU_SOURCE are defined, MINSIGSTKSZ and SIGSTKSZ
are redefined as:

/* Default stack size for a signal handler: sysconf (SC_SIGSTKSZ).  */
 # undef SIGSTKSZ
 # define SIGSTKSZ sysconf (_SC_SIGSTKSZ)

/* Minimum stack size for a signal handler: SIGSTKSZ.  */
 # undef MINSIGSTKSZ
 # define MINSIGSTKSZ SIGSTKSZ

Compilation will fail if the source assumes constant MINSIGSTKSZ or
SIGSTKSZ.

Build error with the GNU C Library 2.34:
DEBUG:	| sigreturn.c:150:13: error: variably modified 'altstack_data' at file scope
| sigreturn.c:150:13: error: variably modified 'altstack_data' at file scope
DEBUG:	|   150 | static char altstack_data[SIGSTKSZ];
|   150 | static char altstack_data[SIGSTKSZ];
DEBUG:	|       |             ^~~~~~~~~~~~~

DEBUG:  | single_step_syscall.c:60:22: error: variably modified 'altstack_data' at file scope
DEBUG:  |   60 | static unsigned char altstack_data[SIGSTKSZ];
DEBUG:  |      |                      ^~~~~~~~~~~~~

Link: https://sourceware.org/pipermail/libc-alpha/2021-January/121996.html
Link: https://sourceware.org/pipermail/libc-alpha/2021-August/129718.html
Suggested-by: Jianwei Hu <jianwei.hu@windriver.com>
Signed-off-by: Jun Miao <jun.miao@windriver.com>
---
 tools/testing/selftests/x86/mov_ss_trap.c         | 4 ++--
 tools/testing/selftests/x86/sigreturn.c           | 7 +++----
 tools/testing/selftests/x86/single_step_syscall.c | 4 ++--
 tools/testing/selftests/x86/syscall_arg_fault.c   | 7 +++----
 4 files changed, 10 insertions(+), 12 deletions(-)

diff --git a/tools/testing/selftests/x86/mov_ss_trap.c b/tools/testing/selftests/x86/mov_ss_trap.c
index 6da0ac3f0135..cc3de6ff9fba 100644
--- a/tools/testing/selftests/x86/mov_ss_trap.c
+++ b/tools/testing/selftests/x86/mov_ss_trap.c
@@ -47,7 +47,6 @@ 
 unsigned short ss;
 extern unsigned char breakpoint_insn[];
 sigjmp_buf jmpbuf;
-static unsigned char altstack_data[SIGSTKSZ];
 
 static void enable_watchpoint(void)
 {
@@ -250,13 +249,14 @@  int main()
 	if (sigsetjmp(jmpbuf, 1) == 0) {
 		printf("[RUN]\tMOV SS; SYSENTER\n");
 		stack_t stack = {
-			.ss_sp = altstack_data,
+			.ss_sp = malloc(sizeof(char) * SIGSTKSZ),
 			.ss_size = SIGSTKSZ,
 		};
 		if (sigaltstack(&stack, NULL) != 0)
 			err(1, "sigaltstack");
 		sethandler(SIGSEGV, handle_and_longjmp, SA_RESETHAND | SA_ONSTACK);
 		nr = SYS_getpid;
+		free(stack.ss_sp);
 		/* Clear EBP first to make sure we segfault cleanly. */
 		asm volatile ("xorl %%ebp, %%ebp; mov %[ss], %%ss; SYSENTER" : "+a" (nr)
 			      : [ss] "m" (ss) : "flags", "rcx"
diff --git a/tools/testing/selftests/x86/sigreturn.c b/tools/testing/selftests/x86/sigreturn.c
index 57c4f67f16ef..5d7961a5f7f6 100644
--- a/tools/testing/selftests/x86/sigreturn.c
+++ b/tools/testing/selftests/x86/sigreturn.c
@@ -138,9 +138,6 @@  static unsigned short LDT3(int idx)
 	return (idx << 3) | 7;
 }
 
-/* Our sigaltstack scratch space. */
-static char altstack_data[SIGSTKSZ];
-
 static void sethandler(int sig, void (*handler)(int, siginfo_t *, void *),
 		       int flags)
 {
@@ -771,7 +768,8 @@  int main()
 	setup_ldt();
 
 	stack_t stack = {
-		.ss_sp = altstack_data,
+		/* Our sigaltstack scratch space. */
+		.ss_sp = malloc(sizeof(char) * SIGSTKSZ),
 		.ss_size = SIGSTKSZ,
 	};
 	if (sigaltstack(&stack, NULL) != 0)
@@ -872,5 +870,6 @@  int main()
 	total_nerrs += test_nonstrict_ss();
 #endif
 
+	free(stack.ss_sp);
 	return total_nerrs ? 1 : 0;
 }
diff --git a/tools/testing/selftests/x86/single_step_syscall.c b/tools/testing/selftests/x86/single_step_syscall.c
index 120ac741fe44..9a30f443e928 100644
--- a/tools/testing/selftests/x86/single_step_syscall.c
+++ b/tools/testing/selftests/x86/single_step_syscall.c
@@ -57,7 +57,6 @@  static void clearhandler(int sig)
 
 static volatile sig_atomic_t sig_traps, sig_eflags;
 sigjmp_buf jmpbuf;
-static unsigned char altstack_data[SIGSTKSZ];
 
 #ifdef __x86_64__
 # define REG_IP REG_RIP
@@ -210,7 +209,7 @@  int main()
 		unsigned long nr = SYS_getpid;
 		printf("[RUN]\tSet TF and check SYSENTER\n");
 		stack_t stack = {
-			.ss_sp = altstack_data,
+			.ss_sp = malloc(sizeof(char) * SIGSTKSZ),
 			.ss_size = SIGSTKSZ,
 		};
 		if (sigaltstack(&stack, NULL) != 0)
@@ -219,6 +218,7 @@  int main()
 			   SA_RESETHAND | SA_ONSTACK);
 		sethandler(SIGILL, print_and_longjmp, SA_RESETHAND);
 		set_eflags(get_eflags() | X86_EFLAGS_TF);
+		free(stack.ss_sp);
 		/* Clear EBP first to make sure we segfault cleanly. */
 		asm volatile ("xorl %%ebp, %%ebp; SYSENTER" : "+a" (nr) :: "flags", "rcx"
 #ifdef __x86_64__
diff --git a/tools/testing/selftests/x86/syscall_arg_fault.c b/tools/testing/selftests/x86/syscall_arg_fault.c
index bff474b5efc6..461fa41a4d02 100644
--- a/tools/testing/selftests/x86/syscall_arg_fault.c
+++ b/tools/testing/selftests/x86/syscall_arg_fault.c
@@ -17,9 +17,6 @@ 
 
 #include "helpers.h"
 
-/* Our sigaltstack scratch space. */
-static unsigned char altstack_data[SIGSTKSZ];
-
 static void sethandler(int sig, void (*handler)(int, siginfo_t *, void *),
 		       int flags)
 {
@@ -104,7 +101,8 @@  static void sigill(int sig, siginfo_t *info, void *ctx_void)
 int main()
 {
 	stack_t stack = {
-		.ss_sp = altstack_data,
+		/* Our sigaltstack scratch space. */
+		.ss_sp = malloc(sizeof(char) * SIGSTKSZ),
 		.ss_size = SIGSTKSZ,
 	};
 	if (sigaltstack(&stack, NULL) != 0)
@@ -233,5 +231,6 @@  int main()
 	set_eflags(get_eflags() & ~X86_EFLAGS_TF);
 #endif
 
+	free(stack.ss_sp);
 	return 0;
 }