public inbox for linux-kselftest@vger.kernel.org
 help / color / mirror / Atom feed
From: Jun Miao <jun.miao@windriver.com>
To: shuah@kernel.org, skhan@linuxfoundation.org
Cc: linux-kselftest@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [V3][PATCH] selftests/x86: Fix error: variably modified 'altstack_data' at file scope
Date: Thu, 2 Sep 2021 16:45:11 +0800	[thread overview]
Message-ID: <09fb52ee-3041-991a-0277-ff01eef2643f@windriver.com> (raw)
In-Reply-To: <20210824024358.4183342-1-jun.miao@windriver.com>

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

  reply	other threads:[~2021-09-02  8:45 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-08-24  2:43 [V3][PATCH] selftests/x86: Fix error: variably modified 'altstack_data' at file scope Jun Miao
2021-09-02  8:45 ` Jun Miao [this message]
2021-09-02 21:05   ` Shuah Khan

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=09fb52ee-3041-991a-0277-ff01eef2643f@windriver.com \
    --to=jun.miao@windriver.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-kselftest@vger.kernel.org \
    --cc=shuah@kernel.org \
    --cc=skhan@linuxfoundation.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox