Author: markj
Date: Wed Nov  4 16:42:20 2020
New Revision: 367335
URL: https://svnweb.freebsd.org/changeset/base/367335

Log:
  amd64: Make it easier to configure exception stack sizes
  
  The amd64 kernel handles certain types of exceptions on a dedicated
  stack.  Currently the sizes of these stacks are all hard-coded to
  PAGE_SIZE, but for at least NMI handling it can be useful to use larger
  stacks.  Add constants to intr_machdep.h to make this easier to tweak.
  
  No functional change intended.
  
  Reviewed by:  kib
  MFC after:    1 week
  Sponsored by: NetApp, Inc.
  Sponsored by: Klara, Inc.
  Differential Revision:        https://reviews.freebsd.org/D27076

Modified:
  head/sys/amd64/amd64/machdep.c
  head/sys/amd64/amd64/mp_machdep.c
  head/sys/amd64/amd64/pmap.c
  head/sys/amd64/include/intr_machdep.h

Modified: head/sys/amd64/amd64/machdep.c
==============================================================================
--- head/sys/amd64/amd64/machdep.c      Wed Nov  4 16:30:56 2020        
(r367334)
+++ head/sys/amd64/amd64/machdep.c      Wed Nov  4 16:42:20 2020        
(r367335)
@@ -670,10 +670,10 @@ cpu_setregs(void)
 static struct gate_descriptor idt0[NIDT];
 struct gate_descriptor *idt = &idt0[0];        /* interrupt descriptor table */
 
-static char dblfault_stack[PAGE_SIZE] __aligned(16);
-static char mce0_stack[PAGE_SIZE] __aligned(16);
-static char nmi0_stack[PAGE_SIZE] __aligned(16);
-static char dbg0_stack[PAGE_SIZE] __aligned(16);
+static char dblfault_stack[DBLFAULT_STACK_SIZE] __aligned(16);
+static char mce0_stack[MCE_STACK_SIZE] __aligned(16);
+static char nmi0_stack[NMI_STACK_SIZE] __aligned(16);
+static char dbg0_stack[DBG_STACK_SIZE] __aligned(16);
 CTASSERT(sizeof(struct nmi_pcpu) == 16);
 
 /*

Modified: head/sys/amd64/amd64/mp_machdep.c
==============================================================================
--- head/sys/amd64/amd64/mp_machdep.c   Wed Nov  4 16:30:56 2020        
(r367334)
+++ head/sys/amd64/amd64/mp_machdep.c   Wed Nov  4 16:42:20 2020        
(r367335)
@@ -305,22 +305,22 @@ init_secondary(void)
        pc->pc_common_tss.tss_rsp0 = 0;
 
        /* The doublefault stack runs on IST1. */
-       np = ((struct nmi_pcpu *)&doublefault_stack[PAGE_SIZE]) - 1;
+       np = ((struct nmi_pcpu *)&doublefault_stack[DBLFAULT_STACK_SIZE]) - 1;
        np->np_pcpu = (register_t)pc;
        pc->pc_common_tss.tss_ist1 = (long)np;
 
        /* The NMI stack runs on IST2. */
-       np = ((struct nmi_pcpu *) &nmi_stack[PAGE_SIZE]) - 1;
+       np = ((struct nmi_pcpu *)&nmi_stack[NMI_STACK_SIZE]) - 1;
        np->np_pcpu = (register_t)pc;
        pc->pc_common_tss.tss_ist2 = (long)np;
 
        /* The MC# stack runs on IST3. */
-       np = ((struct nmi_pcpu *) &mce_stack[PAGE_SIZE]) - 1;
+       np = ((struct nmi_pcpu *)&mce_stack[MCE_STACK_SIZE]) - 1;
        np->np_pcpu = (register_t)pc;
        pc->pc_common_tss.tss_ist3 = (long)np;
 
        /* The DB# stack runs on IST4. */
-       np = ((struct nmi_pcpu *) &dbg_stack[PAGE_SIZE]) - 1;
+       np = ((struct nmi_pcpu *)&dbg_stack[DBG_STACK_SIZE]) - 1;
        np->np_pcpu = (register_t)pc;
        pc->pc_common_tss.tss_ist4 = (long)np;
 
@@ -481,13 +481,14 @@ native_start_all_aps(void)
                /* allocate and set up an idle stack data page */
                bootstacks[cpu] = (void *)kmem_malloc(kstack_pages * PAGE_SIZE,
                    M_WAITOK | M_ZERO);
-               doublefault_stack = (char *)kmem_malloc(PAGE_SIZE, M_WAITOK |
-                   M_ZERO);
-               mce_stack = (char *)kmem_malloc(PAGE_SIZE, M_WAITOK | M_ZERO);
+               doublefault_stack = (char *)kmem_malloc(DBLFAULT_STACK_SIZE,
+                   M_WAITOK | M_ZERO);
+               mce_stack = (char *)kmem_malloc(MCE_STACK_SIZE,
+                   M_WAITOK | M_ZERO);
                nmi_stack = (char *)kmem_malloc_domainset(
-                   DOMAINSET_PREF(domain), PAGE_SIZE, M_WAITOK | M_ZERO);
+                   DOMAINSET_PREF(domain), NMI_STACK_SIZE, M_WAITOK | M_ZERO);
                dbg_stack = (char *)kmem_malloc_domainset(
-                   DOMAINSET_PREF(domain), PAGE_SIZE, M_WAITOK | M_ZERO);
+                   DOMAINSET_PREF(domain), DBG_STACK_SIZE, M_WAITOK | M_ZERO);
                dpcpu = (void *)kmem_malloc_domainset(DOMAINSET_PREF(domain),
                    DPCPU_SIZE, M_WAITOK | M_ZERO);
 

Modified: head/sys/amd64/amd64/pmap.c
==============================================================================
--- head/sys/amd64/amd64/pmap.c Wed Nov  4 16:30:56 2020        (r367334)
+++ head/sys/amd64/amd64/pmap.c Wed Nov  4 16:42:20 2020        (r367335)
@@ -157,6 +157,7 @@ __FBSDID("$FreeBSD$");
 #include <x86/ifunc.h>
 #include <machine/cpu.h>
 #include <machine/cputypes.h>
+#include <machine/intr_machdep.h>
 #include <machine/md_var.h>
 #include <machine/pcb.h>
 #include <machine/specialreg.h>
@@ -10481,17 +10482,17 @@ pmap_pti_init(void)
        CPU_FOREACH(i) {
                /* Doublefault stack IST 1 */
                va = __pcpu[i].pc_common_tss.tss_ist1 + sizeof(struct nmi_pcpu);
-               pmap_pti_add_kva_locked(va - PAGE_SIZE, va, false);
+               pmap_pti_add_kva_locked(va - DBLFAULT_STACK_SIZE, va, false);
                /* NMI stack IST 2 */
                va = __pcpu[i].pc_common_tss.tss_ist2 + sizeof(struct nmi_pcpu);
-               pmap_pti_add_kva_locked(va - PAGE_SIZE, va, false);
+               pmap_pti_add_kva_locked(va - NMI_STACK_SIZE, va, false);
                /* MC# stack IST 3 */
                va = __pcpu[i].pc_common_tss.tss_ist3 +
                    sizeof(struct nmi_pcpu);
-               pmap_pti_add_kva_locked(va - PAGE_SIZE, va, false);
+               pmap_pti_add_kva_locked(va - MCE_STACK_SIZE, va, false);
                /* DB# stack IST 4 */
                va = __pcpu[i].pc_common_tss.tss_ist4 + sizeof(struct nmi_pcpu);
-               pmap_pti_add_kva_locked(va - PAGE_SIZE, va, false);
+               pmap_pti_add_kva_locked(va - DBG_STACK_SIZE, va, false);
        }
        pmap_pti_add_kva_locked((vm_offset_t)kernphys + KERNBASE,
            (vm_offset_t)etext, true);

Modified: head/sys/amd64/include/intr_machdep.h
==============================================================================
--- head/sys/amd64/include/intr_machdep.h       Wed Nov  4 16:30:56 2020        
(r367334)
+++ head/sys/amd64/include/intr_machdep.h       Wed Nov  4 16:42:20 2020        
(r367335)
@@ -41,4 +41,9 @@ struct nmi_pcpu {
        register_t      __padding;      /* pad to 16 bytes */
 };
 
+#define        DBLFAULT_STACK_SIZE     PAGE_SIZE
+#define        NMI_STACK_SIZE          PAGE_SIZE
+#define        MCE_STACK_SIZE          PAGE_SIZE
+#define        DBG_STACK_SIZE          PAGE_SIZE
+
 #endif /* !__MACHINE_INTR_MACHDEP_H__ */
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to