x86: helpers for accessing symbols from asm
authorBarret Rhoden <brho@cs.berkeley.edu>
Tue, 10 Mar 2015 20:49:17 +0000 (16:49 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Tue, 10 Mar 2015 20:55:26 +0000 (16:55 -0400)
kern/arch/x86/entry64.S
kern/arch/x86/pmap.h
kern/arch/x86/pmap64.c

index f76636c..2328aa8 100644 (file)
@@ -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
@@ -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
@@ -452,6 +452,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
index 3cf38a0..204063f 100644 (file)
@@ -3,5 +3,7 @@
 
 void x86_cleanup_bootmem(void);
 void setup_default_mtrrs(barrier_t *smp_barrier);
+physaddr_t get_boot_pml4(void);
+uintptr_t get_gdt64(void);
 
 #endif /* ROS_KERN_ARCH_PMAP_H */
index 698ab83..ba83467 100644 (file)
@@ -419,9 +419,9 @@ static void check_syms_va(void)
 void vm_init(void)
 {
        uint32_t edx;
-       boot_cr3 = (physaddr_t)boot_pml4;
-       boot_pgdir = KADDR((uintptr_t)boot_pml4);
-       gdt = KADDR((uintptr_t)gdt64);
+       boot_cr3 = get_boot_pml4();
+       boot_pgdir = KADDR(get_boot_pml4());
+       gdt = KADDR(get_gdt64());
 
        /* We need to limit our mappings on machines that don't support 1GB pages */
        cpuid(0x80000001, 0x0, 0, 0, 0, &edx);