mirror of
https://github.com/elliotnunn/wedge.git
synced 2024-11-21 16:30:48 +00:00
95df455703
The Wedge is a C program that, when inserted into a PowerPC ROM, runs just before the NanoKernel. This is very early in the boot process. The Wedge takes this opportunity to rearrange the MacOS address space and make more than 1.5 GB RAM available to applications. Some serious problems remain with this approach, so a "proper" solution to the 1.5 GB RAM limit will take more work. This code was ripped out of the old CDG5 build system and refactored. It it more appropriate to keep the Wedge separate from the real OS code.
85 lines
2.3 KiB
ArmAsm
85 lines
2.3 KiB
ArmAsm
; MakeFunction sets up everything you need to make an assembly function
|
|
; callable from C and debuggable with a symbolic debugger. It does the following:
|
|
; - export the function's transition vector
|
|
; - export the function name
|
|
; - create a toc entry for the function's transition vector
|
|
; - create the transition vector, which must contain
|
|
; - the function entry point (the name of the function)
|
|
; - the TOC anchor (the predefined variable TOC[tc0])
|
|
; - tell PPCAsm to create a function entry point symbol for symbolic debuggers
|
|
; - create a csect for the function (one csect per function lets the
|
|
; linker do dead code stripping, resulting in smaller executables)
|
|
|
|
MACRO
|
|
MakeFunction &fnName
|
|
EXPORT &fnName[DS]
|
|
EXPORT .&fnName[PR]
|
|
|
|
TC &fnName[TC], &fnName[DS]
|
|
|
|
CSECT &fnName[DS]
|
|
DC.L .&fnName[PR]
|
|
DC.L TOC[tc0]
|
|
|
|
CSECT .&fnName[PR]
|
|
FUNCTION .&fnName[PR]
|
|
|
|
ENDM
|
|
|
|
linkageArea: set 24 ; constant comes from the PowerPC Runtime Architecture Document
|
|
CalleesParams: set 32 ; always leave space for GPR's 3-10
|
|
CalleesLocalVars: set 0 ; NKxprintf doesn't have any
|
|
numGPRs: set 0 ; num volitile GPR's (GPR's 13-31) used by NKxprintf
|
|
numFPRs: set 0 ; num volitile FPR's (FPR's 14-31) used by NKxprintf
|
|
|
|
spaceToSave: set linkageArea + CalleesParams + CalleesLocalVars + 4*numGPRs + 8*numFPRs
|
|
|
|
; declare the C function DisplayAlert as external
|
|
import .DisplayAlert
|
|
|
|
import gHelloString ; global variable from C program
|
|
import gGoodbyeString ; global variable from C program
|
|
|
|
toc
|
|
tc gHelloString[TC], gHelloString
|
|
tc gGoodbyeString[TC], gGoodbyeString
|
|
|
|
|
|
; Call the MakeFunction macro, defined in MakeFunction.s to begin the function
|
|
MakeFunction NKxprintf
|
|
|
|
li r0, 96
|
|
sc
|
|
blr
|
|
|
|
|
|
MakeFunction NKLocateInfoRecord ; Lifted shamelessly from MPLibrary
|
|
|
|
stw r4,0x001C(SP)
|
|
stw r5,0x0020(SP)
|
|
stw r6,0x0024(SP)
|
|
li r0,107
|
|
sc
|
|
cmpwi r3,0
|
|
bnelr
|
|
lwz r7,0x001C(SP)
|
|
lwz r8,0x0020(SP)
|
|
lwz r9,0x0024(SP)
|
|
cmplwi cr5,r7,0x0000
|
|
cmplwi cr6,r8,0x0000
|
|
cmplwi cr7,r9,0x0000
|
|
beq cr5,$+0x0008 ; 0x00008440
|
|
stw r4,0x0000(r7)
|
|
beq cr6,$+0x0008 ; 0x00008448
|
|
stw r5,0x0000(r8)
|
|
beq cr7,$+0x0008 ; 0x00008450
|
|
stw r6,0x0000(r9)
|
|
blr
|
|
|
|
|
|
MakeFunction NKKernelDebuggerCmd
|
|
|
|
li r0, 200
|
|
sc
|
|
blr
|