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 },