        .text

/*
Callee save registers:
        ebp, ebx, esi, edi

Caller save registers:
        eax, ecx, edx
*/

/*
Saves a set of registers. This is used by our implementation of
getcontext.

The registers_t variable is in (%esp)
*/

// swap_registers(registers_t *oregs, registers_t *regs)
.globl swap_registers
swap_registers:
    // save the old context
    movl 4(%esp), %eax
    movl %ebx, 4(%eax)
    movl %ebp, 16(%eax)
    movl %esi, 20(%eax)
    movl %edi, 24(%eax)

    // save the flags
    pushf
    popl %ecx
    movl %ecx, 44(%eax)

    // save the return address as the instruction pointer
    // and save the stack pointer of the caller
    popl %ecx
    movl %esp, 28(%eax)
    movl %ecx, 48(%eax)

    // restore the new context
    movl 4(%esp), %eax

    movl 4(%eax), %ebx
    movl 16(%eax), %ebp
    movl 20(%eax), %esi
    movl 24(%eax), %edi
    movl 28(%eax), %esp

    // restore the flags
    movl 44(%eax), %ecx
    push %ecx
    popf

    // Return!
    jmp *48(%eax)


