From c95ccdb089510f6ec89568f992aa105b4109cd87 Mon Sep 17 00:00:00 2001 From: Alex Date: Tue, 11 Oct 2022 02:48:12 +0300 Subject: [PATCH] TODO: Trampoline can't be compiled. --- Architecture/amd64/cpu/SMPTrampoline.asm | 202 +++++++++++------------ Makefile | 8 + 2 files changed, 109 insertions(+), 101 deletions(-) diff --git a/Architecture/amd64/cpu/SMPTrampoline.asm b/Architecture/amd64/cpu/SMPTrampoline.asm index fa1317e..4017b88 100644 --- a/Architecture/amd64/cpu/SMPTrampoline.asm +++ b/Architecture/amd64/cpu/SMPTrampoline.asm @@ -1,113 +1,113 @@ -[bits 16] -TRAMPOLINE_BASE equ 0x2000 +; [bits 16] +; TRAMPOLINE_BASE equ 0x2000 -extern StartCPU -global _trampoline_start -_trampoline_start: - cli - mov ax, 0x0 - mov ds, ax - mov es, ax - mov fs, ax - mov gs, ax - mov ss, ax - o32 lgdt [ProtectedMode_gdtr - _trampoline_start + TRAMPOLINE_BASE] - mov eax, cr0 - or al, 0x1 - mov cr0, eax - jmp 0x8:(Trampoline32 - _trampoline_start + TRAMPOLINE_BASE) +; extern StartCPU +; global _trampoline_start +; _trampoline_start: +; cli +; mov ax, 0x0 +; mov ds, ax +; mov es, ax +; mov fs, ax +; mov gs, ax +; mov ss, ax +; o32 lgdt [ProtectedMode_gdtr - _trampoline_start + TRAMPOLINE_BASE] +; mov eax, cr0 +; or al, 0x1 +; mov cr0, eax +; jmp 0x8:(Trampoline32 - _trampoline_start + TRAMPOLINE_BASE) -[bits 32] -section .text -Trampoline32: - mov bx, 0x10 - mov ds, bx - mov es, bx - mov ss, bx - mov eax, dword [0x500] - mov cr3, eax - mov eax, cr4 - or eax, 1 << 5 ; Set the PAE-bit, which is the 6th bit (bit 5). - or eax, 1 << 7 - mov cr4, eax - mov ecx, 0xc0000080 - rdmsr - or eax,1 << 8 ; LME - wrmsr - mov eax, cr0 - or eax, 1 << 31 - mov cr0, eax - lgdt [LongMode_gdtr - _trampoline_start + TRAMPOLINE_BASE] - jmp 0x8:(Trampoline64 - _trampoline_start + TRAMPOLINE_BASE) +; [bits 32] +; section .text +; Trampoline32: +; mov bx, 0x10 +; mov ds, bx +; mov es, bx +; mov ss, bx +; mov eax, dword [0x500] +; mov cr3, eax +; mov eax, cr4 +; or eax, 1 << 5 ; Set the PAE-bit, which is the 6th bit (bit 5). +; or eax, 1 << 7 +; mov cr4, eax +; mov ecx, 0xc0000080 +; rdmsr +; or eax,1 << 8 ; LME +; wrmsr +; mov eax, cr0 +; or eax, 1 << 31 +; mov cr0, eax +; lgdt [LongMode_gdtr - _trampoline_start + TRAMPOLINE_BASE] +; jmp 0x8:(Trampoline64 - _trampoline_start + TRAMPOLINE_BASE) -[bits 64] -Trampoline64: - mov ax, 0x10 - mov ds, ax - mov es, ax - mov ss, ax - mov ax, 0x0 - mov fs, ax - mov gs, ax - lgdt [0x580] - lidt [0x590] - mov rsp, [0x570] - mov rbp, 0x0 ; Terminate stack traces here. - ; Reset RFLAGS. - push 0x0 - popf - mov rax, qword vcode64 - call vcode64 +; [bits 64] +; Trampoline64: +; mov ax, 0x10 +; mov ds, ax +; mov es, ax +; mov ss, ax +; mov ax, 0x0 +; mov fs, ax +; mov gs, ax +; lgdt [0x580] +; lidt [0x590] +; mov rsp, [0x570] +; mov rbp, 0x0 ; Terminate stack traces here. +; ; Reset RFLAGS. +; push 0x0 +; popf +; mov rax, qword vcode64 +; call vcode64 -vcode64: - push rbp - ; Set up SSE - mov rax, cr0 - ; btr eax, 2 - ; bts eax, 1 - ; mov cr0, rax - mov rax, cr4 - bts eax, 9 - bts eax, 10 - mov cr4, rax - mov rax, qword TrampolineExit - call rax +; vcode64: +; push rbp +; ; Set up SSE +; mov rax, cr0 +; ; btr eax, 2 +; ; bts eax, 1 +; ; mov cr0, rax +; mov rax, cr4 +; bts eax, 9 +; bts eax, 10 +; mov cr4, rax +; mov rax, qword TrampolineExit +; call rax -align 16 -LongMode_gdtr: - dw LongModeGDTEnd - LongModeGDTStart - 1 - dq LongModeGDTStart - _trampoline_start + TRAMPOLINE_BASE +; align 16 +; LongMode_gdtr: +; dw LongModeGDTEnd - LongModeGDTStart - 1 +; dq LongModeGDTStart - _trampoline_start + TRAMPOLINE_BASE -align 16 -LongModeGDTStart: - dq 0 ; NULL segment - dq 0x00AF98000000FFFF ; Code segment - dq 0x00CF92000000FFFF ; Data segment -LongModeGDTEnd: +; align 16 +; LongModeGDTStart: +; dq 0 ; NULL segment +; dq 0x00AF98000000FFFF ; Code segment +; dq 0x00CF92000000FFFF ; Data segment +; LongModeGDTEnd: -align 16 -ProtectedMode_gdtr: - dw ProtectedModeGDTEnd - ProtectedModeGDTStart - 1 - dd ProtectedModeGDTStart - _trampoline_start + TRAMPOLINE_BASE +; align 16 +; ProtectedMode_gdtr: +; dw ProtectedModeGDTEnd - ProtectedModeGDTStart - 1 +; dd ProtectedModeGDTStart - _trampoline_start + TRAMPOLINE_BASE -align 16 -ProtectedModeGDTStart: - dq 0 ; NULL segment - dq 0x00CF9A000000FFFF ; Code segment - dq 0x00CF92000000FFFF ; Data segment -ProtectedModeGDTEnd: +; align 16 +; ProtectedModeGDTStart: +; dq 0 ; NULL segment +; dq 0x00CF9A000000FFFF ; Code segment +; dq 0x00CF92000000FFFF ; Data segment +; ProtectedModeGDTEnd: -align 16 -ProtectedMode_idtr: - dw 0 - dd 0 - dd 0 - align 16 +; align 16 +; ProtectedMode_idtr: +; dw 0 +; dd 0 +; dd 0 +; align 16 -global _trampoline_end -_trampoline_end: +; global _trampoline_end +; _trampoline_end: -TrampolineExit: - call StartCPU +; TrampolineExit: +; call StartCPU -times 512 - ($-$$) db 0 +; times 512 - ($-$$) db 0 diff --git a/Makefile b/Makefile index 234bb0b..74a1399 100644 --- a/Makefile +++ b/Makefile @@ -86,6 +86,14 @@ LDFLAGS += -TArchitecture/aarch64/linker.ld -fPIC endif +ifeq ($(OSARCH), amd64) +NASMFLAGS := -f elf64 +else ifeq ($(OSARCH), i686) +NASMFLAGS := -f elf32 +else ifeq ($(OSARCH), aarch64) +NASMFLAGS := +endif + ifeq ($(DEBUG), 1) CFLAGS += -DDEBUG -ggdb -O0 -fdiagnostics-color=always LDFLAGS += -ggdb -O0 -g