| 331 |
int trapnr; |
int trapnr; |
| 332 |
unsigned int n, insn; |
unsigned int n, insn; |
| 333 |
target_siginfo_t info; |
target_siginfo_t info; |
| 334 |
|
uint32_t addr; |
| 335 |
|
|
| 336 |
for(;;) { |
for(;;) { |
| 337 |
trapnr = cpu_arm_exec(env); |
trapnr = cpu_arm_exec(env); |
| 398 |
/* just indicate that signals should be handled asap */ |
/* just indicate that signals should be handled asap */ |
| 399 |
break; |
break; |
| 400 |
case EXCP_PREFETCH_ABORT: |
case EXCP_PREFETCH_ABORT: |
| 401 |
|
addr = env->cp15.c6_data; |
| 402 |
|
goto do_segv; |
| 403 |
case EXCP_DATA_ABORT: |
case EXCP_DATA_ABORT: |
| 404 |
|
addr = env->cp15.c6_insn; |
| 405 |
|
goto do_segv; |
| 406 |
|
do_segv: |
| 407 |
{ |
{ |
| 408 |
info.si_signo = SIGSEGV; |
info.si_signo = SIGSEGV; |
| 409 |
info.si_errno = 0; |
info.si_errno = 0; |
| 410 |
/* XXX: check env->error_code */ |
/* XXX: check env->error_code */ |
| 411 |
info.si_code = TARGET_SEGV_MAPERR; |
info.si_code = TARGET_SEGV_MAPERR; |
| 412 |
info._sifields._sigfault._addr = env->cp15_6; |
info._sifields._sigfault._addr = addr; |
| 413 |
queue_signal(info.si_signo, &info); |
queue_signal(info.si_signo, &info); |
| 414 |
} |
} |
| 415 |
break; |
break; |
| 1196 |
#elif defined(TARGET_ARM) |
#elif defined(TARGET_ARM) |
| 1197 |
{ |
{ |
| 1198 |
int i; |
int i; |
| 1199 |
|
cpsr_write(env, regs->uregs[16], 0xffffffff); |
| 1200 |
for(i = 0; i < 16; i++) { |
for(i = 0; i < 16; i++) { |
| 1201 |
env->regs[i] = regs->uregs[i]; |
env->regs[i] = regs->uregs[i]; |
| 1202 |
} |
} |
|
env->cpsr = regs->uregs[16]; |
|
| 1203 |
ts->stack_base = info->start_stack; |
ts->stack_base = info->start_stack; |
| 1204 |
ts->heap_base = info->brk; |
ts->heap_base = info->brk; |
| 1205 |
/* This will be filled in on the first SYS_HEAPINFO call. */ |
/* This will be filled in on the first SYS_HEAPINFO call. */ |