diff options
Diffstat (limited to 'usr/src/cmd/mdb/i86pc/modules/unix/unix.c')
| -rw-r--r-- | usr/src/cmd/mdb/i86pc/modules/unix/unix.c | 34 |
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]", |
