On 8/13/2014 7:31 AM, Riku Voipio wrote: > On Tue, Aug 12, 2014 at 01:53:40PM -0500, Tom Musta wrote: >> The ELF V2 ABI for PPC64 defines MINSIGSTKSZ as 4096 bytes whereas it was >> 2048 previously. > > fails to build - need to make get_ppc64_abi a properly exported function. >
Riku: Sorry about this. There is already a patch in Alex's ppc-next tree (but not yet pulled into mainline) that does this: http://lists.nongnu.org/archive/html/qemu-devel/2014-06/msg07225.html I will republish V3 with this patch included. >> Signed-off-by: Tom Musta <tommu...@gmail.com> >> --- >> V2: Define and use TARGET_MINSIGSTKSZ constants from the various >> linux-user/$ARCH/syscall.h files (per Peter Maydell's review). >> >> There is still a runtime check for PPC64 since the stack size changes >> in ELF V2. >> >> linux-user/aarch64/syscall.h | 1 + >> linux-user/alpha/syscall.h | 1 + >> linux-user/arm/syscall.h | 2 ++ >> linux-user/cris/syscall.h | 1 + >> linux-user/i386/syscall.h | 1 + >> linux-user/m68k/syscall.h | 2 ++ >> linux-user/microblaze/syscall.h | 1 + >> linux-user/mips/syscall.h | 1 + >> linux-user/mips64/syscall.h | 1 + >> linux-user/openrisc/syscall.h | 2 ++ >> linux-user/ppc/syscall.h | 2 ++ >> linux-user/s390x/syscall.h | 1 + >> linux-user/sh4/syscall.h | 2 ++ >> linux-user/signal.c | 12 +++++++++++- >> linux-user/sparc/syscall.h | 1 + >> linux-user/sparc64/syscall.h | 1 + >> linux-user/unicore32/syscall.h | 2 ++ >> linux-user/x86_64/syscall.h | 1 + >> 18 files changed, 34 insertions(+), 1 deletions(-) >> >> diff --git a/linux-user/aarch64/syscall.h b/linux-user/aarch64/syscall.h >> index 18f44a8..d1f4823 100644 >> --- a/linux-user/aarch64/syscall.h >> +++ b/linux-user/aarch64/syscall.h >> @@ -8,3 +8,4 @@ struct target_pt_regs { >> #define UNAME_MACHINE "aarch64" >> #define UNAME_MINIMUM_RELEASE "3.8.0" >> #define TARGET_CLONE_BACKWARDS >> +#define TARGET_MINSIGSTKSZ 2048 >> diff --git a/linux-user/alpha/syscall.h b/linux-user/alpha/syscall.h >> index ed13d9a..3adedeb 100644 >> --- a/linux-user/alpha/syscall.h >> +++ b/linux-user/alpha/syscall.h >> @@ -252,3 +252,4 @@ struct target_pt_regs { >> #define TARGET_UAC_NOPRINT 1 >> #define TARGET_UAC_NOFIX 2 >> #define TARGET_UAC_SIGBUS 4 >> +#define TARGET_MINSIGSTKSZ 4096 >> diff --git a/linux-user/arm/syscall.h b/linux-user/arm/syscall.h >> index e0d2cc3..cdadb0c 100644 >> --- a/linux-user/arm/syscall.h >> +++ b/linux-user/arm/syscall.h >> @@ -44,3 +44,5 @@ struct target_pt_regs { >> #define UNAME_MINIMUM_RELEASE "2.6.32" >> >> #define TARGET_CLONE_BACKWARDS >> + >> +#define TARGET_MINSIGSTKSZ 2048 >> diff --git a/linux-user/cris/syscall.h b/linux-user/cris/syscall.h >> index f5783c0..a75bcc4 100644 >> --- a/linux-user/cris/syscall.h >> +++ b/linux-user/cris/syscall.h >> @@ -39,5 +39,6 @@ struct target_pt_regs { >> }; >> >> #define TARGET_CLONE_BACKWARDS2 >> +#define TARGET_MINSIGSTKSZ 2048 >> >> #endif >> diff --git a/linux-user/i386/syscall.h b/linux-user/i386/syscall.h >> index 9bfc1ad..acf6856 100644 >> --- a/linux-user/i386/syscall.h >> +++ b/linux-user/i386/syscall.h >> @@ -147,3 +147,4 @@ struct target_vm86plus_struct { >> #define UNAME_MINIMUM_RELEASE "2.6.32" >> >> #define TARGET_CLONE_BACKWARDS >> +#define TARGET_MINSIGSTKSZ 2048 >> diff --git a/linux-user/m68k/syscall.h b/linux-user/m68k/syscall.h >> index 889eaf7..f8553f8 100644 >> --- a/linux-user/m68k/syscall.h >> +++ b/linux-user/m68k/syscall.h >> @@ -18,4 +18,6 @@ struct target_pt_regs { >> #define UNAME_MACHINE "m68k" >> #define UNAME_MINIMUM_RELEASE "2.6.32" >> >> +#define TARGET_MINSIGSTKSZ 2048 >> + >> void do_m68k_simcall(CPUM68KState *, int); >> diff --git a/linux-user/microblaze/syscall.h >> b/linux-user/microblaze/syscall.h >> index 5b5f6b4..2a5e160 100644 >> --- a/linux-user/microblaze/syscall.h >> +++ b/linux-user/microblaze/syscall.h >> @@ -49,5 +49,6 @@ struct target_pt_regs { >> }; >> >> #define TARGET_CLONE_BACKWARDS >> +#define TARGET_MINSIGSTKSZ 2048 >> >> #endif >> diff --git a/linux-user/mips/syscall.h b/linux-user/mips/syscall.h >> index 5bc5696..0b4662c 100644 >> --- a/linux-user/mips/syscall.h >> +++ b/linux-user/mips/syscall.h >> @@ -228,3 +228,4 @@ struct target_pt_regs { >> #define UNAME_MINIMUM_RELEASE "2.6.32" >> >> #define TARGET_CLONE_BACKWARDS >> +#define TARGET_MINSIGSTKSZ 2048 >> diff --git a/linux-user/mips64/syscall.h b/linux-user/mips64/syscall.h >> index a7f5a58..39b8bed 100644 >> --- a/linux-user/mips64/syscall.h >> +++ b/linux-user/mips64/syscall.h >> @@ -225,3 +225,4 @@ struct target_pt_regs { >> #define UNAME_MINIMUM_RELEASE "2.6.32" >> >> #define TARGET_CLONE_BACKWARDS >> +#define TARGET_MINSIGSTKSZ 2048 >> diff --git a/linux-user/openrisc/syscall.h b/linux-user/openrisc/syscall.h >> index c3b36da..e5e6180 100644 >> --- a/linux-user/openrisc/syscall.h >> +++ b/linux-user/openrisc/syscall.h >> @@ -23,3 +23,5 @@ struct target_pt_regs { >> >> #define UNAME_MACHINE "openrisc" >> #define UNAME_MINIMUM_RELEASE "2.6.32" >> + >> +#define TARGET_MINSIGSTKSZ 2048 >> diff --git a/linux-user/ppc/syscall.h b/linux-user/ppc/syscall.h >> index db92bbe..5311cc6 100644 >> --- a/linux-user/ppc/syscall.h >> +++ b/linux-user/ppc/syscall.h >> @@ -69,3 +69,5 @@ struct target_revectored_struct { >> #define UNAME_MINIMUM_RELEASE "2.6.32" >> >> #define TARGET_CLONE_BACKWARDS >> + >> +#define TARGET_MINSIGSTKSZ 2048 >> diff --git a/linux-user/s390x/syscall.h b/linux-user/s390x/syscall.h >> index aaad512..b11a3b2 100644 >> --- a/linux-user/s390x/syscall.h >> +++ b/linux-user/s390x/syscall.h >> @@ -24,3 +24,4 @@ struct target_pt_regs { >> #define UNAME_MINIMUM_RELEASE "2.6.32" >> >> #define TARGET_CLONE_BACKWARDS2 >> +#define TARGET_MINSIGSTKSZ 2048 >> diff --git a/linux-user/sh4/syscall.h b/linux-user/sh4/syscall.h >> index ccd2216..285ecf3 100644 >> --- a/linux-user/sh4/syscall.h >> +++ b/linux-user/sh4/syscall.h >> @@ -11,3 +11,5 @@ struct target_pt_regs { >> >> #define UNAME_MACHINE "sh4" >> #define UNAME_MINIMUM_RELEASE "2.6.32" >> + >> +#define TARGET_MINSIGSTKSZ 2048 >> diff --git a/linux-user/signal.c b/linux-user/signal.c >> index cdfcc52..174c286 100644 >> --- a/linux-user/signal.c >> +++ b/linux-user/signal.c >> @@ -617,6 +617,15 @@ abi_long do_sigaltstack(abi_ulong uss_addr, abi_ulong >> uoss_addr, abi_ulong sp) >> { >> struct target_sigaltstack *uss; >> struct target_sigaltstack ss; >> + size_t minstacksize = TARGET_MINSIGSTKSZ; >> + >> +#if defined(TARGET_PPC64) >> + /* ELF V2 for PPC64 has a 4K minimum stack size for signal handlers >> */ >> + struct image_info *image = ((TaskState *)thread_cpu->opaque)->info; >> + if (get_ppc64_abi(image) > 1) { >> + minstacksize = 4096; >> + } >> +#endif > > fails to build: > > CC ppc64-linux-user/linux-user/signal.o > /home/voipio/deploy/qemu/linux-user/signal.c: In function ‘do_sigaltstack’: > /home/voipio/deploy/qemu/linux-user/signal.c:625:9: error: implicit > declaration of function ‘get_ppc64_abi’ > [-Werror=implicit-function-declaration] > if (get_ppc64_abi(image) > 1) { > ^ > /home/voipio/deploy/qemu/linux-user/signal.c:625:9: error: nested extern > declaration of ‘get_ppc64_abi’ [-Werror=nested-externs] > cc1: all warnings being treated as errors > > >> ret = -TARGET_EFAULT; >> if (!lock_user_struct(VERIFY_READ, uss, uss_addr, 1)) { >> @@ -642,8 +651,9 @@ abi_long do_sigaltstack(abi_ulong uss_addr, abi_ulong >> uoss_addr, abi_ulong sp) >> ss.ss_sp = 0; >> } else { >> ret = -TARGET_ENOMEM; >> - if (ss.ss_size < MINSIGSTKSZ) >> + if (ss.ss_size < minstacksize) { >> goto out; >> + } >> } >> >> target_sigaltstack_used.ss_sp = ss.ss_sp; >> diff --git a/linux-user/sparc/syscall.h b/linux-user/sparc/syscall.h >> index 9549ea0..ae40744 100644 >> --- a/linux-user/sparc/syscall.h >> +++ b/linux-user/sparc/syscall.h >> @@ -15,3 +15,4 @@ struct target_pt_regs { >> * and copy_thread(). >> */ >> #define TARGET_CLONE_BACKWARDS >> +#define TARGET_MINSIGSTKSZ 4096 >> diff --git a/linux-user/sparc64/syscall.h b/linux-user/sparc64/syscall.h >> index 82b1680..816a00f 100644 >> --- a/linux-user/sparc64/syscall.h >> +++ b/linux-user/sparc64/syscall.h >> @@ -16,3 +16,4 @@ struct target_pt_regs { >> * and copy_thread(). >> */ >> #define TARGET_CLONE_BACKWARDS >> +#define TARGET_MINSIGSTKSZ 4096 >> diff --git a/linux-user/unicore32/syscall.h b/linux-user/unicore32/syscall.h >> index f7e5525..3ed6237 100644 >> --- a/linux-user/unicore32/syscall.h >> +++ b/linux-user/unicore32/syscall.h >> @@ -53,4 +53,6 @@ struct target_pt_regs { >> #define UNAME_MACHINE "UniCore-II" >> #define UNAME_MINIMUM_RELEASE "2.6.32" >> >> +#define TARGET_MINSIGSTKSZ 2048 >> + >> #endif /* __UC32_SYSCALL_H__ */ >> diff --git a/linux-user/x86_64/syscall.h b/linux-user/x86_64/syscall.h >> index e03b5a0..5828b91 100644 >> --- a/linux-user/x86_64/syscall.h >> +++ b/linux-user/x86_64/syscall.h >> @@ -97,3 +97,4 @@ struct target_msqid64_ds { >> #define TARGET_ARCH_SET_FS 0x1002 >> #define TARGET_ARCH_GET_FS 0x1003 >> #define TARGET_ARCH_GET_GS 0x1004 >> +#define TARGET_MINSIGSTKSZ 2048 >> -- >> 1.7.1 >>