x86_64: GS base work
[akaros.git] / kern / arch / x86 / entry64.S
index 876e840..fe911f2 100644 (file)
@@ -112,12 +112,13 @@ _start:
 .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
+       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. 
@@ -125,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
@@ -141,12 +151,14 @@ 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
-       SEG_DATA_64                     # generic flat data segment (debugging for now)
 .globl gdt64desc
 gdt64desc:
        .word   (gdt64desc - gdt64 - 1)         # sizeof(gdt64) - 1