x86_64: GS base work
[akaros.git] / kern / arch / x86 / entry64.S
index 031a0ef..fe911f2 100644 (file)
@@ -7,9 +7,6 @@
 #include <arch/x86.h>
 #include <ros/memlayout.h>
 
-# Shift Right Logical 
-#define SRL(val, shamt)                (((val) >> (shamt)) & ~(-1 << (32 - (shamt))))
-
 #define MULTIBOOT_PAGE_ALIGN  (1<<0)
 #define MULTIBOOT_MEMORY_INFO (1<<1)
 #define MULTIBOOT_HEADER_MAGIC (0x1BADB002)
@@ -114,6 +111,14 @@ _start:
        ljmp    $0x08, $long_mode
 .code64
 long_mode:
+       # zero the data segments.  Not sure if this is legit or not.
+       xor             %rax, %rax
+       mov             %ax, %ds
+       mov             %ax, %es
+       mov             %ax, %ss
+       mov             %ax, %fs
+       mov             %ax, %gs
+       lldt    %ax
        # paging is on, and our code is still running at 0x00100000.
        # do some miscellaneous OS setup.  the coreid stuff is so we can call
        # core_id() before smp_boot. 
@@ -121,6 +126,15 @@ long_mode:
        movl    $0x0, (%rax)
        movabs  $(hw_coreid_lookup), %rax
        movl    $0x0, (%rax)
+       # set up gs to point to our pcpu info (both GS base and KERN GS base)
+       movabs  $(per_cpu_info), %rdx
+       movq    %rdx, %rax
+       shrq    $32, %rdx
+       andl    $0xffffffff, %eax
+       movl    $MSR_GS_BASE, %ecx
+       wrmsr
+       movl    $MSR_KERN_GS_BASE, %ecx
+       wrmsr
        # Clear the frame pointer for proper backtraces
        movq    $0x0, %rbp
        movabs  $(bootstacktop), %rsp
@@ -135,14 +149,23 @@ spin:     jmp     spin
 
 .section .bootdata, "aw"
        .p2align        2               # force 4 byte alignment
+.globl gdt64
 gdt64:
+       # keep the number of these in sync with SEG_COUNT
        SEG_NULL
-       SEG_CODE_64(0)
+       SEG_CODE_64(0)          # kernel code segment
+       SEG_DATA_64(0)          # kernel data segment
+       SEG_CODE_64(3)          # user code segment
+       SEG_DATA_64(3)          # user data segment
+       SEG_NULL                        # these two nulls are a placeholder for the TSS
+       SEG_NULL                        # these two nulls are a placeholder for the TSS
+.globl gdt64desc
 gdt64desc:
        .word   (gdt64desc - gdt64 - 1)         # sizeof(gdt64) - 1
        .long   gdt64           # HW 0-extends this to 64 bit when loading (i think)
 # boot page tables
        .align PGSIZE
+.globl boot_pml4
 boot_pml4:
        .space  PGSIZE
 boot_pml3_lo:
@@ -154,14 +177,6 @@ boot_pml3_kernbase:
 
 # From here down is linked for KERNBASE
 .data
-       # TODO: do we need these in asm?
-       .globl  vpt
-       .quad   vpt
-       .set    vpt, VPT
-       .globl  vpd
-       .quad   vpd
-       .set    vpd, (VPT + SRL(VPT, 10))
-
        .p2align        PGSHIFT         # force page alignment
        .globl          bootstack
 bootstack: