Revision 53a5960a linux-user/signal.c
b/linux-user/signal.c | ||
---|---|---|
135 | 135 |
|
136 | 136 |
host_to_target_sigset_internal(&d1, s); |
137 | 137 |
for(i = 0;i < TARGET_NSIG_WORDS; i++) |
138 |
__put_user(d1.sig[i], &d->sig[i]);
|
|
138 |
d->sig[i] = tswapl(d1.sig[i]);
|
|
139 | 139 |
} |
140 | 140 |
|
141 | 141 |
void target_to_host_sigset_internal(sigset_t *d, const target_sigset_t *s) |
... | ... | |
168 | 168 |
int i; |
169 | 169 |
|
170 | 170 |
for(i = 0;i < TARGET_NSIG_WORDS; i++) |
171 |
__get_user(s1.sig[i], &s->sig[i]);
|
|
171 |
s1.sig[i] = tswapl(s->sig[i]);
|
|
172 | 172 |
target_to_host_sigset_internal(d, &s1); |
173 | 173 |
} |
174 | 174 |
|
... | ... | |
647 | 647 |
ka->sa.sa_restorer) { |
648 | 648 |
esp = (unsigned long) ka->sa.sa_restorer; |
649 | 649 |
} |
650 |
return (void *)((esp - frame_size) & -8ul);
|
|
650 |
return g2h((esp - frame_size) & -8ul);
|
|
651 | 651 |
} |
652 | 652 |
|
653 | 653 |
static void setup_frame(int sig, struct emulated_sigaction *ka, |
... | ... | |
694 | 694 |
goto give_sigsegv; |
695 | 695 |
|
696 | 696 |
/* Set up registers for signal handler */ |
697 |
env->regs[R_ESP] = (unsigned long) frame;
|
|
697 |
env->regs[R_ESP] = h2g(frame);
|
|
698 | 698 |
env->eip = (unsigned long) ka->sa._sa_handler; |
699 | 699 |
|
700 | 700 |
cpu_x86_load_seg(env, R_DS, __USER_DS); |
... | ... | |
835 | 835 |
|
836 | 836 |
long do_sigreturn(CPUX86State *env) |
837 | 837 |
{ |
838 |
struct sigframe *frame = (struct sigframe *)(env->regs[R_ESP] - 8); |
|
838 |
struct sigframe *frame = (struct sigframe *)g2h(env->regs[R_ESP] - 8);
|
|
839 | 839 |
target_sigset_t target_set; |
840 | 840 |
sigset_t set; |
841 | 841 |
int eax, i; |
... | ... | |
866 | 866 |
|
867 | 867 |
long do_rt_sigreturn(CPUX86State *env) |
868 | 868 |
{ |
869 |
struct rt_sigframe *frame = (struct rt_sigframe *)(env->regs[R_ESP] - 4); |
|
869 |
struct rt_sigframe *frame = (struct rt_sigframe *)g2h(env->regs[R_ESP] - 4);
|
|
870 | 870 |
sigset_t set; |
871 | 871 |
// stack_t st; |
872 | 872 |
int eax; |
... | ... | |
1029 | 1029 |
/* |
1030 | 1030 |
* ATPCS B01 mandates 8-byte alignment |
1031 | 1031 |
*/ |
1032 |
return (void *)((sp - framesize) & ~7);
|
|
1032 |
return g2h((sp - framesize) & ~7);
|
|
1033 | 1033 |
} |
1034 | 1034 |
|
1035 | 1035 |
static int |
... | ... | |
1084 | 1084 |
} |
1085 | 1085 |
|
1086 | 1086 |
env->regs[0] = usig; |
1087 |
env->regs[13] = (target_ulong)frame;
|
|
1087 |
env->regs[13] = h2g(frame);
|
|
1088 | 1088 |
env->regs[14] = retcode; |
1089 | 1089 |
env->regs[15] = handler & (thumb ? ~1 : ~3); |
1090 | 1090 |
|
... | ... | |
1130 | 1130 |
err |= copy_siginfo_to_user(&frame->info, info); |
1131 | 1131 |
|
1132 | 1132 |
/* Clear all the bits of the ucontext we don't use. */ |
1133 |
err |= __clear_user(&frame->uc, offsetof(struct ucontext, uc_mcontext));
|
|
1133 |
memset(&frame->uc, 0, offsetof(struct target_ucontext, tuc_mcontext));
|
|
1134 | 1134 |
|
1135 | 1135 |
err |= setup_sigcontext(&frame->uc.tuc_mcontext, /*&frame->fpstate,*/ |
1136 | 1136 |
env, set->sig[0]); |
... | ... | |
1202 | 1202 |
if (env->regs[13] & 7) |
1203 | 1203 |
goto badframe; |
1204 | 1204 |
|
1205 |
frame = (struct sigframe *)env->regs[13];
|
|
1205 |
frame = (struct sigframe *)g2h(env->regs[13]);
|
|
1206 | 1206 |
|
1207 | 1207 |
#if 0 |
1208 | 1208 |
if (verify_area(VERIFY_READ, frame, sizeof (*frame))) |
... | ... | |
1378 | 1378 |
sp = current->sas_ss_sp + current->sas_ss_size; |
1379 | 1379 |
} |
1380 | 1380 |
#endif |
1381 |
return (void *)(sp - framesize);
|
|
1381 |
return g2h(sp - framesize);
|
|
1382 | 1382 |
} |
1383 | 1383 |
|
1384 | 1384 |
static int |
... | ... | |
1461 | 1461 |
goto sigsegv; |
1462 | 1462 |
|
1463 | 1463 |
/* 3. signal handler back-trampoline and parameters */ |
1464 |
env->regwptr[UREG_FP] = (target_ulong) sf;
|
|
1464 |
env->regwptr[UREG_FP] = h2g(sf);
|
|
1465 | 1465 |
env->regwptr[UREG_I0] = sig; |
1466 |
env->regwptr[UREG_I1] = (target_ulong) &sf->info;
|
|
1467 |
env->regwptr[UREG_I2] = (target_ulong) &sf->info;
|
|
1466 |
env->regwptr[UREG_I1] = h2g(&sf->info);
|
|
1467 |
env->regwptr[UREG_I2] = h2g(&sf->info);
|
|
1468 | 1468 |
|
1469 | 1469 |
/* 4. signal handler */ |
1470 | 1470 |
env->pc = (unsigned long) ka->sa._sa_handler; |
... | ... | |
1473 | 1473 |
if (ka->sa.sa_restorer) |
1474 | 1474 |
env->regwptr[UREG_I7] = (unsigned long)ka->sa.sa_restorer; |
1475 | 1475 |
else { |
1476 |
env->regwptr[UREG_I7] = (unsigned long)(&(sf->insns[0]) - 2);
|
|
1476 |
env->regwptr[UREG_I7] = h2g(&(sf->insns[0]) - 2);
|
|
1477 | 1477 |
|
1478 | 1478 |
/* mov __NR_sigreturn, %g1 */ |
1479 | 1479 |
err |= __put_user(0x821020d8, &sf->insns[0]); |
... | ... | |
1548 | 1548 |
target_ulong fpu_save; |
1549 | 1549 |
int err, i; |
1550 | 1550 |
|
1551 |
sf = (struct target_signal_frame *) env->regwptr[UREG_FP];
|
|
1551 |
sf = (struct target_signal_frame *)g2h(env->regwptr[UREG_FP]);
|
|
1552 | 1552 |
#if 0 |
1553 | 1553 |
fprintf(stderr, "sigreturn\n"); |
1554 | 1554 |
fprintf(stderr, "sf: %x pc %x fp %x sp %x\n", sf, env->pc, env->regwptr[UREG_FP], env->regwptr[UREG_SP]); |
Also available in: Unified diff