--- SheepShaver/src/Unix/ppc_asm.S 2005/02/20 18:25:45 1.1 +++ SheepShaver/src/Unix/ppc_asm.S 2005/06/25 10:58:47 1.6 @@ -25,27 +25,27 @@ /* - * void *get_toc(void) - Get TOC pointer (small data pointer r13 under Linux) + * void *get_sp(void) - Get stack pointer */ - ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME(get_toc) -C_SYMBOL_NAME(get_toc): - mr r3,r13 + ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME(get_sp) +C_SYMBOL_NAME(get_sp): + mr r3,r1 blr /* - * void *get_sp(void) - Get stack pointer + * void *get_r2(void) - Get r2 */ - ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME(get_sp) -C_SYMBOL_NAME(get_sp): - mr r3,r1 + ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME(get_r2) +C_SYMBOL_NAME(get_r2): + mr r3,r2 blr /* - * void set_r2(uint32 val {r3}) - Set r2 + * void set_r2(void *val {r3}) - Set r2 */ ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME(set_r2) @@ -55,6 +55,25 @@ C_SYMBOL_NAME(set_r2): /* + * void *get_r13(void) - Get r13 (small data pointer under Linux) + */ + + ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME(get_r13) +C_SYMBOL_NAME(get_r13): + mr r3,r13 + blr + +/* + * void set_r13(void *val {r3}) - Set r13 (small data pointer under Linux) + */ + + ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME(set_r13) +C_SYMBOL_NAME(set_r13): + mr r13,r3 + blr + + +/* * void flush_icache_range(void *start {r3}, void *end {r3}) - Flush D and I cache */ @@ -161,7 +180,7 @@ C_SYMBOL_NAME(test_and_set): isync lwarx r5,0,r3 cmpi 0,r5,0x0000 - beq 1f + bne 1f stwcx. r4,0,r3 bne- 0b 1: isync @@ -225,6 +244,8 @@ C_SYMBOL_NAME(jump_to_rom): // Restore PowerPC registers lwz r1,XLM_EMUL_RETURN_STACK(0) + RESTORE_SYSTEM_R2 + RESTORE_SYSTEM_R13 lmw r13,20(r1) lfd f14,20+19*4+0*8(r1) lfd f15,20+19*4+1*8(r1) @@ -324,6 +345,8 @@ C_SYMBOL_NAME(jump_to_rom): lwz r0,56+19*4+18*8+4(r1) mtlr r0 addi r1,r1,56+19*4+18*8 + RESTORE_SYSTEM_R2 + RESTORE_SYSTEM_R13 blr @@ -360,87 +383,88 @@ C_SYMBOL_NAME(jump_to_rom): mfxer r0 stw r0,16(r1) stw r2,12(r1) - stwu r1,-(24+16*4+15*8)(r1) + stwu r1,-(56+16*4+15*8)(r1) // Save 68k registers (M68kRegisters) - stw r8,24+0*4(r1) // d[0]..d[7] - stw r9,24+1*4(r1) - stw r10,24+2*4(r1) - stw r11,24+3*4(r1) - stw r12,24+4*4(r1) - stw r13,24+5*4(r1) - stw r14,24+6*4(r1) - stw r15,24+7*4(r1) - stw r16,24+8*4(r1) // a[0]..a[7] - stw r17,24+9*4(r1) - stw r18,24+10*4(r1) - stw r19,24+11*4(r1) - stw r20,24+12*4(r1) - stw r21,24+13*4(r1) - stw r22,24+14*4(r1) - stw r3,24+15*4(r1) - stfd f0,24+16*4+0*8(r1) - stfd f1,24+16*4+1*8(r1) - stfd f2,24+16*4+2*8(r1) - stfd f3,24+16*4+3*8(r1) - stfd f4,24+16*4+4*8(r1) - stfd f5,24+16*4+5*8(r1) - stfd f6,24+16*4+6*8(r1) - stfd f7,24+16*4+7*8(r1) + stw r8,56+0*4(r1) // d[0]..d[7] + stw r9,56+1*4(r1) + stw r10,56+2*4(r1) + stw r11,56+3*4(r1) + stw r12,56+4*4(r1) + stw r13,56+5*4(r1) + stw r14,56+6*4(r1) + stw r15,56+7*4(r1) + stw r16,56+8*4(r1) // a[0]..a[7] + stw r17,56+9*4(r1) + stw r18,56+10*4(r1) + stw r19,56+11*4(r1) + stw r20,56+12*4(r1) + stw r21,56+13*4(r1) + stw r22,56+14*4(r1) + stw r3,56+15*4(r1) + stfd f0,56+16*4+0*8(r1) + stfd f1,56+16*4+1*8(r1) + stfd f2,56+16*4+2*8(r1) + stfd f3,56+16*4+3*8(r1) + stfd f4,56+16*4+4*8(r1) + stfd f5,56+16*4+5*8(r1) + stfd f6,56+16*4+6*8(r1) + stfd f7,56+16*4+7*8(r1) mffs f0 - stfd f8,24+16*4+8*8(r1) - stfd f9,24+16*4+9*8(r1) - stfd f10,24+16*4+10*8(r1) - stfd f11,24+16*4+11*8(r1) - stfd f12,24+16*4+12*8(r1) - stfd f13,24+16*4+13*8(r1) - stfd f0,24+16*4+14*8(r1) + stfd f8,56+16*4+8*8(r1) + stfd f9,56+16*4+9*8(r1) + stfd f10,56+16*4+10*8(r1) + stfd f11,56+16*4+11*8(r1) + stfd f12,56+16*4+12*8(r1) + stfd f13,56+16*4+13*8(r1) + stfd f0,56+16*4+14*8(r1) // Execute native routine - lwz r13,XLM_TOC(0) - addi r3,r1,24 + RESTORE_SYSTEM_R2 + RESTORE_SYSTEM_R13 + addi r3,r1,56 mr r4,r24 bl C_SYMBOL_NAME(EmulOp) // Restore 68k registers (M68kRegisters) - lwz r8,24+0*4(r1) // d[0]..d[7] - lwz r9,24+1*4(r1) - lwz r10,24+2*4(r1) - lwz r11,24+3*4(r1) - lwz r12,24+4*4(r1) - lwz r13,24+5*4(r1) - lwz r14,24+6*4(r1) - lwz r15,24+7*4(r1) - lwz r16,24+8*4(r1) // a[0]..a[7] - lwz r17,24+9*4(r1) - lwz r18,24+10*4(r1) - lwz r19,24+11*4(r1) - lwz r20,24+12*4(r1) - lwz r21,24+13*4(r1) - lwz r22,24+14*4(r1) - lwz r3,24+15*4(r1) - lfd f13,24+16*4+14*8(r1) - lfd f0,24+16*4+0*8(r1) - lfd f1,24+16*4+1*8(r1) - lfd f2,24+16*4+2*8(r1) - lfd f3,24+16*4+3*8(r1) - lfd f4,24+16*4+4*8(r1) - lfd f5,24+16*4+5*8(r1) - lfd f6,24+16*4+6*8(r1) - lfd f7,24+16*4+7*8(r1) + lwz r8,56+0*4(r1) // d[0]..d[7] + lwz r9,56+1*4(r1) + lwz r10,56+2*4(r1) + lwz r11,56+3*4(r1) + lwz r12,56+4*4(r1) + lwz r13,56+5*4(r1) + lwz r14,56+6*4(r1) + lwz r15,56+7*4(r1) + lwz r16,56+8*4(r1) // a[0]..a[7] + lwz r17,56+9*4(r1) + lwz r18,56+10*4(r1) + lwz r19,56+11*4(r1) + lwz r20,56+12*4(r1) + lwz r21,56+13*4(r1) + lwz r22,56+14*4(r1) + lwz r3,56+15*4(r1) + lfd f13,56+16*4+14*8(r1) + lfd f0,56+16*4+0*8(r1) + lfd f1,56+16*4+1*8(r1) + lfd f2,56+16*4+2*8(r1) + lfd f3,56+16*4+3*8(r1) + lfd f4,56+16*4+4*8(r1) + lfd f5,56+16*4+5*8(r1) + lfd f6,56+16*4+6*8(r1) + lfd f7,56+16*4+7*8(r1) mtfsf 0xff,f13 - lfd f8,24+16*4+8*8(r1) - lfd f9,24+16*4+9*8(r1) - lfd f10,24+16*4+10*8(r1) - lfd f11,24+16*4+11*8(r1) - lfd f12,24+16*4+12*8(r1) - lfd f13,24+16*4+13*8(r1) + lfd f8,56+16*4+8*8(r1) + lfd f9,56+16*4+9*8(r1) + lfd f10,56+16*4+10*8(r1) + lfd f11,56+16*4+11*8(r1) + lfd f12,56+16*4+12*8(r1) + lfd f13,56+16*4+13*8(r1) // Delete PowerPC stack frame - lwz r2,24+16*4+15*8+12(r1) - lwz r0,24+16*4+15*8+16(r1) + lwz r2,56+16*4+15*8+12(r1) + lwz r0,56+16*4+15*8+16(r1) mtxer r0 - lwz r0,24+16*4+15*8+4(r1) + lwz r0,56+16*4+15*8+4(r1) mtcrf 0xff,r0 mr r1,r3 @@ -573,10 +597,11 @@ ASM_MACRO_START prolog ASM_MACRO_END ASM_MACRO_START epilog - lwz r13,XLM_TOC(0) lwz r0,64+4(r1) mtlr r0 addi r1,r1,64 + RESTORE_SYSTEM_R2 + RESTORE_SYSTEM_R13 blr ASM_MACRO_END @@ -685,8 +710,7 @@ C_SYMBOL_NAME(call_macos7): * Native resource manager patches */ - ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME(get_resource) -C_SYMBOL_NAME(get_resource): +ASM_MACRO_START do_get_resource ASM_MACRO_ARG0_DEF // Create stack frame mflr r0 stw r0,8(r1) @@ -697,13 +721,15 @@ C_SYMBOL_NAME(get_resource): stw r4,56+4(r1) // Call old routine - lwz r0,XLM_GET_RESOURCE(0) + lwz r0,ASM_MACRO_ARG0(0) lwz r2,XLM_RES_LIB_TOC(0) mtctr r0 bctrl stw r3,56+8(r1) // Save handle // Call CheckLoad + RESTORE_SYSTEM_R2 + RESTORE_SYSTEM_R13 lwz r3,56(r1) lha r4,56+6(r1) lwz r5,56+8(r1) @@ -715,130 +741,27 @@ C_SYMBOL_NAME(get_resource): mtlr r0 addi r1,r1,56+12 blr +ASM_MACRO_END + + ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME(get_resource) +C_SYMBOL_NAME(get_resource): + do_get_resource XLM_GET_RESOURCE ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME(get_1_resource) C_SYMBOL_NAME(get_1_resource): - // Create stack frame - mflr r0 - stw r0,8(r1) - stwu r1,-(56+12)(r1) - - // Save type/ID - stw r3,56(r1) - stw r4,56+4(r1) - - // Call old routine - lwz r0,XLM_GET_1_RESOURCE(0) - lwz r2,XLM_RES_LIB_TOC(0) - mtctr r0 - bctrl - stw r3,56+8(r1) // Save handle - - // Call CheckLoad - lwz r3,56(r1) - lha r4,56+6(r1) - lwz r5,56+8(r1) - bl C_SYMBOL_NAME(check_load_invoc) - lwz r3,56+8(r1) // Restore handle - - // Return to caller - lwz r0,56+12+8(r1) - mtlr r0 - addi r1,r1,56+12 - blr + do_get_resource XLM_GET_1_RESOURCE ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME(get_ind_resource) C_SYMBOL_NAME(get_ind_resource): - // Create stack frame - mflr r0 - stw r0,8(r1) - stwu r1,-(56+12)(r1) - - // Save type/index - stw r3,56(r1) - stw r4,56+4(r1) - - // Call old routine - lwz r0,XLM_GET_IND_RESOURCE(0) - lwz r2,XLM_RES_LIB_TOC(0) - mtctr r0 - bctrl - stw r3,56+8(r1) // Save handle - - // Call CheckLoad - lwz r3,56(r1) - lha r4,56+6(r1) - lwz r5,56+8(r1) - bl C_SYMBOL_NAME(check_load_invoc) - lwz r3,56+8(r1) // Restore handle - - // Return to caller - lwz r0,56+12+8(r1) - mtlr r0 - addi r1,r1,56+12 - blr + do_get_resource XLM_GET_IND_RESOURCE ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME(get_1_ind_resource) C_SYMBOL_NAME(get_1_ind_resource): - // Create stack frame - mflr r0 - stw r0,8(r1) - stwu r1,-(56+12)(r1) - - // Save type/index - stw r3,56(r1) - stw r4,56+4(r1) - - // Call old routine - lwz r0,XLM_GET_1_IND_RESOURCE(0) - lwz r2,XLM_RES_LIB_TOC(0) - mtctr r0 - bctrl - stw r3,56+8(r1) // Save handle - - // Call CheckLoad - lwz r3,56(r1) - lha r4,56+6(r1) - lwz r5,56+8(r1) - bl C_SYMBOL_NAME(check_load_invoc) - lwz r3,56+8(r1) // Restore handle - - // Return to caller - lwz r0,56+12+8(r1) - mtlr r0 - addi r1,r1,56+12 - blr + do_get_resource XLM_GET_1_IND_RESOURCE ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME(r_get_resource) C_SYMBOL_NAME(r_get_resource): - // Create stack frame - mflr r0 - stw r0,8(r1) - stwu r1,-(56+12)(r1) - - // Save type/ID - stw r3,56(r1) - stw r4,56+4(r1) - - // Call old routine - lwz r0,XLM_R_GET_RESOURCE(0) - lwz r2,XLM_RES_LIB_TOC(0) - mtctr r0 - bctrl - stw r3,56+8(r1) // Save handle - - // Call CheckLoad - lwz r3,56(r1) - lha r4,56+6(r1) - lwz r5,56+8(r1) - bl C_SYMBOL_NAME(check_load_invoc) - lwz r3,56+8(r1) // Restore handle - - // Return to caller - lwz r0,56+12+8(r1) - mtlr r0 - addi r1,r1,56+12 - blr + do_get_resource XLM_R_GET_RESOURCE /*