riscvarchive / riscv-qemu

QEMU with RISC-V (RV64G, RV32G) Emulation Support
385 stars 154 forks source link

riscv linux-user should align stack to 16-byte boundary #129

Open michaeljclark opened 6 years ago

michaeljclark commented 6 years ago

+static abi_ulong get_sigframe(struct target_sigaction *ka,

  • CPURISCVState *regs, size_t framesize) +{
  • abi_ulong sp = regs->gpr[xSP];
  • int onsigstack = on_sig_stack(sp);
  • / redzone /
  • / This is the X/Open sanctioned signal stack switching. /
  • if ((ka->sa_flags & TARGET_SA_ONSTACK) != 0 && !onsigstack) {
  • sp = target_sigaltstack_used.ss_sp + target_sigaltstack_used.ss_size;
  • }
  • sp -= framesize;
  • sp &= ~3UL; / align sp on 4-byte boundary /

kernel aligns using 0xf.

michaeljclark commented 6 years ago

Also:

1- check for signal stack overflow 2- check for X/Open sanctioned signal stack switching

http://lists.nongnu.org/archive/html/qemu-devel/2018-04/msg00338.html