.global context_switch
.type context_switch, %function

// void context_switch(unsigned long* old_sp, unsigned long new_sp);

context_switch:
    cbz     x0, 1f                      // dacă old_sp == NULL, sari peste salvare

    // Salvează registrele callee-saved
    stp     x19, x20, [sp, #-16]!
    stp     x21, x22, [sp, #-16]!
    stp     x23, x24, [sp, #-16]!
    stp     x25, x26, [sp, #-16]!
    stp     x27, x28, [sp, #-16]!
    stp     x29, x30, [sp, #-16]!

    // Salvează SP în *old_sp
    mov     x2, sp
    str     x2, [x0]

1:
    // Treci la SP-ul următorului task
    mov     sp, x1

    // Restaurează contextul
    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
