.section .text.task_switch,"ax" .equ TASK_SP_OFFSET, {sp_offset} .equ TASK_CALLEE_OFFSET, {callee_offset} .equ TASK_VECTOR_OFFSET, {vector_offset} .balign 4 .global __turkos_swap_task_context __turkos_swap_task_context: // x0: exclusive outgoing context, x1: initialized incoming context. // Called only at EL1h on one CPU with IRQ masked. Returning through the // incoming x30 resumes a suspended yield or enters a new task function. mov x9, sp str x9, [x0, #TASK_SP_OFFSET] stp x19, x20, [x0, #TASK_CALLEE_OFFSET + 0] stp x21, x22, [x0, #TASK_CALLEE_OFFSET + 16] stp x23, x24, [x0, #TASK_CALLEE_OFFSET + 32] stp x25, x26, [x0, #TASK_CALLEE_OFFSET + 48] stp x27, x28, [x0, #TASK_CALLEE_OFFSET + 64] stp x29, x30, [x0, #TASK_CALLEE_OFFSET + 80] stp q8, q9, [x0, #TASK_VECTOR_OFFSET + 0] stp q10, q11, [x0, #TASK_VECTOR_OFFSET + 32] stp q12, q13, [x0, #TASK_VECTOR_OFFSET + 64] stp q14, q15, [x0, #TASK_VECTOR_OFFSET + 96] ldp q8, q9, [x1, #TASK_VECTOR_OFFSET + 0] ldp q10, q11, [x1, #TASK_VECTOR_OFFSET + 32] ldp q12, q13, [x1, #TASK_VECTOR_OFFSET + 64] ldp q14, q15, [x1, #TASK_VECTOR_OFFSET + 96] ldp x19, x20, [x1, #TASK_CALLEE_OFFSET + 0] ldp x21, x22, [x1, #TASK_CALLEE_OFFSET + 16] ldp x23, x24, [x1, #TASK_CALLEE_OFFSET + 32] ldp x25, x26, [x1, #TASK_CALLEE_OFFSET + 48] ldp x27, x28, [x1, #TASK_CALLEE_OFFSET + 64] ldp x29, x30, [x1, #TASK_CALLEE_OFFSET + 80] ldr x9, [x1, #TASK_SP_OFFSET] mov sp, x9 ret