47 lines
1.3 KiB
ArmAsm
47 lines
1.3 KiB
ArmAsm
.hidden context_switch_aarch64
|
|
.globl context_switch_aarch64
|
|
context_switch_aarch64:
|
|
// Restore FPU regs
|
|
ldp d0, d1, [x0, #0x00]
|
|
ldp d2, d3, [x0, #0x10]
|
|
ldp d4, d5, [x0, #0x20]
|
|
ldp d6, d7, [x0, #0x30]
|
|
ldp d8, d9, [x0, #0x40]
|
|
ldp d10, d11, [x0, #0x50]
|
|
ldp d12, d13, [x0, #0x60]
|
|
ldp d14, d15, [x0, #0x70]
|
|
ldp d16, d17, [x0, #0x80]
|
|
ldp d18, d19, [x0, #0x90]
|
|
ldp d20, d21, [x0, #0xa0]
|
|
ldp d22, d23, [x0, #0xb0]
|
|
ldp d24, d25, [x0, #0xc0]
|
|
ldp d26, d27, [x0, #0xd0]
|
|
ldp d28, d29, [x0, #0xe0]
|
|
ldp d30, d31, [x0, #0xf0]
|
|
|
|
// Restore GPRS regs
|
|
ldr x1, [x0, #0x108]
|
|
ldp x2, x3, [x0, #0x110]
|
|
ldp x4, x5, [x0, #0x120]
|
|
ldp x6, x7, [x0, #0x130]
|
|
ldp x8, x9, [x0, #0x140]
|
|
ldp x10, x11, [x0, #0x150]
|
|
ldp x12, x13, [x0, #0x160]
|
|
ldp x14, x15, [x0, #0x170]
|
|
ldp x16, x17, [x0, #0x180]
|
|
ldp x18, x19, [x0, #0x190]
|
|
ldp x20, x21, [x0, #0x1a0]
|
|
ldp x22, x23, [x0, #0x1b0]
|
|
ldp x24, x25, [x0, #0x1c0]
|
|
ldp x26, x27, [x0, #0x1d0]
|
|
ldp x28, x29, [x0, #0x1e0] // x29 is FP
|
|
// Restore special regs and jump
|
|
// x16 and x17 are safe to use?
|
|
ldp x30, x17, [x0, #0x1f0] // LR, pstate
|
|
msr nzcv, x17
|
|
ldr x17, [x0, #0x200] // SP
|
|
mov sp, x17
|
|
ldr x17, [x0, #0x208] // PC
|
|
ldr x0, [x0, #0x100]
|
|
br x17
|