x86: Stores core 0's stack as a KVA
authorBarret Rhoden <brho@cs.berkeley.edu>
Mon, 18 Oct 2010 20:27:39 +0000 (13:27 -0700)
committerKevin Klues <klueska@cs.berkeley.edu>
Thu, 3 Nov 2011 00:35:55 +0000 (17:35 -0700)
Instead of a virtual address (like 0xbfc00000).

kern/arch/i686/trap.c

index 1305ba8..d705af1 100644 (file)
@@ -127,9 +127,12 @@ idt_init(void)
        idt[T_SYSCALL].gd_type = SINIT(STS_TG32);
        idt[T_BRKPT].gd_dpl = SINIT(3);
 
        idt[T_SYSCALL].gd_type = SINIT(STS_TG32);
        idt[T_BRKPT].gd_dpl = SINIT(3);
 
-       // Setup a TSS so that we get the right stack
-       // when we trap to the kernel.
-       ts.ts_esp0 = SINIT(KSTACKTOP);
+       /* Setup a TSS so that we get the right stack when we trap to the kernel.
+        * We need to use the KVA for stacktop, and not the memlayout virtual
+        * address, so we can free it later (and check for other bugs). */
+       pte_t *pte = pgdir_walk(boot_pgdir, (void*)KSTACKTOP - PGSIZE, 0);
+       uintptr_t stacktop_kva = (uintptr_t)ppn2kva(PTE2PPN(*pte)) + PGSIZE;
+       ts.ts_esp0 = stacktop_kva;
        ts.ts_ss0 = SINIT(GD_KD);
 
        // Initialize the TSS field of the gdt.
        ts.ts_ss0 = SINIT(GD_KD);
 
        // Initialize the TSS field of the gdt.