x86_64: GS base work
[akaros.git] / kern / arch / x86 / entry64.S
index 1ca8bd0..fe911f2 100644 (file)
@@ -111,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. 
@@ -118,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
@@ -134,9 +151,12 @@ spin:      jmp     spin
        .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)          # 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