Each architecture does the same comparation, but it is hard (at least was hard for me) to see, because of the fancy way of doing a simple 0 comparation.
This patch simply tries to assure signal.c code coherence. Signed-off-by: Alex Barcelo <abarc...@ac.upc.edu> --- linux-user/signal.c | 44 +++++++++++++++++++++++++------------------- 1 files changed, 25 insertions(+), 19 deletions(-) diff --git a/linux-user/signal.c b/linux-user/signal.c index fca51e2..d1a2671 100644 --- a/linux-user/signal.c +++ b/linux-user/signal.c @@ -804,19 +804,21 @@ get_sigframe(struct target_sigaction *ka, CPUX86State *env, size_t frame_size) /* Default to using normal stack */ esp = env->regs[R_ESP]; /* This is the X/Open sanctioned signal stack switching. */ - if (ka->sa_flags & TARGET_SA_ONSTACK) { - if (sas_ss_flags(esp) == 0) - esp = target_sigaltstack_used.ss_sp + target_sigaltstack_used.ss_size; + if (ka->sa_flags & TARGET_SA_ONSTACK) { + if (sas_ss_flags(esp) == 0) { + esp = (target_sigaltstack_used.ss_sp + + target_sigaltstack_used.ss_size); } - - /* This is the legacy signal stack switching. */ - else + } else { + /* This is the legacy signal stack switching. */ if ((env->segs[R_SS].selector & 0xffff) != __USER_DS && !(ka->sa_flags & TARGET_SA_RESTORER) && ka->sa_restorer) { esp = (unsigned long) ka->sa_restorer; - } - return (esp - frame_size) & -8ul; + } + } + + return (esp - frame_size) & -8ul; } /* compare linux/arch/i386/kernel/signal.c:setup_frame() */ @@ -1248,8 +1250,10 @@ get_sigframe(struct target_sigaction *ka, CPUARMState *regs, int framesize) /* * This is the X/Open sanctioned signal stack switching. */ - if ((ka->sa_flags & TARGET_SA_ONSTACK) && !sas_ss_flags(sp)) - sp = target_sigaltstack_used.ss_sp + target_sigaltstack_used.ss_size; + if ((ka->sa_flags & TARGET_SA_ONSTACK) && + (sas_ss_flags(sp) == 0)) { + sp = target_sigaltstack_used.ss_sp + target_sigaltstack_used.ss_size; + } /* * ATPCS B01 mandates 8-byte alignment */ @@ -2710,7 +2714,8 @@ get_sigframe(struct target_sigaction *ka, CPUMIPSState *regs, size_t frame_size) sp -= 32; /* This is the X/Open sanctioned signal stack switching. */ - if ((ka->sa_flags & TARGET_SA_ONSTACK) && (sas_ss_flags (sp) == 0)) { + if ((ka->sa_flags & TARGET_SA_ONSTACK) && + (sas_ss_flags(sp) == 0)) { sp = target_sigaltstack_used.ss_sp + target_sigaltstack_used.ss_size; } @@ -2969,7 +2974,8 @@ struct target_rt_sigframe static abi_ulong get_sigframe(struct target_sigaction *ka, unsigned long sp, size_t frame_size) { - if ((ka->sa_flags & TARGET_SA_ONSTACK) && (sas_ss_flags(sp) == 0)) { + if ((ka->sa_flags & TARGET_SA_ONSTACK) && + (sas_ss_flags(sp) == 0)) { sp = target_sigaltstack_used.ss_sp + target_sigaltstack_used.ss_size; } @@ -3698,11 +3704,9 @@ get_sigframe(struct target_sigaction *ka, CPUS390XState *env, size_t frame_size) sp = env->regs[15]; /* This is the X/Open sanctioned signal stack switching. */ - if (ka->sa_flags & TARGET_SA_ONSTACK) { - if (!sas_ss_flags(sp)) { - sp = target_sigaltstack_used.ss_sp + - target_sigaltstack_used.ss_size; - } + if ((ka->sa_flags & TARGET_SA_ONSTACK) && + (sas_ss_flags(sp) == 0) { + sp = target_sigaltstack_used.ss_sp + target_sigaltstack_used.ss_size; } /* This is the legacy signal stack switching. */ @@ -4668,7 +4672,8 @@ get_sigframe(struct target_sigaction *ka, CPUM68KState *regs, sp = regs->aregs[7]; /* This is the X/Open sanctioned signal stack switching. */ - if ((ka->sa_flags & TARGET_SA_ONSTACK) && (sas_ss_flags (sp) == 0)) { + if ((ka->sa_flags & TARGET_SA_ONSTACK) && + (sas_ss_flags(sp) == 0)) { sp = target_sigaltstack_used.ss_sp + target_sigaltstack_used.ss_size; } @@ -5046,7 +5051,8 @@ static inline abi_ulong get_sigframe(struct target_sigaction *sa, abi_ulong sp = env->ir[IR_SP]; /* This is the X/Open sanctioned signal stack switching. */ - if ((sa->sa_flags & TARGET_SA_ONSTACK) != 0 && !sas_ss_flags(sp)) { + if ((sa->sa_flags & TARGET_SA_ONSTACK) && + (sas_ss_flags(sp) == 0)) { sp = target_sigaltstack_used.ss_sp + target_sigaltstack_used.ss_size; } return (sp - framesize) & -32; -- 1.7.5.4