Revision 192c7bd9 linux-user/main.c
b/linux-user/main.c | ||
---|---|---|
359 | 359 |
case EXCP_SWI: |
360 | 360 |
{ |
361 | 361 |
/* system call */ |
362 |
insn = ldl((void *)(env->regs[15] - 4)); |
|
363 |
n = insn & 0xffffff; |
|
362 |
if (env->thumb) { |
|
363 |
insn = lduw((void *)(env->regs[15] - 2)); |
|
364 |
n = insn & 0xff; |
|
365 |
} else { |
|
366 |
insn = ldl((void *)(env->regs[15] - 4)); |
|
367 |
n = insn & 0xffffff; |
|
368 |
} |
|
369 |
|
|
364 | 370 |
if (n == ARM_NR_cacheflush) { |
365 | 371 |
arm_cache_flush(env->regs[0], env->regs[1]); |
366 | 372 |
} else if (n == ARM_NR_semihosting |
367 | 373 |
|| n == ARM_NR_thumb_semihosting) { |
368 | 374 |
env->regs[0] = do_arm_semihosting (env); |
369 |
} else if (n >= ARM_SYSCALL_BASE) { |
|
375 |
} else if (n >= ARM_SYSCALL_BASE |
|
376 |
|| (env->thumb && n == ARM_THUMB_SYSCALL)) { |
|
370 | 377 |
/* linux syscall */ |
371 |
n -= ARM_SYSCALL_BASE; |
|
378 |
if (env->thumb) { |
|
379 |
n = env->regs[7]; |
|
380 |
} else { |
|
381 |
n -= ARM_SYSCALL_BASE; |
|
382 |
} |
|
372 | 383 |
env->regs[0] = do_syscall(env, |
373 | 384 |
n, |
374 | 385 |
env->regs[0], |
Also available in: Unified diff