46 lines
791 B
ArmAsm
46 lines
791 B
ArmAsm
|
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
|
||
|
|