x86_64: GS base work
[akaros.git] / kern / arch / x86 / entry64.S
index cfc3278..fe911f2 100644 (file)
@@ -126,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
@@ -142,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