Print this page
9210 remove KMDB branch debugging support
9211 ::crregs could do with cr2/cr3 support
9209 ::ttrace should be able to filter by thread
Reviewed by: Patrick Mooney <patrick.mooney@joyent.com>

@@ -18,11 +18,11 @@
  *
  * CDDL HEADER END
  */
 /*
  * Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
- * Copyright 2015 Joyent, Inc.
+ * Copyright 2018 Joyent, Inc.
  */
 
 #include <mdb/mdb_modapi.h>
 #include <mdb/mdb_ctf.h>
 #include <sys/cpuvar.h>

@@ -407,10 +407,11 @@
 };
 
 typedef struct ttrace_dcmd {
         processorid_t ttd_cpu;
         uint_t ttd_extended;
+        uintptr_t ttd_kthread;
         trap_trace_ctl_t ttd_ttc[NCPU];
 } ttrace_dcmd_t;
 
 #if defined(__amd64)
 

@@ -476,10 +477,14 @@
         }
 
         if (dcmd->ttd_cpu != -1 && cpu != dcmd->ttd_cpu)
                 return (WALK_NEXT);
 
+        if (dcmd->ttd_kthread != 0 &&
+            dcmd->ttd_kthread != rec->ttr_curthread)
+                return (WALK_NEXT);
+
         mdb_printf("%3d %15llx ", cpu, rec->ttr_stamp);
 
         for (i = 0; ttrace_hdlr[i].t_hdlr != NULL; i++) {
                 if (rec->ttr_marker != ttrace_hdlr[i].t_marker)
                         continue;

@@ -535,11 +540,12 @@
                     "non-TRAPTRACE kernel?\n");
                 return (DCMD_ERR);
         }
 
         if (mdb_getopts(argc, argv,
-            'x', MDB_OPT_SETBITS, TRUE, &dcmd.ttd_extended, NULL) != argc)
+            'x', MDB_OPT_SETBITS, TRUE, &dcmd.ttd_extended,
+            't', MDB_OPT_UINTPTR, &dcmd.ttd_kthread, NULL) != argc)
                 return (DCMD_USAGE);
 
         if (DCMD_HDRSPEC(flags)) {
                 mdb_printf("%3s %15s %4s %2s %-*s%s\n", "CPU",
                     "TIMESTAMP", "TYPE", "Vec", TT_HDLR_WIDTH, "HANDLER",

@@ -884,11 +890,11 @@
 #ifdef _KMDB
 /* ARGSUSED */
 static int
 crregs_dcmd(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
 {
-        ulong_t cr0, cr4;
+        ulong_t cr0, cr2, cr3, cr4;
         static const mdb_bitmask_t cr0_flag_bits[] = {
                 { "PE",         CR0_PE,         CR0_PE },
                 { "MP",         CR0_MP,         CR0_MP },
                 { "EM",         CR0_EM,         CR0_EM },
                 { "TS",         CR0_TS,         CR0_TS },

@@ -900,10 +906,16 @@
                 { "CD",         CR0_CD,         CR0_CD },
                 { "PG",         CR0_PG,         CR0_PG },
                 { NULL,         0,              0 }
         };
 
+        static const mdb_bitmask_t cr3_flag_bits[] = {
+                { "PCD",        CR3_PCD,        CR3_PCD },
+                { "PWT",        CR3_PWT,        CR3_PWT },
+                { NULL,         0,              0, }
+        };
+
         static const mdb_bitmask_t cr4_flag_bits[] = {
                 { "VME",        CR4_VME,        CR4_VME },
                 { "PVI",        CR4_PVI,        CR4_PVI },
                 { "TSD",        CR4_TSD,        CR4_TSD },
                 { "DE",         CR4_DE,         CR4_DE },

@@ -914,28 +926,42 @@
                 { "PCE",        CR4_PCE,        CR4_PCE },
                 { "OSFXSR",     CR4_OSFXSR,     CR4_OSFXSR },
                 { "OSXMMEXCPT", CR4_OSXMMEXCPT, CR4_OSXMMEXCPT },
                 { "VMXE",       CR4_VMXE,       CR4_VMXE },
                 { "SMXE",       CR4_SMXE,       CR4_SMXE },
+                { "PCIDE",      CR4_PCIDE,      CR4_PCIDE },
                 { "OSXSAVE",    CR4_OSXSAVE,    CR4_OSXSAVE },
                 { "SMEP",       CR4_SMEP,       CR4_SMEP },
                 { "SMAP",       CR4_SMAP,       CR4_SMAP },
                 { NULL,         0,              0 }
         };
 
         cr0 = kmdb_unix_getcr0();
+        cr2 = kmdb_unix_getcr2();
+        cr3 = kmdb_unix_getcr3();
         cr4 = kmdb_unix_getcr4();
         mdb_printf("%%cr0 = 0x%08x <%b>\n", cr0, cr0, cr0_flag_bits);
+        mdb_printf("%%cr2 = 0x%08x <%a>\n", cr2, cr2);
+
+        if ((cr4 & CR4_PCIDE)) {
+                mdb_printf("%%cr3 = 0x%08x <pfn:%lu pcid:%u>\n",
+                    cr3 >> MMU_PAGESHIFT, cr3 & MMU_PAGEOFFSET);
+        } else {
+                mdb_printf("%%cr3 = 0x%08x <pfn:%lu flags:%b>\n", cr3,
+                    cr3 >> MMU_PAGESHIFT, cr3, cr3_flag_bits);
+        }
+
         mdb_printf("%%cr4 = 0x%08x <%b>\n", cr4, cr4, cr4_flag_bits);
+
         return (DCMD_OK);
 }
 #endif
 
 static const mdb_dcmd_t dcmds[] = {
         { "gate_desc", ":", "dump a gate descriptor", gate_desc },
         { "idt", ":[-v]", "dump an IDT", idt },
-        { "ttrace", "[-x]", "dump trap trace buffers", ttrace },
+        { "ttrace", "[-x] [-t kthread]", "dump trap trace buffers", ttrace },
         { "vatopfn", ":[-a as]", "translate address to physical page",
             va2pfn_dcmd },
         { "report_maps", ":[-m]",
             "Given PFN, report mappings / page table usage",
             report_maps_dcmd, report_maps_help },