First step towards x86_64
This commit is contained in:
parent
f8c9766476
commit
fddedb4448
4 changed files with 135 additions and 3 deletions
|
@ -1,10 +1,15 @@
|
|||
arch = x86
|
||||
arch = x86_64
|
||||
#MODE = debug
|
||||
MODE = release # enables optimization
|
||||
|
||||
export PATH := $(HOME)/opt/bin:$(PATH)
|
||||
#PREFIX =
|
||||
ifeq ($(arch),x86)
|
||||
PREFIX = i686-elf-
|
||||
else
|
||||
ifeq ($(arch),x86_64)
|
||||
PREFIX = x86_64-elf-
|
||||
endif
|
||||
endif
|
||||
|
||||
ifeq ($(MODE),debug)
|
||||
CFLAGS += -g3 -DDEBUG
|
||||
|
|
127
kernel/hal/x86_64/boot/boot.S
Normal file
127
kernel/hal/x86_64/boot/boot.S
Normal file
|
@ -0,0 +1,127 @@
|
|||
.code32
|
||||
.section multiboot
|
||||
#define MB_MAGIC 0x1BADB002
|
||||
#define MB_FLAGS 0x0
|
||||
#define MB_CHECKSUM -(MB_MAGIC + MB_FLAGS)
|
||||
.align 4
|
||||
.int MB_MAGIC
|
||||
.int MB_FLAGS
|
||||
.int MB_CHECKSUM
|
||||
.section .text
|
||||
.extern init
|
||||
.global _start
|
||||
_start:
|
||||
mov $mb_ptr, %edi
|
||||
stosl
|
||||
mov %ebx, %eax
|
||||
stosl //Temponarily store both multiboot header pointer and multiboot
|
||||
mov $kernel_stack, %esp
|
||||
mov $0x80000001, %eax //Check if Long Mode is supported
|
||||
cpuid
|
||||
and $0x20000000, %edx
|
||||
jz x86_64_err
|
||||
|
||||
xor %eax, %eax //Check if PAE is supported
|
||||
inc %eax
|
||||
cpuid
|
||||
and $0x40, %dl
|
||||
jz x86_64_err
|
||||
jmp x86_64_OK
|
||||
x86_64_err:
|
||||
cli
|
||||
hlt
|
||||
jmp x86_64_err
|
||||
x86_64_OK:
|
||||
//Fill one entry of both the pagemap L4 and the Pagedir PT
|
||||
mov $pmfill, %esi
|
||||
mov $pagemapL4, %edi
|
||||
lodsl
|
||||
stosl
|
||||
lodsl
|
||||
stosl
|
||||
mov $pagedirPT, %edi
|
||||
lodsl
|
||||
stosl
|
||||
lodsl
|
||||
stosl
|
||||
//Activate PAE
|
||||
mov %cr4, %eax
|
||||
or $0x20, %al
|
||||
mov %eax, %cr4
|
||||
//Activate x86_64
|
||||
mov $0xC0000080, %ecx
|
||||
rdmsr
|
||||
or $0x00000100, %eax
|
||||
wrmsr
|
||||
//Load Page Table
|
||||
mov $pagemapL4, %eax
|
||||
mov %eax, %cr3
|
||||
//Activate Paging
|
||||
mov %cr0, %eax
|
||||
bswap %eax
|
||||
or $0x80, %al
|
||||
bswap %eax
|
||||
mov %eax, %cr0
|
||||
//Jump to x86_64loader
|
||||
lgdt gdtr
|
||||
jmp $0x18, $start
|
||||
|
||||
.code64
|
||||
//extern "C" void init(uint32_t eax, multiboot_info * ebx, uint64_t **** pt);
|
||||
.global init
|
||||
start:
|
||||
xor %rax, %rax
|
||||
mov $mb_ptr, %rsi
|
||||
lodsl
|
||||
mov %rax, %rdi
|
||||
lodsl
|
||||
mov %rax, %rsi
|
||||
mov $pagemapL4, %rdx
|
||||
call init
|
||||
stop:
|
||||
cli
|
||||
hlt
|
||||
jmp stop
|
||||
.section .data
|
||||
gdt:
|
||||
//NULL-descriptor
|
||||
.quad 0
|
||||
//32-bit code
|
||||
.word 0xFFFF
|
||||
.word 0x0000
|
||||
.byte 0x00
|
||||
.byte 0x98
|
||||
.byte 0xCF
|
||||
.byte 0x00
|
||||
//data
|
||||
.word 0xFFFF
|
||||
.word 0x0000
|
||||
.byte 0x00
|
||||
.byte 0x92
|
||||
.byte 0xCF
|
||||
.byte 00
|
||||
//64-bit code
|
||||
.int 0
|
||||
.byte 0
|
||||
.byte 0x98
|
||||
.byte 0x20
|
||||
.byte 0
|
||||
|
||||
gdtr:
|
||||
.word 4 * 8
|
||||
.int gdt
|
||||
pmfill:
|
||||
.int pagedirPT + 0x7
|
||||
.int 0
|
||||
pdptfill:
|
||||
.quad 0x87
|
||||
.section .bss
|
||||
mb_ptr:
|
||||
// These 8 Bytes will never be used when the stack comes near it
|
||||
.space 4096
|
||||
kernel_stack:
|
||||
.align 4096
|
||||
pagemapL4:
|
||||
.space 4096
|
||||
pagedirPT:
|
||||
.space 4096
|
BIN
test.elf
BIN
test.elf
Binary file not shown.
Loading…
Reference in a new issue