### entry point code .macro gdbasm_startup # Align the stack pointer to an 8-byte boundary. lhi %r0,-8 nr %r15,%r0 # Reserve space for the standard stack frame: # back chain, and space for the callee to save its registers. ahi %r15,-104 # Zero this frame's back chain pointer. xc 0(4,%r15),0(%r15) .endm ### Call a function. .macro gdbasm_call subr # Put the address of the constant in %r1, load the constant # (SUBR's address), and jump to it. bras %r1, .Lafterconst\@ .long \subr .Lafterconst\@: l %r1,0(%r1) basr %r14,%r1 .endm ### Exit with a zero status. .macro gdbasm_exit0 lhi %r2, 0 svc 1 .endm ### Standard subroutine prologue. .macro gdbasm_enter # Save all the callee-saves registers. What the heck. stm %r6,%r15,24(%r15) # Allocate the stack frame, and write the back chain pointer. # Keep the original SP in %r11. lr %r1,%r15 ahi %r15,-96 st %r1,0(%r15) .endm ### Standard subroutine epilogue. .macro gdbasm_leave # Restore all our registers. This also pops the frame, and # restores our return address. lm %r6,%r15,120(%r15) # Jump to the return address. br %r14 .endm ### Several nops. .macro gdbasm_several_nops lr %r0, %r0 lr %r0, %r0 lr %r0, %r0 lr %r0, %r0 .endm ### Declare an `int' variable. .purgem gdbasm_datavar .macro gdbasm_datavar name value .data \name: .long \value .endm