--- trunk/src/useremul.c 2007/10/08 16:18:38 12 +++ trunk/src/useremul.c 2007/10/08 16:18:51 14 @@ -25,15 +25,15 @@ * SUCH DAMAGE. * * - * $Id: useremul.c,v 1.62 2005/08/16 06:49:26 debug Exp $ + * $Id: useremul.c,v 1.64 2005/08/27 17:29:06 debug Exp $ * * Userland (syscall) emulation. * * TODO: * - * NetBSD/pmax: - * environment passing - * more syscalls + * environment passing for most emulation modes + * + * implement more syscalls * * 32-bit vs 64-bit problems? MIPS n32, o32, n64? * @@ -232,6 +232,10 @@ } break; + case ARCH_ALPHA: + debug("useremul__netbsd_setup(): ALPHA: TODO\n"); + break; + case ARCH_ARM: debug("useremul__netbsd_setup(): ARM: TODO\n"); break; @@ -828,6 +832,18 @@ arg3 = cpu->cd.ppc.gpr[6]; /* TODO: More arguments? Stack arguments? */ break; + + case ARCH_ARM: + sysnr = code & 0xfffff; + arg0 = cpu->cd.arm.r[0]; + arg1 = cpu->cd.arm.r[1]; + arg2 = cpu->cd.arm.r[2]; + arg3 = cpu->cd.arm.r[3]; + /* TODO: More arguments? Stack arguments? */ + break; + + default:fatal("netbsd syscall for this arch: TODO\n"); + exit(1); } /* @@ -1187,6 +1203,17 @@ switch (cpu->machine->arch) { + case ARCH_ARM: + /* NetBSD/arm return values: */ + cpu->cd.arm.r[0] = result_low; + cpu->cd.arm.cpsr &= ~ARM_FLAG_C; + if (error_flag) { + cpu->cd.arm.cpsr |= ARM_FLAG_C; + cpu->cd.arm.r[0] = error_code; + } + if (result_high_set) + cpu->cd.arm.r[1] = result_high; + break; case ARCH_MIPS: /* * NetBSD/mips return values: @@ -1729,12 +1756,15 @@ add_useremul("NetBSD/pmax", ARCH_MIPS, "R3000", useremul__netbsd, useremul__netbsd_setup); - add_useremul("NetBSD/arm", ARCH_ARM, "ARM", + add_useremul("NetBSD/arm", ARCH_ARM, "SA1110", useremul__netbsd, useremul__netbsd_setup); add_useremul("NetBSD/amd64", ARCH_X86, "AMD64", useremul__netbsd, useremul__netbsd_setup); + add_useremul("NetBSD/alpha", ARCH_ALPHA, "Alpha", + useremul__netbsd, useremul__netbsd_setup); + add_useremul("Linux/PPC64", ARCH_PPC, "PPC970", useremul__linux, useremul__linux_setup);