.globl switch .extern kvar_stack_pma switch: # TODO: Check if we come from kernel mode (use kernel stack) # TODO: restore all registers mov 96(%rdi), %ax mov %ax, %ds mov %ax, %es mov %ax, %fs mov %ax, %gs mov (%rdi), %rax mov %rax, %cr3 push 96(%rdi) push 64(%rdi) pushf pop %rax or $0x200, %rax # Enable interrupt mov $0xffffffffbfff, %rbx # NT flag and %rbx, %rax push %rax push 40(%rdi) push 48(%rdi) # Perform task switching iretq