format elf64 public interrupt_ReloadSegments public interrupt_LoadGDT public interrupt_LoadIDT section '.text' executable ; sysvx64call void interrupt_ReloadSegments() ; ; Clobbers: rax interrupt_ReloadSegments: mov eax, 0x10 ; my data segment xor ax, ax mov ds, ax mov es, ax mov fs, ax mov gs, ax mov ss, ax ;jmp 0x08:.flush ; as in https://forum.osdev.org/viewtopic.php?f=1&t=30739 ; farjump does not work in long mode, you need to do a far return: pop rax push qword 0x08 ; my code segment push rax retfq ; sysvx64call void interrupt_LoadGDT(uint16_t length_sub1, void* base_ptr) ; ; Input: (uint16_t di, void* rsi) ; Clobbers: rax, flags interrupt_LoadGDT: mov rax, rsp ; save old RSP sub rsp, 10 and rsp, 0xfffffffffffffffc ; align RSP to 4-byte mov [rsp], di mov [rsp+2], rsi lgdt [rsp] mov rsp, rax ; restore old RSP ret ; sysvx64call void interrupt_LoadIDT(uint16_t length_sub1, void* base_ptr) ; ; Input: (uint16_t di, void* rsi) ; Clobbers: rax, flags interrupt_LoadIDT: mov rax, rsp ; save old RSP sub rsp, 10 and rsp, 0xfffffffffffffffc ; align RSP to 4-byte mov [rsp], di mov [rsp+2], rsi lidt [rsp] mov rsp, rax ; restore old RSP ret