x86 thread local storage tweaks
[akaros.git] / kern / arch / i386 / env.c
index 83c05bc..aa5ce87 100644 (file)
@@ -17,10 +17,11 @@ void env_pop_tf(trapframe_t *tf)
 {
        /* Load the LDT for this process.  Slightly ghetto doing it here. */
        segdesc_t *my_gdt = per_cpu_info[core_id()].gdt;
-       /* using local space so we can use this macro */
-       segdesc_t ldt_temp = SEG_SYS(STS_LDT, (uint32_t)current->env_procdata->ldt,
-                                    8192, 3);
-
+       /* 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->env_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));