Module Name: src Committed By: maxv Date: Sat Jul 22 09:20:01 UTC 2017
Modified Files: src/sys/arch/amd64/amd64: machdep.c Log Message: Must be curlwp. To generate a diff of this commit: cvs rdiff -u -r1.258 -r1.259 src/sys/arch/amd64/amd64/machdep.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/amd64/amd64/machdep.c diff -u src/sys/arch/amd64/amd64/machdep.c:1.258 src/sys/arch/amd64/amd64/machdep.c:1.259 --- src/sys/arch/amd64/amd64/machdep.c:1.258 Sat Jul 22 09:01:46 2017 +++ src/sys/arch/amd64/amd64/machdep.c Sat Jul 22 09:20:01 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: machdep.c,v 1.258 2017/07/22 09:01:46 maxv Exp $ */ +/* $NetBSD: machdep.c,v 1.259 2017/07/22 09:20:01 maxv Exp $ */ /*- * Copyright (c) 1996, 1997, 1998, 2000, 2006, 2007, 2008, 2011 @@ -111,7 +111,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.258 2017/07/22 09:01:46 maxv Exp $"); +__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.259 2017/07/22 09:20:01 maxv Exp $"); /* #define XENDEBUG_LOW */ @@ -401,7 +401,7 @@ cpu_startup(void) cpu_init_tss(&cpu_info_primary); #if !defined(XEN) ltr(cpu_info_primary.ci_tss_sel); -#endif /* !defined(XEN) */ +#endif x86_startup(); } @@ -2001,38 +2001,33 @@ cpu_fsgs_zero(struct lwp *l) struct pcb *pcb; uint64_t zero = 0; + KASSERT(l == curlwp); + pcb = lwp_getpcb(l); - if (l == curlwp) { - kpreempt_disable(); - tf->tf_fs = 0; - tf->tf_gs = 0; - setfs(0); + + kpreempt_disable(); + tf->tf_fs = 0; + tf->tf_gs = 0; + setfs(0); #ifndef XEN - setusergs(0); + setusergs(0); #else - HYPERVISOR_set_segment_base(SEGBASE_GS_USER_SEL, 0); + HYPERVISOR_set_segment_base(SEGBASE_GS_USER_SEL, 0); #endif - if ((l->l_proc->p_flag & PK_32) == 0) { + if ((l->l_proc->p_flag & PK_32) == 0) { #ifndef XEN - wrmsr(MSR_FSBASE, 0); - wrmsr(MSR_KERNELGSBASE, 0); + wrmsr(MSR_FSBASE, 0); + wrmsr(MSR_KERNELGSBASE, 0); #else - HYPERVISOR_set_segment_base(SEGBASE_FS, 0); - HYPERVISOR_set_segment_base(SEGBASE_GS_USER, 0); + HYPERVISOR_set_segment_base(SEGBASE_FS, 0); + HYPERVISOR_set_segment_base(SEGBASE_GS_USER, 0); #endif - } - pcb->pcb_fs = 0; - pcb->pcb_gs = 0; - update_descriptor(&curcpu()->ci_gdt[GUFS_SEL], &zero); - update_descriptor(&curcpu()->ci_gdt[GUGS_SEL], &zero); - kpreempt_enable(); - } else { - tf->tf_fs = 0; - tf->tf_gs = 0; - pcb->pcb_fs = 0; - pcb->pcb_gs = 0; } - + pcb->pcb_fs = 0; + pcb->pcb_gs = 0; + update_descriptor(&curcpu()->ci_gdt[GUFS_SEL], &zero); + update_descriptor(&curcpu()->ci_gdt[GUGS_SEL], &zero); + kpreempt_enable(); } /* @@ -2047,25 +2042,23 @@ cpu_fsgs_reload(struct lwp *l, int fssel struct pcb *pcb; KASSERT(l->l_proc->p_flag & PK_32); + KASSERT(l == curlwp); + tf = l->l_md.md_regs; - if (l == curlwp) { - pcb = lwp_getpcb(l); - kpreempt_disable(); - update_descriptor(&curcpu()->ci_gdt[GUFS_SEL], &pcb->pcb_fs); - update_descriptor(&curcpu()->ci_gdt[GUGS_SEL], &pcb->pcb_gs); - setfs(fssel); + + pcb = lwp_getpcb(l); + kpreempt_disable(); + update_descriptor(&curcpu()->ci_gdt[GUFS_SEL], &pcb->pcb_fs); + update_descriptor(&curcpu()->ci_gdt[GUGS_SEL], &pcb->pcb_gs); + setfs(fssel); #ifndef XEN - setusergs(gssel); + setusergs(gssel); #else - HYPERVISOR_set_segment_base(SEGBASE_GS_USER_SEL, gssel); + HYPERVISOR_set_segment_base(SEGBASE_GS_USER_SEL, gssel); #endif - tf->tf_fs = fssel; - tf->tf_gs = gssel; - kpreempt_enable(); - } else { - tf->tf_fs = fssel; - tf->tf_gs = gssel; - } + tf->tf_fs = fssel; + tf->tf_gs = gssel; + kpreempt_enable(); }