// Isolated K1205 vector and ERET implementation. Ancestor vector bytes remain // unchanged. Both ingress and egress use the source-bound exceptions Frame ABI. .section .text.os_k1205_vectors,"ax" .equ K1205_FRAME_BYTES, {frame_bytes} .equ K1205_SP, {sp_offset} .equ K1205_SP_EL0, {sp_el0_offset} .equ K1205_ELR, {elr_offset} .equ K1205_SPSR, {spsr_offset} .equ K1205_ESR, {esr_offset} .equ K1205_FAR, {far_offset} .equ K1205_SLOT, {slot_offset} .equ K1205_Q, {q_offset} .equ K1205_FPCR, {fpcr_offset} .equ K1205_FPSR, {fpsr_offset} .equ K1205_CURRENT_EL, {current_el_offset} .equ K1205_CANARY, {canary_offset} .equ K1205_PADDING, {padding_offset} .macro K1205_SLOT_ENTRY slot // SP_EL1 is the trusted guarded stack for every source, including EL1t. msr SPSel, #1 sub sp, sp, #K1205_FRAME_BYTES str x3, [sp, #24] mov x3, #\slot b __os_k1205_vector_common .space 108 .endm .balign 2048 .global __os_k1205_vectors .global __os_k1205_vectors_end .type __os_k1205_vectors, %object __os_k1205_vectors: K1205_SLOT_ENTRY 0 K1205_SLOT_ENTRY 1 K1205_SLOT_ENTRY 2 K1205_SLOT_ENTRY 3 K1205_SLOT_ENTRY 4 K1205_SLOT_ENTRY 5 K1205_SLOT_ENTRY 6 K1205_SLOT_ENTRY 7 K1205_SLOT_ENTRY 8 K1205_SLOT_ENTRY 9 K1205_SLOT_ENTRY 10 K1205_SLOT_ENTRY 11 K1205_SLOT_ENTRY 12 K1205_SLOT_ENTRY 13 K1205_SLOT_ENTRY 14 K1205_SLOT_ENTRY 15 .size __os_k1205_vectors, __os_k1205_vectors_end - __os_k1205_vectors __os_k1205_vectors_end: .macro K1205_SAVE_REGISTERS stp x0, x1, [sp, #0] str x2, [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] stp q0, q1, [sp, #K1205_Q + 0] stp q2, q3, [sp, #K1205_Q + 32] stp q4, q5, [sp, #K1205_Q + 64] stp q6, q7, [sp, #K1205_Q + 96] stp q8, q9, [sp, #K1205_Q + 128] stp q10, q11, [sp, #K1205_Q + 160] stp q12, q13, [sp, #K1205_Q + 192] stp q14, q15, [sp, #K1205_Q + 224] stp q16, q17, [sp, #K1205_Q + 256] stp q18, q19, [sp, #K1205_Q + 288] stp q20, q21, [sp, #K1205_Q + 320] stp q22, q23, [sp, #K1205_Q + 352] stp q24, q25, [sp, #K1205_Q + 384] stp q26, q27, [sp, #K1205_Q + 416] stp q28, q29, [sp, #K1205_Q + 448] stp q30, q31, [sp, #K1205_Q + 480] add x0, sp, #K1205_FRAME_BYTES str x0, [sp, #K1205_SP] mrs x0, SP_EL0 str x0, [sp, #K1205_SP_EL0] mrs x0, ELR_EL1 str x0, [sp, #K1205_ELR] mrs x0, SPSR_EL1 str x0, [sp, #K1205_SPSR] mrs x0, ESR_EL1 str x0, [sp, #K1205_ESR] mrs x0, FAR_EL1 str x0, [sp, #K1205_FAR] mrs x0, FPCR str w0, [sp, #K1205_FPCR] mrs x0, FPSR str w0, [sp, #K1205_FPSR] mrs x0, CurrentEL str x0, [sp, #K1205_CURRENT_EL] movz x0, #0x414d movk x0, #0x4652, lsl #16 movk x0, #0x3230, lsl #32 movk x0, #0x4b39, lsl #48 str x0, [sp, #K1205_CANARY] str xzr, [sp, #K1205_PADDING] .endm .macro K1205_RESTORE_REGISTERS ldr x0, [sp, #K1205_SP_EL0] msr SP_EL0, x0 ldr x0, [sp, #K1205_ELR] msr ELR_EL1, x0 ldr x0, [sp, #K1205_SPSR] msr SPSR_EL1, x0 ldr w0, [sp, #K1205_FPCR] msr FPCR, x0 ldr w0, [sp, #K1205_FPSR] msr FPSR, x0 ldp q0, q1, [sp, #K1205_Q + 0] ldp q2, q3, [sp, #K1205_Q + 32] ldp q4, q5, [sp, #K1205_Q + 64] ldp q6, q7, [sp, #K1205_Q + 96] ldp q8, q9, [sp, #K1205_Q + 128] ldp q10, q11, [sp, #K1205_Q + 160] ldp q12, q13, [sp, #K1205_Q + 192] ldp q14, q15, [sp, #K1205_Q + 224] ldp q16, q17, [sp, #K1205_Q + 256] ldp q18, q19, [sp, #K1205_Q + 288] ldp q20, q21, [sp, #K1205_Q + 320] ldp q22, q23, [sp, #K1205_Q + 352] ldp q24, q25, [sp, #K1205_Q + 384] ldp q26, q27, [sp, #K1205_Q + 416] ldp q28, q29, [sp, #K1205_Q + 448] ldp q30, q31, [sp, #K1205_Q + 480] ldp x0, x1, [sp, #0] ldp x2, x3, [sp, #16] ldp x4, x5, [sp, #32] ldp x6, x7, [sp, #48] ldp x8, x9, [sp, #64] ldp x10, x11, [sp, #80] ldp x12, x13, [sp, #96] ldp x14, x15, [sp, #112] ldp x16, x17, [sp, #128] ldp x18, x19, [sp, #144] ldp x20, x21, [sp, #160] ldp x22, x23, [sp, #176] ldp x24, x25, [sp, #192] ldp x26, x27, [sp, #208] ldp x28, x29, [sp, #224] ldr x30, [sp, #240] add sp, sp, #K1205_FRAME_BYTES .endm .balign 16 .global __os_k1205_vector_common .type __os_k1205_vector_common, %function __os_k1205_vector_common: K1205_SAVE_REGISTERS str x3, [sp, #K1205_SLOT] // The trusted kernel half stays mapped in both retained roots. Restore // the kernel TTBR before Rust reads the owner graph. mrs x9, TTBR0_EL1 adrp x10, OS_K1205_TRAP_TTBR add x10, x10, :lo12:OS_K1205_TRAP_TTBR str x9, [x10] adrp x10, OS_K1205_KERNEL_ROOT add x10, x10, :lo12:OS_K1205_KERNEL_ROOT ldr x9, [x10] dsb ish msr TTBR0_EL1, x9 isb tlbi vmalle1is dsb ish isb mov x0, sp bl os_k1205_dispatch cbz x0, .Lk1205_eret cmp x0, #1 b.eq .Lk1205_kernel_exit .Lk1205_invalid_action: msr DAIFSet, #15 wfe b .Lk1205_invalid_action .Lk1205_eret: adrp x10, OS_K1205_USER_TTBR add x10, x10, :lo12:OS_K1205_USER_TTBR ldr x9, [x10] dsb ish msr TTBR0_EL1, x9 isb tlbi vmalle1is dsb ish isb K1205_RESTORE_REGISTERS eret .Lk1205_kernel_exit: // Completion returns to the original process-stack call frame. adrp x9, OS_K1205_KERNEL_FRAME add x9, x9, :lo12:OS_K1205_KERNEL_FRAME ldr x9, [x9] mov sp, x9 ldp x29, x30, [sp], #16 ldp x27, x28, [sp], #16 ldp x25, x26, [sp], #16 ldp x23, x24, [sp], #16 ldp x21, x22, [sp], #16 ldp x19, x20, [sp], #16 ret .global __os_k1205_vector_common_end __os_k1205_vector_common_end: .size __os_k1205_vector_common, __os_k1205_vector_common_end - __os_k1205_vector_common