changeset 12652:64c37fd33275

6909096 ::irmpools dcmd core dumps on snv 129
author Scott M. Carter <Scott.Carter@Oracle.COM>
date Fri, 18 Jun 2010 16:58:41 -0700
parents a33209c74758
children cbaf1872d02a
files usr/src/cmd/mdb/common/modules/genunix/irm.c
diffstat 1 files changed, 33 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/usr/src/cmd/mdb/common/modules/genunix/irm.c	Fri Jun 18 14:37:08 2010 -0600
+++ b/usr/src/cmd/mdb/common/modules/genunix/irm.c	Fri Jun 18 16:58:41 2010 -0700
@@ -19,8 +19,7 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
- * Use is subject to license terms.
+ * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
  */
 
 #include <sys/mdb_modapi.h>
@@ -53,6 +52,28 @@
 	}
 }
 
+static int
+check_irm_enabled(void)
+{
+	GElf_Sym	sym;
+	uintptr_t	addr;
+	int		value;
+
+	if (mdb_lookup_by_name("irm_enable", &sym) == -1) {
+		mdb_warn("couldn't find irm_enable");
+		return (0);
+	}
+
+	addr = (uintptr_t)sym.st_value;
+
+	if (mdb_vread(&value, sizeof (value), addr) != sizeof (value)) {
+		mdb_warn("couldn't read irm_enable at %p", addr);
+		return (0);
+	}
+
+	return (value);
+}
+
 int
 irmpools_walk_init(mdb_walk_state_t *wsp)
 {
@@ -88,6 +109,11 @@
 	if (argc != 0)
 		return (DCMD_USAGE);
 
+	if (check_irm_enabled() == 0) {
+		mdb_warn("IRM is not enabled");
+		return (DCMD_ERR);
+	}
+
 	if (!(flags & DCMD_ADDRSPEC)) {
 		if (mdb_walk_dcmd("irmpools", "irmpools", argc, argv) == -1) {
 			mdb_warn("can't walk interrupt pools");
@@ -130,6 +156,11 @@
 	if (argc != 0)
 		return (DCMD_USAGE);
 
+	if (check_irm_enabled() == 0) {
+		mdb_warn("IRM is not enabled");
+		return (DCMD_ERR);
+	}
+
 	if (!(flags & DCMD_ADDRSPEC)) {
 		mdb_warn("can't perform global interrupt request walk");
 		return (DCMD_ERR);