format elf64 public interrupt_ReloadSegments public interrupt_LoadGDT public interrupt_LoadIDT section '.text' executable ; sysvx64call void interrupt_LoadGDT(void* gdtr) ; ; Input: (void* rdi) ; Clobbers: none interrupt_LoadGDT: lgdt [rdi] ret ; 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_LoadIDT(void* idtr) ; ; Input: (void* rdi) ; Clobbers: none interrupt_LoadIDT: lidt [rdi] ret