x86: Use a KERNBASE address for the bootstack
authorBarret Rhoden <brho@cs.berkeley.edu>
Sat, 14 Jul 2018 03:02:28 +0000 (23:02 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Sat, 14 Jul 2018 03:17:59 +0000 (23:17 -0400)
Since commit 20694dda54b5 ("x86: Put the boot PMLs and stacks in BSS"),
we have been unable to backtrace from kernel_init(), up until we are on
a stack from the kernel allocator.

The reason is that the kernel backtracer checks for framepointers above
KERNBASE.  When we used an address from within the boot section, those
addresses are at the bottom of the address space.  For instance, our
stack page was around 0x50f000.

We can still use that page, which isn't present in the binary - we just
need to use the KERNBASE mapping for it.

Note we can't use the normal BSS.  That gets zeroed out manually in
kernel_init(), which is after we start using the stack.

Also note that we don't need to set the stacktop for the IDT right away.
That code was from before we had the kernel stack allocator.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
kern/arch/x86/entry64.S
kern/arch/x86/trap.c
kern/include/pmap.h

index bcde2df..61774cd 100644 (file)
@@ -394,7 +394,8 @@ long_mode:
        wrmsr
        # Clear the frame pointer for proper backtraces
        movq    $0x0, %rbp
-       movabs  $(bootstacktop), %rsp
+       # We can use the bootstack from the BSS, but we need the KERNBASE addr
+       movabs  $(bootstacktop + KERNBASE), %rsp
        # Pass multiboot info to kernel_init (%rdi == arg1)
        movq    %rbx, %rdi
        movabs  $(kernel_init), %rax
index b5af403..0e326a2 100644 (file)
@@ -160,7 +160,8 @@ void idt_init(void)
        /* Set up our kernel stack when changing rings */
        /* Note: we want 16 byte aligned kernel stack frames (AMD 2:8.9.3) */
        x86_sysenter_init();
-       set_stack_top((uintptr_t)bootstacktop);
+       /* We will set this properly once we have a kstack from the slab. */
+       set_stack_top(0xdeadbeef);
 
        /* Initialize the TSS field of the gdt.  The size of the TSS desc differs
         * between 64 and 32 bit, hence the pointer acrobatics */
index 92500e1..b93158f 100644 (file)
@@ -56,8 +56,6 @@
 #define KADDR_NOCHECK(pa) ((void*)(pa + KERNBASE))
 #define KBASEADDR(kla) KADDR(PADDR(kla))
 
-extern char bootstacktop[], bootstack[];
-
 extern physaddr_t max_pmem;            /* Total amount of physical memory */
 extern size_t max_nr_pages;            /* Total number of physical memory pages */
 extern physaddr_t max_paddr;   /* Maximum addressable physical address */