x86_64 starts without erroring, reaches high mem and full 64-bit
authorJohn Hodge <[email protected]>
Thu, 27 May 2010 12:10:53 +0000 (20:10 +0800)
committerJohn Hodge <[email protected]>
Thu, 27 May 2010 12:10:53 +0000 (20:10 +0800)
Kernel/Makefile.BuildNum
Kernel/arch/x86_64/start32.asm
Kernel/arch/x86_64/start64.asm

index 2e18d02..165c6a4 100644 (file)
@@ -1 +1 @@
-BUILD_NUM = 2206
+BUILD_NUM = 2212
index 21e7c40..6f3c9a7 100644 (file)
@@ -33,8 +33,12 @@ mboot:
 [global start]
 start:
        ; Check for Long Mode support
+       mov eax, 0x80000000
+       cpuid
+       cmp eax, 0x80000001     ; Compare the A-register with 0x80000001.
        mov eax, 0x80000001
        cpuid
+    jb .not64bitCapable
        test edx, 1<<29
        jz .not64bitCapable
 
@@ -60,13 +64,6 @@ start:
 
        ; Load GDT
        lgdt [gGDTPtr - KERNEL_BASE]
-       mov ax, 0x10
-       mov ss, ax
-       mov ds, ax
-       mov es, ax
-       mov fs, ax
-       mov gs, ax
-
        jmp 0x08:start64 - KERNEL_BASE
 
 .not64bitCapable:
index a2ffb19..699c793 100644 (file)
@@ -6,9 +6,32 @@
 [section .text]
 [global start64]
 start64:
+       ; Load Registers
+       mov ax, 0x10
+       mov ds, ax
+       mov es, ax
+       mov fs, ax
+       mov gs, ax
+       
+       ; Go to high memory
+       mov rax, start64.himem
+       jmp rax
+.himem:
+       
+       ; Clear the screen
+       mov rax, 0x1F201F201F201F20     ; Set the screen to White on blue, space (4 characters)
+       mov edi, 0xB8000
+       mov ecx, 80*25*2/8
+       rep stosq
+       
        ; Set kernel stack
+       mov rsp, gInitialKernelStack
+       
        ; Call main
-       jmp $
+       cli
+.hlt:
+       hlt
+       jmp .hlt
 
 [global GetRIP]
 GetRIP:

UCC git Repository :: git.ucc.asn.au