Check to make sure an ldt exists before loading it
authorKevin Klues <klueska@ros-dev.(none)>
Wed, 14 Apr 2010 22:33:27 +0000 (15:33 -0700)
committerKevin Klues <klueska@cs.berkeley.edu>
Thu, 3 Nov 2011 00:35:42 +0000 (17:35 -0700)
kern/arch/i686/env.c

index 19afc17..7f5f4e8 100644 (file)
@@ -17,14 +17,17 @@ void env_pop_tf(trapframe_t *tf)
 {
        /* Bug with this whole idea (TODO: (TLSV))*/
        /* Load the LDT for this process.  Slightly ghetto doing it here. */
-       segdesc_t *my_gdt = per_cpu_info[core_id()].gdt;
        /* copy-in and check the LDT location.  the segmentation hardware write the
         * accessed bit, so we want the memory to be in the user-writeable area. */
        segdesc_t *ldt = current->procdata->ldt;
        ldt = (segdesc_t*)MIN((uintptr_t)ldt, UTOP - LDT_SIZE);
-       segdesc_t ldt_temp = SEG_SYS(STS_LDT, (uint32_t)ldt, LDT_SIZE, 3);
-       my_gdt[GD_LDT >> 3] = ldt_temp;
-       asm volatile("lldt %%ax" :: "a"(GD_LDT));
+       /* Only set up the ldt if a pointer to the ldt actually exists */
+       if(ldt != NULL) {
+               segdesc_t *my_gdt = per_cpu_info[core_id()].gdt;
+               segdesc_t ldt_temp = SEG_SYS(STS_LDT, (uint32_t)ldt, LDT_SIZE, 3);
+               my_gdt[GD_LDT >> 3] = ldt_temp;
+               asm volatile("lldt %%ax" :: "a"(GD_LDT));
+       }
 
        /* In case they are enabled elsewhere.  We can't take an interrupt in these
         * routines, due to how they play with the kernel stack pointer. */