Commit 775b58d8cb46050f2d0375cb938c293383e970e8
1 parent
eb6a0540
removed warnings - fixed arm stack copy bug
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3593 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
19 additions
and
8 deletions
linux-user/signal.c
@@ -670,6 +670,7 @@ setup_sigcontext(struct target_sigcontext *sc, struct target_fpstate *fpstate, | @@ -670,6 +670,7 @@ setup_sigcontext(struct target_sigcontext *sc, struct target_fpstate *fpstate, | ||
670 | CPUX86State *env, unsigned long mask) | 670 | CPUX86State *env, unsigned long mask) |
671 | { | 671 | { |
672 | int err = 0; | 672 | int err = 0; |
673 | + uint16_t magic; | ||
673 | 674 | ||
674 | /* already locked in setup_frame() */ | 675 | /* already locked in setup_frame() */ |
675 | err |= __put_user(env->segs[R_GS].selector, (unsigned int *)&sc->gs); | 676 | err |= __put_user(env->segs[R_GS].selector, (unsigned int *)&sc->gs); |
@@ -694,7 +695,8 @@ setup_sigcontext(struct target_sigcontext *sc, struct target_fpstate *fpstate, | @@ -694,7 +695,8 @@ setup_sigcontext(struct target_sigcontext *sc, struct target_fpstate *fpstate, | ||
694 | 695 | ||
695 | cpu_x86_fsave(env, (void *)fpstate, 1); | 696 | cpu_x86_fsave(env, (void *)fpstate, 1); |
696 | fpstate->status = fpstate->sw; | 697 | fpstate->status = fpstate->sw; |
697 | - err |= __put_user(0xffff, &fpstate->magic); | 698 | + magic = 0xffff; |
699 | + err |= __put_user(magic, &fpstate->magic); | ||
698 | err |= __put_user(fpstate, &sc->fpstate); | 700 | err |= __put_user(fpstate, &sc->fpstate); |
699 | 701 | ||
700 | /* non-iBCS2 extensions.. */ | 702 | /* non-iBCS2 extensions.. */ |
@@ -766,15 +768,18 @@ static void setup_frame(int sig, struct emulated_sigaction *ka, | @@ -766,15 +768,18 @@ static void setup_frame(int sig, struct emulated_sigaction *ka, | ||
766 | if (ka->sa.sa_flags & TARGET_SA_RESTORER) { | 768 | if (ka->sa.sa_flags & TARGET_SA_RESTORER) { |
767 | err |= __put_user(ka->sa.sa_restorer, &frame->pretcode); | 769 | err |= __put_user(ka->sa.sa_restorer, &frame->pretcode); |
768 | } else { | 770 | } else { |
771 | + uint16_t val16; | ||
769 | err |= __put_user(frame->retcode, &frame->pretcode); | 772 | err |= __put_user(frame->retcode, &frame->pretcode); |
770 | /* This is popl %eax ; movl $,%eax ; int $0x80 */ | 773 | /* This is popl %eax ; movl $,%eax ; int $0x80 */ |
771 | - err |= __put_user(0xb858, (short *)(frame->retcode+0)); | 774 | + val16 = 0xb858; |
775 | + err |= __put_user(val16, (uint16_t *)(frame->retcode+0)); | ||
772 | #if defined(TARGET_X86_64) | 776 | #if defined(TARGET_X86_64) |
773 | #warning "Fix this !" | 777 | #warning "Fix this !" |
774 | #else | 778 | #else |
775 | err |= __put_user(TARGET_NR_sigreturn, (int *)(frame->retcode+2)); | 779 | err |= __put_user(TARGET_NR_sigreturn, (int *)(frame->retcode+2)); |
776 | #endif | 780 | #endif |
777 | - err |= __put_user(0x80cd, (short *)(frame->retcode+6)); | 781 | + val16 = 0x80cd; |
782 | + err |= __put_user(val16, (uint16_t *)(frame->retcode+6)); | ||
778 | } | 783 | } |
779 | 784 | ||
780 | if (err) | 785 | if (err) |
@@ -848,11 +853,14 @@ static void setup_rt_frame(int sig, struct emulated_sigaction *ka, | @@ -848,11 +853,14 @@ static void setup_rt_frame(int sig, struct emulated_sigaction *ka, | ||
848 | if (ka->sa.sa_flags & TARGET_SA_RESTORER) { | 853 | if (ka->sa.sa_flags & TARGET_SA_RESTORER) { |
849 | err |= __put_user(ka->sa.sa_restorer, &frame->pretcode); | 854 | err |= __put_user(ka->sa.sa_restorer, &frame->pretcode); |
850 | } else { | 855 | } else { |
856 | + uint16_t val16; | ||
857 | + | ||
851 | err |= __put_user(frame->retcode, &frame->pretcode); | 858 | err |= __put_user(frame->retcode, &frame->pretcode); |
852 | /* This is movl $,%eax ; int $0x80 */ | 859 | /* This is movl $,%eax ; int $0x80 */ |
853 | - err |= __put_user(0xb8, (char *)(frame->retcode+0)); | 860 | + err |= __put_user(0xb8, (char *)(frame->retcode+0)); |
854 | err |= __put_user(TARGET_NR_rt_sigreturn, (int *)(frame->retcode+1)); | 861 | err |= __put_user(TARGET_NR_rt_sigreturn, (int *)(frame->retcode+1)); |
855 | - err |= __put_user(0x80cd, (short *)(frame->retcode+5)); | 862 | + val16 = 0x80cd; |
863 | + err |= __put_user(val16, (uint16_t *)(frame->retcode+5)); | ||
856 | } | 864 | } |
857 | 865 | ||
858 | if (err) | 866 | if (err) |
@@ -1234,7 +1242,7 @@ static void setup_rt_frame(int usig, struct emulated_sigaction *ka, | @@ -1234,7 +1242,7 @@ static void setup_rt_frame(int usig, struct emulated_sigaction *ka, | ||
1234 | __put_user(target_sigaltstack_used.ss_sp, &stack.ss_sp); | 1242 | __put_user(target_sigaltstack_used.ss_sp, &stack.ss_sp); |
1235 | __put_user(target_sigaltstack_used.ss_size, &stack.ss_size); | 1243 | __put_user(target_sigaltstack_used.ss_size, &stack.ss_size); |
1236 | __put_user(sas_ss_flags(get_sp_from_cpustate(env)), &stack.ss_flags); | 1244 | __put_user(sas_ss_flags(get_sp_from_cpustate(env)), &stack.ss_flags); |
1237 | - err |= copy_to_user(&frame->uc.tuc_stack, &stack, sizeof(stack)); | 1245 | + memcpy(&frame->uc.tuc_stack, &stack, sizeof(stack)); |
1238 | 1246 | ||
1239 | err |= setup_sigcontext(&frame->uc.tuc_mcontext, /*&frame->fpstate,*/ | 1247 | err |= setup_sigcontext(&frame->uc.tuc_mcontext, /*&frame->fpstate,*/ |
1240 | env, set->sig[0]); | 1248 | env, set->sig[0]); |
@@ -1585,13 +1593,16 @@ static void setup_frame(int sig, struct emulated_sigaction *ka, | @@ -1585,13 +1593,16 @@ static void setup_frame(int sig, struct emulated_sigaction *ka, | ||
1585 | if (ka->sa.sa_restorer) | 1593 | if (ka->sa.sa_restorer) |
1586 | env->regwptr[UREG_I7] = (unsigned long)ka->sa.sa_restorer; | 1594 | env->regwptr[UREG_I7] = (unsigned long)ka->sa.sa_restorer; |
1587 | else { | 1595 | else { |
1596 | + uint32_t val32; | ||
1588 | env->regwptr[UREG_I7] = h2g(&(sf->insns[0]) - 2); | 1597 | env->regwptr[UREG_I7] = h2g(&(sf->insns[0]) - 2); |
1589 | 1598 | ||
1590 | /* mov __NR_sigreturn, %g1 */ | 1599 | /* mov __NR_sigreturn, %g1 */ |
1591 | - err |= __put_user(0x821020d8, &sf->insns[0]); | 1600 | + val32 = 0x821020d8; |
1601 | + err |= __put_user(val32, &sf->insns[0]); | ||
1592 | 1602 | ||
1593 | /* t 0x10 */ | 1603 | /* t 0x10 */ |
1594 | - err |= __put_user(0x91d02010, &sf->insns[1]); | 1604 | + val32 = 0x91d02010; |
1605 | + err |= __put_user(val32, &sf->insns[1]); | ||
1595 | if (err) | 1606 | if (err) |
1596 | goto sigsegv; | 1607 | goto sigsegv; |
1597 | 1608 |