X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/008676633c2ad2c325837c2b64915f7ded690a8f..527f99514973766e9c0382a4d8550dfb00f54939:/osfmk/i386/pcb_native.c diff --git a/osfmk/i386/pcb_native.c b/osfmk/i386/pcb_native.c index b26756da1..34df7c119 100644 --- a/osfmk/i386/pcb_native.c +++ b/osfmk/i386/pcb_native.c @@ -54,7 +54,6 @@ * the rights to redistribute these changes. */ -#include #include #include @@ -138,6 +137,7 @@ act_machine_switch_pcb(__unused thread_t old, thread_t new) 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); @@ -159,9 +159,7 @@ act_machine_switch_pcb(__unused thread_t old, thread_t new) /* 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, @@ -169,6 +167,8 @@ act_machine_switch_pcb(__unused thread_t old, thread_t new) */ *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; @@ -196,7 +196,6 @@ act_machine_switch_pcb(__unused thread_t old, thread_t new) wrmsr64(MSR_IA32_KERNEL_GS_BASE, pcb->cthread_self); } } - } else { cdp->cpu_task_map = TASK_MAP_32BIT; @@ -404,9 +403,7 @@ machine_thread_create( * 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); @@ -429,7 +426,7 @@ machine_thread_destroy( #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;