Module Name: src Committed By: maxv Date: Sun Aug 27 09:32:13 UTC 2017
Modified Files: src/sys/arch/i386/i386: machdep.c src/sys/arch/x86/include: cpu.h src/sys/arch/x86/x86: cpu.c Log Message: style, and move some i386-specific code into i386/ To generate a diff of this commit: cvs rdiff -u -r1.791 -r1.792 src/sys/arch/i386/i386/machdep.c cvs rdiff -u -r1.77 -r1.78 src/sys/arch/x86/include/cpu.h cvs rdiff -u -r1.133 -r1.134 src/sys/arch/x86/x86/cpu.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/i386/i386/machdep.c diff -u src/sys/arch/i386/i386/machdep.c:1.791 src/sys/arch/i386/i386/machdep.c:1.792 --- src/sys/arch/i386/i386/machdep.c:1.791 Sat Aug 12 19:06:23 2017 +++ src/sys/arch/i386/i386/machdep.c Sun Aug 27 09:32:12 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: machdep.c,v 1.791 2017/08/12 19:06:23 kre Exp $ */ +/* $NetBSD: machdep.c,v 1.792 2017/08/27 09:32:12 maxv Exp $ */ /*- * Copyright (c) 1996, 1997, 1998, 2000, 2004, 2006, 2008, 2009 @@ -67,7 +67,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.791 2017/08/12 19:06:23 kre Exp $"); +__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.792 2017/08/27 09:32:12 maxv Exp $"); #include "opt_beep.h" #include "opt_compat_freebsd.h" @@ -560,7 +560,80 @@ i386_tls_switch(lwp_t *l) } #endif /* XEN */ +/* XXX */ +#define IDTVEC(name) __CONCAT(X, name) +typedef void (vector)(void); + #ifndef XEN +static void tss_init(struct i386tss *, void *, void *); + +static void +tss_init(struct i386tss *tss, void *stack, void *func) +{ + KASSERT(curcpu()->ci_pmap == pmap_kernel()); + + memset(tss, 0, sizeof *tss); + tss->tss_esp0 = tss->tss_esp = (int)((char *)stack + USPACE - 16); + tss->tss_ss0 = GSEL(GDATA_SEL, SEL_KPL); + tss->__tss_cs = GSEL(GCODE_SEL, SEL_KPL); + tss->tss_fs = GSEL(GCPU_SEL, SEL_KPL); + tss->tss_gs = tss->__tss_es = tss->__tss_ds = + tss->__tss_ss = GSEL(GDATA_SEL, SEL_KPL); + /* %cr3 contains the value associated to pmap_kernel */ + tss->tss_cr3 = rcr3(); + tss->tss_esp = (int)((char *)stack + USPACE - 16); + tss->tss_ldt = GSEL(GLDT_SEL, SEL_KPL); + tss->__tss_eflags = PSL_MBO | PSL_NT; /* XXX not needed? */ + tss->__tss_eip = (int)func; +} + +extern vector IDTVEC(tss_trap08); +#if defined(DDB) && defined(MULTIPROCESSOR) +extern vector Xintrddbipi, Xx2apic_intrddbipi; +extern int ddb_vec; +#endif + +void +cpu_set_tss_gates(struct cpu_info *ci) +{ + struct segment_descriptor sd; + void *doubleflt_stack; + + doubleflt_stack = (void *)uvm_km_alloc(kernel_map, USPACE, 0, + UVM_KMF_WIRED); + tss_init(&ci->ci_doubleflt_tss, doubleflt_stack, IDTVEC(tss_trap08)); + + setsegment(&sd, &ci->ci_doubleflt_tss, sizeof(struct i386tss) - 1, + SDT_SYS386TSS, SEL_KPL, 0, 0); + ci->ci_gdt[GTRAPTSS_SEL].sd = sd; + + setgate(&idt[8], NULL, 0, SDT_SYSTASKGT, SEL_KPL, + GSEL(GTRAPTSS_SEL, SEL_KPL)); + +#if defined(DDB) && defined(MULTIPROCESSOR) + /* + * Set up separate handler for the DDB IPI, so that it doesn't + * stomp on a possibly corrupted stack. + * + * XXX overwriting the gate set in db_machine_init. + * Should rearrange the code so that it's set only once. + */ + void *ddbipi_stack; + + ddbipi_stack = (void *)uvm_km_alloc(kernel_map, USPACE, 0, + UVM_KMF_WIRED); + tss_init(&ci->ci_ddbipi_tss, ddbipi_stack, + x2apic_mode ? Xx2apic_intrddbipi : Xintrddbipi); + + setsegment(&sd, &ci->ci_ddbipi_tss, sizeof(struct i386tss) - 1, + SDT_SYS386TSS, SEL_KPL, 0, 0); + ci->ci_gdt[GIPITSS_SEL].sd = sd; + + setgate(&idt[ddb_vec], NULL, 0, SDT_SYSTASKGT, SEL_KPL, + GSEL(GIPITSS_SEL, SEL_KPL)); +#endif +} + /* * Set up TSS and I/O bitmap. */ @@ -904,8 +977,7 @@ setsegment(struct segment_descriptor *sd sd->sd_hibase = (int)base >> 24; } -#define IDTVEC(name) __CONCAT(X, name) -typedef void (vector)(void); +/* XXX */ extern vector IDTVEC(syscall); extern vector *IDTVEC(exceptions)[]; #ifdef XEN Index: src/sys/arch/x86/include/cpu.h diff -u src/sys/arch/x86/include/cpu.h:1.77 src/sys/arch/x86/include/cpu.h:1.78 --- src/sys/arch/x86/include/cpu.h:1.77 Sun Aug 27 08:38:32 2017 +++ src/sys/arch/x86/include/cpu.h Sun Aug 27 09:32:13 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: cpu.h,v 1.77 2017/08/27 08:38:32 maxv Exp $ */ +/* $NetBSD: cpu.h,v 1.78 2017/08/27 09:32:13 maxv Exp $ */ /*- * Copyright (c) 1990 The Regents of the University of California. @@ -403,6 +403,9 @@ extern void (*x86_cpu_idle)(void); #define cpu_idle() (*x86_cpu_idle)() /* machdep.c */ +#ifdef i386 +void cpu_set_tss_gates(struct cpu_info *); +#endif void cpu_reset(void); /* longrun.c */ @@ -429,9 +432,6 @@ extern vm_guest_t vm_guest; /* cpu_topology.c */ void x86_cpu_topology(struct cpu_info *); -/* vm_machdep.c */ -void cpu_proc_fork(struct proc *, struct proc *); - /* locore.s */ struct region_descriptor; void lgdt(struct region_descriptor *); @@ -458,10 +458,10 @@ void i8254_initclocks(void); #endif /* cpu.c */ - void cpu_probe_features(struct cpu_info *); /* vm_machdep.c */ +void cpu_proc_fork(struct proc *, struct proc *); paddr_t kvtop(void *); #ifdef USER_LDT Index: src/sys/arch/x86/x86/cpu.c diff -u src/sys/arch/x86/x86/cpu.c:1.133 src/sys/arch/x86/x86/cpu.c:1.134 --- src/sys/arch/x86/x86/cpu.c:1.133 Sun Aug 27 08:38:32 2017 +++ src/sys/arch/x86/x86/cpu.c Sun Aug 27 09:32:12 2017 @@ -1,6 +1,6 @@ -/* $NetBSD: cpu.c,v 1.133 2017/08/27 08:38:32 maxv Exp $ */ +/* $NetBSD: cpu.c,v 1.134 2017/08/27 09:32:12 maxv Exp $ */ -/*- +/* * Copyright (c) 2000-2012 NetBSD Foundation, Inc. * All rights reserved. * @@ -62,7 +62,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: cpu.c,v 1.133 2017/08/27 08:38:32 maxv Exp $"); +__KERNEL_RCSID(0, "$NetBSD: cpu.c,v 1.134 2017/08/27 09:32:12 maxv Exp $"); #include "opt_ddb.h" #include "opt_mpbios.h" /* for MPDEBUG */ @@ -164,15 +164,13 @@ struct cpu_info cpu_info_primary __align .ci_curldt = -1, #ifdef TRAPLOG .ci_tlog_base = &tlog_primary, -#endif /* !TRAPLOG */ +#endif }; struct cpu_info *cpu_info_list = &cpu_info_primary; -static void cpu_set_tss_gates(struct cpu_info *); - #ifdef i386 -static void tss_init(struct i386tss *, void *, void *); +void cpu_set_tss_gates(struct cpu_info *); #endif static void cpu_init_idle_lwp(struct cpu_info *); @@ -187,8 +185,6 @@ uint32_t cpu_feature[7] __read_mostly; / * [6] structured extended features cpuid.7:%ecx */ -extern char x86_64_doubleflt_stack[]; - #ifdef MULTIPROCESSOR bool x86_mp_online; paddr_t mp_trampoline_paddr = MP_TRAMPOLINE; @@ -395,7 +391,9 @@ cpu_attach(device_t parent, device_t sel cpu_intr_init(ci); cpu_get_tsc_freq(ci); cpu_init(ci); +#ifdef i386 cpu_set_tss_gates(ci); +#endif pmap_cpu_init_late(ci); #if NLAPIC > 0 if (caa->cpu_role != CPU_ROLE_SP) { @@ -434,7 +432,9 @@ cpu_attach(device_t parent, device_t sel */ cpu_intr_init(ci); gdt_alloc_cpu(ci); +#ifdef i386 cpu_set_tss_gates(ci); +#endif pmap_cpu_init_late(ci); cpu_start_secondary(ci); if (ci->ci_flags & CPUF_PRESENT) { @@ -501,7 +501,6 @@ cpu_rescan(device_t self, const char *if cfaa.ci = ci; if (ifattr_match(ifattr, "cpufeaturebus")) { - if (ci->ci_frequency == NULL) { cfaa.name = "frequency"; ci->ci_frequency = config_found_ia(self, @@ -799,7 +798,7 @@ cpu_hatch(void *v) cpu_probe(ci); ci->ci_data.cpu_cc_freq = cpu_info_primary.ci_data.cpu_cc_freq; - /* cpu_get_tsc_freq(ci); */ + /* cpu_get_tsc_freq(ci); */ KDASSERT((ci->ci_flags & CPUF_PRESENT) == 0); @@ -815,7 +814,7 @@ cpu_hatch(void *v) /* * Wait to be brought online. Use 'monitor/mwait' if available, * in order to make the TSC drift as much as possible. so that - * we can detect it later. If not available, try 'pause'. + * we can detect it later. If not available, try 'pause'. * We'd like to use 'hlt', but we have interrupts off. */ while ((ci->ci_flags & CPUF_GO) == 0) { @@ -924,7 +923,7 @@ cpu_copy_trampoline(void) */ extern u_char cpu_spinup_trampoline[]; extern u_char cpu_spinup_trampoline_end[]; - + vaddr_t mp_trampoline_vaddr; mp_trampoline_vaddr = uvm_km_alloc(kernel_map, PAGE_SIZE, 0, @@ -943,84 +942,6 @@ cpu_copy_trampoline(void) } #endif -#ifdef i386 -static void -tss_init(struct i386tss *tss, void *stack, void *func) -{ - KASSERT(curcpu()->ci_pmap == pmap_kernel()); - - memset(tss, 0, sizeof *tss); - tss->tss_esp0 = tss->tss_esp = (int)((char *)stack + USPACE - 16); - tss->tss_ss0 = GSEL(GDATA_SEL, SEL_KPL); - tss->__tss_cs = GSEL(GCODE_SEL, SEL_KPL); - tss->tss_fs = GSEL(GCPU_SEL, SEL_KPL); - tss->tss_gs = tss->__tss_es = tss->__tss_ds = - tss->__tss_ss = GSEL(GDATA_SEL, SEL_KPL); - /* %cr3 contains the value associated to pmap_kernel */ - tss->tss_cr3 = rcr3(); - tss->tss_esp = (int)((char *)stack + USPACE - 16); - tss->tss_ldt = GSEL(GLDT_SEL, SEL_KPL); - tss->__tss_eflags = PSL_MBO | PSL_NT; /* XXX not needed? */ - tss->__tss_eip = (int)func; -} - -/* XXX */ -#define IDTVEC(name) __CONCAT(X, name) -typedef void (vector)(void); -extern vector IDTVEC(tss_trap08); -#if defined(DDB) && defined(MULTIPROCESSOR) -extern vector Xintrddbipi, Xx2apic_intrddbipi; -extern int ddb_vec; -#endif - -static void -cpu_set_tss_gates(struct cpu_info *ci) -{ - struct segment_descriptor sd; - void *doubleflt_stack; - - doubleflt_stack = (void *)uvm_km_alloc(kernel_map, USPACE, 0, - UVM_KMF_WIRED); - tss_init(&ci->ci_doubleflt_tss, doubleflt_stack, IDTVEC(tss_trap08)); - - setsegment(&sd, &ci->ci_doubleflt_tss, sizeof(struct i386tss) - 1, - SDT_SYS386TSS, SEL_KPL, 0, 0); - ci->ci_gdt[GTRAPTSS_SEL].sd = sd; - - setgate(&idt[8], NULL, 0, SDT_SYSTASKGT, SEL_KPL, - GSEL(GTRAPTSS_SEL, SEL_KPL)); - -#if defined(DDB) && defined(MULTIPROCESSOR) - /* - * Set up separate handler for the DDB IPI, so that it doesn't - * stomp on a possibly corrupted stack. - * - * XXX overwriting the gate set in db_machine_init. - * Should rearrange the code so that it's set only once. - */ - void *ddbipi_stack; - - ddbipi_stack = (void *)uvm_km_alloc(kernel_map, USPACE, 0, - UVM_KMF_WIRED); - tss_init(&ci->ci_ddbipi_tss, ddbipi_stack, - x2apic_mode ? Xx2apic_intrddbipi : Xintrddbipi); - - setsegment(&sd, &ci->ci_ddbipi_tss, sizeof(struct i386tss) - 1, - SDT_SYS386TSS, SEL_KPL, 0, 0); - ci->ci_gdt[GIPITSS_SEL].sd = sd; - - setgate(&idt[ddb_vec], NULL, 0, SDT_SYSTASKGT, SEL_KPL, - GSEL(GIPITSS_SEL, SEL_KPL)); -#endif -} -#else -static void -cpu_set_tss_gates(struct cpu_info *ci) -{ - -} -#endif /* i386 */ - #ifdef MULTIPROCESSOR int mp_cpu_start(struct cpu_info *ci, paddr_t target) @@ -1300,7 +1221,7 @@ cpu_load_pmap(struct pmap *pmap, struct for (i = 0 ; i < PDP_SIZE; i++) { l3_pd[i] = pmap->pm_pdirpa[i] | PG_V; } - + if (interrupts_enabled) x86_enable_intr(); tlbflush();