TODO: Trampoline can't be compiled.

This commit is contained in:
Alex 2022-10-11 02:48:12 +03:00
parent d5c496ea14
commit c95ccdb089
Signed by untrusted user who does not match committer: enderice2
GPG Key ID: EACC3AD603BAB4DD
2 changed files with 109 additions and 101 deletions

View File

@ -1,113 +1,113 @@
[bits 16] ; [bits 16]
TRAMPOLINE_BASE equ 0x2000 ; TRAMPOLINE_BASE equ 0x2000
extern StartCPU ; extern StartCPU
global _trampoline_start ; global _trampoline_start
_trampoline_start: ; _trampoline_start:
cli ; cli
mov ax, 0x0 ; mov ax, 0x0
mov ds, ax ; mov ds, ax
mov es, ax ; mov es, ax
mov fs, ax ; mov fs, ax
mov gs, ax ; mov gs, ax
mov ss, ax ; mov ss, ax
o32 lgdt [ProtectedMode_gdtr - _trampoline_start + TRAMPOLINE_BASE] ; o32 lgdt [ProtectedMode_gdtr - _trampoline_start + TRAMPOLINE_BASE]
mov eax, cr0 ; mov eax, cr0
or al, 0x1 ; or al, 0x1
mov cr0, eax ; mov cr0, eax
jmp 0x8:(Trampoline32 - _trampoline_start + TRAMPOLINE_BASE) ; jmp 0x8:(Trampoline32 - _trampoline_start + TRAMPOLINE_BASE)
[bits 32] ; [bits 32]
section .text ; section .text
Trampoline32: ; Trampoline32:
mov bx, 0x10 ; mov bx, 0x10
mov ds, bx ; mov ds, bx
mov es, bx ; mov es, bx
mov ss, bx ; mov ss, bx
mov eax, dword [0x500] ; mov eax, dword [0x500]
mov cr3, eax ; mov cr3, eax
mov eax, cr4 ; mov eax, cr4
or eax, 1 << 5 ; Set the PAE-bit, which is the 6th bit (bit 5). ; or eax, 1 << 5 ; Set the PAE-bit, which is the 6th bit (bit 5).
or eax, 1 << 7 ; or eax, 1 << 7
mov cr4, eax ; mov cr4, eax
mov ecx, 0xc0000080 ; mov ecx, 0xc0000080
rdmsr ; rdmsr
or eax,1 << 8 ; LME ; or eax,1 << 8 ; LME
wrmsr ; wrmsr
mov eax, cr0 ; mov eax, cr0
or eax, 1 << 31 ; or eax, 1 << 31
mov cr0, eax ; mov cr0, eax
lgdt [LongMode_gdtr - _trampoline_start + TRAMPOLINE_BASE] ; lgdt [LongMode_gdtr - _trampoline_start + TRAMPOLINE_BASE]
jmp 0x8:(Trampoline64 - _trampoline_start + TRAMPOLINE_BASE) ; jmp 0x8:(Trampoline64 - _trampoline_start + TRAMPOLINE_BASE)
[bits 64] ; [bits 64]
Trampoline64: ; Trampoline64:
mov ax, 0x10 ; mov ax, 0x10
mov ds, ax ; mov ds, ax
mov es, ax ; mov es, ax
mov ss, ax ; mov ss, ax
mov ax, 0x0 ; mov ax, 0x0
mov fs, ax ; mov fs, ax
mov gs, ax ; mov gs, ax
lgdt [0x580] ; lgdt [0x580]
lidt [0x590] ; lidt [0x590]
mov rsp, [0x570] ; mov rsp, [0x570]
mov rbp, 0x0 ; Terminate stack traces here. ; mov rbp, 0x0 ; Terminate stack traces here.
; Reset RFLAGS. ; ; Reset RFLAGS.
push 0x0 ; push 0x0
popf ; popf
mov rax, qword vcode64 ; mov rax, qword vcode64
call vcode64 ; call vcode64
vcode64: ; vcode64:
push rbp ; push rbp
; Set up SSE ; ; Set up SSE
mov rax, cr0 ; mov rax, cr0
; btr eax, 2 ; ; btr eax, 2
; bts eax, 1 ; ; bts eax, 1
; mov cr0, rax ; ; mov cr0, rax
mov rax, cr4 ; mov rax, cr4
bts eax, 9 ; bts eax, 9
bts eax, 10 ; bts eax, 10
mov cr4, rax ; mov cr4, rax
mov rax, qword TrampolineExit ; mov rax, qword TrampolineExit
call rax ; call rax
align 16 ; align 16
LongMode_gdtr: ; LongMode_gdtr:
dw LongModeGDTEnd - LongModeGDTStart - 1 ; dw LongModeGDTEnd - LongModeGDTStart - 1
dq LongModeGDTStart - _trampoline_start + TRAMPOLINE_BASE ; dq LongModeGDTStart - _trampoline_start + TRAMPOLINE_BASE
align 16 ; align 16
LongModeGDTStart: ; LongModeGDTStart:
dq 0 ; NULL segment ; dq 0 ; NULL segment
dq 0x00AF98000000FFFF ; Code segment ; dq 0x00AF98000000FFFF ; Code segment
dq 0x00CF92000000FFFF ; Data segment ; dq 0x00CF92000000FFFF ; Data segment
LongModeGDTEnd: ; LongModeGDTEnd:
align 16 ; align 16
ProtectedMode_gdtr: ; ProtectedMode_gdtr:
dw ProtectedModeGDTEnd - ProtectedModeGDTStart - 1 ; dw ProtectedModeGDTEnd - ProtectedModeGDTStart - 1
dd ProtectedModeGDTStart - _trampoline_start + TRAMPOLINE_BASE ; dd ProtectedModeGDTStart - _trampoline_start + TRAMPOLINE_BASE
align 16 ; align 16
ProtectedModeGDTStart: ; ProtectedModeGDTStart:
dq 0 ; NULL segment ; dq 0 ; NULL segment
dq 0x00CF9A000000FFFF ; Code segment ; dq 0x00CF9A000000FFFF ; Code segment
dq 0x00CF92000000FFFF ; Data segment ; dq 0x00CF92000000FFFF ; Data segment
ProtectedModeGDTEnd: ; ProtectedModeGDTEnd:
align 16 ; align 16
ProtectedMode_idtr: ; ProtectedMode_idtr:
dw 0 ; dw 0
dd 0 ; dd 0
dd 0 ; dd 0
align 16 ; align 16
global _trampoline_end ; global _trampoline_end
_trampoline_end: ; _trampoline_end:
TrampolineExit: ; TrampolineExit:
call StartCPU ; call StartCPU
times 512 - ($-$$) db 0 ; times 512 - ($-$$) db 0

View File

@ -86,6 +86,14 @@ LDFLAGS += -TArchitecture/aarch64/linker.ld -fPIC
endif endif
ifeq ($(OSARCH), amd64)
NASMFLAGS := -f elf64
else ifeq ($(OSARCH), i686)
NASMFLAGS := -f elf32
else ifeq ($(OSARCH), aarch64)
NASMFLAGS :=
endif
ifeq ($(DEBUG), 1) ifeq ($(DEBUG), 1)
CFLAGS += -DDEBUG -ggdb -O0 -fdiagnostics-color=always CFLAGS += -DDEBUG -ggdb -O0 -fdiagnostics-color=always
LDFLAGS += -ggdb -O0 -g LDFLAGS += -ggdb -O0 -g