Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 1 Nov 2013 18:27:07 GMT
From:      John Baldwin <jhb@FreeBSD.org>
To:        Perforce Change Reviews <perforce@FreeBSD.org>
Subject:   PERFORCE change 1187750 for review
Message-ID:  <201311011827.rA1IR7qQ076638@skunkworks.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://p4web.freebsd.org/@@1187750?ac=10

Change 1187750 by jhb@jhb_jhbbsd on 2013/11/01 18:26:24

	Use a dedicated stack for machine check exceptions.

Affected files ...

.. //depot/projects/smpng/sys/amd64/amd64/machdep.c#118 edit
.. //depot/projects/smpng/sys/amd64/amd64/mp_machdep.c#92 edit

Differences ...

==== //depot/projects/smpng/sys/amd64/amd64/machdep.c#118 (text+ko) ====

@@ -1046,6 +1046,8 @@
 static char nmi0_stack[PAGE_SIZE] __aligned(16);
 CTASSERT(sizeof(struct nmi_pcpu) == 16);
 
+static char mc0_stack[PAGE_SIZE] __aligned(16);
+
 struct amd64tss common_tss[MAXCPU];
 
 /*
@@ -1785,7 +1787,7 @@
 	setidt(IDT_PF, &IDTVEC(page),  SDT_SYSIGT, SEL_KPL, 0);
 	setidt(IDT_MF, &IDTVEC(fpu),  SDT_SYSIGT, SEL_KPL, 0);
 	setidt(IDT_AC, &IDTVEC(align), SDT_SYSIGT, SEL_KPL, 0);
-	setidt(IDT_MC, &IDTVEC(mchk),  SDT_SYSIGT, SEL_KPL, 0);
+	setidt(IDT_MC, &IDTVEC(mchk),  SDT_SYSIGT, SEL_KPL, 3);
 	setidt(IDT_XF, &IDTVEC(xmm), SDT_SYSIGT, SEL_KPL, 0);
 #ifdef KDTRACE_HOOKS
 	setidt(IDT_DTRACE_RET, &IDTVEC(dtrace_ret), SDT_SYSIGT, SEL_UPL, 0);
@@ -1851,6 +1853,9 @@
 	np->np_pcpu = (register_t) pc;
 	common_tss[0].tss_ist2 = (long) np;
 
+	/* machine check stack space, runs on ist3 */
+	common_tss[0].tss_ist3 = (long)&mc0_stack[sizeof(mc0_stack)];
+
 	/* Set the IO permission bitmap (empty due to tss seg limit) */
 	common_tss[0].tss_iobase = sizeof(struct amd64tss) +
 	    IOPAGES * PAGE_SIZE;

==== //depot/projects/smpng/sys/amd64/amd64/mp_machdep.c#92 (text+ko) ====

@@ -98,6 +98,7 @@
 /* Temporary variables for init_secondary()  */
 char *doublefault_stack;
 char *nmi_stack;
+char *mc_stack;
 void *dpcpu;
 
 struct pcb stoppcbs[MAXCPU];
@@ -638,6 +639,7 @@
 	common_tss[cpu].tss_iobase = sizeof(struct amd64tss) +
 	    IOPAGES * PAGE_SIZE;
 	common_tss[cpu].tss_ist1 = (long)&doublefault_stack[PAGE_SIZE];
+	common_tss[cpu].tss_ist3 = (long)&mc_stack[PAGE_SIZE];
 
 	/* The NMI stack runs on IST2. */
 	np = ((struct nmi_pcpu *) &nmi_stack[PAGE_SIZE]) - 1;
@@ -966,6 +968,8 @@
 		    PAGE_SIZE, M_WAITOK | M_ZERO);
 		nmi_stack = (char *)kmem_malloc(kernel_arena, PAGE_SIZE,
 		    M_WAITOK | M_ZERO);
+		mc_stack = (char *)kmem_malloc(kernel_arena, PAGE_SIZE,
+		    M_WAITOK | M_ZERO);
 		dpcpu = (void *)kmem_malloc(kernel_arena, DPCPU_SIZE,
 		    M_WAITOK | M_ZERO);
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201311011827.rA1IR7qQ076638>