Module Name: src Committed By: maxv Date: Thu Jan 11 10:30:26 UTC 2018
Modified Files: src/sys/arch/amd64/amd64: machdep.c src/sys/arch/amd64/include: param.h src/sys/arch/x86/x86: intr.c Log Message: Initialize ist0 in cpu_init_tss. On amd64 this is the DDB stack, and it has nothing to do with ci_intrstack. While here, style, and don't forget to pass UVM_KMF_ZERO in uvm_km_alloc. To generate a diff of this commit: cvs rdiff -u -r1.286 -r1.287 src/sys/arch/amd64/amd64/machdep.c cvs rdiff -u -r1.22 -r1.23 src/sys/arch/amd64/include/param.h cvs rdiff -u -r1.116 -r1.117 src/sys/arch/x86/x86/intr.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.286 src/sys/arch/amd64/amd64/machdep.c:1.287 --- src/sys/arch/amd64/amd64/machdep.c:1.286 Thu Jan 11 09:00:04 2018 +++ src/sys/arch/amd64/amd64/machdep.c Thu Jan 11 10:30:26 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: machdep.c,v 1.286 2018/01/11 09:00:04 maxv Exp $ */ +/* $NetBSD: machdep.c,v 1.287 2018/01/11 10:30:26 maxv Exp $ */ /* * Copyright (c) 1996, 1997, 1998, 2000, 2006, 2007, 2008, 2011 @@ -110,7 +110,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.286 2018/01/11 09:00:04 maxv Exp $"); +__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.287 2018/01/11 10:30:26 maxv Exp $"); /* #define XENDEBUG_LOW */ @@ -520,13 +520,16 @@ cpu_init_tss(struct cpu_info *ci) #endif cputss->tss.tss_iobase = IOMAP_INVALOFF << 16; - /* cputss->tss.tss_ist[0] is filled by cpu_intr_init */ + + /* DDB stack */ + p = uvm_km_alloc(kernel_map, PAGE_SIZE, 0, UVM_KMF_WIRED|UVM_KMF_ZERO); + cputss->tss.tss_ist[0] = p + PAGE_SIZE - 16; /* double fault */ #ifdef __HAVE_PCPU_AREA p = (vaddr_t)&pcpuarea->ent[cid].ist1; #else - p = uvm_km_alloc(kernel_map, PAGE_SIZE, 0, UVM_KMF_WIRED); + p = uvm_km_alloc(kernel_map, PAGE_SIZE, 0, UVM_KMF_WIRED|UVM_KMF_ZERO); #endif cputss->tss.tss_ist[1] = p + PAGE_SIZE - 16; @@ -534,7 +537,7 @@ cpu_init_tss(struct cpu_info *ci) #ifdef __HAVE_PCPU_AREA p = (vaddr_t)&pcpuarea->ent[cid].ist2; #else - p = uvm_km_alloc(kernel_map, PAGE_SIZE, 0, UVM_KMF_WIRED); + p = uvm_km_alloc(kernel_map, PAGE_SIZE, 0, UVM_KMF_WIRED|UVM_KMF_ZERO); #endif cputss->tss.tss_ist[2] = p + PAGE_SIZE - 16; Index: src/sys/arch/amd64/include/param.h diff -u src/sys/arch/amd64/include/param.h:1.22 src/sys/arch/amd64/include/param.h:1.23 --- src/sys/arch/amd64/include/param.h:1.22 Wed Jun 14 12:27:24 2017 +++ src/sys/arch/amd64/include/param.h Thu Jan 11 10:30:26 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: param.h,v 1.22 2017/06/14 12:27:24 maxv Exp $ */ +/* $NetBSD: param.h,v 1.23 2018/01/11 10:30:26 maxv Exp $ */ #ifdef __x86_64__ @@ -63,7 +63,6 @@ #define UPAGES 3 /* pages of u-area */ #endif #define USPACE (UPAGES * NBPG) /* total size of u-area */ -#define INTRSTACKSIZE 4096 #ifndef MSGBUFSIZE #define MSGBUFSIZE (8*NBPG) /* default message buffer size */ Index: src/sys/arch/x86/x86/intr.c diff -u src/sys/arch/x86/x86/intr.c:1.116 src/sys/arch/x86/x86/intr.c:1.117 --- src/sys/arch/x86/x86/intr.c:1.116 Thu Jan 4 13:36:30 2018 +++ src/sys/arch/x86/x86/intr.c Thu Jan 11 10:30:26 2018 @@ -1,6 +1,6 @@ -/* $NetBSD: intr.c,v 1.116 2018/01/04 13:36:30 maxv Exp $ */ +/* $NetBSD: intr.c,v 1.117 2018/01/11 10:30:26 maxv Exp $ */ -/*- +/* * Copyright (c) 2007, 2008, 2009 The NetBSD Foundation, Inc. * All rights reserved. * @@ -133,7 +133,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: intr.c,v 1.116 2018/01/04 13:36:30 maxv Exp $"); +__KERNEL_RCSID(0, "$NetBSD: intr.c,v 1.117 2018/01/11 10:30:26 maxv Exp $"); #include "opt_intrdebug.h" #include "opt_multiprocessor.h" @@ -168,7 +168,7 @@ __KERNEL_RCSID(0, "$NetBSD: intr.c,v 1.1 #include "acpica.h" #if NIOAPIC > 0 || NACPICA > 0 -#include <machine/i82093var.h> +#include <machine/i82093var.h> #include <machine/mpbiosvar.h> #include <machine/mpacpi.h> #endif @@ -372,7 +372,7 @@ intr_calculatemasks(struct cpu_info *ci) /* * List to keep track of PCI buses that are probed but not known - * to the firmware. Used to + * to the firmware. Used to * * XXX should maintain one list, not an array and a linked list. */ @@ -791,7 +791,7 @@ intr_allocate_slot(struct pic *pic, int } KASSERT(ci != NULL); - /* + /* * Now allocate an IDT vector. * For the 8259 these are reserved up front. */ @@ -1034,7 +1034,7 @@ intr_establish_xname(int legacy_irq, str /* NOTREACHED */ } - /* + /* * If the establishing interrupt uses shared IRQ, the interrupt uses * "ci->ci_isources[slot]" instead of allocated by the establishing * device's pci_intr_alloc() or this function. @@ -1149,7 +1149,7 @@ intr_disestablish_xcall(void *arg1, void source = ci->ci_isources[ih->ih_slot]; idtvec = source->is_idtvec; - (*pic->pic_hwmask)(pic, ih->ih_pin); + (*pic->pic_hwmask)(pic, ih->ih_pin); atomic_and_32(&ci->ci_ipending, ~(1 << ih->ih_slot)); /* @@ -1457,9 +1457,6 @@ cpu_intr_init(struct cpu_info *ci) int i; static int first = 1; #endif -#ifdef INTRSTACKSIZE - vaddr_t istack; -#endif #if NLAPIC > 0 isp = kmem_zalloc(sizeof(*isp), KM_SLEEP); @@ -1504,34 +1501,36 @@ cpu_intr_init(struct cpu_info *ci) #else /* XEN */ int i; /* XXX: duplicate */ vaddr_t istack; /* XXX: duplicate */ - ci->ci_iunmask[0] = 0xfffffffe; + ci->ci_iunmask[0] = 0xfffffffe; for (i = 1; i < NIPL; i++) ci->ci_iunmask[i] = ci->ci_iunmask[i - 1] & ~(1 << i); #endif /* XEN */ #if defined(INTRSTACKSIZE) + vaddr_t istack; + /* * If the red zone is activated, protect both the top and * the bottom of the stack with an unmapped page. */ istack = uvm_km_alloc(kernel_map, INTRSTACKSIZE + redzone_const_or_zero(2 * PAGE_SIZE), 0, - UVM_KMF_WIRED); + UVM_KMF_WIRED|UVM_KMF_ZERO); if (redzone_const_or_false(true)) { pmap_kremove(istack, PAGE_SIZE); pmap_kremove(istack + INTRSTACKSIZE + PAGE_SIZE, PAGE_SIZE); pmap_update(pmap_kernel()); } - /* 33 used to be 1. Arbitrarily reserve 32 more register_t's + + /* + * 33 used to be 1. Arbitrarily reserve 32 more register_t's * of space for ddb(4) to examine some subroutine arguments * and to hunt for the next stack frame. */ ci->ci_intrstack = (char *)istack + redzone_const_or_zero(PAGE_SIZE) + INTRSTACKSIZE - 33 * sizeof(register_t); -#if defined(__x86_64__) - ci->ci_tss->tss.tss_ist[0] = (uintptr_t)ci->ci_intrstack & ~0xf; -#endif /* defined(__x86_64__) */ -#endif /* defined(INTRSTACKSIZE) */ +#endif + ci->ci_idepth = -1; } @@ -1826,7 +1825,7 @@ intr_redistribute(struct cpu_info *oci) where = xc_unicast(0, intr_redistribute_xc_t, isp, (void *)(intptr_t)nslot, nci); xc_wait(where); - + /* * We're ready to go on the target CPU. Run a cross call to * reroute the interrupt away from the source CPU.