x86: Fixes TLS bug causing kernel page faults
[akaros.git] / kern / arch / i686 / process.c
index 19cfc55..f5c7724 100644 (file)
@@ -40,3 +40,16 @@ void proc_set_syscall_retval(trapframe_t *SAFE tf, intreg_t value)
 {
        tf->tf_regs.reg_eax = value;
 }
+
+/* Called when we are currently running an address space on our core and want to
+ * abandon it.  We need a known good pgdir before releasing the old one.  We
+ * decref, since current no longer tracks the proc (and current no longer
+ * protects the cr3).  We also need to clear out the TLS registers (before
+ * unmapping the address space!) */
+void __abandon_core(void)
+{
+       asm volatile ("movw %%ax,%%gs; lldt %%ax" :: "a"(0));
+       lcr3(boot_cr3);
+       proc_decref(current, 1);
+       set_current_proc(NULL);
+}