PERFORCE change 1187750 for review
John Baldwin
jhb at FreeBSD.org
Fri Nov 1 18:27:08 UTC 2013
http://p4web.freebsd.org/@@1187750?ac=10
Change 1187750 by jhb at 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);
More information about the p4-projects
mailing list