Skip to content

Instantly share code, notes, and snippets.

@exjam
Created July 11, 2015 16:35
Show Gist options
  • Save exjam/a56e7405867a2d67b2ef to your computer and use it in GitHub Desktop.
Save exjam/a56e7405867a2d67b2ef to your computer and use it in GitHub Desktop.
# r3 = ThreadState *state
# r4 = test func ptr
#
# 0x00(r1) = lr
# 0x04(r1) = cr
# 0x08(r1) = xer
# 0x10...0x58(r1) = r13...r31
.global runCodeTest
runCodeTest:
stwu r1, -0x80(r1)
# Store lr, cr, xer
mflr r0
stw r0, 0x04(r1)
mfcr r0
stw r0, 0x08(r1)
mfxer r0
stw r0, 0x0C(r1)
# Save gpr[13...31] to stack
stw r13, 0x10(r1)
stw r14, 0x14(r1)
stw r15, 0x18(r1)
stw r16, 0x1C(r1)
stw r17, 0x20(r1)
stw r18, 0x24(r1)
stw r19, 0x28(r1)
stw r20, 0x2C(r1)
stw r21, 0x30(r1)
stw r22, 0x34(r1)
stw r23, 0x38(r1)
stw r24, 0x3C(r1)
stw r25, 0x40(r1)
stw r26, 0x44(r1)
stw r27, 0x48(r1)
stw r28, 0x4C(r1)
stw r29, 0x50(r1)
stw r30, 0x54(r1)
stw r31, 0x58(r1)
# Set r31 to state pointer
mr r31, r3
# Set CTR to our test function
mtctr r4
# Load XER, CR from state
lwz r3, 0x80(r31)
mtxer r3
lwz r3, 0x84(r31)
mtcr r3
# Load gpr[0...30] from state
lwz r0, 0x00(r31)
# Skip r1
lwz r2, 0x08(r31)
lwz r3, 0x0C(r31)
lwz r4, 0x10(r31)
lwz r5, 0x14(r31)
lwz r6, 0x18(r31)
lwz r7, 0x1C(r31)
lwz r8, 0x20(r31)
lwz r9, 0x24(r31)
lwz r10, 0x28(r31)
lwz r11, 0x2C(r31)
lwz r12, 0x30(r31)
lwz r13, 0x34(r31)
lwz r14, 0x38(r31)
lwz r15, 0x3C(r31)
lwz r16, 0x40(r31)
lwz r17, 0x44(r31)
lwz r18, 0x48(r31)
lwz r19, 0x4C(r31)
lwz r20, 0x50(r31)
lwz r21, 0x54(r31)
lwz r22, 0x58(r31)
lwz r23, 0x5C(r31)
lwz r24, 0x60(r31)
lwz r25, 0x64(r31)
lwz r26, 0x68(r31)
lwz r27, 0x6C(r31)
lwz r28, 0x70(r31)
lwz r29, 0x74(r31)
lwz r30, 0x78(r31)
# Execute the code test
bctrl
# Save gpr[0...30] to state
stw r0, 0x00(r31)
# Skip r1
stw r2, 0x08(r31)
stw r3, 0x0C(r31)
stw r4, 0x10(r31)
stw r5, 0x14(r31)
stw r6, 0x18(r31)
stw r7, 0x1C(r31)
stw r8, 0x20(r31)
stw r9, 0x24(r31)
stw r10, 0x28(r31)
stw r11, 0x2C(r31)
stw r12, 0x30(r31)
stw r13, 0x34(r31)
stw r14, 0x38(r31)
stw r15, 0x3C(r31)
stw r16, 0x40(r31)
stw r17, 0x44(r31)
stw r18, 0x48(r31)
stw r19, 0x4C(r31)
stw r20, 0x50(r31)
stw r21, 0x54(r31)
stw r22, 0x58(r31)
stw r23, 0x5C(r31)
stw r24, 0x60(r31)
stw r25, 0x64(r31)
stw r26, 0x68(r31)
stw r27, 0x6C(r31)
stw r28, 0x70(r31)
stw r29, 0x74(r31)
stw r30, 0x78(r31)
# Save XER, CR to state
mfxer r3
stw r3, 0x80(r31)
mfcr r3
stw r3, 0x84(r31)
# Restore gpr[r13...r31] from stack
lwz r13, 0x10(r1)
lwz r14, 0x14(r1)
lwz r15, 0x18(r1)
lwz r16, 0x1C(r1)
lwz r17, 0x20(r1)
lwz r18, 0x24(r1)
lwz r19, 0x28(r1)
lwz r20, 0x2C(r1)
lwz r21, 0x30(r1)
lwz r22, 0x34(r1)
lwz r23, 0x38(r1)
lwz r24, 0x3C(r1)
lwz r25, 0x40(r1)
lwz r26, 0x44(r1)
lwz r27, 0x48(r1)
lwz r28, 0x4C(r1)
lwz r29, 0x50(r1)
lwz r30, 0x54(r1)
lwz r31, 0x58(r1)
# Restore LR, CR, XER from stack
lwz r0, 0x04(r1)
mtlr r0
lwz r0, 0x08(r1)
mtcr r0
lwz r0, 0x0C(r1)
mtxer r0
# Restore stack pointer and return
addi r1, r1, 0x80
blr
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment