--- SheepShaver/src/kpx_cpu/sheepshaver_glue.cpp 2004/07/11 07:54:56 1.50 +++ SheepShaver/src/kpx_cpu/sheepshaver_glue.cpp 2004/11/22 22:04:38 1.53 @@ -42,6 +42,9 @@ #include #include +#ifdef HAVE_MALLOC_H +#include +#endif #ifdef USE_SDL_VIDEO #include @@ -106,7 +109,7 @@ const uint32 POWERPC_EXEC_RETURN = POWER #define INTERRUPTS_IN_NATIVE_MODE 1 // Pointer to Kernel Data -static KernelData * const kernel_data = (KernelData *)KERNEL_DATA_BASE; +static KernelData * kernel_data; // SIGSEGV handler sigsegv_return_t sigsegv_handler(sigsegv_address_t, sigsegv_address_t); @@ -180,9 +183,10 @@ public: // Execute MacOS/PPC code uint32 execute_macos_code(uint32 tvect, int nargs, uint32 const *args); +#if PPC_ENABLE_JIT // Compile one instruction virtual int compile1(codegen_context_t & cg_context); - +#endif // Resource manager thunk void get_resource(uint32 old_get_resource); @@ -318,9 +322,9 @@ void sheepshaver_cpu::execute_sheep(uint } // Compile one instruction +#if PPC_ENABLE_JIT int sheepshaver_cpu::compile1(codegen_context_t & cg_context) { -#if PPC_ENABLE_JIT const instr_info_t *ii = cg_context.instr_info; if (ii->mnemo != PPC_I(SHEEP)) return COMPILE_FAILURE; @@ -466,9 +470,8 @@ int sheepshaver_cpu::compile1(codegen_co } } return status; -#endif - return COMPILE_FAILURE; } +#endif // CPU context to preserve on interrupt sheepshaver_cpu::interrupt_context::interrupt_context(sheepshaver_cpu *_cpu, const char *_where) @@ -812,7 +815,7 @@ sigsegv_return_t sigsegv_handler(sigsegv const uintptr addr = (uintptr)fault_address; #if HAVE_SIGSEGV_SKIP_INSTRUCTION // Ignore writes to ROM - if ((addr - ROM_BASE) < ROM_SIZE) + if ((addr - (uintptr)ROMBaseHost) < ROM_SIZE) return SIGSEGV_RETURN_SKIP_INSTRUCTION; // Get program counter of target CPU @@ -872,6 +875,9 @@ sigsegv_return_t sigsegv_handler(sigsegv void init_emul_ppc(void) { + // Get pointer to KernelData in host address space + kernel_data = (KernelData *)Mac2HostAddr(KERNEL_DATA_BASE); + // Initialize main CPU emulator ppc_cpu = new sheepshaver_cpu(); ppc_cpu->set_register(powerpc_registers::GPR(3), any_register((uint32)ROM_BASE + 0x30d000)); @@ -1042,7 +1048,7 @@ void sheepshaver_cpu::handle_interrupt(v M68kRegisters r; uint32 old_r25 = ReadMacInt32(XLM_68K_R25); // Save interrupt level WriteMacInt32(XLM_68K_R25, 0x21); // Execute with interrupt level 1 - static const uint8 proc[] = { + static const uint8 proc_template[] = { 0x3f, 0x3c, 0x00, 0x00, // move.w #$0000,-(sp) (fake format word) 0x48, 0x7a, 0x00, 0x0a, // pea @1(pc) (return address) 0x40, 0xe7, // move sr,-(sp) (saved SR) @@ -1050,7 +1056,8 @@ void sheepshaver_cpu::handle_interrupt(v 0x4e, 0xd0, // jmp (a0) M68K_RTS >> 8, M68K_RTS & 0xff // @1 }; - Execute68k((uint32)proc, &r); + BUILD_SHEEPSHAVER_PROCEDURE(proc); + Execute68k(proc, &r); WriteMacInt32(XLM_68K_R25, old_r25); // Restore interrupt level #else // Only update cursor @@ -1099,9 +1106,9 @@ void sheepshaver_cpu::execute_native_op( VideoVBL(); break; case NATIVE_VIDEO_DO_DRIVER_IO: - gpr(3) = (int32)(int16)VideoDoDriverIO((void *)gpr(3), (void *)gpr(4), - (void *)gpr(5), gpr(6), gpr(7)); + gpr(3) = (int32)(int16)VideoDoDriverIO(gpr(3), gpr(4), gpr(5), gpr(6), gpr(7)); break; +#ifdef WORDS_BIGENDIAN case NATIVE_ETHER_IRQ: EtherIRQ(); break; @@ -1123,6 +1130,12 @@ void sheepshaver_cpu::execute_native_op( case NATIVE_ETHER_RSRV: gpr(3) = ether_rsrv((queue_t *)gpr(3)); break; +#else + case NATIVE_ETHER_INIT: + // FIXME: needs more complicated thunks + gpr(3) = false; + break; +#endif case NATIVE_SYNC_HOOK: gpr(3) = NQD_sync_hook(gpr(3)); break; @@ -1178,7 +1191,7 @@ void sheepshaver_cpu::execute_native_op( break; } case NATIVE_MAKE_EXECUTABLE: - MakeExecutable(0, (void *)gpr(4), gpr(5)); + MakeExecutable(0, gpr(4), gpr(5)); break; case NATIVE_CHECK_LOAD_INVOC: check_load_invoc(gpr(3), gpr(4), gpr(5));