Revision 992f48a0 linux-user/signal.c
b/linux-user/signal.c | ||
---|---|---|
26 | 26 |
#include <errno.h> |
27 | 27 |
#include <sys/ucontext.h> |
28 | 28 |
|
29 |
#include "target_signal.h" |
|
30 | 29 |
#include "qemu.h" |
30 |
#include "target_signal.h" |
|
31 | 31 |
|
32 | 32 |
//#define DEBUG_SIGNAL |
33 | 33 |
|
... | ... | |
134 | 134 |
if (sigmask & (1 << i)) |
135 | 135 |
target_sigmask |= 1 << (host_to_target_signal(i + 1) - 1); |
136 | 136 |
} |
137 |
#if TARGET_LONG_BITS == 32 && HOST_LONG_BITS == 32
|
|
137 |
#if TARGET_ABI_BITS == 32 && HOST_LONG_BITS == 32
|
|
138 | 138 |
d->sig[0] = target_sigmask; |
139 | 139 |
for(i = 1;i < TARGET_NSIG_WORDS; i++) { |
140 | 140 |
d->sig[i] = ((unsigned long *)s)[i]; |
141 | 141 |
} |
142 |
#elif TARGET_LONG_BITS == 32 && HOST_LONG_BITS == 64 && TARGET_NSIG_WORDS == 2
|
|
142 |
#elif TARGET_ABI_BITS == 32 && HOST_LONG_BITS == 64 && TARGET_NSIG_WORDS == 2
|
|
143 | 143 |
d->sig[0] = target_sigmask; |
144 | 144 |
d->sig[1] = sigmask >> 32; |
145 | 145 |
#else |
... | ... | |
161 | 161 |
{ |
162 | 162 |
int i; |
163 | 163 |
unsigned long sigmask; |
164 |
target_ulong target_sigmask;
|
|
164 |
abi_ulong target_sigmask;
|
|
165 | 165 |
|
166 | 166 |
target_sigmask = s->sig[0]; |
167 | 167 |
sigmask = 0; |
... | ... | |
169 | 169 |
if (target_sigmask & (1 << i)) |
170 | 170 |
sigmask |= 1 << (target_to_host_signal(i + 1) - 1); |
171 | 171 |
} |
172 |
#if TARGET_LONG_BITS == 32 && HOST_LONG_BITS == 32
|
|
172 |
#if TARGET_ABI_BITS == 32 && HOST_LONG_BITS == 32
|
|
173 | 173 |
((unsigned long *)d)[0] = sigmask; |
174 | 174 |
for(i = 1;i < TARGET_NSIG_WORDS; i++) { |
175 | 175 |
((unsigned long *)d)[i] = s->sig[i]; |
176 | 176 |
} |
177 |
#elif TARGET_LONG_BITS == 32 && HOST_LONG_BITS == 64 && TARGET_NSIG_WORDS == 2
|
|
177 |
#elif TARGET_ABI_BITS == 32 && HOST_LONG_BITS == 64 && TARGET_NSIG_WORDS == 2
|
|
178 | 178 |
((unsigned long *)d)[0] = sigmask | ((unsigned long)(s->sig[1]) << 32); |
179 | 179 |
#else |
180 | 180 |
#warning target_to_host_sigset |
181 |
#endif /* TARGET_LONG_BITS */
|
|
181 |
#endif /* TARGET_ABI_BITS */
|
|
182 | 182 |
} |
183 | 183 |
|
184 | 184 |
void target_to_host_sigset(sigset_t *d, const target_sigset_t *s) |
... | ... | |
191 | 191 |
target_to_host_sigset_internal(d, &s1); |
192 | 192 |
} |
193 | 193 |
|
194 |
void host_to_target_old_sigset(target_ulong *old_sigset,
|
|
194 |
void host_to_target_old_sigset(abi_ulong *old_sigset,
|
|
195 | 195 |
const sigset_t *sigset) |
196 | 196 |
{ |
197 | 197 |
target_sigset_t d; |
... | ... | |
200 | 200 |
} |
201 | 201 |
|
202 | 202 |
void target_to_host_old_sigset(sigset_t *sigset, |
203 |
const target_ulong *old_sigset)
|
|
203 |
const abi_ulong *old_sigset)
|
|
204 | 204 |
{ |
205 | 205 |
target_sigset_t d; |
206 | 206 |
int i; |
... | ... | |
233 | 233 |
tinfo->_sifields._rt._uid = info->si_uid; |
234 | 234 |
/* XXX: potential problem if 64 bit */ |
235 | 235 |
tinfo->_sifields._rt._sigval.sival_ptr = |
236 |
(target_ulong)info->si_value.sival_ptr;
|
|
236 |
(abi_ulong)info->si_value.sival_ptr;
|
|
237 | 237 |
} |
238 | 238 |
} |
239 | 239 |
|
... | ... | |
355 | 355 |
{ |
356 | 356 |
struct emulated_sigaction *k; |
357 | 357 |
struct sigqueue *q, **pq; |
358 |
target_ulong handler;
|
|
358 |
abi_ulong handler;
|
|
359 | 359 |
|
360 | 360 |
#if defined(DEBUG_SIGNAL) |
361 | 361 |
fprintf(stderr, "queue_signal: sig=%d\n", |
... | ... | |
440 | 440 |
|
441 | 441 |
int do_sigaltstack(const struct target_sigaltstack *uss, |
442 | 442 |
struct target_sigaltstack *uoss, |
443 |
target_ulong sp)
|
|
443 |
abi_ulong sp)
|
|
444 | 444 |
{ |
445 | 445 |
int ret; |
446 | 446 |
struct target_sigaltstack oss; |
... | ... | |
579 | 579 |
}; |
580 | 580 |
|
581 | 581 |
struct target_xmmreg { |
582 |
target_ulong element[4];
|
|
582 |
abi_ulong element[4];
|
|
583 | 583 |
}; |
584 | 584 |
|
585 | 585 |
struct target_fpstate { |
586 | 586 |
/* Regular FPU environment */ |
587 |
target_ulong cw;
|
|
588 |
target_ulong sw;
|
|
589 |
target_ulong tag;
|
|
590 |
target_ulong ipoff;
|
|
591 |
target_ulong cssel;
|
|
592 |
target_ulong dataoff;
|
|
593 |
target_ulong datasel;
|
|
587 |
abi_ulong cw;
|
|
588 |
abi_ulong sw;
|
|
589 |
abi_ulong tag;
|
|
590 |
abi_ulong ipoff;
|
|
591 |
abi_ulong cssel;
|
|
592 |
abi_ulong dataoff;
|
|
593 |
abi_ulong datasel;
|
|
594 | 594 |
struct target_fpreg _st[8]; |
595 | 595 |
uint16_t status; |
596 | 596 |
uint16_t magic; /* 0xffff = regular FPU data only */ |
597 | 597 |
|
598 | 598 |
/* FXSR FPU environment */ |
599 |
target_ulong _fxsr_env[6]; /* FXSR FPU env is ignored */
|
|
600 |
target_ulong mxcsr;
|
|
601 |
target_ulong reserved;
|
|
599 |
abi_ulong _fxsr_env[6]; /* FXSR FPU env is ignored */
|
|
600 |
abi_ulong mxcsr;
|
|
601 |
abi_ulong reserved;
|
|
602 | 602 |
struct target_fpxreg _fxsr_st[8]; /* FXSR FPU reg data is ignored */ |
603 | 603 |
struct target_xmmreg _xmm[8]; |
604 |
target_ulong padding[56];
|
|
604 |
abi_ulong padding[56];
|
|
605 | 605 |
}; |
606 | 606 |
|
607 | 607 |
#define X86_FXSR_MAGIC 0x0000 |
... | ... | |
611 | 611 |
uint16_t fs, __fsh; |
612 | 612 |
uint16_t es, __esh; |
613 | 613 |
uint16_t ds, __dsh; |
614 |
target_ulong edi;
|
|
615 |
target_ulong esi;
|
|
616 |
target_ulong ebp;
|
|
617 |
target_ulong esp;
|
|
618 |
target_ulong ebx;
|
|
619 |
target_ulong edx;
|
|
620 |
target_ulong ecx;
|
|
621 |
target_ulong eax;
|
|
622 |
target_ulong trapno;
|
|
623 |
target_ulong err;
|
|
624 |
target_ulong eip;
|
|
614 |
abi_ulong edi;
|
|
615 |
abi_ulong esi;
|
|
616 |
abi_ulong ebp;
|
|
617 |
abi_ulong esp;
|
|
618 |
abi_ulong ebx;
|
|
619 |
abi_ulong edx;
|
|
620 |
abi_ulong ecx;
|
|
621 |
abi_ulong eax;
|
|
622 |
abi_ulong trapno;
|
|
623 |
abi_ulong err;
|
|
624 |
abi_ulong eip;
|
|
625 | 625 |
uint16_t cs, __csh; |
626 |
target_ulong eflags;
|
|
627 |
target_ulong esp_at_signal;
|
|
626 |
abi_ulong eflags;
|
|
627 |
abi_ulong esp_at_signal;
|
|
628 | 628 |
uint16_t ss, __ssh; |
629 |
target_ulong fpstate; /* pointer */
|
|
630 |
target_ulong oldmask;
|
|
631 |
target_ulong cr2;
|
|
629 |
abi_ulong fpstate; /* pointer */
|
|
630 |
abi_ulong oldmask;
|
|
631 |
abi_ulong cr2;
|
|
632 | 632 |
}; |
633 | 633 |
|
634 | 634 |
struct target_ucontext { |
635 |
target_ulong tuc_flags;
|
|
636 |
target_ulong tuc_link;
|
|
635 |
abi_ulong tuc_flags;
|
|
636 |
abi_ulong tuc_link;
|
|
637 | 637 |
target_stack_t tuc_stack; |
638 | 638 |
struct target_sigcontext tuc_mcontext; |
639 | 639 |
target_sigset_t tuc_sigmask; /* mask last for extensibility */ |
... | ... | |
641 | 641 |
|
642 | 642 |
struct sigframe |
643 | 643 |
{ |
644 |
target_ulong pretcode;
|
|
644 |
abi_ulong pretcode;
|
|
645 | 645 |
int sig; |
646 | 646 |
struct target_sigcontext sc; |
647 | 647 |
struct target_fpstate fpstate; |
648 |
target_ulong extramask[TARGET_NSIG_WORDS-1];
|
|
648 |
abi_ulong extramask[TARGET_NSIG_WORDS-1];
|
|
649 | 649 |
char retcode[8]; |
650 | 650 |
}; |
651 | 651 |
|
652 | 652 |
struct rt_sigframe |
653 | 653 |
{ |
654 |
target_ulong pretcode;
|
|
654 |
abi_ulong pretcode;
|
|
655 | 655 |
int sig; |
656 |
target_ulong pinfo;
|
|
657 |
target_ulong puc;
|
|
656 |
abi_ulong pinfo;
|
|
657 |
abi_ulong puc;
|
|
658 | 658 |
struct target_siginfo info; |
659 | 659 |
struct target_ucontext uc; |
660 | 660 |
struct target_fpstate fpstate; |
... | ... | |
813 | 813 |
? current->exec_domain->signal_invmap[sig] |
814 | 814 |
: */sig), |
815 | 815 |
&frame->sig); |
816 |
err |= __put_user((target_ulong)&frame->info, &frame->pinfo);
|
|
817 |
err |= __put_user((target_ulong)&frame->uc, &frame->puc);
|
|
816 |
err |= __put_user((abi_ulong)&frame->info, &frame->pinfo);
|
|
817 |
err |= __put_user((abi_ulong)&frame->uc, &frame->puc);
|
|
818 | 818 |
err |= copy_siginfo_to_user(&frame->info, info); |
819 | 819 |
if (err) |
820 | 820 |
goto give_sigsegv; |
... | ... | |
977 | 977 |
#elif defined(TARGET_ARM) |
978 | 978 |
|
979 | 979 |
struct target_sigcontext { |
980 |
target_ulong trap_no;
|
|
981 |
target_ulong error_code;
|
|
982 |
target_ulong oldmask;
|
|
983 |
target_ulong arm_r0;
|
|
984 |
target_ulong arm_r1;
|
|
985 |
target_ulong arm_r2;
|
|
986 |
target_ulong arm_r3;
|
|
987 |
target_ulong arm_r4;
|
|
988 |
target_ulong arm_r5;
|
|
989 |
target_ulong arm_r6;
|
|
990 |
target_ulong arm_r7;
|
|
991 |
target_ulong arm_r8;
|
|
992 |
target_ulong arm_r9;
|
|
993 |
target_ulong arm_r10;
|
|
994 |
target_ulong arm_fp;
|
|
995 |
target_ulong arm_ip;
|
|
996 |
target_ulong arm_sp;
|
|
997 |
target_ulong arm_lr;
|
|
998 |
target_ulong arm_pc;
|
|
999 |
target_ulong arm_cpsr;
|
|
1000 |
target_ulong fault_address;
|
|
980 |
abi_ulong trap_no;
|
|
981 |
abi_ulong error_code;
|
|
982 |
abi_ulong oldmask;
|
|
983 |
abi_ulong arm_r0;
|
|
984 |
abi_ulong arm_r1;
|
|
985 |
abi_ulong arm_r2;
|
|
986 |
abi_ulong arm_r3;
|
|
987 |
abi_ulong arm_r4;
|
|
988 |
abi_ulong arm_r5;
|
|
989 |
abi_ulong arm_r6;
|
|
990 |
abi_ulong arm_r7;
|
|
991 |
abi_ulong arm_r8;
|
|
992 |
abi_ulong arm_r9;
|
|
993 |
abi_ulong arm_r10;
|
|
994 |
abi_ulong arm_fp;
|
|
995 |
abi_ulong arm_ip;
|
|
996 |
abi_ulong arm_sp;
|
|
997 |
abi_ulong arm_lr;
|
|
998 |
abi_ulong arm_pc;
|
|
999 |
abi_ulong arm_cpsr;
|
|
1000 |
abi_ulong fault_address;
|
|
1001 | 1001 |
}; |
1002 | 1002 |
|
1003 | 1003 |
struct target_ucontext { |
1004 |
target_ulong tuc_flags;
|
|
1005 |
target_ulong tuc_link;
|
|
1004 |
abi_ulong tuc_flags;
|
|
1005 |
abi_ulong tuc_link;
|
|
1006 | 1006 |
target_stack_t tuc_stack; |
1007 | 1007 |
struct target_sigcontext tuc_mcontext; |
1008 | 1008 |
target_sigset_t tuc_sigmask; /* mask last for extensibility */ |
... | ... | |
1011 | 1011 |
struct sigframe |
1012 | 1012 |
{ |
1013 | 1013 |
struct target_sigcontext sc; |
1014 |
target_ulong extramask[TARGET_NSIG_WORDS-1];
|
|
1015 |
target_ulong retcode;
|
|
1014 |
abi_ulong extramask[TARGET_NSIG_WORDS-1];
|
|
1015 |
abi_ulong retcode;
|
|
1016 | 1016 |
}; |
1017 | 1017 |
|
1018 | 1018 |
struct rt_sigframe |
... | ... | |
1021 | 1021 |
void *puc; |
1022 | 1022 |
struct target_siginfo info; |
1023 | 1023 |
struct target_ucontext uc; |
1024 |
target_ulong retcode;
|
|
1024 |
abi_ulong retcode;
|
|
1025 | 1025 |
}; |
1026 | 1026 |
|
1027 | 1027 |
#define TARGET_CONFIG_CPU_32 1 |
... | ... | |
1039 | 1039 |
#define SWI_THUMB_SIGRETURN (0xdf00 << 16 | 0x2700 | (TARGET_NR_sigreturn)) |
1040 | 1040 |
#define SWI_THUMB_RT_SIGRETURN (0xdf00 << 16 | 0x2700 | (TARGET_NR_rt_sigreturn)) |
1041 | 1041 |
|
1042 |
static const target_ulong retcodes[4] = {
|
|
1042 |
static const abi_ulong retcodes[4] = {
|
|
1043 | 1043 |
SWI_SYS_SIGRETURN, SWI_THUMB_SIGRETURN, |
1044 | 1044 |
SWI_SYS_RT_SIGRETURN, SWI_THUMB_RT_SIGRETURN |
1045 | 1045 |
}; |
... | ... | |
1105 | 1105 |
|
1106 | 1106 |
static int |
1107 | 1107 |
setup_return(CPUState *env, struct emulated_sigaction *ka, |
1108 |
target_ulong *rc, void *frame, int usig)
|
|
1108 |
abi_ulong *rc, void *frame, int usig)
|
|
1109 | 1109 |
{ |
1110 |
target_ulong handler = (target_ulong)ka->sa._sa_handler;
|
|
1111 |
target_ulong retcode;
|
|
1110 |
abi_ulong handler = (abi_ulong)ka->sa._sa_handler;
|
|
1111 |
abi_ulong retcode;
|
|
1112 | 1112 |
int thumb = 0; |
1113 | 1113 |
#if defined(TARGET_CONFIG_CPU_32) |
1114 | 1114 |
#if 0 |
1115 |
target_ulong cpsr = env->cpsr;
|
|
1115 |
abi_ulong cpsr = env->cpsr;
|
|
1116 | 1116 |
|
1117 | 1117 |
/* |
1118 | 1118 |
* Maybe we need to deliver a 32-bit signal to a 26-bit task. |
... | ... | |
1138 | 1138 |
#endif /* TARGET_CONFIG_CPU_32 */ |
1139 | 1139 |
|
1140 | 1140 |
if (ka->sa.sa_flags & TARGET_SA_RESTORER) { |
1141 |
retcode = (target_ulong)ka->sa.sa_restorer;
|
|
1141 |
retcode = (abi_ulong)ka->sa.sa_restorer;
|
|
1142 | 1142 |
} else { |
1143 | 1143 |
unsigned int idx = thumb; |
1144 | 1144 |
|
... | ... | |
1148 | 1148 |
if (__put_user(retcodes[idx], rc)) |
1149 | 1149 |
return 1; |
1150 | 1150 |
#if 0 |
1151 |
flush_icache_range((target_ulong)rc,
|
|
1152 |
(target_ulong)(rc + 1));
|
|
1151 |
flush_icache_range((abi_ulong)rc,
|
|
1152 |
(abi_ulong)(rc + 1));
|
|
1153 | 1153 |
#endif |
1154 |
retcode = ((target_ulong)rc) + thumb;
|
|
1154 |
retcode = ((abi_ulong)rc) + thumb;
|
|
1155 | 1155 |
} |
1156 | 1156 |
|
1157 | 1157 |
env->regs[0] = usig; |
... | ... | |
1197 | 1197 |
if (!access_ok(VERIFY_WRITE, frame, sizeof (*frame))) |
1198 | 1198 |
return /* 1 */; |
1199 | 1199 |
|
1200 |
__put_user_error(&frame->info, (target_ulong *)&frame->pinfo, err);
|
|
1201 |
__put_user_error(&frame->uc, (target_ulong *)&frame->puc, err);
|
|
1200 |
__put_user_error(&frame->info, (abi_ulong *)&frame->pinfo, err);
|
|
1201 |
__put_user_error(&frame->uc, (abi_ulong *)&frame->puc, err);
|
|
1202 | 1202 |
err |= copy_siginfo_to_user(&frame->info, info); |
1203 | 1203 |
|
1204 | 1204 |
/* Clear all the bits of the ucontext we don't use. */ |
... | ... | |
1229 | 1229 |
* arguments for the signal handler. |
1230 | 1230 |
* -- Peter Maydell <pmaydell@chiark.greenend.org.uk> 2000-12-06 |
1231 | 1231 |
*/ |
1232 |
env->regs[1] = (target_ulong)frame->pinfo;
|
|
1233 |
env->regs[2] = (target_ulong)frame->puc;
|
|
1232 |
env->regs[1] = (abi_ulong)frame->pinfo;
|
|
1233 |
env->regs[2] = (abi_ulong)frame->puc;
|
|
1234 | 1234 |
} |
1235 | 1235 |
|
1236 | 1236 |
// return err; |
... | ... | |
1360 | 1360 |
|
1361 | 1361 |
/* This is what SunOS does, so shall I. */ |
1362 | 1362 |
struct target_sigcontext { |
1363 |
target_ulong sigc_onstack; /* state to restore */
|
|
1363 |
abi_ulong sigc_onstack; /* state to restore */
|
|
1364 | 1364 |
|
1365 |
target_ulong sigc_mask; /* sigmask to restore */
|
|
1366 |
target_ulong sigc_sp; /* stack pointer */
|
|
1367 |
target_ulong sigc_pc; /* program counter */
|
|
1368 |
target_ulong sigc_npc; /* next program counter */
|
|
1369 |
target_ulong sigc_psr; /* for condition codes etc */
|
|
1370 |
target_ulong sigc_g1; /* User uses these two registers */
|
|
1371 |
target_ulong sigc_o0; /* within the trampoline code. */
|
|
1365 |
abi_ulong sigc_mask; /* sigmask to restore */
|
|
1366 |
abi_ulong sigc_sp; /* stack pointer */
|
|
1367 |
abi_ulong sigc_pc; /* program counter */
|
|
1368 |
abi_ulong sigc_npc; /* next program counter */
|
|
1369 |
abi_ulong sigc_psr; /* for condition codes etc */
|
|
1370 |
abi_ulong sigc_g1; /* User uses these two registers */
|
|
1371 |
abi_ulong sigc_o0; /* within the trampoline code. */
|
|
1372 | 1372 |
|
1373 | 1373 |
/* Now comes information regarding the users window set |
1374 | 1374 |
* at the time of the signal. |
1375 | 1375 |
*/ |
1376 |
target_ulong sigc_oswins; /* outstanding windows */
|
|
1376 |
abi_ulong sigc_oswins; /* outstanding windows */
|
|
1377 | 1377 |
|
1378 | 1378 |
/* stack ptrs for each regwin buf */ |
1379 | 1379 |
char *sigc_spbuf[__SUNOS_MAXWIN]; |
1380 | 1380 |
|
1381 | 1381 |
/* Windows to restore after signal */ |
1382 | 1382 |
struct { |
1383 |
target_ulong locals[8];
|
|
1384 |
target_ulong ins[8];
|
|
1383 |
abi_ulong locals[8];
|
|
1384 |
abi_ulong ins[8];
|
|
1385 | 1385 |
} sigc_wbuf[__SUNOS_MAXWIN]; |
1386 | 1386 |
}; |
1387 | 1387 |
/* A Sparc stack frame */ |
1388 | 1388 |
struct sparc_stackf { |
1389 |
target_ulong locals[8];
|
|
1390 |
target_ulong ins[6];
|
|
1389 |
abi_ulong locals[8];
|
|
1390 |
abi_ulong ins[6];
|
|
1391 | 1391 |
struct sparc_stackf *fp; |
1392 |
target_ulong callers_pc;
|
|
1392 |
abi_ulong callers_pc;
|
|
1393 | 1393 |
char *structptr; |
1394 |
target_ulong xargs[6];
|
|
1395 |
target_ulong xxargs[1];
|
|
1394 |
abi_ulong xargs[6];
|
|
1395 |
abi_ulong xxargs[1];
|
|
1396 | 1396 |
}; |
1397 | 1397 |
|
1398 | 1398 |
typedef struct { |
1399 | 1399 |
struct { |
1400 |
target_ulong psr;
|
|
1401 |
target_ulong pc;
|
|
1402 |
target_ulong npc;
|
|
1403 |
target_ulong y;
|
|
1404 |
target_ulong u_regs[16]; /* globals and ins */
|
|
1400 |
abi_ulong psr;
|
|
1401 |
abi_ulong pc;
|
|
1402 |
abi_ulong npc;
|
|
1403 |
abi_ulong y;
|
|
1404 |
abi_ulong u_regs[16]; /* globals and ins */
|
|
1405 | 1405 |
} si_regs; |
1406 | 1406 |
int si_mask; |
1407 | 1407 |
} __siginfo_t; |
... | ... | |
1421 | 1421 |
struct sparc_stackf ss; |
1422 | 1422 |
__siginfo_t info; |
1423 | 1423 |
qemu_siginfo_fpu_t *fpu_save; |
1424 |
target_ulong insns[2] __attribute__ ((aligned (8)));
|
|
1425 |
target_ulong extramask[TARGET_NSIG_WORDS - 1];
|
|
1426 |
target_ulong extra_size; /* Should be 0 */
|
|
1424 |
abi_ulong insns[2] __attribute__ ((aligned (8)));
|
|
1425 |
abi_ulong extramask[TARGET_NSIG_WORDS - 1];
|
|
1426 |
abi_ulong extra_size; /* Should be 0 */
|
|
1427 | 1427 |
qemu_siginfo_fpu_t fpu_state; |
1428 | 1428 |
}; |
1429 | 1429 |
struct target_rt_signal_frame { |
1430 | 1430 |
struct sparc_stackf ss; |
1431 | 1431 |
siginfo_t info; |
1432 |
target_ulong regs[20];
|
|
1432 |
abi_ulong regs[20];
|
|
1433 | 1433 |
sigset_t mask; |
1434 | 1434 |
qemu_siginfo_fpu_t *fpu_save; |
1435 | 1435 |
unsigned int insns[2]; |
... | ... | |
1468 | 1468 |
} |
1469 | 1469 |
|
1470 | 1470 |
static int |
1471 |
setup___siginfo(__siginfo_t *si, CPUState *env, target_ulong mask)
|
|
1471 |
setup___siginfo(__siginfo_t *si, CPUState *env, abi_ulong mask)
|
|
1472 | 1472 |
{ |
1473 | 1473 |
int err = 0, i; |
1474 | 1474 |
|
... | ... | |
1634 | 1634 |
uint32_t up_psr, pc, npc; |
1635 | 1635 |
target_sigset_t set; |
1636 | 1636 |
sigset_t host_set; |
1637 |
target_ulong fpu_save;
|
|
1637 |
abi_ulong fpu_save;
|
|
1638 | 1638 |
int err, i; |
1639 | 1639 |
|
1640 | 1640 |
sf = (struct target_signal_frame *)g2h(env->regwptr[UREG_FP]); |
... | ... | |
1676 | 1676 |
err |= __get_user(env->regwptr[i + UREG_I0], &sf->info.si_regs.u_regs[i+8]); |
1677 | 1677 |
} |
1678 | 1678 |
|
1679 |
err |= __get_user(fpu_save, (target_ulong *)&sf->fpu_save);
|
|
1679 |
err |= __get_user(fpu_save, (abi_ulong *)&sf->fpu_save);
|
|
1680 | 1680 |
|
1681 | 1681 |
//if (fpu_save) |
1682 | 1682 |
// err |= restore_fpu_state(env, fpu_save); |
... | ... | |
1729 | 1729 |
#define MC_O7 18 |
1730 | 1730 |
#define MC_NGREG 19 |
1731 | 1731 |
|
1732 |
typedef target_ulong target_mc_greg_t;
|
|
1732 |
typedef abi_ulong target_mc_greg_t;
|
|
1733 | 1733 |
typedef target_mc_greg_t target_mc_gregset_t[MC_NGREG]; |
1734 | 1734 |
|
1735 | 1735 |
struct target_mc_fq { |
1736 |
target_ulong *mcfq_addr;
|
|
1736 |
abi_ulong *mcfq_addr;
|
|
1737 | 1737 |
uint32_t mcfq_insn; |
1738 | 1738 |
}; |
1739 | 1739 |
|
... | ... | |
1743 | 1743 |
uint64_t dregs[32]; |
1744 | 1744 |
//uint128_t qregs[16]; |
1745 | 1745 |
} mcfpu_fregs; |
1746 |
target_ulong mcfpu_fsr;
|
|
1747 |
target_ulong mcfpu_fprs;
|
|
1748 |
target_ulong mcfpu_gsr;
|
|
1746 |
abi_ulong mcfpu_fsr;
|
|
1747 |
abi_ulong mcfpu_fprs;
|
|
1748 |
abi_ulong mcfpu_gsr;
|
|
1749 | 1749 |
struct target_mc_fq *mcfpu_fq; |
1750 | 1750 |
unsigned char mcfpu_qcnt; |
1751 | 1751 |
unsigned char mcfpu_qentsz; |
... | ... | |
1762 | 1762 |
|
1763 | 1763 |
struct target_ucontext { |
1764 | 1764 |
struct target_ucontext *uc_link; |
1765 |
target_ulong uc_flags;
|
|
1765 |
abi_ulong uc_flags;
|
|
1766 | 1766 |
target_sigset_t uc_sigmask; |
1767 | 1767 |
target_mcontext_t uc_mcontext; |
1768 | 1768 |
}; |
1769 | 1769 |
|
1770 | 1770 |
/* A V9 register window */ |
1771 | 1771 |
struct target_reg_window { |
1772 |
target_ulong locals[8];
|
|
1773 |
target_ulong ins[8];
|
|
1772 |
abi_ulong locals[8];
|
|
1773 |
abi_ulong ins[8];
|
|
1774 | 1774 |
}; |
1775 | 1775 |
|
1776 | 1776 |
#define TARGET_STACK_BIAS 2047 |
... | ... | |
1781 | 1781 |
struct target_ucontext *ucp = (struct target_ucontext *) |
1782 | 1782 |
env->regwptr[UREG_I0]; |
1783 | 1783 |
target_mc_gregset_t *grp; |
1784 |
target_ulong pc, npc, tstate;
|
|
1785 |
target_ulong fp, i7;
|
|
1784 |
abi_ulong pc, npc, tstate;
|
|
1785 |
abi_ulong fp, i7;
|
|
1786 | 1786 |
unsigned char fenab; |
1787 | 1787 |
int err; |
1788 | 1788 |
unsigned int i; |
1789 |
target_ulong *src, *dst;
|
|
1789 |
abi_ulong *src, *dst;
|
|
1790 | 1790 |
|
1791 | 1791 |
grp = &ucp->uc_mcontext.mc_gregs; |
1792 | 1792 |
err = get_user(pc, &((*grp)[MC_PC])); |
... | ... | |
1803 | 1803 |
} else { |
1804 | 1804 |
src = &ucp->uc_sigmask; |
1805 | 1805 |
dst = &target_set; |
1806 |
for (i = 0; i < sizeof(target_sigset_t) / sizeof(target_ulong);
|
|
1806 |
for (i = 0; i < sizeof(target_sigset_t) / sizeof(abi_ulong);
|
|
1807 | 1807 |
i++, dst++, src++) |
1808 | 1808 |
err |= get_user(dst, src); |
1809 | 1809 |
if (err) |
... | ... | |
1866 | 1866 |
env->regwptr[UREG_I0]; |
1867 | 1867 |
target_mc_gregset_t *grp; |
1868 | 1868 |
target_mcontext_t *mcp; |
1869 |
target_ulong fp, i7;
|
|
1869 |
abi_ulong fp, i7;
|
|
1870 | 1870 |
int err; |
1871 | 1871 |
unsigned int i; |
1872 |
target_ulong *src, *dst;
|
|
1872 |
abi_ulong *src, *dst;
|
|
1873 | 1873 |
target_sigset_t target_set; |
1874 | 1874 |
sigset_t set; |
1875 | 1875 |
|
... | ... | |
1886 | 1886 |
host_to_target_sigset_internal(&target_set, &set); |
1887 | 1887 |
if (TARGET_NSIG_WORDS == 1) |
1888 | 1888 |
err |= put_user(target_set.sig[0], |
1889 |
(target_ulong *)&ucp->uc_sigmask);
|
|
1889 |
(abi_ulong *)&ucp->uc_sigmask);
|
|
1890 | 1890 |
else { |
1891 | 1891 |
src = &target_set; |
1892 | 1892 |
dst = &ucp->uc_sigmask; |
1893 |
for (i = 0; i < sizeof(target_sigset_t) / sizeof(target_ulong);
|
|
1893 |
for (i = 0; i < sizeof(target_sigset_t) / sizeof(abi_ulong);
|
|
1894 | 1894 |
i++, dst++, src++) |
1895 | 1895 |
err |= put_user(src, dst); |
1896 | 1896 |
if (err) |
... | ... | |
2354 | 2354 |
void process_pending_signals(void *cpu_env) |
2355 | 2355 |
{ |
2356 | 2356 |
int sig; |
2357 |
target_ulong handler;
|
|
2357 |
abi_ulong handler;
|
|
2358 | 2358 |
sigset_t set, old_set; |
2359 | 2359 |
target_sigset_t target_old_set; |
2360 | 2360 |
struct emulated_sigaction *k; |
Also available in: Unified diff