.section .text.os_k1100_wait,"ax" .balign 16 .macro os_k1100_save sub sp, sp, #640 stp x19, x20, [sp, #8] stp x21, x22, [sp, #24] stp x23, x24, [sp, #40] stp x25, x26, [sp, #56] stp x27, x28, [sp, #72] stp x29, x30, [sp, #88] stp q0, q1, [sp, #112] stp q2, q3, [sp, #144] stp q4, q5, [sp, #176] stp q6, q7, [sp, #208] stp q8, q9, [sp, #240] stp q10, q11, [sp, #272] stp q12, q13, [sp, #304] stp q14, q15, [sp, #336] stp q16, q17, [sp, #368] stp q18, q19, [sp, #400] stp q20, q21, [sp, #432] stp q22, q23, [sp, #464] stp q24, q25, [sp, #496] stp q26, q27, [sp, #528] stp q28, q29, [sp, #560] stp q30, q31, [sp, #592] add x9, sp, #640 str x9, [sp, #0] str xzr, [sp, #104] mrs x9, FPCR mrs x10, FPSR str w9, [sp, #624] str w10, [sp, #628] movz x9, #0x5458 movk x9, #0x3043, lsl #16 movk x9, #0x3034, lsl #32 movk x9, #0x4b31, lsl #48 str x9, [sp, #632] .endm .macro os_k1100_load pointer ldr w9, [\pointer, #624] ldr w10, [\pointer, #628] msr FPCR, x9 msr FPSR, x10 ldp q0, q1, [\pointer, #112] ldp q2, q3, [\pointer, #144] ldp q4, q5, [\pointer, #176] ldp q6, q7, [\pointer, #208] ldp q8, q9, [\pointer, #240] ldp q10, q11, [\pointer, #272] ldp q12, q13, [\pointer, #304] ldp q14, q15, [\pointer, #336] ldp q16, q17, [\pointer, #368] ldp q18, q19, [\pointer, #400] ldp q20, q21, [\pointer, #432] ldp q22, q23, [\pointer, #464] ldp q24, q25, [\pointer, #496] ldp q26, q27, [\pointer, #528] ldp q28, q29, [\pointer, #560] ldp q30, q31, [\pointer, #592] ldp x19, x20, [\pointer, #8] ldp x21, x22, [\pointer, #24] ldp x23, x24, [\pointer, #40] ldp x25, x26, [\pointer, #56] ldp x27, x28, [\pointer, #72] ldp x29, x30, [\pointer, #88] .endm .macro os_k1100_episode adrp x9, OS_K1100_CAPTURE_EPISODE add x9, x9, :lo12:OS_K1100_CAPTURE_EPISODE ldr x10, [x9] adds x10, x10, #1 b.cs __os_k1100_capture_exhausted cbz x10, __os_k1100_capture_exhausted str x10, [x9] adrp x9, OS_K1100_LIVE_CAPTURE_ADDRESS add x9, x9, :lo12:OS_K1100_LIVE_CAPTURE_ADDRESS mov x11, sp str x11, [x9] dsb ish .endm .macro os_k1100_landing label, callback // x0 is observed before any callback; ADR is the executed landing label. os_k1100_save adrp x9, OS_K1100_LANDING_ARGUMENT add x9, x9, :lo12:OS_K1100_LANDING_ARGUMENT str x0, [x9] adr x10, \label adrp x9, OS_K1100_LANDING_PC add x9, x9, :lo12:OS_K1100_LANDING_PC str x10, [x9] mov x0, sp adrp x9, OS_K1100_LANDING_ADDRESS add x9, x9, :lo12:OS_K1100_LANDING_ADDRESS str x0, [x9] bl \callback mov x16, sp os_k1100_load x16 add sp, sp, #640 .endm .global __os_k1100_run .type __os_k1100_run, %function __os_k1100_run: // x0 names a sealed, departed initial handoff; no Context loan is live. os_k1100_save adrp x9, OS_K1100_BOOT_CAPTURE_ADDRESS add x9, x9, :lo12:OS_K1100_BOOT_CAPTURE_ADDRESS mov x10, sp str x10, [x9] // Observe the inactive stack without MRS SP_EL1 or reading SP_EL0 while // SP0 is selected. Record the original active SP before the640 push. mrs x11, SPSel cbnz x11, 1f add x12, sp, #640 msr SPSel, #1 mov x13, sp b 2f 1: mrs x12, SP_EL0 add x13, sp, #640 2: adrp x9, OS_K1100_BOOT_STACK_REGISTERS add x9, x9, :lo12:OS_K1100_BOOT_STACK_REGISTERS stp x11, x12, [x9] str x13, [x9, #16] dsb ish b __os_k1100_restore_wire .size __os_k1100_run, .-__os_k1100_run .global __os_k1100_restore_wire .type __os_k1100_restore_wire, %function __os_k1100_restore_wire: // Wire: actual frozen640 frame, pc:u64, argument:u64. Checked private // handoff custody validates it before this no-loan assembly operation. mov x16, x0 ldr x17, [x16, #640] ldr x0, [x16, #648] ldr x18, [x16, #0] ldr x11, [x16, #664] os_k1100_load x16 cmp x11, #2 b.eq 1f cmp x11, #1 b.ne 3f adr x17, __os_k1100_cooperative_landed 3: // Real fibres run on SP_EL1. Timer vectors are therefore actual EL1h // slot5; their saved SPSR is never rewritten or relabelled. msr SPSel, #1 mov sp, x18 br x17 1: adrp x12, OS_K1100_BOOT_STACK_REGISTERS add x12, x12, :lo12:OS_K1100_BOOT_STACK_REGISTERS ldp x11, x13, [x12] ldr x14, [x12, #16] msr SPSel, #1 mov sp, x14 msr SP_EL0, x13 cbnz x11, 2f msr SPSel, #0 2: br x17 .size __os_k1100_restore_wire, .-__os_k1100_restore_wire .global __os_k1100_stack_registers .type __os_k1100_stack_registers, %function __os_k1100_stack_registers: // Caller has IRQ masked. No stack access or Rust callback occurs while // observing the other stack. x0 -> SPSel,SP_EL0,SP_EL1,activeSP. mrs x9, SPSel mov x12, sp cbnz x9, 1f mov x10, sp msr SPSel, #1 mov x11, sp msr SPSel, #0 b 2f 1: mrs x10, SP_EL0 mov x11, sp 2: stp x9, x10, [x0] stp x11, x12, [x0, #16] ret .size __os_k1100_stack_registers, .-__os_k1100_stack_registers .global __os_k1100_cooperate .type __os_k1100_cooperate, %function __os_k1100_cooperate: // x0 selects an inert target; the actual current thread/stack and new // assembly episode authorize the source capture independently. mov x1, x0 os_k1100_save os_k1100_episode mov x0, sp bl __os_k1100_prepare_cooperative b __os_k1100_restore_wire .size __os_k1100_cooperate, .-__os_k1100_cooperate .global __os_k1100_finish .type __os_k1100_finish, %function __os_k1100_finish: os_k1100_save os_k1100_episode mov x0, sp bl __os_k1100_prepare_return b __os_k1100_restore_wire .size __os_k1100_finish, .-__os_k1100_finish .global __os_k1100_boot_landed .type __os_k1100_boot_landed, %function __os_k1100_boot_landed: os_k1100_landing __os_k1100_boot_landed, __os_k1100_return_landed ret .size __os_k1100_boot_landed, .-__os_k1100_boot_landed .global __os_k1100_capture_exhausted .type __os_k1100_capture_exhausted, %function __os_k1100_capture_exhausted: msr DAIFSet, #15 b __os_k1100_capture_exhausted .size __os_k1100_capture_exhausted, .-__os_k1100_capture_exhausted .global __os_k1100_bad_return .type __os_k1100_bad_return, %function __os_k1100_bad_return: msr DAIFSet, #15 b __os_k1100_bad_return .size __os_k1100_bad_return, .-__os_k1100_bad_return .macro os_k1100_task name, ordinal .global __os_k1100_\name\()_entry .type __os_k1100_\name\()_entry, %function __os_k1100_\name\()_entry: os_k1100_landing __os_k1100_\name\()_entry, __os_k1100_landed mov x0, #\ordinal bl __os_k1100_task_work bl __os_k1100_finish b __os_k1100_bad_return .size __os_k1100_\name\()_entry, .-__os_k1100_\name\()_entry .endm os_k1100_task a, 0 os_k1100_task b, 1 os_k1100_task c, 2 .global __os_k1100_cooperative_landed .type __os_k1100_cooperative_landed, %function __os_k1100_cooperative_landed: os_k1100_landing __os_k1100_cooperative_landed, __os_k1100_landed ret .size __os_k1100_cooperative_landed, .-__os_k1100_cooperative_landed .global __os_k1100_mutex_request .type __os_k1100_mutex_request, %function __os_k1100_mutex_request: os_k1100_save os_k1100_episode mov x0, sp bl __os_k1100_prepare_mutex cbnz x0, 1f mov x16, sp os_k1100_load x16 add sp, sp, #640 ret 1: b __os_k1100_restore_wire .size __os_k1100_mutex_request, .-__os_k1100_mutex_request .global __os_k1100_checkpoint .type __os_k1100_checkpoint, %function __os_k1100_checkpoint: mov x1, x0 os_k1100_save os_k1100_episode mov x0, sp bl __os_k1100_checkpoint_body mov x16, sp os_k1100_load x16 add sp, sp, #640 ret .size __os_k1100_checkpoint, .-__os_k1100_checkpoint .global __os_k1100_primary_on_stack .type __os_k1100_primary_on_stack, %function __os_k1100_primary_on_stack: adrp x9, OS_K1100_PRIMARY_STACK_EVIDENCE add x9, x9, :lo12:OS_K1100_PRIMARY_STACK_EVIDENCE mov x10, sp str x10, [x9] stp x19, x30, [sp, #-16]! mov x19, sp adrp x9, OS_K1100_PRIMARY_STACK add x9, x9, :lo12:OS_K1100_PRIMARY_STACK add x9, x9, #4096 mov x10, #65536 add x9, x9, x10 sub x9, x9, #16 mov sp, x9 adrp x9, OS_K1100_PRIMARY_STACK_EVIDENCE add x9, x9, :lo12:OS_K1100_PRIMARY_STACK_EVIDENCE mov x10, sp str x10, [x9, #24] bl __os_k1100_primary_body mov sp, x19 ldp x19, x30, [sp], #16 adrp x9, OS_K1100_PRIMARY_STACK_EVIDENCE add x9, x9, :lo12:OS_K1100_PRIMARY_STACK_EVIDENCE mov x10, sp str x10, [x9, #48] ret .size __os_k1100_primary_on_stack, .-__os_k1100_primary_on_stack // Every native timer callback occurs in this exact range. No Rust owner loan // survives this call. SP_EL0 primary callers move their same live guarded64K // stack to SP_EL1 for the IRQ and restore the original stack selector/other SP. .global __os_k1100_timer_wait .type __os_k1100_timer_wait, %function __os_k1100_timer_wait: mov x11, x0 mrs x12, SPSel mov x13, sp cbnz x12, 1f msr SPSel, #1 mov x14, sp mov sp, x13 b 2f 1: mrs x14, SP_EL0 2: adrp x9, OS_K1100_TIMER_STACK_REGISTERS add x9, x9, :lo12:OS_K1100_TIMER_STACK_REGISTERS stp x12, x13, [x9] str x14, [x9, #16] adrp x9, OS_K1100_IRQ_COUNT add x9, x9, :lo12:OS_K1100_IRQ_COUNT mov x0, xzr dsb sy msr DAIFClr, #2 .global __os_k1100_timer_wait_loop __os_k1100_timer_wait_loop: add x0, x0, #1 ldr x10, [x9] cmp x10, x11 b.hs __os_k1100_timer_wait_mask // Sample actual timer and interrupt registers without touching ownership. // This bounded observation makes an absent hardware delivery diagnosable. ands x15, x0, #0xffff b.ne __os_k1100_timer_wait_loop adrp x16, OS_K1100_TIMER_STACK_REGISTERS add x16, x16, :lo12:OS_K1100_TIMER_STACK_REGISTERS str x10, [x16, #24] mrs x17, CNTPCT_EL0 str x17, [x16, #32] mrs x17, CNTP_CVAL_EL0 str x17, [x16, #40] mrs x17, CNTP_CTL_EL0 str x17, [x16, #48] mrs x17, DAIF str x17, [x16, #56] mrs x17, ICC_PMR_EL1 str x17, [x16, #64] str x0, [x16, #72] b __os_k1100_timer_wait_loop .global __os_k1100_timer_wait_mask __os_k1100_timer_wait_mask: msr DAIFSet, #2 isb adrp x9, OS_K1100_TIMER_STACK_REGISTERS add x9, x9, :lo12:OS_K1100_TIMER_STACK_REGISTERS ldp x12, x13, [x9] ldr x14, [x9, #16] cbnz x12, 3f mov sp, x14 msr SPSel, #0 mov sp, x13 3: ret .size __os_k1100_timer_wait, .-__os_k1100_timer_wait .global __os_k1105_probe_on_stack .type __os_k1105_probe_on_stack, %function __os_k1105_probe_on_stack: stp x19, x30, [sp, #-16]! mov x19, sp adrp x9, OS_K1105_WORK_STACK add x9, x9, :lo12:OS_K1105_WORK_STACK add x9, x9, #4096 mov x10, #131072 add x9, x9, x10 sub x9, x9, #16 mov sp, x9 bl __os_k1105_probe_body mov sp, x19 ldp x19, x30, [sp], #16 ret .size __os_k1105_probe_on_stack, .-__os_k1105_probe_on_stack .global __os_k1110_probe_on_stack .type __os_k1110_probe_on_stack, %function __os_k1110_probe_on_stack: stp x19, x30, [sp, #-16]! mov x19, sp adrp x9, OS_K1105_WORK_STACK add x9, x9, :lo12:OS_K1105_WORK_STACK add x9, x9, #4096 mov x10, #131072 add x9, x9, x10 sub x9, x9, #16 mov sp, x9 bl __os_k1110_probe_body mov sp, x19 ldp x19, x30, [sp], #16 ret .size __os_k1110_probe_on_stack, .-__os_k1110_probe_on_stack .global __os_k1110_enter_parent_stack .type __os_k1110_enter_parent_stack, %function __os_k1110_enter_parent_stack: stp x19, x30, [sp, #-16]! mov x19, sp mov sp, x2 mov x2, x3 bl __os_k1110_parent_body mov sp, x19 ldp x19, x30, [sp], #16 ret .size __os_k1110_enter_parent_stack, .-__os_k1110_enter_parent_stack .global __os_k1115_probe_on_stack .type __os_k1115_probe_on_stack, %function __os_k1115_probe_on_stack: stp x19, x30, [sp, #-16]! mov x19, sp adrp x9, OS_K1105_WORK_STACK add x9, x9, :lo12:OS_K1105_WORK_STACK add x9, x9, #4096 mov x10, #131072 add x9, x9, x10 sub x9, x9, #16 mov sp, x9 bl __os_k1115_probe_body mov sp, x19 ldp x19, x30, [sp], #16 ret .size __os_k1115_probe_on_stack, .-__os_k1115_probe_on_stack .global __os_k1120_probe_on_stack .type __os_k1120_probe_on_stack, %function __os_k1120_probe_on_stack: stp x19, x30, [sp, #-16]! mov x19, sp adrp x9, OS_K1105_WORK_STACK add x9, x9, :lo12:OS_K1105_WORK_STACK add x9, x9, #4096 mov x10, #131072 add x9, x9, x10 sub x9, x9, #16 mov sp, x9 bl __os_k1120_probe_body mov sp, x19 ldp x19, x30, [sp], #16 ret .size __os_k1120_probe_on_stack, .-__os_k1120_probe_on_stack .global __os_k1125_preflight_on_stack .type __os_k1125_preflight_on_stack, %function __os_k1125_preflight_on_stack: stp x19, x30, [sp, #-16]! mov x19, sp adrp x9, OS_K1105_WORK_STACK add x9, x9, :lo12:OS_K1105_WORK_STACK add x9, x9, #4096 mov x10, #131072 add x9, x9, x10 sub x9, x9, #16 mov sp, x9 bl __os_k1125_preflight_body mov sp, x19 ldp x19, x30, [sp], #16 ret .size __os_k1125_preflight_on_stack, .-__os_k1125_preflight_on_stack .global __os_k1125_launch_on_stack .type __os_k1125_launch_on_stack, %function __os_k1125_launch_on_stack: stp x19, x30, [sp, #-16]! mov x19, sp adrp x9, OS_K1105_WORK_STACK add x9, x9, :lo12:OS_K1105_WORK_STACK add x9, x9, #4096 mov x10, #131072 add x9, x9, x10 sub x9, x9, #16 mov sp, x9 bl __os_k1125_launch_body mov sp, x19 ldp x19, x30, [sp], #16 ret .size __os_k1125_launch_on_stack, .-__os_k1125_launch_on_stack .global __os_k1125_enter_process_stack .type __os_k1125_enter_process_stack, %function __os_k1125_enter_process_stack: stp x19, x30, [sp, #-16]! mov x19, sp mov sp, x2 mov x2, x3 bl __os_k1125_launch_process_body mov sp, x19 ldp x19, x30, [sp], #16 ret .size __os_k1125_enter_process_stack, .-__os_k1125_enter_process_stack .global __os_k1125_el0_on_stack .type __os_k1125_el0_on_stack, %function __os_k1125_el0_on_stack: stp x19, x30, [sp, #-16]! mov x19, sp adrp x9, OS_K1105_WORK_STACK add x9, x9, :lo12:OS_K1105_WORK_STACK add x9, x9, #4096 mov x10, #131072 add x9, x9, x10 sub x9, x9, #16 mov sp, x9 bl __os_k1125_el0_body mov sp, x19 ldp x19, x30, [sp], #16 ret .size __os_k1125_el0_on_stack, .-__os_k1125_el0_on_stack .global __os_k1125_enter_el0_process_stack .type __os_k1125_enter_el0_process_stack, %function __os_k1125_enter_el0_process_stack: stp x19, x30, [sp, #-16]! mov x19, sp mov sp, x2 mov x2, x3 bl __os_k1125_el0_process_body mov sp, x19 ldp x19, x30, [sp], #16 ret .size __os_k1125_enter_el0_process_stack, .-__os_k1125_enter_el0_process_stack .section .text.k1125_el0,"ax" .balign 16 .global __os_k1125_enter_el0 .type __os_k1125_enter_el0, %function // x0: retained user TTBR0 with ASID; x1: trusted entry; x2: user SP; // x3: EL0t SPSR. Caller is already on the actual process kernel stack. __os_k1125_enter_el0: stp x19, x30, [sp, #-16]! adrp x9, OS_K1125_KERNEL_FRAME add x9, x9, :lo12:OS_K1125_KERNEL_FRAME mov x10, sp str x10, [x9] adrp x9, __os_k1125_vectors add x9, x9, :lo12:__os_k1125_vectors msr VBAR_EL1, x9 dsb ishst msr TTBR0_EL1, x0 isb tlbi vmalle1is dsb ish isb msr SP_EL0, x2 msr ELR_EL1, x1 msr SPSR_EL1, x3 isb eret .size __os_k1125_enter_el0, .-__os_k1125_enter_el0 .global __os_k1130_el0_on_stack .type __os_k1130_el0_on_stack, %function __os_k1130_el0_on_stack: stp x19, x30, [sp, #-16]! mov x19, sp adrp x9, OS_K1105_WORK_STACK add x9, x9, :lo12:OS_K1105_WORK_STACK add x9, x9, #4096 mov x10, #131072 add x9, x9, x10 sub x9, x9, #16 mov sp, x9 bl __os_k1130_el0_body mov sp, x19 ldp x19, x30, [sp], #16 ret .size __os_k1130_el0_on_stack, .-__os_k1130_el0_on_stack .global __os_k1130_enter_el0_process_stack .type __os_k1130_enter_el0_process_stack, %function __os_k1130_enter_el0_process_stack: stp x19, x30, [sp, #-16]! mov x19, sp mov sp, x2 mov x2, x3 bl __os_k1130_el0_process_body mov sp, x19 ldp x19, x30, [sp], #16 ret .size __os_k1130_enter_el0_process_stack, .-__os_k1130_enter_el0_process_stack .section .text.k1130_el0,"ax" .balign 16 .global __os_k1130_enter_el0 .type __os_k1130_enter_el0, %function // x0: retained user TTBR0 with ASID; x1: trusted entry; x2: user SP; // x3: EL0t SPSR. Caller is already on the actual process kernel stack. __os_k1130_enter_el0: stp x19, x30, [sp, #-16]! adrp x9, OS_K1130_KERNEL_FRAME add x9, x9, :lo12:OS_K1130_KERNEL_FRAME mov x10, sp str x10, [x9] adrp x9, __os_k1130_vectors add x9, x9, :lo12:__os_k1130_vectors msr VBAR_EL1, x9 dsb ishst msr TTBR0_EL1, x0 isb tlbi vmalle1is dsb ish isb msr SP_EL0, x2 msr ELR_EL1, x1 msr SPSR_EL1, x3 isb eret .size __os_k1130_enter_el0, .-__os_k1130_enter_el0 .global __os_k1135_el0_on_stack .type __os_k1135_el0_on_stack, %function __os_k1135_el0_on_stack: stp x19, x30, [sp, #-16]! mov x19, sp adrp x9, OS_K1105_WORK_STACK add x9, x9, :lo12:OS_K1105_WORK_STACK add x9, x9, #4096 mov x10, #131072 add x9, x9, x10 sub x9, x9, #16 mov sp, x9 bl __os_k1135_el0_body mov sp, x19 ldp x19, x30, [sp], #16 ret .size __os_k1135_el0_on_stack, .-__os_k1135_el0_on_stack .global __os_k1135_enter_el0_process_stack .type __os_k1135_enter_el0_process_stack, %function __os_k1135_enter_el0_process_stack: stp x19, x30, [sp, #-16]! mov x19, sp mov sp, x2 mov x2, x3 bl __os_k1135_el0_process_body mov sp, x19 ldp x19, x30, [sp], #16 ret .size __os_k1135_enter_el0_process_stack, .-__os_k1135_enter_el0_process_stack .section .text.k1135_el0,"ax" .balign 16 .global __os_k1135_enter_el0 .type __os_k1135_enter_el0, %function // x0: retained user TTBR0 with ASID; x1: trusted entry; x2: user SP; // x3: EL0t SPSR. Caller is already on the actual process kernel stack. __os_k1135_enter_el0: stp x19, x30, [sp, #-16]! adrp x9, OS_K1135_KERNEL_FRAME add x9, x9, :lo12:OS_K1135_KERNEL_FRAME mov x10, sp str x10, [x9] adrp x9, __os_k1135_vectors add x9, x9, :lo12:__os_k1135_vectors msr VBAR_EL1, x9 dsb ishst msr TTBR0_EL1, x0 isb tlbi vmalle1is dsb ish isb msr SP_EL0, x2 msr ELR_EL1, x1 msr SPSR_EL1, x3 isb eret .size __os_k1135_enter_el0, .-__os_k1135_enter_el0 .global __os_k1140_el0_on_stack .type __os_k1140_el0_on_stack, %function __os_k1140_el0_on_stack: stp x19, x30, [sp, #-16]! mov x19, sp adrp x9, OS_K1105_WORK_STACK add x9, x9, :lo12:OS_K1105_WORK_STACK add x9, x9, #4096 mov x10, #131072 add x9, x9, x10 sub x9, x9, #16 mov sp, x9 bl __os_k1140_el0_body mov sp, x19 ldp x19, x30, [sp], #16 ret .size __os_k1140_el0_on_stack, .-__os_k1140_el0_on_stack .global __os_k1140_enter_el0_process_stack .type __os_k1140_enter_el0_process_stack, %function __os_k1140_enter_el0_process_stack: stp x19, x30, [sp, #-16]! mov x19, sp mov sp, x2 mov x2, x3 bl __os_k1140_el0_process_body mov sp, x19 ldp x19, x30, [sp], #16 ret .size __os_k1140_enter_el0_process_stack, .-__os_k1140_enter_el0_process_stack .section .text.k1140_el0,"ax" .balign 16 .global __os_k1140_enter_el0 .type __os_k1140_enter_el0, %function // x0: retained user TTBR0 with ASID; x1: trusted entry; x2: user SP; // x3: EL0t SPSR. Caller is already on the actual process kernel stack. __os_k1140_enter_el0: stp x19, x30, [sp, #-16]! adrp x9, OS_K1140_KERNEL_FRAME add x9, x9, :lo12:OS_K1140_KERNEL_FRAME mov x10, sp str x10, [x9] adrp x9, __os_k1140_vectors add x9, x9, :lo12:__os_k1140_vectors msr VBAR_EL1, x9 dsb ishst msr TTBR0_EL1, x0 isb tlbi vmalle1is dsb ish isb msr SP_EL0, x2 msr ELR_EL1, x1 msr SPSR_EL1, x3 isb eret .size __os_k1140_enter_el0, .-__os_k1140_enter_el0 .global __os_k1145_el0_on_stack .type __os_k1145_el0_on_stack, %function __os_k1145_el0_on_stack: stp x19, x30, [sp, #-16]! mov x19, sp adrp x9, OS_K1105_WORK_STACK add x9, x9, :lo12:OS_K1105_WORK_STACK add x9, x9, #4096 mov x10, #131072 add x9, x9, x10 sub x9, x9, #16 mov sp, x9 bl __os_k1145_el0_body mov sp, x19 ldp x19, x30, [sp], #16 ret .size __os_k1145_el0_on_stack, .-__os_k1145_el0_on_stack .global __os_k1145_enter_el0_process_stack .type __os_k1145_enter_el0_process_stack, %function __os_k1145_enter_el0_process_stack: stp x19, x30, [sp, #-16]! mov x19, sp mov sp, x2 mov x2, x3 bl __os_k1145_el0_process_body mov sp, x19 ldp x19, x30, [sp], #16 ret .size __os_k1145_enter_el0_process_stack, .-__os_k1145_enter_el0_process_stack .section .text.k1145_el0,"ax" .balign 16 .global __os_k1145_enter_el0 .type __os_k1145_enter_el0, %function // x0: retained user TTBR0 with ASID; x1: trusted entry; x2: user SP; // x3: EL0t SPSR. Caller is already on the actual process kernel stack. __os_k1145_enter_el0: stp x19, x30, [sp, #-16]! adrp x9, OS_K1145_KERNEL_FRAME add x9, x9, :lo12:OS_K1145_KERNEL_FRAME mov x10, sp str x10, [x9] adrp x9, __os_k1145_vectors add x9, x9, :lo12:__os_k1145_vectors msr VBAR_EL1, x9 dsb ishst msr TTBR0_EL1, x0 isb tlbi vmalle1is dsb ish isb msr SP_EL0, x2 msr ELR_EL1, x1 msr SPSR_EL1, x3 isb eret .size __os_k1145_enter_el0, .-__os_k1145_enter_el0