x86: Upgrade backtrace
[akaros.git] / kern / arch / x86 / entry64.S
index 4ccedc5..65141c9 100644 (file)
@@ -5,7 +5,7 @@
 #include <arch/mmu.h>
 #include <arch/trap.h>
 #include <arch/x86.h>
-#include <ros/memlayout.h>
+#include <kstack.h>
 
 #define MULTIBOOT_PAGE_ALIGN  (1<<0)
 #define MULTIBOOT_MEMORY_INFO (1<<1)
@@ -44,7 +44,7 @@ multiboot_header:
 /* Helper: creates count mappings in the PML3 for 1GB jumbo pages for the given
  * vaddr to paddr range in physical memory.  Then it puts that PML3's addr in
  * the PML4's appropriate slot.  Using a macro mostly to help with 64 bit
- * argument marshalling.  
+ * argument marshalling.
  *
  * This will clobber ax, dx, cx, di, si.
  *
@@ -95,7 +95,7 @@ map_gb_pages:
        call    insert_pml3
        pop             %ebx
        ret
-       
+
 # Fills pml3 with "count" jumbo entries, mapping from vaddr -> paddr.
 # pml3s are responsible for bits 38..30 of vaddr space and 30 bit paddr entries
 #
@@ -127,7 +127,7 @@ fill_jpml3:
        jnz             1b
        pop             %ebx
        ret
-       
+
 #define MAP_2MB_PAGES(pml3, vaddr, paddr, count, pml2base)                     \
        movl    $(pml2base), %eax;                                                 \
        push    %eax;                                                              \
@@ -157,7 +157,7 @@ map_2mb_pages:
        # arg5 and 7 on stack.  other args already in regs.
        movl    0x1c(%esp), %ebx        # arg7 (4 pushes, 1 retaddr, arg 5, arg6)
        push    %ebx
-       movl    0x18(%esp), %ebx        # arg5 (5 pushes, 1 retaddr)
+       movl    0x18(%esp), %ebx        # arg6 (5 pushes, 1 retaddr)
        push    %ebx
        call    fill_pml3
        add             $0x8, %esp                      # pop args frame
@@ -169,7 +169,7 @@ map_2mb_pages:
        call    insert_pml3
        pop             %ebx
        ret
-       
+
 # Fills pml3 with "count" pml2 entries, mapping from vaddr -> paddr.
 # pml3s are responsible for bits 38..30 of vaddr space and 30 bit paddr entries
 #
@@ -266,7 +266,7 @@ insert_pml3:
        andl    $0x1ff, %esi
        orl             $(PTE_P | PTE_W), %edi
        movl    %edi, (%ecx, %esi, 8)
-       movl    $0x0, 4(%ecx, %esi, 8)
+       movl    $0x0, 4(%ecx, %esi, 8)  # being clever, i know upper bits are 0
        ret
 
 # Inserts a pml2 into pml3, so that it handles mapping for vaddr
@@ -280,7 +280,7 @@ insert_pml2:
        andl    $0x1ff, %esi
        orl             $(PTE_P | PTE_W), %edi
        movl    %edi, (%ecx, %esi, 8)
-       movl    $0x0, 4(%ecx, %esi, 8)
+       movl    $0x0, 4(%ecx, %esi, 8)  # being clever, i know upper bits are 0
        ret
 
 .globl         _start
@@ -331,8 +331,8 @@ post_mapping:
        # Setup cr0.  PE and PG are critical for now.  The others are similar to
        # what we want in general (-AM with 64 bit, it's useless).
        movl    %cr0, %eax
-       orl             $(CR0_PE | CR0_PG | CR0_WP | CR0_NE | CR0_MP), %eax  
-       andl    $(~(CR0_AM | CR0_TS | CR0_EM | CR0_CD | CR0_NW)), %eax  
+       orl             $(CR0_PE | CR0_PG | CR0_WP | CR0_NE | CR0_MP), %eax
+       andl    $(~(CR0_AM | CR0_TS | CR0_EM | CR0_CD | CR0_NW)), %eax
        movl    %eax, %cr0
        pop             %ebx                            # restore multiboot info
        # load the 64bit GDT and jump to long mode
@@ -382,12 +382,7 @@ long_mode:
        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. 
-       movabs  $(os_coreid_lookup), %rax
-       movl    $0x0, (%rax)
-       movabs  $(hw_coreid_lookup), %rax
-       movl    $0x0, (%rax)
+       # do some miscellaneous OS setup.
        # set up gs to point to our pcpu info (both GS base and KERN GS base)
        movabs  $(per_cpu_info), %rdx
        movq    %rdx, %rax
@@ -400,8 +395,6 @@ long_mode:
        # Clear the frame pointer for proper backtraces
        movq    $0x0, %rbp
        movabs  $(bootstacktop), %rsp
-       movabs  $(num_cpus), %rax
-       movl    $0x1, (%rax)
        # Pass multiboot info to kernel_init (%rdi == arg1)
        movq    %rbx, %rdi
        movabs  $(kernel_init), %rax
@@ -452,6 +445,15 @@ boot_pml2_kb:              # 512 pml2s in the kb pml3
        .space  PGSIZE * 512
 
 # From here down is linked for KERNBASE
+.text
+       .globl get_boot_pml4
+get_boot_pml4:
+       movabs  $(boot_pml4), %rax
+       ret
+       .globl get_gdt64
+get_gdt64:
+       movabs  $(gdt64), %rax
+       ret
 .data
        .p2align        PGSHIFT         # force page alignment
        .globl          bootstack