15472 ::x86_featureset could accept arbitrary addresses
Reviewed by: Robert Mustacchi <rm+illumos@fingolfin.org>
Reviewed by: Toomas Soome <tsoome@me.com>
Approved by: Patrick Mooney <pmooney@pfmooney.com>
diff --git a/usr/src/cmd/mdb/i86pc/modules/unix/unix.c b/usr/src/cmd/mdb/i86pc/modules/unix/unix.c
index c3b7e80..fd9cddc 100644
--- a/usr/src/cmd/mdb/i86pc/modules/unix/unix.c
+++ b/usr/src/cmd/mdb/i86pc/modules/unix/unix.c
@@ -931,10 +931,18 @@
return (DCMD_ERR);
}
- if (mdb_readvar(fset, "x86_featureset") != sz) {
- mdb_warn("failed to read x86_featureset");
- mdb_free(fset, sz);
- return (DCMD_ERR);
+ if (flags & DCMD_ADDRSPEC) {
+ if (mdb_vread(fset, sz, addr) != sz) {
+ mdb_warn("failed to read x86_featureset from %p", addr);
+ mdb_free(fset, sz);
+ return (DCMD_ERR);
+ }
+ } else {
+ if (mdb_readvar(fset, "x86_featureset") != sz) {
+ mdb_warn("failed to read x86_featureset");
+ mdb_free(fset, sz);
+ return (DCMD_ERR);
+ }
}
for (ii = 0; ii < NUM_X86_FEATURES; ii++) {
@@ -949,11 +957,10 @@
}
if (mdb_readstr(name, sizeof (name), nptr) == -1) {
- mdb_warn("failed to read feature %d", ii);
- mdb_free(fset, sz);
- return (DCMD_ERR);
+ mdb_printf("unknown feature 0x%x\n", ii);
+ } else {
+ mdb_printf("%s\n", name);
}
- mdb_printf("%s\n", name);
}
mdb_free(fset, sz);
@@ -1015,7 +1022,7 @@
{ "memseg_list", ":", "show memseg list", memseg_list },
{ "scalehrtime", ":[-a|-r]", "scale an unscaled high-res time",
scalehrtime_dcmd, scalehrtime_help },
- { "x86_featureset", NULL, "dump the x86_featureset vector",
+ { "x86_featureset", ":", "dump the x86_featureset vector",
x86_featureset_dcmd },
{ "xcall", ":", "print CPU cross-call state", xcall_dcmd, xcall_help },
#ifdef _KMDB