summaryrefslogtreecommitdiff
path: root/usr/src/cmd/mdb/i86pc/modules/unix/unix.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/cmd/mdb/i86pc/modules/unix/unix.c')
-rw-r--r--usr/src/cmd/mdb/i86pc/modules/unix/unix.c34
1 files changed, 30 insertions, 4 deletions
diff --git a/usr/src/cmd/mdb/i86pc/modules/unix/unix.c b/usr/src/cmd/mdb/i86pc/modules/unix/unix.c
index 4bce7100ef..a168eef2e3 100644
--- a/usr/src/cmd/mdb/i86pc/modules/unix/unix.c
+++ b/usr/src/cmd/mdb/i86pc/modules/unix/unix.c
@@ -20,7 +20,7 @@
*/
/*
* 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>
@@ -409,6 +409,7 @@ static struct {
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;
@@ -478,6 +479,10 @@ ttrace_walk(uintptr_t addr, trap_trace_rec_t *rec, ttrace_dcmd_t *dcmd)
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++) {
@@ -537,7 +542,8 @@ ttrace(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
}
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)) {
@@ -886,7 +892,7 @@ x86_featureset_cmd(uintptr_t addr, uint_t flags, int argc,
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 },
@@ -902,6 +908,12 @@ crregs_dcmd(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
{ 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 },
@@ -916,6 +928,7 @@ crregs_dcmd(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
{ "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 },
@@ -923,9 +936,22 @@ crregs_dcmd(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
};
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
@@ -933,7 +959,7 @@ crregs_dcmd(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
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]",