From aaaf607148436993af968c6fb0f92a759e8fdccb Mon Sep 17 00:00:00 2001 From: Colin Percival Date: Fri, 31 Dec 2010 17:42:25 +0000 Subject: [PATCH] Make i386_set_ldt work on i386/XEN, step 5/5. When cleaning up a thread, reset its LDT to the default LDT. Note: Casting the LDT pointer to an int and storing it in pc_currentldt is wildly bogus, but is harmless since pc_currentldt is a write-only variable. MFC after: 3 days --- sys/i386/i386/sys_machdep.c | 5 +++++ sys/i386/include/segments.h | 1 + 2 files changed, 6 insertions(+) diff --git a/sys/i386/i386/sys_machdep.c b/sys/i386/i386/sys_machdep.c index b47679ab775..3fb231b7866 100644 --- a/sys/i386/i386/sys_machdep.c +++ b/sys/i386/i386/sys_machdep.c @@ -523,8 +523,13 @@ user_ldt_free(struct thread *td) } if (td == PCPU_GET(curthread)) { +#ifdef XEN + i386_reset_ldt(&default_proc_ldt); + PCPU_SET(currentldt, (int)&default_proc_ldt); +#else lldt(_default_ldt); PCPU_SET(currentldt, _default_ldt); +#endif } mdp->md_ldt = NULL; diff --git a/sys/i386/include/segments.h b/sys/i386/include/segments.h index deeaf76ccbc..1c1ddee864f 100644 --- a/sys/i386/include/segments.h +++ b/sys/i386/include/segments.h @@ -257,6 +257,7 @@ struct region_descriptor { #ifdef _KERNEL extern int _default_ldt; #ifdef XEN +extern struct proc_ldt default_proc_ldt; extern union descriptor *gdt; extern union descriptor *ldt; #else