.section .text.gp_probe,"ax" .balign 16 .global __gp_probe_run __gp_probe_run: // Keep the Rust caller's callee-saved state and the SGI command outside // the 31-register snapshot. The live values at IRQ entry are 0x6000+n. sub sp, sp, #384 str x1, [sp, #248] str x0, [sp, #256] stp x18, x19, [sp, #264] stp x20, x21, [sp, #280] stp x22, x23, [sp, #296] stp x24, x25, [sp, #312] stp x26, x27, [sp, #328] stp x28, x29, [sp, #344] str x30, [sp, #360] mrs x0, SP_EL0 str x0, [sp, #368] sevl wfe mov x0, #0x6000 mov x1, #0x6001 mov x2, #0x6002 mov x3, #0x6003 mov x4, #0x6004 mov x5, #0x6005 mov x6, #0x6006 mov x7, #0x6007 mov x8, #0x6008 mov x9, #0x6009 mov x10, #0x600a mov x11, #0x600b mov x12, #0x600c mov x13, #0x600d mov x14, #0x600e mov x15, #0x600f mov x16, #0x6010 mov x17, #0x6011 mov x18, #0x6012 mov x19, #0x6013 mov x20, #0x6014 mov x21, #0x6015 mov x22, #0x6016 mov x23, #0x6017 mov x24, #0x6018 mov x25, #0x6019 mov x26, #0x601a mov x27, #0x601b mov x28, #0x601c mov x29, #0x601d mov x30, #0x601e mov x0, #0x7a5a msr SP_EL0, x0 ldr x0, [sp, #256] msr ICC_SGI1R_EL1, x0 isb mov x0, #0x6000 msr daifclr, #2 isb .Lgp_wait: wfe msr daifset, #2 isb // A different event may wake WFE. Check the handler-owned flag while // IRQ is masked, then restore x0 before trying again or taking a snapshot. adrp x0, GP_IRQ_WAKE add x0, x0, :lo12:GP_IRQ_WAKE ldr x0, [x0] cbnz x0, .Lgp_observed mov x0, #0x6000 msr daifclr, #2 isb b .Lgp_wait .Lgp_observed: mov x0, #0x6000 stp x0, x1, [sp, #0] stp x2, x3, [sp, #16] stp x4, x5, [sp, #32] stp x6, x7, [sp, #48] stp x8, x9, [sp, #64] stp x10, x11, [sp, #80] stp x12, x13, [sp, #96] stp x14, x15, [sp, #112] stp x16, x17, [sp, #128] stp x18, x19, [sp, #144] stp x20, x21, [sp, #160] stp x22, x23, [sp, #176] stp x24, x25, [sp, #192] stp x26, x27, [sp, #208] stp x28, x29, [sp, #224] str x30, [sp, #240] mrs x2, SP_EL0 adrp x3, GP_RETURNED_SP_EL0 add x3, x3, :lo12:GP_RETURNED_SP_EL0 str x2, [x3] ldr x2, [sp, #368] msr SP_EL0, x2 ldr x0, [sp, #248] mov x1, #0 .Lgp_copy: ldr x2, [sp, x1, lsl #3] str x2, [x0, x1, lsl #3] add x1, x1, #1 cmp x1, #31 b.lo .Lgp_copy ldp x18, x19, [sp, #264] ldp x20, x21, [sp, #280] ldp x22, x23, [sp, #296] ldp x24, x25, [sp, #312] ldp x26, x27, [sp, #328] ldp x28, x29, [sp, #344] ldr x30, [sp, #360] add sp, sp, #384 ret