--- SheepShaver/src/thunks.cpp 2004/06/22 17:10:06 1.10 +++ SheepShaver/src/thunks.cpp 2006/05/13 17:12:18 1.17 @@ -56,12 +56,17 @@ uint32 NativeOpcode(int selector) uint32 opcode; switch (selector) { case NATIVE_CHECK_LOAD_INVOC: + case NATIVE_NAMED_CHECK_LOAD_INVOC: opcode = POWERPC_NATIVE_OP(0, selector); break; case NATIVE_PATCH_NAME_REGISTRY: case NATIVE_VIDEO_INSTALL_ACCEL: case NATIVE_VIDEO_VBL: case NATIVE_VIDEO_DO_DRIVER_IO: + case NATIVE_ETHER_AO_GET_HWADDR: + case NATIVE_ETHER_AO_ADD_MULTI: + case NATIVE_ETHER_AO_DEL_MULTI: + case NATIVE_ETHER_AO_SEND_PACKET: case NATIVE_ETHER_IRQ: case NATIVE_ETHER_INIT: case NATIVE_ETHER_TERM: @@ -81,13 +86,16 @@ uint32 NativeOpcode(int selector) case NATIVE_GET_IND_RESOURCE: case NATIVE_GET_1_IND_RESOURCE: case NATIVE_R_GET_RESOURCE: + case NATIVE_GET_NAMED_RESOURCE: + case NATIVE_GET_1_NAMED_RESOURCE: case NATIVE_MAKE_EXECUTABLE: - case NATIVE_SYNC_HOOK: - case NATIVE_BITBLT_HOOK: - case NATIVE_FILLRECT_HOOK: - case NATIVE_BITBLT: - case NATIVE_INVRECT: - case NATIVE_FILLRECT: + case NATIVE_NQD_SYNC_HOOK: + case NATIVE_NQD_BITBLT_HOOK: + case NATIVE_NQD_FILLRECT_HOOK: + case NATIVE_NQD_UNKNOWN_HOOK: + case NATIVE_NQD_BITBLT: + case NATIVE_NQD_INVRECT: + case NATIVE_NQD_FILLRECT: opcode = POWERPC_NATIVE_OP(1, selector); break; default: @@ -108,9 +116,15 @@ static uint32 get_1_resource_func; static uint32 get_ind_resource_func; static uint32 get_1_ind_resource_func; static uint32 r_get_resource_func; +static uint32 get_named_resource_func; +static uint32 get_1_named_resource_func; static void generate_powerpc_thunks(void) { + // check_load_invoc() thunk + uint32 check_load_invoc_opcode = NativeOpcode(NATIVE_CHECK_LOAD_INVOC); + uint32 base; + static uint32 get_resource_template[] = { PL(0x7c0802a6), // mflr r0 PL(0x90010008), // stw r0,8(r1) @@ -148,9 +162,6 @@ static void generate_powerpc_thunks(void } assert(xlm_index != -1 && check_load_invoc_index != -1); - uint32 check_load_invoc_opcode = NativeOpcode(NATIVE_CHECK_LOAD_INVOC); - uintptr base; - // GetResource() get_resource_func = base = SheepMem::Reserve(get_resource_template_size); Host2Mac_memcpy(base, get_resource_template, get_resource_template_size); @@ -180,6 +191,58 @@ static void generate_powerpc_thunks(void Host2Mac_memcpy(base, get_resource_template, get_resource_template_size); WriteMacInt32(base + xlm_index * 4, 0x80000000 | XLM_R_GET_RESOURCE); WriteMacInt32(base + check_load_invoc_index * 4, check_load_invoc_opcode); + + // named_check_load_invoc() thunk + check_load_invoc_opcode = NativeOpcode(NATIVE_NAMED_CHECK_LOAD_INVOC); + + static uint32 get_named_resource_template[] = { + PL(0x7c0802a6), // mflr r0 + PL(0x90010008), // stw r0,8(r1) + PL(0x9421ffbc), // stwu r1,-68(r1) + PL(0x90610038), // stw r3,56(r1) + PL(0x9081003c), // stw r4,60(r1) + PL(0x00000000), // lwz r0,XLM_GET_NAMED_RESOURCE(r0) + PL(0x80402834), // lwz r2,XLM_RES_LIB_TOC(r0) + PL(0x7c0903a6), // mtctr r0 + PL(0x4e800421), // bctrl + PL(0x90610040), // stw r3,64(r1) + PL(0x80610038), // lwz r3,56(r1) + PL(0x8081003c), // lwz r4,60(r1) + PL(0x80a10040), // lwz r5,64(r1) + PL(0x00000001), // + PL(0x80610040), // lwz r3,64(r1) + PL(0x8001004c), // lwz r0,76(r1) + PL(0x7c0803a6), // mtlr r0 + PL(0x38210044), // addi r1,r1,68 + PL(0x4e800020) // blr + }; + const uint32 get_named_resource_template_size = sizeof(get_named_resource_template); + + xlm_index = -1, check_load_invoc_index = -1; + for (int i = 0; i < get_resource_template_size/4; i++) { + uint32 opcode = ntohl(get_resource_template[i]); + switch (opcode) { + case 0x00000000: + xlm_index = i; + break; + case 0x00000001: + check_load_invoc_index = i; + break; + } + } + assert(xlm_index != -1 && check_load_invoc_index != -1); + + // GetNamedResource() + get_named_resource_func = base = SheepMem::Reserve(get_named_resource_template_size); + Host2Mac_memcpy(base, get_named_resource_template, get_named_resource_template_size); + WriteMacInt32(base + xlm_index * 4, 0x80000000 | XLM_GET_NAMED_RESOURCE); + WriteMacInt32(base + check_load_invoc_index * 4, check_load_invoc_opcode); + + // Get1NamedResource() + get_1_named_resource_func = base = SheepMem::Reserve(get_named_resource_template_size); + Host2Mac_memcpy(base, get_named_resource_template, get_named_resource_template_size); + WriteMacInt32(base + xlm_index * 4, 0x80000000 | XLM_GET_1_NAMED_RESOURCE); + WriteMacInt32(base + check_load_invoc_index * 4, check_load_invoc_opcode); } #endif @@ -213,13 +276,15 @@ bool ThunksInit(void) native_op[NATIVE_GET_IND_RESOURCE].func = get_ind_resource_func; native_op[NATIVE_GET_1_IND_RESOURCE].func = get_1_ind_resource_func; native_op[NATIVE_R_GET_RESOURCE].func = r_get_resource_func; + native_op[NATIVE_GET_NAMED_RESOURCE].func = get_named_resource_func; + native_op[NATIVE_GET_1_NAMED_RESOURCE].func = get_1_named_resource_func; #endif #else -#if defined(__linux__) || (defined(__APPLE__) && defined(__MACH__)) +#if defined(__linux__) || defined(__NetBSD__) || (defined(__APPLE__) && defined(__MACH__)) #define DEFINE_NATIVE_OP(ID, FUNC) do { \ uintptr base = SheepMem::Reserve(8); \ WriteMacInt32(base + 0, (uint32)FUNC); \ - WriteMacInt32(base + 4, 0); /*Fake TVECT*/ \ + WriteMacInt32(base + 4, (uint32)TOC); \ native_op[ID].tvect = base; \ native_op[ID].func = (uint32)FUNC; \ } while (0) @@ -236,6 +301,10 @@ bool ThunksInit(void) DEFINE_NATIVE_OP(NATIVE_VIDEO_INSTALL_ACCEL, VideoInstallAccel); DEFINE_NATIVE_OP(NATIVE_VIDEO_VBL, VideoVBL); DEFINE_NATIVE_OP(NATIVE_VIDEO_DO_DRIVER_IO, VideoDoDriverIO); + DEFINE_NATIVE_OP(NATIVE_ETHER_AO_GET_HWADDR, AO_get_ethernet_address); + DEFINE_NATIVE_OP(NATIVE_ETHER_AO_ADD_MULTI, AO_enable_multicast); + DEFINE_NATIVE_OP(NATIVE_ETHER_AO_DEL_MULTI, AO_disable_multicast); + DEFINE_NATIVE_OP(NATIVE_ETHER_AO_SEND_PACKET, AO_transmit_packet); DEFINE_NATIVE_OP(NATIVE_ETHER_IRQ, EtherIRQ); DEFINE_NATIVE_OP(NATIVE_ETHER_INIT, InitStreamModule); DEFINE_NATIVE_OP(NATIVE_ETHER_TERM, TerminateStreamModule); @@ -251,12 +320,13 @@ bool ThunksInit(void) DEFINE_NATIVE_OP(NATIVE_SERIAL_STATUS, SerialStatus); DEFINE_NATIVE_OP(NATIVE_SERIAL_CLOSE, SerialClose); DEFINE_NATIVE_OP(NATIVE_MAKE_EXECUTABLE, MakeExecutable); - DEFINE_NATIVE_OP(NATIVE_SYNC_HOOK, NQD_sync_hook); - DEFINE_NATIVE_OP(NATIVE_BITBLT_HOOK, NQD_bitblt_hook); - DEFINE_NATIVE_OP(NATIVE_FILLRECT_HOOK, NQD_fillrect_hook); - DEFINE_NATIVE_OP(NATIVE_BITBLT, NQD_bitblt); - DEFINE_NATIVE_OP(NATIVE_INVRECT, NQD_invrect); - DEFINE_NATIVE_OP(NATIVE_FILLRECT, NQD_fillrect); + DEFINE_NATIVE_OP(NATIVE_NQD_SYNC_HOOK, NQD_sync_hook); + DEFINE_NATIVE_OP(NATIVE_NQD_BITBLT_HOOK, NQD_bitblt_hook); + DEFINE_NATIVE_OP(NATIVE_NQD_FILLRECT_HOOK, NQD_fillrect_hook); + DEFINE_NATIVE_OP(NATIVE_NQD_UNKNOWN_HOOK, NQD_unknown_hook); + DEFINE_NATIVE_OP(NATIVE_NQD_BITBLT, NQD_bitblt); + DEFINE_NATIVE_OP(NATIVE_NQD_INVRECT, NQD_invrect); + DEFINE_NATIVE_OP(NATIVE_NQD_FILLRECT, NQD_fillrect); #undef DEFINE_NATIVE_OP #endif