* the rights to redistribute these changes.
*/
-#include <mach_rt.h>
#include <mach_debug.h>
#include <mach_ldebug.h>
set_ds(NULL_SEG);
set_es(NULL_SEG);
set_fs(NULL_SEG);
+
if (get_gs() != NULL_SEG) {
swapgs(); /* switch to user's GS context */
set_gs(NULL_SEG);
/* require 16-byte alignment */
assert((pcb_stack_top & 0xF) == 0);
- /* Interrupt stack is pcb */
- current_ktss64()->rsp0 = pcb_stack_top;
-
+ current_ktss64()->rsp0 = cdp->cpu_desc_index.cdi_sstku;
/*
* Top of temporary sysenter stack points to pcb stack.
* Although this is not normally used by 64-bit users,
*/
*current_sstk64() = pcb_stack_top;
+ cdp->cd_estack = cpu_shadowp(cdp->cpu_number)->cd_estack = cdp->cpu_desc_index.cdi_sstku;
+
if (is_saved_state64(pcb->iss)) {
cdp->cpu_task_map = new->map->pmap->pm_task_map;
wrmsr64(MSR_IA32_KERNEL_GS_BASE, pcb->cthread_self);
}
}
-
} else {
cdp->cpu_task_map = TASK_MAP_32BIT;
* segment.
*/
if ((pcb->cthread_desc.access & ACC_P) == 0) {
- struct real_descriptor *ldtp;
- ldtp = (struct real_descriptor *)current_ldt();
- pcb->cthread_desc = ldtp[sel_idx(USER_DS)];
+ pcb->cthread_desc = *gdt_desc_p(USER_DS);
}
return(KERN_SUCCESS);
#endif
if (pcb->ifps != 0)
- fpu_free(pcb->ifps);
+ fpu_free(thread, pcb->ifps);
if (pcb->iss != 0) {
zfree(iss_zone, pcb->iss);
pcb->iss = 0;