changeset 3323:3cff27a475a5

PSARC 2006/679 Fault Event Extension 6279682 fmadm -q rotate errlog hangs while fmd report an error into the log 6326650 fma needs more dcmds for getting errors from crash dumps 6372709 fltlog can grow without bound; needs to be managed by logadm 6400607 fmd dumped core in zfs-diagnosis 6464740 fmdump -v output should display FRU location (label) information separate from the FRU 6485057 mc-amd driver should provide access to HT routing tables 6493219 libtopo needs to allow re-enumeration according static .xml props 6495169 PCI topo enumerator should maintain a 'module' property 6496757 Incorrect initializer for topo_builtin.c:_topo_builtins[] 6496850 Need mdb support for libtopo 6498181 .po files inconsistencies wrt the event registry content 6498187 SCA1000 and SCA500 .po dictionary files are out of date 6498195 SMF dictionary .po files are inconsistent 6498201 ZFS dictionary .po files are out of date 6502660 eft fills in ASRU and FRU from libtopo when none are defined in a fault event specification 6502949 eft memory leak in platform_fault2ipath() 6506108 topo_fmri_nvl2str on mem scheme fails to lookup offset and physaddr 6506622 missing entry in PCIEX dict/po files
author cindi
date Fri, 22 Dec 2006 11:30:38 -0800
parents 1d861e55bbc9
children 7c249df09f8c
files deleted_files/usr/src/cmd/fm/dicts/SMF.dict deleted_files/usr/src/cmd/fm/dicts/SMF.po usr/src/cmd/fm/dicts/FMD.po usr/src/cmd/fm/dicts/Makefile usr/src/cmd/fm/dicts/PCI.po usr/src/cmd/fm/dicts/PCIEX.dict usr/src/cmd/fm/dicts/PCIEX.po usr/src/cmd/fm/dicts/SCA1000.po usr/src/cmd/fm/dicts/SCA500.po usr/src/cmd/fm/dicts/SMF.dict usr/src/cmd/fm/dicts/SMF.po usr/src/cmd/fm/dicts/SUN4.po usr/src/cmd/fm/dicts/SUN4U.po usr/src/cmd/fm/dicts/SUN4V.po usr/src/cmd/fm/dicts/SUNOS.dict usr/src/cmd/fm/dicts/SUNOS.po usr/src/cmd/fm/dicts/ZFS.po usr/src/cmd/fm/fmd/common/fmd_api.c usr/src/cmd/fm/fmd/common/fmd_event.c usr/src/cmd/fm/fmd/common/fmd_log.c usr/src/cmd/fm/fmd/common/fmd_protocol.c usr/src/cmd/fm/fmd/common/fmd_protocol.h usr/src/cmd/fm/fmd/common/fmd_self.c usr/src/cmd/fm/fmdump/common/fault.c usr/src/cmd/fm/fmtopo/common/fmtopo.c usr/src/cmd/fm/modules/common/eversholt/platform.c usr/src/cmd/logadm/logadm.conf usr/src/cmd/mdb/Makefile.common usr/src/cmd/mdb/common/modules/genunix/fm.c usr/src/cmd/mdb/common/modules/genunix/fm.h usr/src/cmd/mdb/common/modules/genunix/genunix.c usr/src/cmd/mdb/common/modules/libtopo/libtopo.c usr/src/cmd/mdb/intel/amd64/genunix/Makefile usr/src/cmd/mdb/intel/amd64/libtopo/Makefile usr/src/cmd/mdb/intel/ia32/genunix/Makefile usr/src/cmd/mdb/intel/ia32/libtopo/Makefile usr/src/cmd/mdb/sparc/v7/libtopo/Makefile usr/src/cmd/mdb/sparc/v9/genunix/Makefile usr/src/cmd/mdb/sparc/v9/libtopo/Makefile usr/src/lib/fm/topo/libtopo/common/hc.c usr/src/lib/fm/topo/libtopo/common/libtopo.h usr/src/lib/fm/topo/libtopo/common/mapfile-vers usr/src/lib/fm/topo/libtopo/common/mem.c usr/src/lib/fm/topo/libtopo/common/mod.c usr/src/lib/fm/topo/libtopo/common/topo_builtin.c usr/src/lib/fm/topo/libtopo/common/topo_error.h usr/src/lib/fm/topo/libtopo/common/topo_fmri.c usr/src/lib/fm/topo/libtopo/common/topo_fmri.h usr/src/lib/fm/topo/libtopo/common/topo_hc.h usr/src/lib/fm/topo/libtopo/common/topo_mod.c usr/src/lib/fm/topo/libtopo/common/topo_xml.c usr/src/lib/fm/topo/modules/SUNW,SPARC-Enterprise/ioboard/opl_hostbridge.c usr/src/lib/fm/topo/modules/common/pcibus/did_props.c usr/src/lib/fm/topo/modules/i86pc/chip/chip.c usr/src/lib/fm/topo/modules/i86pc/chip/chip.h usr/src/pkgdefs/SUNW0on/prototype_com usr/src/pkgdefs/SUNWfmd/prototype_com usr/src/pkgdefs/SUNWmdb/prototype_com usr/src/pkgdefs/SUNWmdb/prototype_i386 usr/src/pkgdefs/SUNWmdb/prototype_sparc usr/src/tools/scripts/bfu.sh usr/src/uts/common/sys/fm/protocol.h usr/src/uts/i86pc/io/mc/mcamd.h usr/src/uts/i86pc/io/mc/mcamd_dimmcfg.h usr/src/uts/i86pc/io/mc/mcamd_drv.c usr/src/uts/intel/os/driver_aliases usr/src/uts/intel/sys/mc_amd.h
diffstat 67 files changed, 2965 insertions(+), 896 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/deleted_files/usr/src/cmd/fm/dicts/SMF.dict	Fri Dec 22 11:30:38 2006 -0800
@@ -0,0 +1,52 @@
+#
+# Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
+# Use is subject to license terms.
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License, Version 1.0 only
+# (the "License").  You may not use this file except in compliance
+# with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+#ident	"%Z%%M%	%I%	%E% SMI"
+
+FMDICT: name=SMF version=1 maxkey=1
+
+defect.sunos.smf.svc.disabled=0
+defect.sunos.smf.svc.temporarily_disabled=1
+defect.sunos.smf.svc.restarter_invalid=2
+defect.sunos.smf.svc.restarter_absent=3
+defect.sunos.smf.svc.uninitialized=4
+defect.sunos.smf.svc.restarter_dead=5
+defect.sunos.smf.svc.administrative_maintenance=6
+defect.sunos.smf.svc.repeated_fail=7
+defect.sunos.smf.svc.method_fail=8
+defect.sunos.smf.svc.none=9
+defect.sunos.smf.svc.unknown=10
+defect.sunos.smf.svc.starting=11
+defect.sunos.smf.svc.administrative_degraded=12
+defect.sunos.smf.svc.dependency_absent=13
+defect.sunos.smf.svc.dependency_running=14
+defect.sunos.smf.svc.dependency_other=15
+defect.sunos.smf.svc.dependency_cycle=16
+defect.sunos.smf.svc.dependency_invalid=17
+defect.sunos.smf.svc.start_method_fail=18
+defect.sunos.smf.svc.restarting_too_quickly=19
+defect.sunos.smf.db.verify=20
+defect.sunos.smf.svc.invalid_state=21
+defect.sunos.smf.svc.transitioning=22
+defect.sunos.smf.info.recovery=23
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/deleted_files/usr/src/cmd/fm/dicts/SMF.po	Fri Dec 22 11:30:38 2006 -0800
@@ -0,0 +1,411 @@
+#
+# Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
+# Use is subject to license terms.
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License, Version 1.0 only
+# (the "License").  You may not use this file except in compliance
+# with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+#ident	"%Z%%M%	%I%	%E% SMI"
+#
+# These are placeholders until they are actually used somewhere.
+#
+# code: SMF-8000-05
+# keys: defect.sunos.smf.svc.disabled
+#
+msgid "SMF-8000-05.type"
+msgstr "XXX"
+msgid "SMF-8000-05.severity"
+msgstr "XXX"
+msgid "SMF-8000-05.description"
+msgstr "XXX"
+msgid "SMF-8000-05.response"
+msgstr "XXX"
+msgid "SMF-8000-05.impact"
+msgstr "XXX"
+msgid "SMF-8000-05.action"
+msgstr "XXX"
+#
+# code: SMF-8000-1S
+# keys: defect.sunos.smf.svc.temporarily_disabled
+#
+msgid "SMF-8000-1S.type"
+msgstr "XXX"
+msgid "SMF-8000-1S.severity"
+msgstr "XXX"
+msgid "SMF-8000-1S.description"
+msgstr "XXX"
+msgid "SMF-8000-1S.response"
+msgstr "XXX"
+msgid "SMF-8000-1S.impact"
+msgstr "XXX"
+msgid "SMF-8000-1S.action"
+msgstr "XXX"
+#
+# code: SMF-8000-2A
+# keys: defect.sunos.smf.svc.restarter_invalid
+#
+msgid "SMF-8000-2A.type"
+msgstr "XXX"
+msgid "SMF-8000-2A.severity"
+msgstr "XXX"
+msgid "SMF-8000-2A.description"
+msgstr "XXX"
+msgid "SMF-8000-2A.response"
+msgstr "XXX"
+msgid "SMF-8000-2A.impact"
+msgstr "XXX"
+msgid "SMF-8000-2A.action"
+msgstr "XXX"
+#
+# code: SMF-8000-3P
+# keys: defect.sunos.smf.svc.restarter_absent
+#
+msgid "SMF-8000-3P.type"
+msgstr "XXX"
+msgid "SMF-8000-3P.severity"
+msgstr "XXX"
+msgid "SMF-8000-3P.description"
+msgstr "XXX"
+msgid "SMF-8000-3P.response"
+msgstr "XXX"
+msgid "SMF-8000-3P.impact"
+msgstr "XXX"
+msgid "SMF-8000-3P.action"
+msgstr "XXX"
+#
+# code: SMF-8000-4D
+# keys: defect.sunos.smf.svc.uninitialized
+#
+msgid "SMF-8000-4D.type"
+msgstr "XXX"
+msgid "SMF-8000-4D.severity"
+msgstr "XXX"
+msgid "SMF-8000-4D.description"
+msgstr "XXX"
+msgid "SMF-8000-4D.response"
+msgstr "XXX"
+msgid "SMF-8000-4D.impact"
+msgstr "XXX"
+msgid "SMF-8000-4D.action"
+msgstr "XXX"
+#
+# code: SMF-8000-5H
+# keys: defect.sunos.smf.svc.restarter_dead
+#
+msgid "SMF-8000-5H.type"
+msgstr "XXX"
+msgid "SMF-8000-5H.severity"
+msgstr "XXX"
+msgid "SMF-8000-5H.description"
+msgstr "XXX"
+msgid "SMF-8000-5H.response"
+msgstr "XXX"
+msgid "SMF-8000-5H.impact"
+msgstr "XXX"
+msgid "SMF-8000-5H.action"
+msgstr "XXX"
+#
+# code: SMF-8000-63
+# keys: defect.sunos.smf.svc.administrative_maintenance
+#
+msgid "SMF-8000-63.type"
+msgstr "XXX"
+msgid "SMF-8000-63.severity"
+msgstr "XXX"
+msgid "SMF-8000-63.description"
+msgstr "XXX"
+msgid "SMF-8000-63.response"
+msgstr "XXX"
+msgid "SMF-8000-63.impact"
+msgstr "XXX"
+msgid "SMF-8000-63.action"
+msgstr "XXX"
+#
+# code: SMF-8000-7Y
+# keys: defect.sunos.smf.svc.repeated_fail
+#
+msgid "SMF-8000-7Y.type"
+msgstr "XXX"
+msgid "SMF-8000-7Y.severity"
+msgstr "XXX"
+msgid "SMF-8000-7Y.description"
+msgstr "XXX"
+msgid "SMF-8000-7Y.response"
+msgstr "XXX"
+msgid "SMF-8000-7Y.impact"
+msgstr "XXX"
+msgid "SMF-8000-7Y.action"
+msgstr "XXX"
+#
+# code: SMF-8000-8Q
+# keys: defect.sunos.smf.svc.method_fail
+#
+msgid "SMF-8000-8Q.type"
+msgstr "XXX"
+msgid "SMF-8000-8Q.severity"
+msgstr "XXX"
+msgid "SMF-8000-8Q.description"
+msgstr "XXX"
+msgid "SMF-8000-8Q.response"
+msgstr "XXX"
+msgid "SMF-8000-8Q.impact"
+msgstr "XXX"
+msgid "SMF-8000-8Q.action"
+msgstr "XXX"
+#
+# code: SMF-8000-9C
+# keys: defect.sunos.smf.svc.none
+#
+msgid "SMF-8000-9C.type"
+msgstr "XXX"
+msgid "SMF-8000-9C.severity"
+msgstr "XXX"
+msgid "SMF-8000-9C.description"
+msgstr "XXX"
+msgid "SMF-8000-9C.response"
+msgstr "XXX"
+msgid "SMF-8000-9C.impact"
+msgstr "XXX"
+msgid "SMF-8000-9C.action"
+msgstr "XXX"
+#
+# code: SMF-8000-AR
+# keys: defect.sunos.smf.svc.unknown
+#
+msgid "SMF-8000-AR.type"
+msgstr "XXX"
+msgid "SMF-8000-AR.severity"
+msgstr "XXX"
+msgid "SMF-8000-AR.description"
+msgstr "XXX"
+msgid "SMF-8000-AR.response"
+msgstr "XXX"
+msgid "SMF-8000-AR.impact"
+msgstr "XXX"
+msgid "SMF-8000-AR.action"
+msgstr "XXX"
+#
+# code: SMF-8000-C4
+# keys: defect.sunos.smf.svc.starting
+#
+msgid "SMF-8000-C4.type"
+msgstr "XXX"
+msgid "SMF-8000-C4.severity"
+msgstr "XXX"
+msgid "SMF-8000-C4.description"
+msgstr "XXX"
+msgid "SMF-8000-C4.response"
+msgstr "XXX"
+msgid "SMF-8000-C4.impact"
+msgstr "XXX"
+msgid "SMF-8000-C4.action"
+msgstr "XXX"
+#
+# code: SMF-8000-DX
+# keys: defect.sunos.smf.svc.administrative_degraded
+#
+msgid "SMF-8000-DX.type"
+msgstr "XXX"
+msgid "SMF-8000-DX.severity"
+msgstr "XXX"
+msgid "SMF-8000-DX.description"
+msgstr "XXX"
+msgid "SMF-8000-DX.response"
+msgstr "XXX"
+msgid "SMF-8000-DX.impact"
+msgstr "XXX"
+msgid "SMF-8000-DX.action"
+msgstr "XXX"
+#
+# code: SMF-8000-E2
+# keys: defect.sunos.smf.svc.dependency_absent
+#
+msgid "SMF-8000-E2.type"
+msgstr "XXX"
+msgid "SMF-8000-E2.severity"
+msgstr "XXX"
+msgid "SMF-8000-E2.description"
+msgstr "XXX"
+msgid "SMF-8000-E2.response"
+msgstr "XXX"
+msgid "SMF-8000-E2.impact"
+msgstr "XXX"
+msgid "SMF-8000-E2.action"
+msgstr "XXX"
+#
+# code: SMF-8000-FJ
+# keys: defect.sunos.smf.svc.dependency_running
+#
+msgid "SMF-8000-FJ.type"
+msgstr "XXX"
+msgid "SMF-8000-FJ.severity"
+msgstr "XXX"
+msgid "SMF-8000-FJ.description"
+msgstr "XXX"
+msgid "SMF-8000-FJ.response"
+msgstr "XXX"
+msgid "SMF-8000-FJ.impact"
+msgstr "XXX"
+msgid "SMF-8000-FJ.action"
+msgstr "XXX"
+#
+# code: SMF-8000-GE
+# keys: defect.sunos.smf.svc.dependency_other
+#
+msgid "SMF-8000-GE.type"
+msgstr "XXX"
+msgid "SMF-8000-GE.severity"
+msgstr "XXX"
+msgid "SMF-8000-GE.description"
+msgstr "XXX"
+msgid "SMF-8000-GE.response"
+msgstr "XXX"
+msgid "SMF-8000-GE.impact"
+msgstr "XXX"
+msgid "SMF-8000-GE.action"
+msgstr "XXX"
+#
+# code: SMF-8000-HP
+# keys: defect.sunos.smf.svc.dependency_cycle
+#
+msgid "SMF-8000-HP.type"
+msgstr "XXX"
+msgid "SMF-8000-HP.severity"
+msgstr "XXX"
+msgid "SMF-8000-HP.description"
+msgstr "XXX"
+msgid "SMF-8000-HP.response"
+msgstr "XXX"
+msgid "SMF-8000-HP.impact"
+msgstr "XXX"
+msgid "SMF-8000-HP.action"
+msgstr "XXX"
+#
+# code: SMF-8000-JA
+# keys: defect.sunos.smf.svc.dependency_invalid
+#
+msgid "SMF-8000-JA.type"
+msgstr "XXX"
+msgid "SMF-8000-JA.severity"
+msgstr "XXX"
+msgid "SMF-8000-JA.description"
+msgstr "XXX"
+msgid "SMF-8000-JA.response"
+msgstr "XXX"
+msgid "SMF-8000-JA.impact"
+msgstr "XXX"
+msgid "SMF-8000-JA.action"
+msgstr "XXX"
+#
+# code: SMF-8000-KS
+# keys: defect.sunos.smf.svc.start_method_fail
+#
+msgid "SMF-8000-KS.type"
+msgstr "XXX"
+msgid "SMF-8000-KS.severity"
+msgstr "XXX"
+msgid "SMF-8000-KS.description"
+msgstr "XXX"
+msgid "SMF-8000-KS.response"
+msgstr "XXX"
+msgid "SMF-8000-KS.impact"
+msgstr "XXX"
+msgid "SMF-8000-KS.action"
+msgstr "XXX"
+#
+# code: SMF-8000-L5
+# keys: defect.sunos.smf.svc.restarting_too_quickly
+#
+msgid "SMF-8000-L5.type"
+msgstr "XXX"
+msgid "SMF-8000-L5.severity"
+msgstr "XXX"
+msgid "SMF-8000-L5.description"
+msgstr "XXX"
+msgid "SMF-8000-L5.response"
+msgstr "XXX"
+msgid "SMF-8000-L5.impact"
+msgstr "XXX"
+msgid "SMF-8000-L5.action"
+msgstr "XXX"
+#
+# code: SMF-8000-MY
+# keys: defect.sunos.smf.db.verify
+#
+msgid "SMF-8000-MY.type"
+msgstr "XXX"
+msgid "SMF-8000-MY.severity"
+msgstr "XXX"
+msgid "SMF-8000-MY.description"
+msgstr "XXX"
+msgid "SMF-8000-MY.response"
+msgstr "XXX"
+msgid "SMF-8000-MY.impact"
+msgstr "XXX"
+msgid "SMF-8000-MY.action"
+msgstr "XXX"
+#
+# code: SMF-8000-N3
+# keys: defect.sunos.smf.svc.invalid_state
+#
+msgid "SMF-8000-N3.type"
+msgstr "XXX"
+msgid "SMF-8000-N3.severity"
+msgstr "XXX"
+msgid "SMF-8000-N3.description"
+msgstr "XXX"
+msgid "SMF-8000-N3.response"
+msgstr "XXX"
+msgid "SMF-8000-N3.impact"
+msgstr "XXX"
+msgid "SMF-8000-N3.action"
+msgstr "XXX"
+#
+# code: SMF-8000-PH
+# keys: defect.sunos.smf.svc.transitioning
+#
+msgid "SMF-8000-PH.type"
+msgstr "XXX"
+msgid "SMF-8000-PH.severity"
+msgstr "XXX"
+msgid "SMF-8000-PH.description"
+msgstr "XXX"
+msgid "SMF-8000-PH.response"
+msgstr "XXX"
+msgid "SMF-8000-PH.impact"
+msgstr "XXX"
+msgid "SMF-8000-PH.action"
+msgstr "XXX"
+#
+# code: SMF-8000-QD
+# keys: defect.sunos.smf.info.recovery
+#
+msgid "SMF-8000-QD.type"
+msgstr "XXX"
+msgid "SMF-8000-QD.severity"
+msgstr "XXX"
+msgid "SMF-8000-QD.description"
+msgstr "XXX"
+msgid "SMF-8000-QD.response"
+msgstr "XXX"
+msgid "SMF-8000-QD.impact"
+msgstr "XXX"
+msgid "SMF-8000-QD.action"
+msgstr "XXX"
--- a/usr/src/cmd/fm/dicts/FMD.po	Fri Dec 22 09:18:37 2006 -0800
+++ b/usr/src/cmd/fm/dicts/FMD.po	Fri Dec 22 11:30:38 2006 -0800
@@ -1,13 +1,12 @@
 #
-# Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
+# Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
 # Use is subject to license terms.
 #
 # CDDL HEADER START
 #
 # The contents of this file are subject to the terms of the
-# Common Development and Distribution License, Version 1.0 only
-# (the "License").  You may not use this file except in compliance
-# with the License.
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
 #
 # You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 # or http://www.opensolaris.org/os/licensing.
@@ -24,6 +23,9 @@
 #
 #ident	"%Z%%M%	%I%	%E% SMI"
 #
+# DO NOT EDIT -- this file is generated by the Event Registry.
+#
+#
 # General-purpose messages
 #
 msgid "syslog-msgs-message-template"
@@ -32,6 +34,7 @@
 # Fault-related messages
 #
 #
+#
 # code: FMD-8000-0W
 # keys: defect.sunos.fmd.nosub
 #
@@ -40,7 +43,7 @@
 msgid "FMD-8000-0W.severity"
 msgstr "Minor"
 msgid "FMD-8000-0W.description"
-msgstr "The Solaris Fault Manager received an event from a component to which no automated diagnosis software is currently subscribed. Refer to %s for more information."
+msgstr "The Solaris Fault Manager received an event from a component to which no automated diagnosis software is currently subscribed.  Refer to %s for more information."
 msgid "FMD-8000-0W.response"
 msgstr "Error reports from the component will be logged for examination by Sun."
 msgid "FMD-8000-0W.impact"
@@ -56,7 +59,7 @@
 msgid "FMD-8000-11.severity"
 msgstr "Minor"
 msgid "FMD-8000-11.description"
-msgstr "A Solaris Fault Manager component generated a diagnosis for which no message summary exists. Refer to %s for more information."
+msgstr "A Solaris Fault Manager component generated a diagnosis for which no message summary exists.  Refer to %s for more information."
 msgid "FMD-8000-11.response"
 msgstr "The diagnosis has been saved in the fault log for examination by Sun."
 msgid "FMD-8000-11.impact"
@@ -88,7 +91,7 @@
 msgid "FMD-8000-3F.severity"
 msgstr "Minor"
 msgid "FMD-8000-3F.description"
-msgstr "A Solaris Fault Manager component could not load because of an error in its configuration file.  Refer to %s for more information."
+msgstr "A Solaris Fault Manager component could not load due to an erroroneous configuration file.  Refer to %s for more information."
 msgid "FMD-8000-3F.response"
 msgstr "The module has been disabled.  Events destined for the module will be saved for manual diagnosis."
 msgid "FMD-8000-3F.impact"
--- a/usr/src/cmd/fm/dicts/Makefile	Fri Dec 22 09:18:37 2006 -0800
+++ b/usr/src/cmd/fm/dicts/Makefile	Fri Dec 22 11:30:38 2006 -0800
@@ -29,7 +29,6 @@
 common_DCNAMES = \
 	DISK \
 	FMD \
-	SMF \
 	SUNOS \
 	PCI \
 	PCIEX \
--- a/usr/src/cmd/fm/dicts/PCI.po	Fri Dec 22 09:18:37 2006 -0800
+++ b/usr/src/cmd/fm/dicts/PCI.po	Fri Dec 22 11:30:38 2006 -0800
@@ -152,7 +152,7 @@
 msgid "PCI-8000-7J.impact"
 msgstr "Possible loss of services provided by the device instances associated with this fault\n"
 msgid "PCI-8000-7J.action"
-msgstr "Schedule a repair procedure to replace the affected device.  Use fmdump -v -u  to identify the device or contact Sun for support.\n"
+msgstr "Schedule a repair procedure to replace the affected device.  Use fmdump -v -u <EVENT_ID> to identify the device or contact Sun for support.\n"
 #
 # code: PCI-8000-8S
 # keys: fault.io.pci.bus-linkerr fault.io.pci.device-interr
@@ -168,7 +168,7 @@
 msgid "PCI-8000-8S.impact"
 msgstr "Possible loss of services provided by the device instances associated with this fault\n"
 msgid "PCI-8000-8S.action"
-msgstr "If a plug-in card is involved check for badly-seated cards or bent pins. Otherwise schedule a repair procedure to replace the affected device.  Use fmdump -v -u  to identify the device and bus or contact Sun for support.\n"
+msgstr "If a plug-in card is involved check for badly-seated cards or bent pins. Otherwise schedule a repair procedure to replace the affected device.  Use fmdump -v -u <EVENT_ID> to identify the device and bus or contact Sun for support.\n"
 #
 # code: PCI-8000-95
 # keys: fault.io.pci.device-invreq fault.io.pci.device-noresp
@@ -184,7 +184,7 @@
 msgid "PCI-8000-95.impact"
 msgstr "Possible loss of services provided by the device instances associated with this fault\n"
 msgid "PCI-8000-95.action"
-msgstr "Ensure that the latest drivers and patches are installed. If a plug-in card is involved check for badly-seated cards or bent pins.  Otherwise schedule a repair procedure to replace the affected device(s).  Use fmdump -v -u  to identify the devices or contact Sun for support.\n"
+msgstr "Ensure that the latest drivers and patches are installed. If a plug-in card is involved check for badly-seated cards or bent pins.  Otherwise schedule a repair procedure to replace the affected device(s).  Use fmdump -v -u <EVENT_ID> to identify the devices or contact Sun for support.\n"
 #
 # code: PCI-8000-AP
 # keys: fault.io.pci.device-interr fault.io.pci.device-invreq
@@ -200,7 +200,7 @@
 msgid "PCI-8000-AP.impact"
 msgstr "Possible loss of services provided by the device instances associated with this fault\n"
 msgid "PCI-8000-AP.action"
-msgstr "Ensure that the latest drivers and patches are installed.  Otherwise schedule a repair procedure to replace the affected device(s).  Use fmdump -v -u  to identify the devices or contact Sun for support.\n"
+msgstr "Ensure that the latest drivers and patches are installed.  Otherwise schedule a repair procedure to replace the affected device(s).  Use fmdump -v -u <EVENT_ID> to identify the devices or contact Sun for support.\n"
 #
 # code: PCI-8000-CA
 # keys: fault.io.pci.device-noresp
@@ -210,10 +210,10 @@
 msgid "PCI-8000-CA.severity"
 msgstr "Critical"
 msgid "PCI-8000-CA.description"
-msgstr "Device is failing to respond\n  Refer to %s for more information."
+msgstr "A device is failing to respond\n  Refer to %s for more information."
 msgid "PCI-8000-CA.response"
 msgstr "One or more device instances may be disabled\n"
 msgid "PCI-8000-CA.impact"
 msgstr "Possible loss of services provided by the device instances associated with this fault\n"
 msgid "PCI-8000-CA.action"
-msgstr "Schedule a repair procedure to replace the affected device.  Use fmdump -v -u  to identify the device or contact Sun for support.\n"
+msgstr "Schedule a repair procedure to replace the affected device.\n\nUse fmdump -v -u <EVENT_ID> to identify the device or contact Sun for support.\n"
--- a/usr/src/cmd/fm/dicts/PCIEX.dict	Fri Dec 22 09:18:37 2006 -0800
+++ b/usr/src/cmd/fm/dicts/PCIEX.dict	Fri Dec 22 11:30:38 2006 -0800
@@ -26,7 +26,7 @@
 # DO NOT EDIT -- this file is generated by the Event Registry.
 #
 
-FMDICT: name=PCIEX version=1 maxkey=4 dictid=0x4558
+FMDICT: name=PCIEX version=1 maxkey=5 dictid=0x4558
 
 fault.io.pciex.device-interr=0
 fault.io.pciex.device-interr fault.io.pciex.device-invreq=1
@@ -42,3 +42,6 @@
 fault.io.pci.bus-linkerr fault.io.pci.device-interr fault.io.pciex.device-interr=11
 fault.io.pciex.bus-noresp fault.io.pciex.device-interr fault.io.pciex.device-noresp=12
 fault.io.pciex.bus-linkerr fault.io.pciex.bus-noresp fault.io.pciex.device-interr fault.io.pciex.device-noresp=13
+fault.io.pciex.bus-linkerr fault.io.pciex.bus-noresp fault.io.pciex.device-interr fault.io.pciex.device-invreq fault.io.pciex.device-noresp=14
+fault.io.pciex.bus-noresp fault.io.pciex.device-interr fault.io.pciex.device-invreq fault.io.pciex.device-noresp=15
+fault.io.pciex.bus-noresp fault.io.pciex.device-interr=16
--- a/usr/src/cmd/fm/dicts/PCIEX.po	Fri Dec 22 09:18:37 2006 -0800
+++ b/usr/src/cmd/fm/dicts/PCIEX.po	Fri Dec 22 11:30:38 2006 -0800
@@ -40,7 +40,7 @@
 msgid "PCIEX-8000-0A.impact"
 msgstr "Loss of services provided by the device instances associated with this fault\n"
 msgid "PCIEX-8000-0A.action"
-msgstr "Schedule a repair procedure to replace the affected device.  Use fmdump -v -u  to identify the device or contact Sun for support.\n"
+msgstr "Schedule a repair procedure to replace the affected device.  Use fmdump -v -u <EVENT_ID> to identify the device or contact Sun for support.\n"
 #
 # code: PCIEX-8000-1P
 # keys: fault.io.pciex.device-interr fault.io.pciex.device-invreq
@@ -56,7 +56,7 @@
 msgid "PCIEX-8000-1P.impact"
 msgstr "Loss of services provided by the device instances associated with this fault\n"
 msgid "PCIEX-8000-1P.action"
-msgstr "Ensure that the latest drivers and patches are installed.  Otherwise schedule a repair procedure to replace the affected device(s).  Use fmdump -v -u  to identify the devices or contact Sun for support.\n"
+msgstr "Ensure that the latest drivers and patches are installed.  Otherwise schedule a repair procedure to replace the affected device(s).  Use fmdump -v -u <EVENT_ID> to identify the devices or contact Sun for support.\n"
 #
 # code: PCIEX-8000-25
 # keys: fault.io.pciex.bus-noresp fault.io.pciex.device-noresp
@@ -72,7 +72,7 @@
 msgid "PCIEX-8000-25.impact"
 msgstr "Loss of services provided by the device instances associated with this fault\n"
 msgid "PCIEX-8000-25.action"
-msgstr "If a plug-in card is involved check for badly-seated cards or bent pins. Otherwise schedule a repair procedure to replace the affected device(s).  Use fmdump -v -u  to identify the devices or contact Sun for support.\n"
+msgstr "If a plug-in card is involved check for badly-seated cards or bent pins. Otherwise schedule a repair procedure to replace the affected device(s).  Use fmdump -v -u <EVENT_ID> to identify the devices or contact Sun for support.\n"
 #
 # code: PCIEX-8000-3S
 # keys: fault.io.pciex.bus-linkerr fault.io.pciex.device-interr
@@ -88,7 +88,7 @@
 msgid "PCIEX-8000-3S.impact"
 msgstr "Loss of services provided by the device instances associated with this fault\n"
 msgid "PCIEX-8000-3S.action"
-msgstr "If a plug-in card is involved check for badly-seated cards or bent pins. Otherwise schedule a repair procedure to replace the affected device(s).  Use fmdump -v -u  to identify the devices or contact Sun for support.\n"
+msgstr "If a plug-in card is involved check for badly-seated cards or bent pins. Otherwise schedule a repair procedure to replace the affected device(s).  Use fmdump -v -u <EVENT_ID> to identify the devices or contact Sun for support.\n"
 #
 # code: PCIEX-8000-43
 # keys: fault.io.pci.bus-linkerr fault.io.pciex.device-interr
@@ -104,7 +104,7 @@
 msgid "PCIEX-8000-43.impact"
 msgstr "Loss of services provided by the device instances associated with this fault\n"
 msgid "PCIEX-8000-43.action"
-msgstr "If a plug-in card is involved check for badly-seated cards or bent pins. Otherwise schedule a repair procedure to replace the affected device.  Use fmdump -v -u  to identify the device and bus or contact Sun for support.\n"
+msgstr "If a plug-in card is involved check for badly-seated cards or bent pins. Otherwise schedule a repair procedure to replace the affected device.  Use fmdump -v -u <EVENT_ID> to identify the device and bus or contact Sun for support.\n"
 #
 # code: PCIEX-8000-5Y
 # keys: fault.io.pci.device-invreq
@@ -120,7 +120,7 @@
 msgid "PCIEX-8000-5Y.impact"
 msgstr "Loss of services provided by the device instances associated with this fault\n"
 msgid "PCIEX-8000-5Y.action"
-msgstr "Ensure that the latest drivers and patches are installed. Otherwise schedule a repair procedure to replace the affected device(s).  Use fmdump -v -u  to identify the devices or contact Sun for support.\n"
+msgstr "Ensure that the latest drivers and patches are installed. Otherwise schedule a repair procedure to replace the affected device(s).  Use fmdump -v -u <EVENT_ID> to identify the devices or contact Sun for support.\n"
 #
 # code: PCIEX-8000-6D
 # keys: fault.io.pci.device-invreq fault.io.pciex.device-interr
@@ -136,7 +136,7 @@
 msgid "PCIEX-8000-6D.impact"
 msgstr "Loss of services provided by the device instances associated with this fault\n"
 msgid "PCIEX-8000-6D.action"
-msgstr "Ensure that the latest drivers and patches are installed.  Otherwise schedule a repair procedure to replace the affected device(s).  Use fmdump -v -u  to identify the devices or contact Sun for support.\n"
+msgstr "Ensure that the latest drivers and patches are installed.  Otherwise schedule a repair procedure to replace the affected device(s).  Use fmdump -v -u <EVENT_ID> to identify the devices or contact Sun for support.\n"
 #
 # code: PCIEX-8000-7H
 # keys: fault.io.pci.device-interr fault.io.pciex.device-invreq
@@ -152,7 +152,7 @@
 msgid "PCIEX-8000-7H.impact"
 msgstr "Loss of services provided by the device instances associated with this fault\n"
 msgid "PCIEX-8000-7H.action"
-msgstr "Ensure that the latest drivers and patches are installed.  Otherwise schedule a repair procedure to replace the affected device(s).  Use fmdump -v -u  to identify the devices or contact Sun for support.\n"
+msgstr "Ensure that the latest drivers and patches are installed.  Otherwise schedule a repair procedure to replace the affected device(s).  Use fmdump -v -u <EVENT_ID> to identify the devices or contact Sun for support.\n"
 #
 # code: PCIEX-8000-8R
 # keys: fault.io.pciex.device-invreq
@@ -168,7 +168,7 @@
 msgid "PCIEX-8000-8R.impact"
 msgstr "Loss of services provided by the device instances associated with this fault\n"
 msgid "PCIEX-8000-8R.action"
-msgstr "Ensure that the latest drivers and patches are installed. Otherwise schedule a repair procedure to replace the affected device(s).  Use fmdump -v -u  to identify the devices or contact Sun for support.\n"
+msgstr "Ensure that the latest drivers and patches are installed. Otherwise schedule a repair procedure to replace the affected device(s).  Use fmdump -v -u <EVENT_ID> to identify the devices or contact Sun for support.\n"
 #
 # code: PCIEX-8000-94
 # keys: fault.io.pci.device-noresp fault.io.pciex.device-invreq
@@ -184,7 +184,7 @@
 msgid "PCIEX-8000-94.impact"
 msgstr "Loss of services provided by the device instances associated with this fault\n"
 msgid "PCIEX-8000-94.action"
-msgstr "Ensure that the latest drivers and patches are installed. If a plug-in card is involved check for badly-seated cards or bent pins.  Otherwise schedule a repair procedure to replace the affected device(s).  Use fmdump -v -u  to identify the devices or contact Sun for support.\n"
+msgstr "Ensure that the latest drivers and patches are installed. If a plug-in card is involved check for badly-seated cards or bent pins.  Otherwise schedule a repair procedure to replace the affected device(s).  Use fmdump -v -u <EVENT_ID> to identify the devices or contact Sun for support.\n"
 #
 # code: PCIEX-8000-AQ
 # keys: fault.io.pci.device-invreq fault.io.pciex.device-noresp
@@ -200,7 +200,7 @@
 msgid "PCIEX-8000-AQ.impact"
 msgstr "Loss of services provided by the device instances associated with this fault\n"
 msgid "PCIEX-8000-AQ.action"
-msgstr "Ensure that the latest drivers and patches are installed. If a plug-in card is involved check for badly-seated cards or bent pins.  Otherwise schedule a repair procedure to replace the affected device(s).  Use fmdump -v -u  to identify the devices or contact Sun for support.\n"
+msgstr "Ensure that the latest drivers and patches are installed. If a plug-in card is involved check for badly-seated cards or bent pins.  Otherwise schedule a repair procedure to replace the affected device(s).  Use fmdump -v -u <EVENT_ID> to identify the devices or contact Sun for support.\n"
 #
 # code: PCIEX-8000-CC
 # keys: fault.io.pci.bus-linkerr fault.io.pci.device-interr fault.io.pciex.device-interr
@@ -216,7 +216,7 @@
 msgid "PCIEX-8000-CC.impact"
 msgstr "Loss of services provided by the device instances associated with this fault\n"
 msgid "PCIEX-8000-CC.action"
-msgstr "If a plug-in card is involved check for badly-seated cards or bent pins. Otherwise schedule a repair procedure to replace the affected device(s).  Use fmdump -v -u  to identify the devices or contact Sun for support.\n"
+msgstr "If a plug-in card is involved check for badly-seated cards or bent pins. Otherwise schedule a repair procedure to replace the affected device(s).  Use fmdump -v -u <EVENT_ID> to identify the devices or contact Sun for support.\n"
 #
 # code: PCIEX-8000-DJ
 # keys: fault.io.pciex.bus-noresp fault.io.pciex.device-interr fault.io.pciex.device-noresp
@@ -232,7 +232,7 @@
 msgid "PCIEX-8000-DJ.impact"
 msgstr "Loss of services provided by the device instances associated with this fault\n"
 msgid "PCIEX-8000-DJ.action"
-msgstr "If a plug-in card is involved check for badly-seated cards or bent pins. Otherwise schedule a repair procedure to replace the affected device(s).  Use fmdump -v -u  to identify the devices or contact Sun for support.\n"
+msgstr "If a plug-in card is involved check for badly-seated cards or bent pins. Otherwise schedule a repair procedure to replace the affected device(s).  Use fmdump -v -u <EVENT_ID> to identify the devices or contact Sun for support.\n"
 #
 # code: PCIEX-8000-EE
 # keys: fault.io.pciex.bus-linkerr fault.io.pciex.bus-noresp fault.io.pciex.device-interr fault.io.pciex.device-noresp
@@ -248,4 +248,52 @@
 msgid "PCIEX-8000-EE.impact"
 msgstr "Loss of services provided by the device instances associated with this fault\n"
 msgid "PCIEX-8000-EE.action"
-msgstr "If a plug-in card is involved check for badly-seated cards or bent pins. Otherwise schedule a repair procedure to replace the affected device(s).  Use fmdump -v -u  to identify the devices or contact Sun for support.\n"
+msgstr "If a plug-in card is involved check for badly-seated cards or bent pins. Otherwise schedule a repair procedure to replace the affected device(s).  Use fmdump -v -u <EVENT_ID> to identify the devices or contact Sun for support.\n"
+#
+# code: PCIEX-8000-FX
+# keys: fault.io.pciex.bus-linkerr fault.io.pciex.bus-noresp fault.io.pciex.device-interr fault.io.pciex.device-invreq fault.io.pciex.device-noresp
+#
+msgid "PCIEX-8000-FX.type"
+msgstr "Fault"
+msgid "PCIEX-8000-FX.severity"
+msgstr "Critical"
+msgid "PCIEX-8000-FX.description"
+msgstr "A problem has been detected on one of the specified devices or on one of the specified connecting buses.\n  Refer to %s for more information."
+msgid "PCIEX-8000-FX.response"
+msgstr "One or more device instances may be disabled\n"
+msgid "PCIEX-8000-FX.impact"
+msgstr "Loss of services provided by the device instances associated with this fault\n"
+msgid "PCIEX-8000-FX.action"
+msgstr "Ensure that the latest drivers and patches are installed. If a plug-in card is involved check for badly-seated cards or bent pins. Otherwise schedule a repair procedure to replace the affected device(s).  Use fmdump -v -u <EVENT_ID> to identify the devices or contact Sun for support.\n"
+#
+# code: PCIEX-8000-G2
+# keys: fault.io.pciex.bus-noresp fault.io.pciex.device-interr fault.io.pciex.device-invreq fault.io.pciex.device-noresp
+#
+msgid "PCIEX-8000-G2.type"
+msgstr "Fault"
+msgid "PCIEX-8000-G2.severity"
+msgstr "Critical"
+msgid "PCIEX-8000-G2.description"
+msgstr "A problem has been detected on one of the specified devices or on one of the specified connecting buses.\n  Refer to %s for more information."
+msgid "PCIEX-8000-G2.response"
+msgstr "One or more device instances may be disabled\n"
+msgid "PCIEX-8000-G2.impact"
+msgstr "Loss of services provided by the device instances associated with this fault\n"
+msgid "PCIEX-8000-G2.action"
+msgstr "Ensure that the latest drivers and patches are installed. Otherwise schedule a repair procedure to replace the affected device(s).  Use fmdump -v -u <EVENT_ID> to identify the devices or contact Sun for support.\n"
+#
+# code: PCIEX-8000-HS
+# keys: fault.io.pciex.bus-noresp fault.io.pciex.device-interr
+#
+msgid "PCIEX-8000-HS.type"
+msgstr "Fault"
+msgid "PCIEX-8000-HS.severity"
+msgstr "Critical"
+msgid "PCIEX-8000-HS.description"
+msgstr "A problem has been detected on one of the specified devices or on one of the specified connecting buses.\n  Refer to %s for more information."
+msgid "PCIEX-8000-HS.response"
+msgstr "One or more device instances may be disabled\n"
+msgid "PCIEX-8000-HS.impact"
+msgstr "Loss of services provided by the device instances associated with this fault\n"
+msgid "PCIEX-8000-HS.action"
+msgstr "If a plug-in card is involved check for badly-seated cards or bent pins. Otherwise schedule a repair procedure to replace the affected device(s).  Use fmdump -v -u <EVENT_ID> to identify the devices or contact Sun for support.\n"
--- a/usr/src/cmd/fm/dicts/SCA1000.po	Fri Dec 22 09:18:37 2006 -0800
+++ b/usr/src/cmd/fm/dicts/SCA1000.po	Fri Dec 22 11:30:38 2006 -0800
@@ -1,3 +1,6 @@
+#
+# Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
+# Use is subject to license terms.
 #
 # CDDL HEADER START
 #
@@ -18,12 +21,10 @@
 #
 # CDDL HEADER END
 #
-# Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
-# Use is subject to license terms.
-#
 #ident	"%Z%%M%	%I%	%E% SMI"
 #
-# cmd/fm/SCA1000.po
+# DO NOT EDIT -- this file is generated by the Event Registry.
+#
 #
 # code: SCA1000-8000-0V
 # keys: fault.io.sca1000.hw
@@ -33,10 +34,10 @@
 msgid "SCA1000-8000-0V.severity"
 msgstr "Major"
 msgid "SCA1000-8000-0V.description"
-msgstr "Hardware fault detected on Sun Crypto Accelerator 1000 card.  Refer to %s for more information."
+msgstr "The Solaris Fault Manager has detected a hardware failure on the Sun Crypto Accelerator 1000 card.  Refer to %s for more information."
 msgid "SCA1000-8000-0V.response"
 msgstr "The module has been disabled and un-registered as a hardware provider to the Solaris Cryptographic Framework."
 msgid "SCA1000-8000-0V.impact"
 msgstr "The card will no longer function as a cryptographic accelerator."
 msgid "SCA1000-8000-0V.action"
-msgstr "Verify hardware installation and run diagnostics on the card using sunvts.  Contact Sun for support."
+msgstr "Ensure that the board is securely installed on the system.\n\nUse the cryptoadm(1M) command\n\ncryptoadm list -p\n\n\nto check whether 'dca/x' (where x is a number) is listed under 'kernel hardware\nproviders'. If so, run diagnostics on the hardware provider using SUNVTS\nfollowing the procedures described in the Sun Crypto Accelerator 1000 Board\nUser's Guide.\n\nUse the fmdump(1M) command\n\nfmdump -vu event-id\n\n\nto view the results of diagnosis and the specific Field Replaceable\nUnit (FRU) identified for replacement.\n\nThe event-id can be found in the EVENT-ID field of the message.\nFor example:\n\n\nEVENT-ID: 39b30371-f009-c76c-90ee-b245784d2277\n"
--- a/usr/src/cmd/fm/dicts/SCA500.po	Fri Dec 22 09:18:37 2006 -0800
+++ b/usr/src/cmd/fm/dicts/SCA500.po	Fri Dec 22 11:30:38 2006 -0800
@@ -1,3 +1,6 @@
+#
+# Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
+# Use is subject to license terms.
 #
 # CDDL HEADER START
 #
@@ -18,13 +21,10 @@
 #
 # CDDL HEADER END
 #
-# Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
-# Use is subject to license terms.
-#
 #ident	"%Z%%M%	%I%	%E% SMI"
 #
+# DO NOT EDIT -- this file is generated by the Event Registry.
 #
-# cmd/fm/SCA500.po
 #
 # code: SCA500-8000-0D
 # keys: fault.io.sca500.hw
@@ -34,10 +34,10 @@
 msgid "SCA500-8000-0D.severity"
 msgstr "Major"
 msgid "SCA500-8000-0D.description"
-msgstr "Hardware fault detected on Sun Crypto Accelerator 500 card.  Refer to %s for more information."
+msgstr "The Solaris Fault Manager has detected a hardware failure on the Sun Crypto Accelerator 500 card.  Refer to %s for more information."
 msgid "SCA500-8000-0D.response"
 msgstr "The module has been disabled and un-registered as a hardware provider to the Solaris Cryptographic Framework."
 msgid "SCA500-8000-0D.impact"
 msgstr "The card will no longer function as a cryptographic accelerator."
 msgid "SCA500-8000-0D.action"
-msgstr "Verify hardware installation and run diagnostics on the card using sunvts.  Contact Sun for support."
+msgstr "Ensure that the board is securely installed on the system.\n\nUse the cryptoadm(1M) command\n\ncryptoadm list -p\n\n\nto check whether 'dca/x' (where x is a number) is listed under 'kernel hardware\nproviders'. If so, run diagnostics on the hardware provider using SUNVTS\nfollowing the procedures described in the Sun Crypto Accelerator 1000 Board\nUser's Guide.\n\nUse the fmdump(1M) command\n\nfmdump -vu event-id\n\n\nto view the results of diagnosis and the specific Field Replaceable\nUnit (FRU) identified for replacement.\n\nThe event-id can be found in the EVENT-ID field of the message.\nFor example:\n\n\nEVENT-ID: 39b30371-f009-c76c-90ee-b245784d2277\n"
--- a/usr/src/cmd/fm/dicts/SMF.dict	Fri Dec 22 09:18:37 2006 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,52 +0,0 @@
-#
-# Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
-# Use is subject to license terms.
-#
-# CDDL HEADER START
-#
-# The contents of this file are subject to the terms of the
-# Common Development and Distribution License, Version 1.0 only
-# (the "License").  You may not use this file except in compliance
-# with the License.
-#
-# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
-# or http://www.opensolaris.org/os/licensing.
-# See the License for the specific language governing permissions
-# and limitations under the License.
-#
-# When distributing Covered Code, include this CDDL HEADER in each
-# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
-# If applicable, add the following below this CDDL HEADER, with the
-# fields enclosed by brackets "[]" replaced with your own identifying
-# information: Portions Copyright [yyyy] [name of copyright owner]
-#
-# CDDL HEADER END
-#
-#ident	"%Z%%M%	%I%	%E% SMI"
-
-FMDICT: name=SMF version=1 maxkey=1
-
-defect.sunos.smf.svc.disabled=0
-defect.sunos.smf.svc.temporarily_disabled=1
-defect.sunos.smf.svc.restarter_invalid=2
-defect.sunos.smf.svc.restarter_absent=3
-defect.sunos.smf.svc.uninitialized=4
-defect.sunos.smf.svc.restarter_dead=5
-defect.sunos.smf.svc.administrative_maintenance=6
-defect.sunos.smf.svc.repeated_fail=7
-defect.sunos.smf.svc.method_fail=8
-defect.sunos.smf.svc.none=9
-defect.sunos.smf.svc.unknown=10
-defect.sunos.smf.svc.starting=11
-defect.sunos.smf.svc.administrative_degraded=12
-defect.sunos.smf.svc.dependency_absent=13
-defect.sunos.smf.svc.dependency_running=14
-defect.sunos.smf.svc.dependency_other=15
-defect.sunos.smf.svc.dependency_cycle=16
-defect.sunos.smf.svc.dependency_invalid=17
-defect.sunos.smf.svc.start_method_fail=18
-defect.sunos.smf.svc.restarting_too_quickly=19
-defect.sunos.smf.db.verify=20
-defect.sunos.smf.svc.invalid_state=21
-defect.sunos.smf.svc.transitioning=22
-defect.sunos.smf.info.recovery=23
--- a/usr/src/cmd/fm/dicts/SMF.po	Fri Dec 22 09:18:37 2006 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,411 +0,0 @@
-#
-# Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
-# Use is subject to license terms.
-#
-# CDDL HEADER START
-#
-# The contents of this file are subject to the terms of the
-# Common Development and Distribution License, Version 1.0 only
-# (the "License").  You may not use this file except in compliance
-# with the License.
-#
-# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
-# or http://www.opensolaris.org/os/licensing.
-# See the License for the specific language governing permissions
-# and limitations under the License.
-#
-# When distributing Covered Code, include this CDDL HEADER in each
-# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
-# If applicable, add the following below this CDDL HEADER, with the
-# fields enclosed by brackets "[]" replaced with your own identifying
-# information: Portions Copyright [yyyy] [name of copyright owner]
-#
-# CDDL HEADER END
-#
-#ident	"%Z%%M%	%I%	%E% SMI"
-#
-# These are placeholders until they are actually used somewhere.
-#
-# code: SMF-8000-05
-# keys: defect.sunos.smf.svc.disabled
-#
-msgid "SMF-8000-05.type"
-msgstr "XXX"
-msgid "SMF-8000-05.severity"
-msgstr "XXX"
-msgid "SMF-8000-05.description"
-msgstr "XXX"
-msgid "SMF-8000-05.response"
-msgstr "XXX"
-msgid "SMF-8000-05.impact"
-msgstr "XXX"
-msgid "SMF-8000-05.action"
-msgstr "XXX"
-#
-# code: SMF-8000-1S
-# keys: defect.sunos.smf.svc.temporarily_disabled
-#
-msgid "SMF-8000-1S.type"
-msgstr "XXX"
-msgid "SMF-8000-1S.severity"
-msgstr "XXX"
-msgid "SMF-8000-1S.description"
-msgstr "XXX"
-msgid "SMF-8000-1S.response"
-msgstr "XXX"
-msgid "SMF-8000-1S.impact"
-msgstr "XXX"
-msgid "SMF-8000-1S.action"
-msgstr "XXX"
-#
-# code: SMF-8000-2A
-# keys: defect.sunos.smf.svc.restarter_invalid
-#
-msgid "SMF-8000-2A.type"
-msgstr "XXX"
-msgid "SMF-8000-2A.severity"
-msgstr "XXX"
-msgid "SMF-8000-2A.description"
-msgstr "XXX"
-msgid "SMF-8000-2A.response"
-msgstr "XXX"
-msgid "SMF-8000-2A.impact"
-msgstr "XXX"
-msgid "SMF-8000-2A.action"
-msgstr "XXX"
-#
-# code: SMF-8000-3P
-# keys: defect.sunos.smf.svc.restarter_absent
-#
-msgid "SMF-8000-3P.type"
-msgstr "XXX"
-msgid "SMF-8000-3P.severity"
-msgstr "XXX"
-msgid "SMF-8000-3P.description"
-msgstr "XXX"
-msgid "SMF-8000-3P.response"
-msgstr "XXX"
-msgid "SMF-8000-3P.impact"
-msgstr "XXX"
-msgid "SMF-8000-3P.action"
-msgstr "XXX"
-#
-# code: SMF-8000-4D
-# keys: defect.sunos.smf.svc.uninitialized
-#
-msgid "SMF-8000-4D.type"
-msgstr "XXX"
-msgid "SMF-8000-4D.severity"
-msgstr "XXX"
-msgid "SMF-8000-4D.description"
-msgstr "XXX"
-msgid "SMF-8000-4D.response"
-msgstr "XXX"
-msgid "SMF-8000-4D.impact"
-msgstr "XXX"
-msgid "SMF-8000-4D.action"
-msgstr "XXX"
-#
-# code: SMF-8000-5H
-# keys: defect.sunos.smf.svc.restarter_dead
-#
-msgid "SMF-8000-5H.type"
-msgstr "XXX"
-msgid "SMF-8000-5H.severity"
-msgstr "XXX"
-msgid "SMF-8000-5H.description"
-msgstr "XXX"
-msgid "SMF-8000-5H.response"
-msgstr "XXX"
-msgid "SMF-8000-5H.impact"
-msgstr "XXX"
-msgid "SMF-8000-5H.action"
-msgstr "XXX"
-#
-# code: SMF-8000-63
-# keys: defect.sunos.smf.svc.administrative_maintenance
-#
-msgid "SMF-8000-63.type"
-msgstr "XXX"
-msgid "SMF-8000-63.severity"
-msgstr "XXX"
-msgid "SMF-8000-63.description"
-msgstr "XXX"
-msgid "SMF-8000-63.response"
-msgstr "XXX"
-msgid "SMF-8000-63.impact"
-msgstr "XXX"
-msgid "SMF-8000-63.action"
-msgstr "XXX"
-#
-# code: SMF-8000-7Y
-# keys: defect.sunos.smf.svc.repeated_fail
-#
-msgid "SMF-8000-7Y.type"
-msgstr "XXX"
-msgid "SMF-8000-7Y.severity"
-msgstr "XXX"
-msgid "SMF-8000-7Y.description"
-msgstr "XXX"
-msgid "SMF-8000-7Y.response"
-msgstr "XXX"
-msgid "SMF-8000-7Y.impact"
-msgstr "XXX"
-msgid "SMF-8000-7Y.action"
-msgstr "XXX"
-#
-# code: SMF-8000-8Q
-# keys: defect.sunos.smf.svc.method_fail
-#
-msgid "SMF-8000-8Q.type"
-msgstr "XXX"
-msgid "SMF-8000-8Q.severity"
-msgstr "XXX"
-msgid "SMF-8000-8Q.description"
-msgstr "XXX"
-msgid "SMF-8000-8Q.response"
-msgstr "XXX"
-msgid "SMF-8000-8Q.impact"
-msgstr "XXX"
-msgid "SMF-8000-8Q.action"
-msgstr "XXX"
-#
-# code: SMF-8000-9C
-# keys: defect.sunos.smf.svc.none
-#
-msgid "SMF-8000-9C.type"
-msgstr "XXX"
-msgid "SMF-8000-9C.severity"
-msgstr "XXX"
-msgid "SMF-8000-9C.description"
-msgstr "XXX"
-msgid "SMF-8000-9C.response"
-msgstr "XXX"
-msgid "SMF-8000-9C.impact"
-msgstr "XXX"
-msgid "SMF-8000-9C.action"
-msgstr "XXX"
-#
-# code: SMF-8000-AR
-# keys: defect.sunos.smf.svc.unknown
-#
-msgid "SMF-8000-AR.type"
-msgstr "XXX"
-msgid "SMF-8000-AR.severity"
-msgstr "XXX"
-msgid "SMF-8000-AR.description"
-msgstr "XXX"
-msgid "SMF-8000-AR.response"
-msgstr "XXX"
-msgid "SMF-8000-AR.impact"
-msgstr "XXX"
-msgid "SMF-8000-AR.action"
-msgstr "XXX"
-#
-# code: SMF-8000-C4
-# keys: defect.sunos.smf.svc.starting
-#
-msgid "SMF-8000-C4.type"
-msgstr "XXX"
-msgid "SMF-8000-C4.severity"
-msgstr "XXX"
-msgid "SMF-8000-C4.description"
-msgstr "XXX"
-msgid "SMF-8000-C4.response"
-msgstr "XXX"
-msgid "SMF-8000-C4.impact"
-msgstr "XXX"
-msgid "SMF-8000-C4.action"
-msgstr "XXX"
-#
-# code: SMF-8000-DX
-# keys: defect.sunos.smf.svc.administrative_degraded
-#
-msgid "SMF-8000-DX.type"
-msgstr "XXX"
-msgid "SMF-8000-DX.severity"
-msgstr "XXX"
-msgid "SMF-8000-DX.description"
-msgstr "XXX"
-msgid "SMF-8000-DX.response"
-msgstr "XXX"
-msgid "SMF-8000-DX.impact"
-msgstr "XXX"
-msgid "SMF-8000-DX.action"
-msgstr "XXX"
-#
-# code: SMF-8000-E2
-# keys: defect.sunos.smf.svc.dependency_absent
-#
-msgid "SMF-8000-E2.type"
-msgstr "XXX"
-msgid "SMF-8000-E2.severity"
-msgstr "XXX"
-msgid "SMF-8000-E2.description"
-msgstr "XXX"
-msgid "SMF-8000-E2.response"
-msgstr "XXX"
-msgid "SMF-8000-E2.impact"
-msgstr "XXX"
-msgid "SMF-8000-E2.action"
-msgstr "XXX"
-#
-# code: SMF-8000-FJ
-# keys: defect.sunos.smf.svc.dependency_running
-#
-msgid "SMF-8000-FJ.type"
-msgstr "XXX"
-msgid "SMF-8000-FJ.severity"
-msgstr "XXX"
-msgid "SMF-8000-FJ.description"
-msgstr "XXX"
-msgid "SMF-8000-FJ.response"
-msgstr "XXX"
-msgid "SMF-8000-FJ.impact"
-msgstr "XXX"
-msgid "SMF-8000-FJ.action"
-msgstr "XXX"
-#
-# code: SMF-8000-GE
-# keys: defect.sunos.smf.svc.dependency_other
-#
-msgid "SMF-8000-GE.type"
-msgstr "XXX"
-msgid "SMF-8000-GE.severity"
-msgstr "XXX"
-msgid "SMF-8000-GE.description"
-msgstr "XXX"
-msgid "SMF-8000-GE.response"
-msgstr "XXX"
-msgid "SMF-8000-GE.impact"
-msgstr "XXX"
-msgid "SMF-8000-GE.action"
-msgstr "XXX"
-#
-# code: SMF-8000-HP
-# keys: defect.sunos.smf.svc.dependency_cycle
-#
-msgid "SMF-8000-HP.type"
-msgstr "XXX"
-msgid "SMF-8000-HP.severity"
-msgstr "XXX"
-msgid "SMF-8000-HP.description"
-msgstr "XXX"
-msgid "SMF-8000-HP.response"
-msgstr "XXX"
-msgid "SMF-8000-HP.impact"
-msgstr "XXX"
-msgid "SMF-8000-HP.action"
-msgstr "XXX"
-#
-# code: SMF-8000-JA
-# keys: defect.sunos.smf.svc.dependency_invalid
-#
-msgid "SMF-8000-JA.type"
-msgstr "XXX"
-msgid "SMF-8000-JA.severity"
-msgstr "XXX"
-msgid "SMF-8000-JA.description"
-msgstr "XXX"
-msgid "SMF-8000-JA.response"
-msgstr "XXX"
-msgid "SMF-8000-JA.impact"
-msgstr "XXX"
-msgid "SMF-8000-JA.action"
-msgstr "XXX"
-#
-# code: SMF-8000-KS
-# keys: defect.sunos.smf.svc.start_method_fail
-#
-msgid "SMF-8000-KS.type"
-msgstr "XXX"
-msgid "SMF-8000-KS.severity"
-msgstr "XXX"
-msgid "SMF-8000-KS.description"
-msgstr "XXX"
-msgid "SMF-8000-KS.response"
-msgstr "XXX"
-msgid "SMF-8000-KS.impact"
-msgstr "XXX"
-msgid "SMF-8000-KS.action"
-msgstr "XXX"
-#
-# code: SMF-8000-L5
-# keys: defect.sunos.smf.svc.restarting_too_quickly
-#
-msgid "SMF-8000-L5.type"
-msgstr "XXX"
-msgid "SMF-8000-L5.severity"
-msgstr "XXX"
-msgid "SMF-8000-L5.description"
-msgstr "XXX"
-msgid "SMF-8000-L5.response"
-msgstr "XXX"
-msgid "SMF-8000-L5.impact"
-msgstr "XXX"
-msgid "SMF-8000-L5.action"
-msgstr "XXX"
-#
-# code: SMF-8000-MY
-# keys: defect.sunos.smf.db.verify
-#
-msgid "SMF-8000-MY.type"
-msgstr "XXX"
-msgid "SMF-8000-MY.severity"
-msgstr "XXX"
-msgid "SMF-8000-MY.description"
-msgstr "XXX"
-msgid "SMF-8000-MY.response"
-msgstr "XXX"
-msgid "SMF-8000-MY.impact"
-msgstr "XXX"
-msgid "SMF-8000-MY.action"
-msgstr "XXX"
-#
-# code: SMF-8000-N3
-# keys: defect.sunos.smf.svc.invalid_state
-#
-msgid "SMF-8000-N3.type"
-msgstr "XXX"
-msgid "SMF-8000-N3.severity"
-msgstr "XXX"
-msgid "SMF-8000-N3.description"
-msgstr "XXX"
-msgid "SMF-8000-N3.response"
-msgstr "XXX"
-msgid "SMF-8000-N3.impact"
-msgstr "XXX"
-msgid "SMF-8000-N3.action"
-msgstr "XXX"
-#
-# code: SMF-8000-PH
-# keys: defect.sunos.smf.svc.transitioning
-#
-msgid "SMF-8000-PH.type"
-msgstr "XXX"
-msgid "SMF-8000-PH.severity"
-msgstr "XXX"
-msgid "SMF-8000-PH.description"
-msgstr "XXX"
-msgid "SMF-8000-PH.response"
-msgstr "XXX"
-msgid "SMF-8000-PH.impact"
-msgstr "XXX"
-msgid "SMF-8000-PH.action"
-msgstr "XXX"
-#
-# code: SMF-8000-QD
-# keys: defect.sunos.smf.info.recovery
-#
-msgid "SMF-8000-QD.type"
-msgstr "XXX"
-msgid "SMF-8000-QD.severity"
-msgstr "XXX"
-msgid "SMF-8000-QD.description"
-msgstr "XXX"
-msgid "SMF-8000-QD.response"
-msgstr "XXX"
-msgid "SMF-8000-QD.impact"
-msgstr "XXX"
-msgid "SMF-8000-QD.action"
-msgstr "XXX"
--- a/usr/src/cmd/fm/dicts/SUN4.po	Fri Dec 22 09:18:37 2006 -0800
+++ b/usr/src/cmd/fm/dicts/SUN4.po	Fri Dec 22 11:30:38 2006 -0800
@@ -1,13 +1,12 @@
 #
-# Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
+# Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
 # Use is subject to license terms.
 #
 # CDDL HEADER START
 #
 # The contents of this file are subject to the terms of the
-# Common Development and Distribution License, Version 1.0 only
-# (the "License").  You may not use this file except in compliance
-# with the License.
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
 #
 # You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 # or http://www.opensolaris.org/os/licensing.
@@ -41,7 +40,7 @@
 msgid "SUN4-8000-0Y.impact"
 msgstr "Loss of services provided by the device instances associated with this fault"
 msgid "SUN4-8000-0Y.action"
-msgstr "\nSchedule a repair procedure to replace the affected device.  Use\nfmdump -v -u EVENT_ID to identify the device or contact\nSun for support.\n"
+msgstr "\nSchedule a repair procedure to replace the affected device.  Use\nfmdump -v -u EVENT_ID to identify the device or contact\nSun for support.  \n\nIf this message occurs on a Sun Fire T2000 also refer to the NOTE\nat the end of the Details section below.\n"
 #
 # code: SUN4-8000-13
 # keys: fault.io.ebus
@@ -105,7 +104,7 @@
 msgid "SUN4-8000-4P.impact"
 msgstr "Loss of services provided by the device instances associated with this fault"
 msgid "SUN4-8000-4P.action"
-msgstr "\nSchedule a repair procedure to replace the affected device.  Use\nfmdump -v -u EVENT_ID to identify the device or contact\nSun for support.\n"
+msgstr "\nSchedule a repair procedure to replace the affected device.  Use\nfmdump -v -u EVENT_ID to identify the device or contact\nSun for support.  \n\nIf this message occurs on a Sun Fire T2000 also refer to the NOTE\nat the end of the Details section below."
 #
 # code: SUN4-8000-5A
 # keys: defect.io.fire.pciex.driver
@@ -121,7 +120,7 @@
 msgid "SUN4-8000-5A.impact"
 msgstr "Loss of services provided by the device instances associated with\nthis problem"
 msgid "SUN4-8000-5A.action"
-msgstr "Ensure latest driver and patch are installed.  Use fmdump -v -u &lt;EVENT_ID&gt; to identify the module/package, or contact Sun for support."
+msgstr "Ensure latest driver and patch are installed.  Use fmdump -v -u <EVENT_ID> to identify the module/package, or contact Sun for support."
 #
 # code: SUN4-8000-6S
 # keys: fault.io.datapath fault.io.fire.asic
@@ -153,7 +152,7 @@
 msgid "SUN4-8000-75.impact"
 msgstr "Loss of services provided by the device instances associated with this fault"
 msgid "SUN4-8000-75.action"
-msgstr "\nSchedule a repair procedure to replace the affected device.  Use\nfmdump -v -u EVENT_ID to identify the device or contact\nSun for support.\n"
+msgstr "\nSchedule a repair procedure to replace the affected device.  Use\nfmdump -v -u EVENT_ID to identify the device or contact\nSun for support.  \n\nIf this message occurs on a Sun Fire T2000 also refer to the NOTE\nat the end of the Details section below.\n"
 #
 # code: SUN4-8000-8E
 # keys: defect.io.fire.pci.driver defect.io.fire.pciex.driver
@@ -169,7 +168,7 @@
 msgid "SUN4-8000-8E.impact"
 msgstr "Loss of services provided by the device instances associated with this problem"
 msgid "SUN4-8000-8E.action"
-msgstr "Ensure latest driver and patch are installed.  Use fmdump -v -u &lt;EVENT_ID&gt; to identify the module/package, or contact Sun for support."
+msgstr "Ensure latest driver and patch are installed.  Use fmdump -v -u <EVENT_ID> to identify the module/package, or contact Sun for support."
 #
 # code: SUN4-8000-9J
 # keys: fault.io.fire.pci.device fault.io.fire.pciex.device
@@ -233,7 +232,7 @@
 msgid "SUN4-8000-D4.impact"
 msgstr "Loss of services provided by the device instances associated with this fault"
 msgid "SUN4-8000-D4.action"
-msgstr "\nSchedule a repair procedure to replace the affected device.  Use\nfmdump -v -u EVENT_ID to identify the device or contact\nSun for support.\n"
+msgstr "\nSchedule a repair procedure to replace the affected device.  Use\nfmdump -v -u EVENT_ID to identify the device or contact\nSun for support.  \n\nIf this message occurs on a Sun Fire T2000 also refer to the NOTE\nat the end of the Details section below.\n"
 #
 # code: SUN4-8000-ER
 # keys: fault.io.fire.asic fault.io.fire.pci.device
@@ -249,7 +248,7 @@
 msgid "SUN4-8000-ER.impact"
 msgstr "Loss of services provided by the device instances associated with this fault"
 msgid "SUN4-8000-ER.action"
-msgstr "\nSchedule a repair procedure to replace the affected device.  Use\nfmdump -v -u EVENT_ID to identify the device or contact\nSun for support.\n"
+msgstr "\nSchedule a repair procedure to replace the affected device.  Use\nfmdump -v -u EVENT_ID to identify the device or contact\nSun for support.  \n\nIf this message occurs on a Sun Fire T2000 also refer to the NOTE\nat the end of the Details section below.\n"
 #
 # code: SUN4-8000-FC
 # keys: fault.io.fire.hbus
--- a/usr/src/cmd/fm/dicts/SUN4U.po	Fri Dec 22 09:18:37 2006 -0800
+++ b/usr/src/cmd/fm/dicts/SUN4U.po	Fri Dec 22 11:30:38 2006 -0800
@@ -3714,13 +3714,13 @@
 msgid "SUN4U-8007-7S.severity"
 msgstr "Critical"
 msgid "SUN4U-8007-7S.description"
-msgstr "The number of errors associated with this CHIP has exceeded acceptable levels.\nRefer to %s for more information.\n  Refer to %s for more information."
+msgstr "The number of errors associated with this CHIP has exceeded acceptable levels.\nRefer to %s for more information.  Refer to %s for more information."
 msgid "SUN4U-8007-7S.response"
-msgstr "An attempt will be made to remove the affected CHIP from service.\n"
+msgstr "An attempt will be made to remove the affected CHIP from service."
 msgid "SUN4U-8007-7S.impact"
-msgstr "The system will not be functioning at the same performance level with the CHIP removal.\n"
+msgstr "The system will not be functioning at the same performance level with the CHIP removal."
 msgid "SUN4U-8007-7S.action"
-msgstr "Schedule a repair procedure to replace the affected CHIP.  Use fmdump -v -u\n to identify the smallest CPU/Strand ID of the affected CORE on this\nCHIP.\n"
+msgstr "Schedule a repair procedure to replace the affected CHIP.  Use fmdump -v -u <EVENT_ID>\nto identify the smallest CPU/Strand ID of the affected CORE on this\nCHIP."
 #
 # code: SUN4U-8007-8J
 # keys: fault.cpu.SPARC64-VI.core
@@ -3730,13 +3730,13 @@
 msgid "SUN4U-8007-8J.severity"
 msgstr "Critical"
 msgid "SUN4U-8007-8J.description"
-msgstr "The number of errors associated with this CHIP has exceeded acceptable levels.\nRefer to %s for more information.\n  Refer to %s for more information."
+msgstr "The number of errors associated with this CHIP has exceeded acceptable levels.\nRefer to %s for more information.  Refer to %s for more information."
 msgid "SUN4U-8007-8J.response"
-msgstr "An attempt will be made to remove the affected CORE from service.\n"
+msgstr "An attempt will be made to remove the affected CORE from service."
 msgid "SUN4U-8007-8J.impact"
-msgstr "The system will not be functioning at the same performance level with the CORE removal.\n"
+msgstr "The system will not be functioning at the same performance level with the CORE removal."
 msgid "SUN4U-8007-8J.action"
-msgstr "Schedule a repair procedure to replace the affected CORE.  Use fmdump -v -u\n to identify the smallest CPU/Strand ID of the affected CORE on this\nCORE.\n"
+msgstr "Schedule a repair procedure to replace the affected CORE.  Use fmdump -v -u <EVENT_ID>\nto identify the smallest CPU/Strand ID of the affected CORE on this\nCORE.\n"
 #
 # code: SUN4U-8007-9E
 # keys: fault.cpu.SPARC64-VI.strand
@@ -3746,13 +3746,13 @@
 msgid "SUN4U-8007-9E.severity"
 msgstr "Critical"
 msgid "SUN4U-8007-9E.description"
-msgstr "The number of errors associated with this STRAND has exceeded acceptable levels.\nRefer to %s for more information.\n  Refer to %s for more information."
+msgstr "The number of errors associated with this STRAND has exceeded acceptable levels.\nRefer to %s for more information.  Refer to %s for more information."
 msgid "SUN4U-8007-9E.response"
-msgstr "An attempt will be made to remove the affected STRAND from service.\n"
+msgstr "An attempt will be made to remove the affected STRAND from service."
 msgid "SUN4U-8007-9E.impact"
-msgstr "The system will not be functioning at the same performance level with the STRAND removal.\n"
+msgstr "The system will not be functioning at the same performance level with the STRAND removal."
 msgid "SUN4U-8007-9E.action"
-msgstr "Schedule a repair procedure to replace the affected STRAND.  Use fmdump -v -u\n to identify the smallest CPU/Strand ID of the affected CORE on this\nSTRAND.\n"
+msgstr "Schedule a repair procedure to replace the affected STRAND.  Use fmdump -v -u <EVENT_ID>\nto identify the smallest CPU/Strand ID of the affected CORE on this\nSTRAND.\n"
 #
 # code: SUN4U-8007-AX
 # keys: fault.io.pci.device-invreq fault.io.tomatillo
@@ -3768,4 +3768,4 @@
 msgid "SUN4U-8007-AX.impact"
 msgstr "Loss of services provided by the device instances associated with this fault\n"
 msgid "SUN4U-8007-AX.action"
-msgstr "Ensure that the latest drivers and patches are installed. If a plug-in card is involved check for badly-seated cards or bent pins.  Otherwise schedule a repair procedure to replace the affected device(s).  Use fmdump -v -u  to identify the devices or contact Sun for support.\n"
+msgstr "Ensure that the latest drivers and patches are installed. If a plug-in card is involved check for badly-seated cards or bent pins.  Otherwise schedule a repair procedure to replace the affected device(s).  Use fmdump -v -u <EVENT_ID> to identify the devices or contact Sun for support.\n"
--- a/usr/src/cmd/fm/dicts/SUN4V.po	Fri Dec 22 09:18:37 2006 -0800
+++ b/usr/src/cmd/fm/dicts/SUN4V.po	Fri Dec 22 11:30:38 2006 -0800
@@ -1,13 +1,12 @@
 #
-# Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
+# Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
 # Use is subject to license terms.
 #
 # CDDL HEADER START
 #
 # The contents of this file are subject to the terms of the
-# Common Development and Distribution License, Version 1.0 only
-# (the "License").  You may not use this file except in compliance
-# with the License.
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
 #
 # You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 # or http://www.opensolaris.org/os/licensing.
@@ -41,7 +40,7 @@
 msgid "SUN4V-8000-1S.impact"
 msgstr "System performance may be affected."
 msgid "SUN4V-8000-1S.action"
-msgstr "Schedule a repair procedure to replace the affected CPU, the identity of which can be determined using fmdump -v -u &lt;EVENT_ID&gt;."
+msgstr "Schedule a repair procedure to replace the affected CPU, the identity of which can be determined using fmdump -v -u <EVENT_ID>."
 #
 # code: SUN4V-8000-2A
 # keys: fault.cpu.ultraSPARC-T1.freg
@@ -57,7 +56,7 @@
 msgid "SUN4V-8000-2A.impact"
 msgstr "System performance may be affected."
 msgid "SUN4V-8000-2A.action"
-msgstr "Schedule a repair procedure to replace the affected CPU, the identity of which can be determined using fmdump -v -u &lt;EVENT_ID&gt;."
+msgstr "Schedule a repair procedure to replace the affected CPU, the identity of which can be determined using fmdump -v -u <EVENT_ID>."
 #
 # code: SUN4V-8000-3P
 # keys: fault.cpu.ultraSPARC-T1.itlb
@@ -73,7 +72,7 @@
 msgid "SUN4V-8000-3P.impact"
 msgstr "System performance may be affected.\n"
 msgid "SUN4V-8000-3P.action"
-msgstr "Schedule a repair procedure to replace the affected CPU, the identity of which can be determined using fmdump -v -u &lt;EVENT_ID&gt;."
+msgstr "Schedule a repair procedure to replace the affected CPU, the identity of which can be determined using fmdump -v -u <EVENT_ID>."
 #
 # code: SUN4V-8000-4D
 # keys: fault.cpu.ultraSPARC-T1.dtlb
@@ -89,7 +88,7 @@
 msgid "SUN4V-8000-4D.impact"
 msgstr "System performance may be affected.\n"
 msgid "SUN4V-8000-4D.action"
-msgstr "Schedule a repair procedure to replace the affected CPU, the identity of which can be determined using fmdump -v -u &lt;EVENT_ID&gt;."
+msgstr "Schedule a repair procedure to replace the affected CPU, the identity of which can be determined using fmdump -v -u <EVENT_ID>."
 #
 # code: SUN4V-8000-5H
 # keys: fault.cpu.ultraSPARC-T1.icache
@@ -105,7 +104,7 @@
 msgid "SUN4V-8000-5H.impact"
 msgstr "System performance may be affected.\n"
 msgid "SUN4V-8000-5H.action"
-msgstr "Schedule a repair procedure to replace the affected CPU, the identity of which can be determined using fmdump -v -u &lt;EVENT_ID&gt;."
+msgstr "Schedule a repair procedure to replace the affected CPU, the identity of which can be determined using fmdump -v -u <EVENT_ID>."
 #
 # code: SUN4V-8000-63
 # keys: fault.cpu.ultraSPARC-T1.dcache
@@ -121,7 +120,7 @@
 msgid "SUN4V-8000-63.impact"
 msgstr "System performance may be affected.\n"
 msgid "SUN4V-8000-63.action"
-msgstr "Schedule a repair procedure to replace the affected CPU, the identity of which can be determined using fmdump -v -u &lt;EVENT_ID&gt;."
+msgstr "Schedule a repair procedure to replace the affected CPU, the identity of which can be determined using fmdump -v -u <EVENT_ID>."
 #
 # code: SUN4V-8000-7Y
 # keys: fault.cpu.ultraSPARC-T1.mau
@@ -137,7 +136,7 @@
 msgid "SUN4V-8000-7Y.impact"
 msgstr "System performance may be affected.\n"
 msgid "SUN4V-8000-7Y.action"
-msgstr "Schedule a repair procedure to replace the affected CPU, the identity of which can be determined using fmdump -v -u &lt;EVENT_ID&gt;."
+msgstr "Schedule a repair procedure to replace the affected CPU, the identity of which can be determined using fmdump -v -u <EVENT_ID>."
 #
 # code: SUN4V-8000-8Q
 # keys: fault.cpu.ultraSPARC-T1.l2cachedata
@@ -153,7 +152,7 @@
 msgid "SUN4V-8000-8Q.impact"
 msgstr "System performance may be affected.\n"
 msgid "SUN4V-8000-8Q.action"
-msgstr "Schedule a repair procedure to replace the affected CPU, the identity of which can be determined using fmdump -v -u &lt;EVENT_ID&gt;."
+msgstr "Schedule a repair procedure to replace the affected CPU, the identity of which can be determined using fmdump -v -u <EVENT_ID>."
 #
 # code: SUN4V-8000-9C
 # keys: fault.cpu.ultraSPARC-T1.l2cachetag
@@ -169,7 +168,7 @@
 msgid "SUN4V-8000-9C.impact"
 msgstr "System performance may be affected.\n"
 msgid "SUN4V-8000-9C.action"
-msgstr "Schedule a repair procedure to replace the affected CPU, the identity of which can be determined using fmdump -v -u &lt;EVENT_ID&gt;."
+msgstr "Schedule a repair procedure to replace the affected CPU, the identity of which can be determined using fmdump -v -u <EVENT_ID>."
 #
 # code: SUN4V-8000-AR
 # keys: fault.cpu.ultraSPARC-T1.l2cachectl
@@ -185,7 +184,7 @@
 msgid "SUN4V-8000-AR.impact"
 msgstr "System performance may be affected.\n"
 msgid "SUN4V-8000-AR.action"
-msgstr "Schedule a repair procedure to replace the affected CPU, the identity of which can be determined using fmdump -v -u &lt;EVENT_ID&gt;."
+msgstr "Schedule a repair procedure to replace the affected CPU, the identity of which can be determined using fmdump -v -u <EVENT_ID>."
 #
 # code: SUN4V-8000-C4
 # keys: fault.memory.page
@@ -217,7 +216,7 @@
 msgid "SUN4V-8000-DX.impact"
 msgstr "Total system memory capacity will be reduced as pages are retired."
 msgid "SUN4V-8000-DX.action"
-msgstr "Schedule a repair procedure to replace the affected memory module. Use fmdump -v -u &lt;EVENT_ID&gt; to identify the module."
+msgstr "Schedule a repair procedure to replace the affected memory module. Use fmdump -v -u <EVENT_ID> to identify the module."
 #
 # code: SUN4V-8000-E2
 # keys: fault.memory.bank
@@ -233,4 +232,4 @@
 msgid "SUN4V-8000-E2.impact"
 msgstr "Total system memory capacity will be reduced as pages are retired."
 msgid "SUN4V-8000-E2.action"
-msgstr "Schedule a repair procedure to replace the affected memory module. Use fmdump -v -u &lt;EVENT_ID&gt; to identify the module."
+msgstr "Schedule a repair procedure to replace the affected memory module. Use fmdump -v -u <EVENT_ID> to identify the module."
--- a/usr/src/cmd/fm/dicts/SUNOS.dict	Fri Dec 22 09:18:37 2006 -0800
+++ b/usr/src/cmd/fm/dicts/SUNOS.dict	Fri Dec 22 11:30:38 2006 -0800
@@ -1,13 +1,12 @@
 #
-# Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
+# Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
 # Use is subject to license terms.
 #
 # CDDL HEADER START
 #
 # The contents of this file are subject to the terms of the
-# Common Development and Distribution License, Version 1.0 only
-# (the "License").  You may not use this file except in compliance
-# with the License.
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
 #
 # You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 # or http://www.opensolaris.org/os/licensing.
@@ -23,8 +22,11 @@
 # CDDL HEADER END
 #
 #ident	"%Z%%M%	%I%	%E% SMI"
+#
+# DO NOT EDIT -- this file is generated by the Event Registry.
+#
 
-FMDICT: name=SUNOS version=1 maxkey=4
+FMDICT: name=SUNOS version=1 maxkey=4 dictid=0x4f53
 
 ereport.sunos.unix.fm_panic=0
 defect.sunos.eft.undiagnosable_problem=1
@@ -35,3 +37,6 @@
 defect.Deprecated fault.io.pci.device=6
 defect.Deprecated fault.io.pci.bus=7
 defect.Deprecated defect.io.pci.driver=8
+defect.sunos.zones.upgrade=9
+ereport.sunos.boot.upgrade.menu_lst=10
+ereport.sunos.boot.upgrade.menu_lst_bfu=11
--- a/usr/src/cmd/fm/dicts/SUNOS.po	Fri Dec 22 09:18:37 2006 -0800
+++ b/usr/src/cmd/fm/dicts/SUNOS.po	Fri Dec 22 11:30:38 2006 -0800
@@ -1,13 +1,12 @@
 #
-# Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
+# Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
 # Use is subject to license terms.
 #
 # CDDL HEADER START
 #
 # The contents of this file are subject to the terms of the
-# Common Development and Distribution License, Version 1.0 only
-# (the "License").  You may not use this file except in compliance
-# with the License.
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
 #
 # You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 # or http://www.opensolaris.org/os/licensing.
@@ -24,6 +23,9 @@
 #
 #ident	"%Z%%M%	%I%	%E% SMI"
 #
+# DO NOT EDIT -- this file is generated by the Event Registry.
+#
+#
 # code: SUNOS-8000-0G
 # keys: ereport.sunos.unix.fm_panic
 #
@@ -48,129 +50,170 @@
 msgid "SUNOS-8000-1L.severity"
 msgstr "Minor"
 msgid "SUNOS-8000-1L.description"
-msgstr "The EFT Diagnosis Engine encountered telemetry for which it is unable to produce a diagnosis.  This may indicate an incomplete EFT file provided or a defect in the diagnosis algorithm.  Refer to %s for more information."
+msgstr "The EFT Diagnosis Engine encountered telemetry for which it is unable to produce a diagnosis.  Refer to %s for more information."
 msgid "SUNOS-8000-1L.response"
 msgstr "Error reports from the component will be logged for examination by Sun."
 msgid "SUNOS-8000-1L.impact"
 msgstr "Automated diagnosis and response for these events will not occur."
 msgid "SUNOS-8000-1L.action"
-msgstr "Run pkgchk -n SUNWfmd to ensure that fault management software is installed properly.  Contact Sun for support."
+msgstr "Run pkgchk -n SUNWfmd to ensure that fault management software is installed properly. Contact Sun for support."
 #
 # code: SUNOS-8000-20
-# keys: defect.io.pci.driver fault.io.pci.device fault.io.pci.bus 
+# keys: defect.Deprecated defect.io.pci.driver fault.io.pci.bus fault.io.pci.device
 #
 msgid "SUNOS-8000-20.type"
 msgstr "Fault"
 msgid "SUNOS-8000-20.severity"
 msgstr "Critical"
 msgid "SUNOS-8000-20.description"
-msgstr "A problem was detected in the SUNOS subsystem or controlling software"
+msgstr "A problem was detected in the SUNOS subsystem or controlling software.  Refer to %s for more information."
 msgid "SUNOS-8000-20.response"
 msgstr "One or more of device instances may be disabled"
 msgid "SUNOS-8000-20.impact"
 msgstr "Loss of services provided by the device instances associated with this fault"
 msgid "SUNOS-8000-20.action"
 msgstr "Ensure latest drivers and patches are installed, schedule a repair procedure to replace the affected device if necessary, or contact Sun for support."
-
 #
 # code: SUNOS-8000-3V
-# keys: fault.io.pci.bus fault.io.pci.device
+# keys: defect.Deprecated fault.io.pci.bus fault.io.pci.device
 #
 msgid "SUNOS-8000-3V.type"
 msgstr "Fault"
 msgid "SUNOS-8000-3V.severity"
 msgstr "Critical"
 msgid "SUNOS-8000-3V.description"
-msgstr "A problem was detected in the PCI subsystem"
+msgstr "A problem was detected in the PCI subsystem.  Refer to %s for more information."
 msgid "SUNOS-8000-3V.response"
 msgstr "One or more of device instances may be disabled"
 msgid "SUNOS-8000-3V.impact"
 msgstr "Loss of services provided by the device instances associated with this fault"
 msgid "SUNOS-8000-3V.action"
-msgstr "Schedule a repair procedure to replace the affected device.  Use fmdump -v -u <EVENT_ID> to identify the device or contact Sun for support."
-
+msgstr "Schedule a repair procedure to replace the affected device. Use fmdump -v -u <EVENT_ID> to identify the device or contact Sun for support."
 #
 # code: SUNOS-8000-46
-# keys: defect.io.pci.driver fault.io.pci.device
+# keys: defect.Deprecated defect.io.pci.driver fault.io.pci.device
 #
 msgid "SUNOS-8000-46.type"
 msgstr "Fault"
 msgid "SUNOS-8000-46.severity"
 msgstr "Critical"
 msgid "SUNOS-8000-46.description"
-msgstr "A problem was detected in the PCI subsystem or controlling software"
+msgstr "A problem was detected in the PCI subsystem or controlling software.  Refer to %s for more information."
 msgid "SUNOS-8000-46.response"
 msgstr "One or more of device instances may be disabled"
 msgid "SUNOS-8000-46.impact"
 msgstr "Loss of services provided by the device instances associated with this fault"
 msgid "SUNOS-8000-46.action"
 msgstr "Ensure latest drivers and patches are installed, schedule a repair procedure to replace the affected device if necessary, or contact Sun for support."
-
 #
 # code: SUNOS-8000-5T
-# keys: defect.io.pci.driver fault.io.pci.bus
+# keys: defect.Deprecated defect.io.pci.driver fault.io.pci.bus
 #
 msgid "SUNOS-8000-5T.type"
 msgstr "Fault"
 msgid "SUNOS-8000-5T.severity"
 msgstr "Critical"
 msgid "SUNOS-8000-5T.description"
-msgstr "A problem was detected in the PCI subsystem or controlling software"
+msgstr "A problem was detected in the PCI subsystem or controlling software.  Refer to %s for more information."
 msgid "SUNOS-8000-5T.response"
 msgstr "One or more of device instances may be disabled"
 msgid "SUNOS-8000-5T.impact"
 msgstr "Loss of services provided by the device instances associated with this fault"
 msgid "SUNOS-8000-5T.action"
 msgstr "Ensure latest drivers and patches are installed, schedule a repair procedure to replace the affected device if necessary, or contact Sun for support."
-
 #
 # code: SUNOS-8000-69
-# keys: fault.io.pci.device
+# keys: defect.Deprecated fault.io.pci.device
 #
 msgid "SUNOS-8000-69.type"
 msgstr "Fault"
 msgid "SUNOS-8000-69.severity"
 msgstr "Critical"
 msgid "SUNOS-8000-69.description"
-msgstr "A problem was detected for a PCI controller"
+msgstr "A problem was detected for a PCI controller  Refer to %s for more information."
 msgid "SUNOS-8000-69.response"
 msgstr "One or more of device instances may be disabled"
 msgid "SUNOS-8000-69.impact"
-msgstr "Loss of services provided by the device instances associated with this fault"
+msgstr "Loss of services provided by the device instances associated with this fault."
 msgid "SUNOS-8000-69.action"
-msgstr "Schedule a repair procedure to replace the affected device.  Use fmdump -v -u <EVENT_ID> to identify the device or contact Sun for support."
-
+msgstr "Schedule a repair procedure to replace the affected device. Use fmdump -v -u <EVENT_ID> to identify the device or contact Sun for support."
 #
 # code: SUNOS-8000-7N
-# keys: fault.io.pci.bus
+# keys: defect.Deprecated fault.io.pci.bus
 #
 msgid "SUNOS-8000-7N.type"
 msgstr "Fault"
 msgid "SUNOS-8000-7N.severity"
 msgstr "Critical"
 msgid "SUNOS-8000-7N.description"
-msgstr "A problem was detected for a PCI bus"
+msgstr "A problem was detected for a PCI bus  Refer to %s for more information."
 msgid "SUNOS-8000-7N.response"
 msgstr "One or more of device instances may be disabled"
 msgid "SUNOS-8000-7N.impact"
-msgstr "Loss of services provided by the device instances associated with this fault"
+msgstr "Loss of services provided by the device instances associated with this fault."
 msgid "SUNOS-8000-7N.action"
-msgstr "Schedule a repair procedure to replace the affected device.  Use fmdump -v -u <EVENT_ID> to identify the device or contact Sun for support."
-
+msgstr "Schedule a repair procedure to replace the affected device. Use fmdump -v -u <EVENT_ID> to identify the device or contact Sun for support."
 #
 # code: SUNOS-8000-8W
-# keys: defect.io.pci.driver
-#
+# keys: defect.Deprecated defect.io.pci.driver
 #
 msgid "SUNOS-8000-8W.type"
 msgstr "Fault"
 msgid "SUNOS-8000-8W.severity"
 msgstr "Critical"
 msgid "SUNOS-8000-8W.description"
-msgstr "A problem was detected in the PCI controller software"
+msgstr "A problem was detected in the PCI controller software  Refer to %s for more information."
 msgid "SUNOS-8000-8W.response"
 msgstr "One or more of device instances may be disabled"
 msgid "SUNOS-8000-8W.impact"
-msgstr "Loss of services provided by the device instances associated with this fault"
+msgstr "Loss of services provided by the device instances associated with this fault."
 msgid "SUNOS-8000-8W.action"
 msgstr "Ensure latest drivers and patches are installed. Use fmdump -v -u <EVENT_ID> to identify the module/package, or contact Sun for support."
+#
+# code: SUNOS-8000-91
+# keys: defect.sunos.zones.upgrade
+#
+msgid "SUNOS-8000-91.type"
+msgstr "Defect"
+msgid "SUNOS-8000-91.severity"
+msgstr "Minor"
+msgid "SUNOS-8000-91.description"
+msgstr "\n	The Solaris system or boot environment that is being upgraded\n	has non-global zones installed.  The current version of Live\n	Upgrade cannot upgrade a boot environment that has non-global\n	zones installed.\n	  Refer to %s for more information."
+msgid "SUNOS-8000-91.response"
+msgstr "The upgrade procedure has been terminated."
+msgid "SUNOS-8000-91.impact"
+msgstr "The Solaris system or boot environment is not upgraded."
+msgid "SUNOS-8000-91.action"
+msgstr "\n	Evaluate each of the choices below and select the one that is\n	best for your needs.  Contact Sun for support.\n	"
+#
+# code: SUNOS-8000-AK
+# keys: ereport.sunos.boot.upgrade.menu_lst
+#
+msgid "SUNOS-8000-AK.type"
+msgstr "Error"
+msgid "SUNOS-8000-AK.severity"
+msgstr "Critical"
+msgid "SUNOS-8000-AK.description"
+msgstr "Solaris OS could not automatically adjust\n/boot/grub/menu.lst\nto the new boot architecture\n  Refer to %s for more information."
+msgid "SUNOS-8000-AK.response"
+msgstr "No automated response.\n"
+msgid "SUNOS-8000-AK.impact"
+msgstr "Future reboots could fail until this problem is corrected.\n"
+msgid "SUNOS-8000-AK.action"
+msgstr "Examine /boot/grub/menu.lst and revise as\ndescribed in Details.\n"
+#
+# code: SUNOS-8000-CF
+# keys: ereport.sunos.boot.upgrade.menu_lst_bfu
+#
+msgid "SUNOS-8000-CF.type"
+msgstr "Error"
+msgid "SUNOS-8000-CF.severity"
+msgstr "Critical"
+msgid "SUNOS-8000-CF.description"
+msgstr "Solaris OS could not automatically adjust\n/boot/grub/menu.lst\nto the new boot architecture\n  Refer to %s for more information."
+msgid "SUNOS-8000-CF.response"
+msgstr "No automated response.\n"
+msgid "SUNOS-8000-CF.impact"
+msgstr "Future reboots could fail until this problem is corrected.\n"
+msgid "SUNOS-8000-CF.action"
+msgstr "Examine /boot/grub/menu.lst and revise as\ndescribed in Details.\n"
--- a/usr/src/cmd/fm/dicts/ZFS.po	Fri Dec 22 09:18:37 2006 -0800
+++ b/usr/src/cmd/fm/dicts/ZFS.po	Fri Dec 22 11:30:38 2006 -0800
@@ -56,7 +56,7 @@
 msgid "ZFS-8000-2Q.impact"
 msgstr "The pool is no longer providing the configured level of\n	    replication."
 msgid "ZFS-8000-2Q.action"
-msgstr "\nIf this error was encountered while running 'zpool import', please see the\nsection below.  Otherwise, run 'zpool status -x' to determine which pool has\nexperienced a failure:\n\n\n# zpool status -x\n  pool: test\n state: DEGRADED\nstatus: One or more devices could not be opened.  Sufficient replicas exist for\n        the pool to continue functioning in a degraded state.\naction: Attach the missing device and online it using 'zpool online'.\n   see: http://www.sun.com/msg/ZFS-8000-2Q\n scrub: none requested\nconfig:\n\n        NAME                  STATE     READ WRITE CKSUM\n        test                  DEGRADED     0     0     0\n          mirror              DEGRADED     0     0     0\n            c0t0d0            ONLINE       0     0     0\n            c0t0d1            FAULTED      0     0     0  cannot open\n#\n\n\nDetermine which device failed to open by looking for a FAULTED device with\nan additional \"cannot open\" message.  If this device has been inadvertently\nremoved from the system, attach the device and bring it online with 'zpool\nonline':\n\n\n# zpool online test c0t0d1\nBringing device 'c0t0d1' online\n#\n\n\nIf the device is no longer available, the device can be replaced using the\n'zpool replace' command:\n\n\n# zpool replace test c0t0d1 c0t0d2\n#\n\n\nExisting data will be resilvered to the new device.  Once the resilvering\ncompletes, the device will be removed from the pool.\n\n\nIf this error is encountered during a 'zpool import', it means that one of\nthe devices is not attached to the system:\n\n\n# zpool import\n  pool: test\n    id: 10121266328238932306\n state: DEGRADED\nstatus: One or more devices are missing from the system.\naction: The pool can be imported despite missing or damaged devices.  The\n        fault tolerance of the pool may be compromised if imported.\n   see: http://www.sun.com/msg/ZFS-8000-2Q\nconfig:\n\n        test              DEGRADED\n          mirror          DEGRADED\n            c0t0d0        ONLINE\n            c0t0d1        FAULTED   cannot open\n\n\nUnlike when the pool is active on the system, the device cannot be replaced\nwhile the pool is exported.  If the device can be attached to the system,\nattach the device and run 'zpool import' again.\n\nAlternatively, the pool can be imported as-is, though it will be placed in\nthe DEGRADED state due to a missing device.  Once the pool has been\nimported, the missing device can be replaced as described above.\n	"
+msgstr "\nIf this error was encountered while running 'zpool import', please see the\nsection below.  Otherwise, run 'zpool status -x' to determine which pool has\nexperienced a failure:\n\n\n# zpool status -x\n  pool: test\n state: DEGRADED\nstatus: One or more devices could not be opened.  Sufficient replicas exist for\n        the pool to continue functioning in a degraded state.\naction: Attach the missing device and online it using 'zpool online'.\n   see: http://www.sun.com/msg/ZFS-8000-2Q\n scrub: none requested\nconfig:\n\n        NAME                  STATE     READ WRITE CKSUM\n        test                  DEGRADED     0     0     0\n          mirror              DEGRADED     0     0     0\n            c0t0d0            ONLINE       0     0     0\n            c0t0d1            FAULTED      0     0     0  cannot open\n#\n\n\nDetermine which device failed to open by looking for a FAULTED device with\nan additional 'cannot open' message.  If this device has been inadvertently\nremoved from the system, attach the device and bring it online with 'zpool\nonline':\n\n\n# zpool online test c0t0d1\nBringing device 'c0t0d1' online\n#\n\n\nIf the device is no longer available, the device can be replaced using the\n'zpool replace' command:\n\n\n# zpool replace test c0t0d1 c0t0d2\n#\n\n\nExisting data will be resilvered to the new device.  Once the resilvering\ncompletes, the device will be removed from the pool.\n\n\nIf this error is encountered during a 'zpool import', it means that one of\nthe devices is not attached to the system:\n\n\n# zpool import\n  pool: test\n    id: 10121266328238932306\n state: DEGRADED\nstatus: One or more devices are missing from the system.\naction: The pool can be imported despite missing or damaged devices.  The\n        fault tolerance of the pool may be compromised if imported.\n   see: http://www.sun.com/msg/ZFS-8000-2Q\nconfig:\n\n        test              DEGRADED\n          mirror          DEGRADED\n            c0t0d0        ONLINE\n            c0t0d1        FAULTED   cannot open\n\n\nUnlike when the pool is active on the system, the device cannot be replaced\nwhile the pool is exported.  If the device can be attached to the system,\nattach the device and run 'zpool import' again.\n\nAlternatively, the pool can be imported as-is, though it will be placed in\nthe DEGRADED state due to a missing device.  Once the pool has been\nimported, the missing device can be replaced as described above.\n	"
 #
 # code: ZFS-8000-3C
 # keys: ereport.fs.zfs.device.missing_nr
@@ -88,7 +88,7 @@
 msgid "ZFS-8000-4J.impact"
 msgstr "The pool is no longer providing the configured level of\n	    replication."
 msgid "ZFS-8000-4J.action"
-msgstr "\nIf this error is encountered while running 'zpool import', see the section\nbelow.  Otherwise, run 'zpool status -x' to determine which pool has the\ndamaged device:\n\n\n# zpool status -x\n  pool: test\n state: DEGRADED\nstatus: One or more devices could not be used because the label is missing or\n        invalid.  Sufficient replicas exist for the pool to continue\n        functioning in a degraded state.\naction: Replace the device using 'zpool replace'.\n   see: http://www.sun.com/msg/ZFS-8000-4J\n scrub: none requested\nconfig:\n\n        NAME                  STATE     READ WRITE CKSUM\n        test                  DEGRADED     0     0     0\n          mirror              DEGRADED     0     0     0\n            c0t0d0            ONLINE       0     0     0\n            c0t0d1            FAULTED      0     0     0  corrupted data\n\n\nDetermine which device is damaged by locating the FAULTED device showing\n\"corrupted data\".  This indicates that the device label was corrupt.  Because\nZFS could not identify the device as the one expected, no automatic resilvering\nwill take place.\n\nThe device can be resilvered by issuing 'zpool replace':\n\n\n# zpool replace test c0t0d1\n\n\nThis will replace the device in situ.  To replace the device with another,\ndifferent, device, run 'zpool replace' with an additional argument specifying\nthe new device:\n\n\n# zpool replace test c0t0d1 c0t0d2\n\n\nZFS will being migrating data to the new device as soon as the replace is\nissued.  Once the resilvering completes, the original device (if different from\nthe replacement) will be removed, and the pool will be restored to the ONLINE\nstate.\n\n\nIf this error is encountered while running 'zpool import', the pool can be still\nbe imported despite the failure:\n\n\n# zpool import\n  pool: test\n    id: 5187963178597328409\n state: DEGRADED\nstatus: One or more devices contains corrupted data.  The fault tolerance of\n	the pool may be compromised if imported.\naction: The pool can be imported using its name or numeric identifier.\n   see: http://www.sun.com/msg/ZFS-8000-4J\nconfig:\n\n        test              DEGRADED\n          mirror          DEGRADED\n            /disk/a       ONLINE\n            /disk/b       FAULTED   corrupted data\n\n\nTo import the pool, run 'zpool import':\n\n\n# zpool import test\n\n\nOnce the pool has been imported, the damaged device can be replaced according to\nthe above procedure.\n	"
+msgstr "\nIf this error is encountered while running 'zpool import', see the section\nbelow.  Otherwise, run 'zpool status -x' to determine which pool has the\ndamaged device:\n\n\n# zpool status -x\n  pool: test\n state: DEGRADED\nstatus: One or more devices could not be used because the label is missing or\n        invalid.  Sufficient replicas exist for the pool to continue\n        functioning in a degraded state.\naction: Replace the device using 'zpool replace'.\n   see: http://www.sun.com/msg/ZFS-8000-4J\n scrub: none requested\nconfig:\n\n        NAME                  STATE     READ WRITE CKSUM\n        test                  DEGRADED     0     0     0\n          mirror              DEGRADED     0     0     0\n            c0t0d0            ONLINE       0     0     0\n            c0t0d1            FAULTED      0     0     0  corrupted data\n\n\nDetermine which device is damaged by locating the FAULTED device showing\n'corrupted data'.  This indicates that the device label was corrupt.  Because\nZFS could not identify the device as the one expected, no automatic resilvering\nwill take place.\n\nThe device can be resilvered by issuing 'zpool replace':\n\n\n# zpool replace test c0t0d1\n\n\nThis will replace the device in situ.  To replace the device with another,\ndifferent, device, run 'zpool replace' with an additional argument specifying\nthe new device:\n\n\n# zpool replace test c0t0d1 c0t0d2\n\n\nZFS will being migrating data to the new device as soon as the replace is\nissued.  Once the resilvering completes, the original device (if different from\nthe replacement) will be removed, and the pool will be restored to the ONLINE\nstate.\n\n\nIf this error is encountered while running 'zpool import', the pool can be still\nbe imported despite the failure:\n\n\n# zpool import\n  pool: test\n    id: 5187963178597328409\n state: DEGRADED\nstatus: One or more devices contains corrupted data.  The fault tolerance of\n	the pool may be compromised if imported.\naction: The pool can be imported using its name or numeric identifier.\n   see: http://www.sun.com/msg/ZFS-8000-4J\nconfig:\n\n        test              DEGRADED\n          mirror          DEGRADED\n            /disk/a       ONLINE\n            /disk/b       FAULTED   corrupted data\n\n\nTo import the pool, run 'zpool import':\n\n\n# zpool import test\n\n\nOnce the pool has been imported, the damaged device can be replaced according to\nthe above procedure.\n	"
 #
 # code: ZFS-8000-5E
 # keys: ereport.fs.zfs.device.corrupt_label_nr
@@ -104,7 +104,7 @@
 msgid "ZFS-8000-5E.impact"
 msgstr "The pool is no longer available"
 msgid "ZFS-8000-5E.action"
-msgstr "\nIf this error is encountered during 'zpool import', see the section below.\nOtherwise, run 'zpool status -x' to determine which pool is faulted:\n\n\n# zpool status -x\n  pool: test\n state: FAULTED\nstatus: One or more devices could not be used because the the label is missing \n        or invalid.  There are insufficient replicas for the pool to continue\n        functioning.\naction: Destroy and re-create the pool from a backup source.\n   see: http://www.sun.com/msg/ZFS-8000-5E\n scrub: none requested\nconfig:\n\n        NAME                  STATE     READ WRITE CKSUM\n        test                  FAULTED      0     0     0  insufficient replicas\n          c0t0d0              FAULTED      0     0     0  corrupted data\n          c0t0d1              ONLINE       0     0     0\n\n\nThe device listed as FAULTED with \"corrupted data\" cannot be opened due to a\ncorrupt label.  ZFS will be unable to use the pool, and all data within the pool\nis irrevocably lost.  The pool must be destroyed and recreated from an\nappropriate backup source.  Using replicated configurations will prevent this\nfrom happening in the future.\n\n\nIf this error is enountered during 'zpool import', the action is the same.  The\npool cannot be imported - all data is lost and must be restored from an\nappropriate backup source.\n	"
+msgstr "\nIf this error is encountered during 'zpool import', see the section below.\nOtherwise, run 'zpool status -x' to determine which pool is faulted:\n\n\n# zpool status -x\n  pool: test\n state: FAULTED\nstatus: One or more devices could not be used because the the label is missing \n        or invalid.  There are insufficient replicas for the pool to continue\n        functioning.\naction: Destroy and re-create the pool from a backup source.\n   see: http://www.sun.com/msg/ZFS-8000-5E\n scrub: none requested\nconfig:\n\n        NAME                  STATE     READ WRITE CKSUM\n        test                  FAULTED      0     0     0  insufficient replicas\n          c0t0d0              FAULTED      0     0     0  corrupted data\n          c0t0d1              ONLINE       0     0     0\n\n\nThe device listed as FAULTED with 'corrupted data' cannot be opened due to a\ncorrupt label.  ZFS will be unable to use the pool, and all data within the pool\nis irrevocably lost.  The pool must be destroyed and recreated from an\nappropriate backup source.  Using replicated configurations will prevent this\nfrom happening in the future.\n\n\nIf this error is enountered during 'zpool import', the action is the same.  The\npool cannot be imported - all data is lost and must be restored from an\nappropriate backup source.\n	"
 #
 # code: ZFS-8000-6X
 # keys: ereport.fs.zfs.pool.bad_guid_sum
--- a/usr/src/cmd/fm/fmd/common/fmd_api.c	Fri Dec 22 09:18:37 2006 -0800
+++ b/usr/src/cmd/fm/fmd/common/fmd_api.c	Fri Dec 22 11:30:38 2006 -0800
@@ -1641,27 +1641,51 @@
 		    "id %ld is not a valid timer id\n", id);
 	}
 
-	t = fmd_timerq_remove(fmd.d_timers, mp->mod_timerids, id);
+	/*
+	 * If the timer has not fired (t != NULL), remove it from the timer
+	 * queue.  If the timer has fired (t == NULL), we could be in one of
+	 * two situations: a) we are processing the timer callback or b)
+	 * the timer event is on the module queue awaiting dispatch.  For a),
+	 * fmd_timerq_remove() will wait for the timer callback function
+	 * to complete and queue an event for dispatch.  For a) and b),
+	 * we cancel the outstanding timer event from the module's dispatch
+	 * queue.
+	 */
+	if ((t = fmd_timerq_remove(fmd.d_timers, mp->mod_timerids, id)) != NULL)
+		fmd_free(t, sizeof (fmd_modtimer_t));
 	fmd_module_unlock(mp);
 
-	if (t != NULL) {
-		fmd_eventq_cancel(mp->mod_queue, FMD_EVT_TIMEOUT, t);
-		fmd_free(t, sizeof (fmd_modtimer_t));
-	}
+	fmd_eventq_cancel(mp->mod_queue, FMD_EVT_TIMEOUT, (void *)id);
 }
 
 nvlist_t *
 fmd_nvl_create_fault(fmd_hdl_t *hdl, const char *class,
     uint8_t certainty, nvlist_t *asru, nvlist_t *fru, nvlist_t *rsrc)
 {
-	fmd_module_t *mp = fmd_api_module_lock(hdl);
+	fmd_module_t *mp;
+	topo_hdl_t *thp;
 	nvlist_t *nvl;
+	char *loc = NULL;
+	int err;
 
+	thp = fmd_hdl_topology(hdl, TOPO_VERSION);
+
+	mp = fmd_api_module_lock(hdl);
 	if (class == NULL || class[0] == '\0')
 		fmd_api_error(mp, EFMD_NVL_INVAL, "invalid fault class\n");
 
-	nvl = fmd_protocol_fault(class, certainty, asru, fru, rsrc);
+	/*
+	 * Try to find the location label for this resource
+	 */
+	(void) topo_fmri_label(thp, rsrc, &loc, &err);
+
+	nvl = fmd_protocol_fault(class, certainty, asru, fru, rsrc, loc);
+
 	fmd_module_unlock(mp);
+
+	if (loc != NULL)
+		topo_hdl_strfree(thp, loc);
+
 	return (nvl);
 }
 
--- a/usr/src/cmd/fm/fmd/common/fmd_event.c	Fri Dec 22 09:18:37 2006 -0800
+++ b/usr/src/cmd/fm/fmd/common/fmd_event.c	Fri Dec 22 11:30:38 2006 -0800
@@ -2,9 +2,8 @@
  * CDDL HEADER START
  *
  * The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License").  You may not use this file except in compliance
- * with the License.
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
  *
  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
  * or http://www.opensolaris.org/os/licensing.
@@ -21,7 +20,7 @@
  */
 
 /*
- * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
@@ -344,6 +343,8 @@
 
 	if (type == FMD_EVT_PROTOCOL)
 		return (ep->ev_type == type && fmd_strmatch(ep->ev_data, data));
+	else if (type == FMD_EVT_TIMEOUT)
+		return ((id_t)data == ((fmd_modtimer_t *)ep->ev_data)->mt_id);
 	else
 		return (ep->ev_type == type && ep->ev_data == data);
 }
--- a/usr/src/cmd/fm/fmd/common/fmd_log.c	Fri Dec 22 09:18:37 2006 -0800
+++ b/usr/src/cmd/fm/fmd/common/fmd_log.c	Fri Dec 22 11:30:38 2006 -0800
@@ -2,9 +2,8 @@
  * CDDL HEADER START
  *
  * The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License").  You may not use this file except in compliance
- * with the License.
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
  *
  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
  * or http://www.opensolaris.org/os/licensing.
@@ -21,7 +20,7 @@
  */
 
 /*
- * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
@@ -355,6 +354,7 @@
 	fmd_log_t *lp = fmd_zalloc(sizeof (fmd_log_t), FMD_SLEEP);
 
 	char buf[PATH_MAX];
+	char *slash = "/";
 	size_t len;
 	int err;
 
@@ -362,9 +362,11 @@
 	(void) pthread_cond_init(&lp->log_cv, NULL);
 	(void) pthread_mutex_lock(&lp->log_lock);
 
-	len = strlen(root) + strlen(name) + 2; /* for "/" and "\0" */
+	if (strcmp(root, "") == 0)
+		slash = "";
+	len = strlen(root) + strlen(name) + strlen(slash) + 1; /* for "\0" */
 	lp->log_name = fmd_alloc(len, FMD_SLEEP);
-	(void) snprintf(lp->log_name, len, "%s/%s", root, name);
+	(void) snprintf(lp->log_name, len, "%s%s%s", root, slash, name);
 	lp->log_tag = fmd_strdup(tag, FMD_SLEEP);
 	(void) fmd_conf_getprop(fmd.d_conf, "log.minfree", &lp->log_minfree);
 
@@ -1017,6 +1019,17 @@
 	char npath[PATH_MAX];
 	fmd_log_t *nlp;
 
+	(void) snprintf(npath, sizeof (npath), "%s+", lp->log_name);
+
+	/*
+	 * Open new log file.
+	 */
+	if ((nlp = fmd_log_open("", npath, lp->log_tag)) == NULL) {
+		fmd_error(EFMD_LOG_ROTATE, "failed to open %s", npath);
+		(void) fmd_set_errno(EFMD_LOG_ROTATE);
+		return (NULL);
+	}
+
 	(void) snprintf(npath, sizeof (npath), "%s.0-", lp->log_name);
 	(void) pthread_mutex_lock(&lp->log_lock);
 
@@ -1027,6 +1040,8 @@
 	 */
 	if (lp->log_pending != 0) {
 		(void) pthread_mutex_unlock(&lp->log_lock);
+		(void) unlink(nlp->log_name);
+		fmd_log_rele(nlp);
 		(void) fmd_set_errno(EFMD_LOG_ROTBUSY);
 		return (NULL);
 	}
@@ -1034,19 +1049,29 @@
 	if (rename(lp->log_name, npath) != 0) {
 		(void) pthread_mutex_unlock(&lp->log_lock);
 		fmd_error(EFMD_LOG_ROTATE, "failed to rename %s", lp->log_name);
+		(void) unlink(nlp->log_name);
+		fmd_log_rele(nlp);
 		(void) fmd_set_errno(EFMD_LOG_ROTATE);
 		return (NULL);
 	}
 
-	if ((nlp = fmd_log_open("", lp->log_name, lp->log_tag)) == NULL) {
-		(void) rename(npath, lp->log_name);
+	if (rename(nlp->log_name, lp->log_name) != 0) {
 		(void) pthread_mutex_unlock(&lp->log_lock);
-		fmd_error(EFMD_LOG_ROTATE, "failed to reopen %s", lp->log_name);
+		fmd_error(EFMD_LOG_ROTATE, "failed to rename %s",
+		    nlp->log_name);
+		(void) unlink(nlp->log_name);
+		fmd_log_rele(nlp);
 		(void) fmd_set_errno(EFMD_LOG_ROTATE);
 		return (NULL);
 	}
 
 	/*
+	 * Change name of new log file
+	 */
+	fmd_strfree(nlp->log_name);
+	nlp->log_name = fmd_strdup(lp->log_name, FMD_SLEEP);
+
+	/*
 	 * If we've rotated the log, no pending events exist so we don't have
 	 * any more commits coming, and our caller should have arranged for
 	 * no more calls to append.  As such, we can close log_fd for good.
--- a/usr/src/cmd/fm/fmd/common/fmd_protocol.c	Fri Dec 22 09:18:37 2006 -0800
+++ b/usr/src/cmd/fm/fmd/common/fmd_protocol.c	Fri Dec 22 11:30:38 2006 -0800
@@ -2,9 +2,8 @@
  * CDDL HEADER START
  *
  * The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License").  You may not use this file except in compliance
- * with the License.
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
  *
  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
  * or http://www.opensolaris.org/os/licensing.
@@ -111,7 +110,7 @@
 
 nvlist_t *
 fmd_protocol_fault(const char *class, uint8_t certainty,
-    nvlist_t *asru, nvlist_t *fru, nvlist_t *resource)
+    nvlist_t *asru, nvlist_t *fru, nvlist_t *resource, const char *location)
 {
 	nvlist_t *nvl;
 	int err = 0;
@@ -129,6 +128,8 @@
 		err |= nvlist_add_nvlist(nvl, FM_FAULT_FRU, fru);
 	if (resource != NULL)
 		err |= nvlist_add_nvlist(nvl, FM_FAULT_RESOURCE, resource);
+	if (location != NULL)
+		err |= nvlist_add_string(nvl, FM_FAULT_LOCATION, location);
 
 	if (err != 0)
 		fmd_panic("failed to populate nvlist: %s\n", fmd_strerror(err));
--- a/usr/src/cmd/fm/fmd/common/fmd_protocol.h	Fri Dec 22 09:18:37 2006 -0800
+++ b/usr/src/cmd/fm/fmd/common/fmd_protocol.h	Fri Dec 22 11:30:38 2006 -0800
@@ -2,9 +2,8 @@
  * CDDL HEADER START
  *
  * The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License").  You may not use this file except in compliance
- * with the License.
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
  *
  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
  * or http://www.opensolaris.org/os/licensing.
@@ -21,7 +20,7 @@
  */
 
 /*
- * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
@@ -69,7 +68,7 @@
 extern nvlist_t *fmd_protocol_authority(void);
 extern nvlist_t *fmd_protocol_fmri_module(struct fmd_module *);
 extern nvlist_t *fmd_protocol_fault(const char *,
-    uint8_t, nvlist_t *, nvlist_t *, nvlist_t *);
+    uint8_t, nvlist_t *, nvlist_t *, nvlist_t *, const char *);
 extern nvlist_t *fmd_protocol_list(const char *, nvlist_t *,
     const char *, const char *, uint_t, nvlist_t **, uint8_t *, int);
 extern nvlist_t *fmd_protocol_rsrc_asru(const char *, nvlist_t *,
--- a/usr/src/cmd/fm/fmd/common/fmd_self.c	Fri Dec 22 09:18:37 2006 -0800
+++ b/usr/src/cmd/fm/fmd/common/fmd_self.c	Fri Dec 22 11:30:38 2006 -0800
@@ -2,9 +2,8 @@
  * CDDL HEADER START
  *
  * The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License").  You may not use this file except in compliance
- * with the License.
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
  *
  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
  * or http://www.opensolaris.org/os/licensing.
@@ -21,7 +20,7 @@
  */
 
 /*
- * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
@@ -118,7 +117,7 @@
 			return; /* case is already closed but error in _fini */
 
 		class = err == EFMD_MOD_FAIL ? FMD_FLT_MOD : FMD_FLT_CONF;
-		flt = fmd_protocol_fault(class, 100, mod, NULL, NULL);
+		flt = fmd_protocol_fault(class, 100, mod, NULL, NULL, NULL);
 
 		fmd_case_add_suspect(hdl, cp, flt);
 		fmd_case_solve(hdl, cp);
@@ -158,7 +157,7 @@
 	fmd_case_add_ereport(hdl, cp, ep);
 	self_stats.nosub.fmds_value.ui64++;
 
-	flt = fmd_protocol_fault(FMD_FLT_NOSUB, 100, NULL, NULL, NULL);
+	flt = fmd_protocol_fault(FMD_FLT_NOSUB, 100, NULL, NULL, NULL, NULL);
 	fmd_case_add_suspect(hdl, cp, flt);
 	fmd_case_solve(hdl, cp);
 }
--- a/usr/src/cmd/fm/fmdump/common/fault.c	Fri Dec 22 09:18:37 2006 -0800
+++ b/usr/src/cmd/fm/fmdump/common/fault.c	Fri Dec 22 11:30:38 2006 -0800
@@ -2,9 +2,8 @@
  * CDDL HEADER START
  *
  * The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License").  You may not use this file except in compliance
- * with the License.
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
  *
  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
  * or http://www.opensolaris.org/os/licensing.
@@ -29,6 +28,7 @@
 
 #include <fmdump.h>
 #include <stdio.h>
+#include <strings.h>
 
 /*ARGSUSED*/
 static int
@@ -62,6 +62,7 @@
 
 	for (i = 0; i < size; i++) {
 		char *class = NULL, *rname = NULL, *aname = NULL, *fname = NULL;
+		char *loc = NULL;
 		nvlist_t *fru, *asru, *rsrc;
 		uint8_t pct = 0;
 
@@ -77,6 +78,14 @@
 		if (nvlist_lookup_nvlist(nva[i], FM_FAULT_RESOURCE, &rsrc) == 0)
 			rname = fmdump_nvl2str(rsrc);
 
+		if (nvlist_lookup_string(nva[i], FM_FAULT_LOCATION, &loc)
+		    == 0) {
+			if (strncmp(fname, FM_FMRI_LEGACY_HC_PREFIX,
+			    sizeof (FM_FMRI_LEGACY_HC_PREFIX)) == 0)
+				loc = fname + sizeof (FM_FMRI_LEGACY_HC_PREFIX);
+		}
+
+
 		fmdump_printf(fp, "  %3u%%  %s\n\n",
 		    pct, class ? class : "-");
 
@@ -90,9 +99,12 @@
 		fmdump_printf(fp, "           Affects: %s\n",
 		    aname ? aname : "-");
 
-		fmdump_printf(fp, "               FRU: %s\n\n",
+		fmdump_printf(fp, "               FRU: %s\n",
 		    fname ? fname : "-");
 
+		fmdump_printf(fp, "          Location: %s\n\n",
+		    loc ? loc : "-");
+
 		free(fname);
 		free(aname);
 		free(rname);
--- a/usr/src/cmd/fm/fmtopo/common/fmtopo.c	Fri Dec 22 09:18:37 2006 -0800
+++ b/usr/src/cmd/fm/fmtopo/common/fmtopo.c	Fri Dec 22 11:30:38 2006 -0800
@@ -197,6 +197,8 @@
 	topo_type_t type;
 	char *tstr, *propn, buf[48];
 	nvpair_t *pv_nvp;
+	int i;
+	uint_t nelem;
 
 	if ((pv_nvp = nvlist_next_nvpair(nvl, NULL)) == NULL)
 		return;
@@ -313,6 +315,16 @@
 			topo_hdl_strfree(thp, fmri);
 			break;
 		}
+		case DATA_TYPE_UINT32_ARRAY: {
+			uint32_t *val;
+
+			(void) nvpair_value_uint32_array(pv_nvp, &val, &nelem);
+			(void) printf(" [ ");
+			for (i = 0; i < nelem; i++)
+				(void) printf("%u ", val[i]);
+			(void) printf("]");
+			break;
+		}
 		default:
 			(void) fprintf(stderr, " unknown data type (%d)",
 			    nvpair_type(pv_nvp));
--- a/usr/src/cmd/fm/modules/common/eversholt/platform.c	Fri Dec 22 09:18:37 2006 -0800
+++ b/usr/src/cmd/fm/modules/common/eversholt/platform.c	Fri Dec 22 11:30:38 2006 -0800
@@ -629,67 +629,34 @@
 }
 
 static void
-defect_units(nvlist_t **ap, nvlist_t **fp, struct config *croot, char *path)
+defect_units(nvlist_t **ap, struct config *croot, char *path)
 {
-	const char *driverstr;
-	nvlist_t *cf, *nf;
+	const char *modstr;
 	nvlist_t *na;
-	nvlist_t *arg;
 	int err;
 
 	/*
-	 * Defects aren't required to have ASRUs and FRUs defined with
+	 * Defects aren't required to have ASRUs defined with
 	 * them in the eversholt fault tree, so usually we'll be
-	 * creating original FMRIs here.  If either the ASRU or FRU
+	 * creating original FMRIs here.  If the ASRU
 	 * is defined when we get here, we won't replace it.
 	 */
-	if (*ap != NULL && *fp != NULL)
+	if (*ap != NULL)
 		return;
 
 	/*
 	 * Find the driver for this resource and use that to get
-	 * mod and pkg fmris for ASRU and FRU respectively.
+	 * a mod fmri for ASRU.  There are no FRUs for defects.
 	 */
-	if ((driverstr = cfgstrprop_lookup(croot, path, TOPO_IO_DRIVER))
-	    == NULL)
+	if ((modstr = cfgstrprop_lookup(croot, path, TOPO_IO_MODULE)) == NULL)
 		return;
 
-	if (topo_hdl_nvalloc(Eft_topo_hdl, &arg, NV_UNIQUE_NAME) != 0) {
-		out(O_ALTFP, "Can not allocate nvlist for MOD fmri lookup");
-		return;
-	}
-	if (nvlist_add_string(arg, TOPO_IO_DRIVER, driverstr) != 0) {
-		out(O_ALTFP, "Failed to add DRIVER string to arg nvlist");
-		nvlist_free(arg);
+	if (topo_fmri_str2nvl(Eft_topo_hdl, modstr, &na, &err) < 0) {
+		out(O_ALTFP, "topo_fmri_str2nvl() of %s failed", modstr);
 		return;
 	}
-	na = topo_fmri_create(Eft_topo_hdl, FM_FMRI_SCHEME_MOD,
-	    FM_FMRI_SCHEME_MOD, 0, arg, &err);
-	if (na == NULL) {
-		out(O_ALTFP, "topo_fmri_create() of %s scheme fmri"
-		    " for driver %s failed.", FM_FMRI_SCHEME_MOD, driverstr);
-		nvlist_free(arg);
-		return;
-	}
-	nvlist_free(arg);
 
-	if (*ap != NULL)
-		nvlist_free(*ap);
 	*ap = na;
-
-	err = nvlist_lookup_nvlist(na, FM_FMRI_MOD_PKG, &cf);
-	if (err != 0) {
-		out(O_ALTFP, "No pkg RTI within mod FMRI for %s (%s)\n",
-		    driverstr, topo_strerror(err));
-		return;
-	}
-	if (nvlist_xdup(cf, &nf, &Eft_nv_hdl) != 0) {
-		out(O_ALTFP, "Dup of pkg FMRI to be FRU FMRI failed\n");
-		return;
-	}
-	if (*fp != NULL)
-		nvlist_free(*fp);
-	*fp = nf;
 }
 
 /*
@@ -724,27 +691,34 @@
 	 * module.
 	 */
 	if (isdefect) {
-		defect_units(dfltasru, dfltfru, croot, path);
+		defect_units(dfltasru, croot, path);
 		return;
 	}
 
 	/*
 	 * Find the TOPO_PROP_ASRU and TOPO_PROP_FRU properties
-	 * for this resource
+	 * for this resource if *dfltasru and *dfltfru are set
 	 */
-	if ((asru = rewrite_resource(TOPO_PROP_ASRU, croot, path)) == NULL) {
-		out(O_ALTFP, "Cannot rewrite %s for %s.", TOPO_PROP_ASRU, path);
-	} else {
-		nvlist_free(*dfltasru);
-		*dfltasru = asru;
+	if (*dfltasru != NULL) {
+		if ((asru = rewrite_resource(TOPO_PROP_ASRU, croot, path))
+		    == NULL) {
+			out(O_ALTFP, "Cannot rewrite %s for %s.",
+			    TOPO_PROP_ASRU, path);
+		} else {
+			nvlist_free(*dfltasru);
+			*dfltasru = asru;
+		}
 	}
 
-	if ((fru = rewrite_resource(TOPO_PROP_FRU, croot, path)) == NULL) {
-		out(O_ALTFP, "Cannot rewrite %s for %s.",
-		    TOPO_PROP_FRU, path);
-	} else {
-		nvlist_free(*dfltfru);
-		*dfltfru = fru;
+	if (*dfltfru != NULL) {
+		if ((fru = rewrite_resource(TOPO_PROP_FRU, croot, path))
+		    == NULL) {
+			out(O_ALTFP, "Cannot rewrite %s for %s.",
+			    TOPO_PROP_FRU, path);
+		} else {
+			nvlist_free(*dfltfru);
+			*dfltfru = fru;
+		}
 	}
 }
 
@@ -2224,6 +2198,7 @@
 	nvlist_t *rsrc;
 	struct node *np;
 	char *scheme;
+	const struct ipath *ip;
 
 	if (nvlist_lookup_nvlist(flt, FM_FAULT_RESOURCE, &rsrc) != 0) {
 		out(O_ALTFP, "platform_fault2ipath: no resource member");
@@ -2243,5 +2218,7 @@
 	if ((np = hc_fmri_nodeize(rsrc)) == NULL)
 		return (NULL);		/* nodeize will already have whinged */
 
-	return (ipath(np));
+	ip = ipath(np);
+	tree_free(np);
+	return (ip);
 }
--- a/usr/src/cmd/logadm/logadm.conf	Fri Dec 22 09:18:37 2006 -0800
+++ b/usr/src/cmd/logadm/logadm.conf	Fri Dec 22 11:30:38 2006 -0800
@@ -2,9 +2,8 @@
 # CDDL HEADER START
 #
 # The contents of this file are subject to the terms of the
-# Common Development and Distribution License, Version 1.0 only
-# (the "License").  You may not use this file except in compliance
-# with the License.
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
 #
 # You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 # or http://www.opensolaris.org/os/licensing.
@@ -19,7 +18,7 @@
 #
 # CDDL HEADER END
 #
-# Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
+# Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
 # Use is subject to license terms.
 #
 #ident	"%Z%%M%	%I%	%E% SMI"
@@ -44,6 +43,7 @@
 /var/cron/log -c -s 512k -t /var/cron/olog
 /var/lp/logs/lpsched -C 2 -N -t '$file.$N'
 /var/fm/fmd/errlog -N -s 2m -M '/usr/sbin/fmadm -q rotate errlog && mv /var/fm/fmd/errlog.0- $nfile'
+/var/fm/fmd/fltlog -N -A 6m -s 10m -M '/usr/sbin/fmadm -q rotate fltlog && mv /var/fm/fmd/fltlog.0- $nfile'
 smf_logs /var/svc/log/*.log -C 8 -s 1m
 #
 # The entry below is used by turnacct(1M)
--- a/usr/src/cmd/mdb/Makefile.common	Fri Dec 22 09:18:37 2006 -0800
+++ b/usr/src/cmd/mdb/Makefile.common	Fri Dec 22 11:30:38 2006 -0800
@@ -34,6 +34,7 @@
 	libnvpair \
 	libproc \
 	libsysevent \
+	libtopo \
 	libumem \
 	libuutil \
 	libzpool \
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/usr/src/cmd/mdb/common/modules/genunix/fm.c	Fri Dec 22 11:30:38 2006 -0800
@@ -0,0 +1,240 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#pragma ident	"%Z%%M%	%I%	%E% SMI"
+
+#include <sys/types.h>
+#include <sys/time.h>
+#include <sys/sysmacros.h>
+#include <sys/ddifm.h>
+#include <sys/nvpair.h>
+#include <sys/nvpair_impl.h>
+#include <sys/errorq_impl.h>
+#include <sys/errorq.h>
+#include <sys/fm/protocol.h>
+
+#include <ctype.h>
+#include <mdb/mdb_modapi.h>
+#include <mdb/mdb_ks.h>
+
+#include "nvpair.h"
+
+int
+ereportq_pend_walk_init(mdb_walk_state_t *wsp)
+{
+	errorq_t eq;
+	uintptr_t addr;
+
+	if (wsp->walk_addr == NULL &&
+	    mdb_readvar(&addr, "ereport_errorq") == -1) {
+		mdb_warn("failed to read ereport_errorq");
+		return (WALK_ERR);
+	}
+
+	if (mdb_vread(&eq, sizeof (eq), addr) == -1) {
+		mdb_warn("failed to read ereport_errorq at %p", addr);
+		return (WALK_ERR);
+	}
+
+	if (!(eq.eq_flags & ERRORQ_NVLIST)) {
+		mdb_warn("errorq at %p does not service ereports", addr);
+		return (WALK_ERR);
+	}
+
+	wsp->walk_addr = (uintptr_t)eq.eq_pend;
+
+	return (WALK_NEXT);
+}
+
+int
+ereportq_pend_walk_step(mdb_walk_state_t *wsp)
+{
+	uintptr_t addr = wsp->walk_addr;
+	nvlist_t nvl;
+	errorq_nvelem_t eqnp;
+	errorq_elem_t elem;
+
+	if (addr == NULL)
+		return (WALK_DONE);
+
+	if (mdb_vread(&elem, sizeof (elem), addr) != sizeof (elem) ||
+	    mdb_vread(&eqnp, sizeof (eqnp), (uintptr_t)elem.eqe_data)
+	    != sizeof (eqnp) || mdb_vread(&nvl, sizeof (nvl),
+	    (uintptr_t)eqnp.eqn_nvl) != sizeof (nvl)) {
+		mdb_warn("failed to read ereportq element at %p", addr);
+		return (WALK_ERR);
+	}
+
+	wsp->walk_addr = (uintptr_t)elem.eqe_prev;
+
+	return (wsp->walk_callback((uintptr_t)eqnp.eqn_nvl, &nvl,
+	    wsp->walk_cbdata));
+}
+
+int
+ereportq_dump_walk_init(mdb_walk_state_t *wsp)
+{
+	errorq_t eq;
+	uintptr_t addr;
+
+	if (wsp->walk_addr == NULL &&
+	    mdb_readvar(&addr, "ereport_errorq") == -1) {
+		mdb_warn("failed to read ereport_errorq");
+		return (WALK_ERR);
+	}
+
+	if (mdb_vread(&eq, sizeof (eq), addr) == -1) {
+		mdb_warn("failed to read ereport_errorq at %p", addr);
+		return (WALK_ERR);
+	}
+
+	if (!(eq.eq_flags & ERRORQ_NVLIST)) {
+		mdb_warn("errorq at %p does not service ereports", addr);
+		return (WALK_ERR);
+	}
+
+	wsp->walk_addr = (uintptr_t)eq.eq_dump;
+
+	return (WALK_NEXT);
+}
+
+int
+ereportq_dump_walk_step(mdb_walk_state_t *wsp)
+{
+	uintptr_t addr = wsp->walk_addr;
+	nvlist_t nvl;
+	errorq_nvelem_t eqnp;
+	errorq_elem_t elem;
+
+	if (addr == NULL)
+		return (WALK_DONE);
+
+	if (mdb_vread(&elem, sizeof (elem), addr) != sizeof (elem) ||
+	    mdb_vread(&eqnp, sizeof (eqnp), (uintptr_t)elem.eqe_data)
+	    != sizeof (eqnp) || mdb_vread(&nvl, sizeof (nvl),
+	    (uintptr_t)eqnp.eqn_nvl) != sizeof (nvl)) {
+		mdb_warn("failed to read ereportq element at %p", addr);
+		return (WALK_ERR);
+	}
+
+	wsp->walk_addr = (uintptr_t)elem.eqe_dump;
+
+	return (wsp->walk_callback((uintptr_t)eqnp.eqn_nvl, &nvl,
+	    wsp->walk_cbdata));
+}
+
+/*ARGSUSED*/
+int
+ereport(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
+{
+	int ret;
+	uint_t opt_v = 0;
+	char *class = NULL;
+	uint64_t ena = 0;
+	nvlist_t nvl;
+	nvpriv_t nvpriv;
+	i_nvp_t *nvcur, i_nvp;
+
+	if (!(flags & DCMD_ADDRSPEC))
+		return (DCMD_USAGE);
+
+	if (mdb_getopts(argc, argv, 'v', MDB_OPT_SETBITS, TRUE, &opt_v) != argc)
+		return (DCMD_USAGE);
+
+	if (mdb_vread(&nvl, sizeof (nvl), addr) == -1) {
+		mdb_warn("failed to read nvlist at %p", addr);
+		return (DCMD_ERR);
+	}
+
+	if (DCMD_HDRSPEC(flags) && !opt_v) {
+		mdb_printf("ENA                CLASS\n");
+	}
+
+	/*
+	 * The following code attempts to pretty print the ereport class
+	 * and ENA.  The code uses project private macros from libnvpair
+	 * that could change and break this functionality.  If we are unable
+	 * to get a valid class and ENA from the nvpair list, we revert to
+	 * dumping the nvlist (same as opt_v).
+	 */
+	if (mdb_vread(&nvpriv, sizeof (nvpriv), nvl.nvl_priv) == -1) {
+		mdb_warn("failed to read nvpriv at %p", nvl.nvl_priv);
+		return (DCMD_ERR);
+	}
+
+	for (nvcur = nvpriv.nvp_list; nvcur != NULL; nvcur = i_nvp.nvi_next) {
+		nvpair_t *nvp, *nvpair;
+		int32_t size;
+
+		if (opt_v)
+			break;
+
+		if (mdb_vread(&i_nvp, sizeof (i_nvp), (uintptr_t)nvcur) == -1) {
+			mdb_warn("failed to read i_nvp at %p", nvcur);
+			return (DCMD_ERR);
+		}
+
+		nvp = &i_nvp.nvi_nvp;
+		size = NVP_SIZE(nvp);
+		if (size == 0) {
+			mdb_warn("nvpair of size zero at %p", nvp);
+			return (DCMD_OK);
+		}
+
+		/* read in the entire nvpair */
+		nvpair = mdb_alloc(size, UM_SLEEP | UM_GC);
+		if (mdb_vread(nvpair, size, (uintptr_t)&nvcur->nvi_nvp) == -1) {
+			mdb_warn("failed to read nvpair and data at %p", nvp);
+			return (DCMD_ERR);
+		}
+
+		if (strcmp(FM_CLASS, NVP_NAME(nvpair)) == 0 &&
+		    NVP_TYPE(nvpair) == DATA_TYPE_STRING && class == NULL) {
+			char *p = (char *)NVP_VALUE(nvpair);
+
+			class = mdb_zalloc(strlen(p) + 1, UM_SLEEP | UM_GC);
+			bcopy(p, class, strlen(p));
+		} else if (strcmp(FM_EREPORT_ENA, NVP_NAME(nvpair)) == 0 &&
+		    NVP_TYPE(nvpair) == DATA_TYPE_UINT64 && ena == 0) {
+			bcopy(NVP_VALUE(nvpair), (char *)&ena,
+			    sizeof (uint64_t));
+		}
+
+		if (class != NULL && ena != 0) {
+			mdb_printf("0x%016llx %s\n", ena, class);
+			return (DCMD_OK);
+		}
+
+	}
+
+	/*
+	 * Dump entire nvlist
+	 */
+	ret = mdb_call_dcmd("nvlist", addr, flags | DCMD_ADDRSPEC,
+	    0, argv);
+	mdb_printf("\n");
+
+	return (ret);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/usr/src/cmd/mdb/common/modules/genunix/fm.h	Fri Dec 22 11:30:38 2006 -0800
@@ -0,0 +1,47 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef	_FM_H
+#define	_FM_H
+
+#pragma ident	"%Z%%M%	%I%	%E% SMI"
+
+#ifdef	__cplusplus
+extern "C" {
+#endif
+
+#include <mdb/mdb_modapi.h>
+
+extern int ereportq_dump_walk_init(mdb_walk_state_t *);
+extern int ereportq_dump_walk_step(mdb_walk_state_t *);
+extern int ereportq_pend_walk_init(mdb_walk_state_t *);
+extern int ereportq_pend_walk_step(mdb_walk_state_t *);
+extern int ereport(uintptr_t, uint_t, int, const mdb_arg_t *);
+
+#ifdef	__cplusplus
+}
+#endif
+
+#endif	/* _FM_H */
--- a/usr/src/cmd/mdb/common/modules/genunix/genunix.c	Fri Dec 22 09:18:37 2006 -0800
+++ b/usr/src/cmd/mdb/common/modules/genunix/genunix.c	Fri Dec 22 11:30:38 2006 -0800
@@ -100,6 +100,7 @@
 #include "zone.h"
 #include "modhash.h"
 #include "mdi.h"
+#include "fm.h"
 
 /*
  * Surely this is defined somewhere...
@@ -3322,6 +3323,10 @@
 	{ "devinfo_fmce", ":", "devinfo fault managment cache entry",
 	    devinfo_fmce},
 
+	/* from fm.c */
+	{ "ereport", "[-v]", "print ereports logged in dump",
+	    ereport },
+
 	/* from findstack.c */
 	{ "findstack", ":[-v]", "find kernel thread stack", findstack },
 	{ "findstack_debug", NULL, "toggle findstack debugging",
@@ -3514,6 +3519,10 @@
 	{ "anon", "given an amp, list of anon structures",
 		anon_walk_init, anon_walk_step, anon_walk_fini },
 	{ "cpu", "walk cpu structures", cpu_walk_init, cpu_walk_step },
+	{ "ereportq_dump", "walk list of ereports in dump error queue",
+		ereportq_dump_walk_init, ereportq_dump_walk_step, NULL },
+	{ "ereportq_pend", "walk list of ereports in pending error queue",
+		ereportq_pend_walk_init, ereportq_pend_walk_step, NULL },
 	{ "errorq", "walk list of system error queues",
 		errorq_walk_init, errorq_walk_step, NULL },
 	{ "errorq_data", "walk pending error queue data buffers",
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/usr/src/cmd/mdb/common/modules/libtopo/libtopo.c	Fri Dec 22 11:30:38 2006 -0800
@@ -0,0 +1,898 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+
+/*
+ * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
+ * Use is subject to license terms.
+ */
+#pragma ident	"%Z%%M%	%I%	%E% SMI"
+
+#include <sys/mdb_modapi.h>
+#include <libelf.h>
+#include <sys/fm/protocol.h>
+#include <topo_mod.h>
+#include <topo_tree.h>
+#include <topo_module.h>
+
+
+/*
+ * We use this to keep track of which bucket we're in while walking
+ * the modhash and we also cache the length of the hash
+ */
+static topo_modhash_t tmh;
+static uint_t hash_idx;
+
+static uintptr_t curr_pg;
+static uint_t is_root;
+static uint_t verbose;
+static char *pgrp;
+static char *tgt_scheme;
+static char parent[255];
+
+/*
+ * This structure is used by the topo_nodehash walker instances to
+ * keep track of where they're at in the node hash
+ */
+typedef struct tnwalk_state {
+	uint_t hash_idx;
+	topo_nodehash_t hash;
+	topo_nodehash_t *curr_hash;
+} tnwalk_state_t;
+
+
+static char *stab_lvls[] = {"Internal", "", "Private", "Obsolete", "External",
+	"Unstable", "Evolving", "Stable", "Standard", "Max"};
+
+/*ARGSUSED*/
+static int
+topo_handle(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
+{
+	char uuid[36], root[36], plat[36], isa[36], machine[36], product[36];
+	topo_hdl_t th;
+
+	/*
+	 * Read in the structure and then read in all of the string fields from
+	 * the target's addr space
+	 */
+	if (mdb_vread(&th, sizeof (th), addr) != sizeof (th)) {
+		mdb_warn("failed to read topo_hdl_t at %p", addr);
+		return (DCMD_ERR);
+	}
+
+	if (mdb_readstr(uuid, sizeof (uuid), (uintptr_t)th.th_uuid) < 0) {
+		(void) mdb_snprintf(uuid, sizeof (uuid), "<%p>", th.th_uuid);
+	}
+	if (mdb_readstr(root, sizeof (root), (uintptr_t)th.th_rootdir) < 0) {
+		(void) mdb_snprintf(root, sizeof (root), "<%p>", th.th_rootdir);
+	}
+	if (mdb_readstr(plat, sizeof (plat), (uintptr_t)th.th_platform) < 0) {
+		(void) mdb_snprintf(plat, sizeof (plat), "<%p>",
+		    th.th_platform);
+	}
+	if (mdb_readstr(isa, sizeof (isa), (uintptr_t)th.th_isa) < 0) {
+		(void) mdb_snprintf(isa, sizeof (isa), "<%p>", th.th_isa);
+	}
+	if (mdb_readstr(machine, sizeof (machine), (uintptr_t)th.th_machine)
+	    < 0) {
+
+		(void) mdb_snprintf(machine, sizeof (machine), "<%p>",
+		    th.th_machine);
+	}
+	if (mdb_readstr(product, sizeof (product), (uintptr_t)th.th_product)
+	    < 0) {
+
+		(void) mdb_snprintf(product, sizeof (product), "<%p>",
+		    th.th_product);
+	}
+
+	/*
+	 * Dump it all out in a nice pretty format and keep it to 80 chars wide
+	 */
+	if (DCMD_HDRSPEC(flags)) {
+		mdb_printf("%<u>%-12s %-36s %-30s%</u>\n", "FIELD", "VALUE",
+		    "DESCR");
+	}
+	mdb_printf("%-12s 0x%-34p %-30s\n", "th_lock", th.th_lock,
+	    "Mutex lock protecting handle");
+	mdb_printf("%-12s %-36s %-30s\n", "th_uuid", uuid,
+	    "UUID of the topology snapshot");
+	mdb_printf("%-12s %-36s %-30s\n", "th_rootdir", root,
+	    "Root directory of plugin paths");
+	mdb_printf("%-12s %-36s %-30s\n", "th_platform", plat, "Platform name");
+	mdb_printf("%-12s %-36s %-30s\n", "th_isa", isa, "ISA name");
+	mdb_printf("%-12s %-36s %-30s\n", "th_machine", machine,
+	    "Machine name");
+	mdb_printf("%-12s %-36s %-30s\n", "th_product", product,
+	    "Product name");
+	mdb_printf("%-12s 0x%-34p %-30s\n", "th_di", th.th_di,
+	    "Handle to the root of the devinfo tree");
+	mdb_printf("%-12s 0x%-34p %-30s\n", "th_pi", th.th_pi,
+	    "Handle to the root of the PROM tree");
+	mdb_printf("%-12s 0x%-34p %-30s\n", "th_modhash", th.th_modhash,
+	    "Module hash");
+	mdb_printf("%-12s %-36s %-30s\n", "th_trees", "",
+	    "Scheme-specific topo tree list");
+	mdb_printf("  %-12s 0x%-34p %-30s\n", "l_prev", th.th_trees.l_prev,
+		"");
+	mdb_printf("  %-12s 0x%-34p %-30s\n", "l_next", th.th_trees.l_next,
+		"");
+	mdb_printf("%-12s 0x%-34p %-30s\n", "th_alloc", th.th_alloc,
+	    "Allocators");
+	mdb_printf("%-12s %-36d %-30s\n", "tm_ernno", th.th_errno, "errno");
+	mdb_printf("%-12s %-36d %-30s\n", "tm_debug", th.th_debug,
+	    "Debug mask");
+	mdb_printf("%-12s %-36d %-30s\n", "tm_dbout", th.th_dbout,
+	    "Debug channel");
+
+	return (DCMD_OK);
+}
+
+
+/*ARGSUSED*/
+static int
+topo_module(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
+{
+	char name[36], path[36], root[36];
+	topo_mod_t tm;
+
+	/*
+	 * Read in the structure and then read in all of the string fields from
+	 * the target's addr space
+	 */
+	if (mdb_vread(&tm, sizeof (tm), addr) != sizeof (tm)) {
+		mdb_warn("failed to read topo_mod_t at %p", addr);
+		return (DCMD_ERR);
+	}
+
+	if (mdb_readstr(name, sizeof (name), (uintptr_t)tm.tm_name) < 0) {
+		(void) mdb_snprintf(name, sizeof (name), "<%p>", tm.tm_name);
+	}
+	if (mdb_readstr(path, sizeof (path), (uintptr_t)tm.tm_path) < 0) {
+		(void) mdb_snprintf(path, sizeof (path), "<%p>", tm.tm_path);
+	}
+	if (mdb_readstr(root, sizeof (root), (uintptr_t)tm.tm_rootdir) < 0) {
+		(void) mdb_snprintf(root, sizeof (root), "<%p>", tm.tm_rootdir);
+	}
+
+	/*
+	 * Dump it all out in a nice pretty format and keep it to 80 chars wide
+	 */
+	if (DCMD_HDRSPEC(flags)) {
+		mdb_printf("%<u>%-12s %-36s %-30s%</u>\n",
+		"FIELD", "VALUE", "DESCR");
+	}
+	mdb_printf("%-12s 0x%-34p %-30s\n", "tm_lock", tm.tm_lock,
+		"Lock for tm_cv/owner/flags/refs");
+	mdb_printf("%-12s 0x%-34p %-30s\n", "tm_cv", tm.tm_cv,
+		"Module condition variable");
+	mdb_printf("%-12s %-36s %-30s\n", "tm_busy", tm.tm_busy,
+		"Busy indicator");
+	mdb_printf("%-12s 0x%-34p %-30s\n", "tm_next", tm.tm_next,
+		"Next module in hash chain");
+	mdb_printf("%-12s 0x%-34p %-30s\n", "tm_hdl", tm.tm_hdl,
+		"Topo handle for this module");
+	mdb_printf("%-12s 0x%-34p %-30s\n", "tm_alloc", tm.tm_alloc,
+		"Allocators");
+	mdb_printf("%-12s %-36s %-30s\n", "tm_name", name,
+		"Basename of module");
+	mdb_printf("%-12s %-36s %-30s\n", "tm_path", path,
+		"Full pathname of module");
+	mdb_printf("%-12s %-36s %-30s\n", "tm_rootdir", root,
+		"Relative root directory of module");
+	mdb_printf("%-12s %-36u %-30s\n", "tm_refs", tm.tm_refs,
+		"Module reference count");
+	mdb_printf("%-12s %-36u %-30s\n", "tm_flags", tm.tm_flags,
+		"Module flags");
+	if (TOPO_MOD_INIT & tm.tm_flags) {
+		mdb_printf("%-12s %-36s %-30s\n", "", "TOPO_MOD_INIT",
+			"Module init completed");
+	}
+	if (TOPO_MOD_FINI & tm.tm_flags) {
+		mdb_printf("%-12s %-36s %-30s\n", "", "TOPO_MOD_FINI",
+			"Module fini completed");
+	}
+	if (TOPO_MOD_REG & tm.tm_flags) {
+		mdb_printf("%-12s %-36s %-30s\n", "", "TOPO_MOD_REG",
+			"Module registered");
+	}
+	if (TOPO_MOD_UNREG & tm.tm_flags) {
+		mdb_printf("%-12s %-36s %-30s\n", "", "TOPO_MOD_UNREG",
+			"Module unregistered");
+	}
+
+	mdb_printf("%-12s %-36u %-30s\n", "tm_debug", tm.tm_debug,
+		"Debug printf mask");
+	mdb_printf("%-12s 0x%-34p %-30s\n", "tm_data", tm.tm_data,
+		"Private rtld/builtin data");
+	mdb_printf("%-12s 0x%-34p %-30s\n", "tm_mops", tm.tm_mops,
+		"Module class ops vector");
+	mdb_printf("%-12s 0x%-34p %-30s\n", "tm_info", tm.tm_info,
+		"Module info registered with handle");
+	mdb_printf("%-12s %-36d %-30s\n", "tm_ernno", tm.tm_errno,
+		"Module errno");
+
+	return (DCMD_OK);
+}
+
+
+/*ARGSUSED*/
+static int
+topo_node(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
+{
+	char name[36];
+	tnode_t tn;
+
+	if (!addr)
+		return (DCMD_ERR);
+
+	/*
+	 * Read in the structure and then read in all of the string fields from
+	 * the target's addr space
+	 */
+	if (mdb_vread(&tn, sizeof (tn), addr) != sizeof (tn)) {
+		mdb_warn("failed to read tnode_t at %p", addr);
+		return (DCMD_ERR);
+	}
+
+	if (mdb_readstr(name, sizeof (name), (uintptr_t)tn.tn_name) < 0) {
+		(void) mdb_snprintf(name, sizeof (name), "<%p>", tn.tn_name);
+	}
+
+	/*
+	 * Dump it all out in a nice pretty format and keep it to 80 chars wide
+	 */
+	if (DCMD_HDRSPEC(flags)) {
+		mdb_printf("%<u>%-12s %-36s %-30s%</u>\n",
+		"FIELD", "VALUE", "DESCR");
+	}
+
+	mdb_printf("%-12s 0x%-34p %-30s\n", "tn_lock", tn.tn_lock,
+		"Mutex lock protecting node members");
+	mdb_printf("%-12s %-36s %-30s\n", "tn_name", name,
+		"Node name");
+	mdb_printf("%-12s %-36d %-30s\n", "tn_instance", tn.tn_instance,
+		"Node instance");
+	mdb_printf("%-12s %-36d %-30s\n", "tn_state", tn.tn_state,
+		"Node state");
+	if (TOPO_NODE_INIT & tn.tn_state) {
+		mdb_printf("%-12s %-36s %-30s\n", "", "TOPO_NODE_INIT", "");
+	}
+	if (TOPO_NODE_ROOT & tn.tn_state) {
+		mdb_printf("%-12s %-36s %-30s\n", "", "TOPO_NODE_ROOT", "");
+	}
+	if (TOPO_NODE_BOUND & tn.tn_state) {
+		mdb_printf("%-12s %-36s %-30s\n", "", "TOPO_NODE_BOUND", "");
+	}
+	if (TOPO_NODE_LINKED & tn.tn_state) {
+		mdb_printf("%-12s %-36s %-30s\n", "", "TOPO_NODE_LINKED", "");
+	}
+	mdb_printf("%-12s %-36d %-30s\n", "tn_fflags", tn.tn_fflags,
+		"FMRI flags");
+	mdb_printf("%-12s 0x%-34p %-30s\n", "tn_parent", tn.tn_parent,
+		"Node parent");
+	mdb_printf("%-12s 0x%-34p %-30s\n", "tn_phash", tn.tn_phash,
+		"Parent hash bucket");
+	mdb_printf("%-12s 0x%-34p %-30s\n", "tn_hdl", tn.tn_hdl,
+		"Topo handle");
+	mdb_printf("%-12s 0x%-34p %-30s\n", "tn_enum", tn.tn_enum,
+		"Enumerator module");
+	mdb_printf("%-12s %-36s %-30s\n", "tn_children", "",
+		"Hash table of child nodes");
+	mdb_printf("  %-12s 0x%-34p %-30s\n", "l_prev", tn.tn_children.l_prev,
+		"");
+	mdb_printf("  %-12s 0x%-34p %-30s\n", "l_next", tn.tn_children.l_next,
+		"");
+	mdb_printf("%-12s 0x%-34p %-30s\n", "tn_pgroups", &(tn.tn_pgroups),
+		"Property group list");
+	mdb_printf("%-12s 0x%-34p %-30s\n", "tn_methods", &(tn.tn_methods),
+		"Registered method list");
+	mdb_printf("%-12s 0x%-34p %-30s\n", "tn_priv", tn.tn_priv,
+		"Private enumerator data");
+	mdb_printf("%-12s %-36d %-30s\n", "tn_refs", tn.tn_refs,
+		"Node reference count");
+
+	return (DCMD_OK);
+}
+
+/*ARGSUSED*/
+static int
+find_tree_root(uintptr_t addr, const void *data, void *arg)
+{
+	ttree_t *tree = (ttree_t *)data;
+	char scheme[36];
+
+	if (mdb_readstr(scheme, sizeof (scheme), (uintptr_t)tree->tt_scheme)
+	    < 0) {
+		(void) mdb_snprintf(scheme, sizeof (scheme), "<%p>",
+		    tree->tt_scheme);
+	}
+
+	if (strncmp(tgt_scheme, scheme, 36) == 0) {
+		*((tnode_t **)arg) = tree->tt_root;
+		return (WALK_DONE);
+	}
+	return (WALK_NEXT);
+}
+
+
+/*
+ * Dump the given property value. For the actual property values
+ * we dump a pointer to the nvlist which can be decoded using the ::nvlist
+ * dcmd from the libnvpair MDB module
+ */
+/*ARGSUSED*/
+static int
+dump_propval(uintptr_t addr, const void *data, void *arg)
+{
+	topo_proplist_t *plistp = (topo_proplist_t *)data;
+	topo_propval_t pval;
+	char name[32], *type;
+
+	if (mdb_vread(&pval, sizeof (pval), (uintptr_t)plistp->tp_pval)
+	    != sizeof (pval)) {
+
+		mdb_warn("failed to read topo_propval_t at %p",
+		    plistp->tp_pval);
+		return (WALK_ERR);
+	}
+	if (mdb_readstr(name, sizeof (name), (uintptr_t)pval.tp_name) < 0) {
+		(void) mdb_snprintf(name, sizeof (name), "<%p>", pval.tp_name);
+	}
+	switch (pval.tp_type) {
+		case TOPO_TYPE_BOOLEAN: type = "boolean"; break;
+		case TOPO_TYPE_INT32: type = "int32"; break;
+		case TOPO_TYPE_UINT32: type = "uint32"; break;
+		case TOPO_TYPE_INT64: type = "int64"; break;
+		case TOPO_TYPE_UINT64: type = "uint64"; break;
+		case TOPO_TYPE_STRING: type = "string"; break;
+		case TOPO_TYPE_FMRI: type = "fmri"; break;
+		case TOPO_TYPE_INT32_ARRAY: type = "int32[]"; break;
+		case TOPO_TYPE_UINT32_ARRAY: type = "uint32[]"; break;
+		case TOPO_TYPE_INT64_ARRAY: type = "int64[]"; break;
+		case TOPO_TYPE_UINT64_ARRAY: type = "uint64[]"; break;
+		case TOPO_TYPE_STRING_ARRAY: type = "string[]"; break;
+		case TOPO_TYPE_FMRI_ARRAY: type = "fmri[]"; break;
+		default: type = "unknown type";
+	}
+	mdb_printf("    %-32s %-16s value: %p\n", name, type, pval.tp_val);
+	return (WALK_NEXT);
+}
+
+
+/*
+ * Dumps the contents of the property group.
+ */
+/*ARGSUSED*/
+static int
+dump_pgroup(uintptr_t addr, const void *data, void *arg)
+{
+	topo_pgroup_t *pgp = (topo_pgroup_t *)data;
+	topo_ipgroup_info_t ipg;
+	char buf[32];
+
+	if (mdb_vread(&ipg, sizeof (ipg), (uintptr_t)pgp->tpg_info)
+	    != sizeof (ipg)) {
+
+		mdb_warn("failed to read topo_ipgroup_info_t at %p",
+		    pgp->tpg_info);
+		return (WALK_ERR);
+	}
+	if (mdb_readstr(buf, sizeof (buf), (uintptr_t)ipg.tpi_name) < 0) {
+		mdb_warn("failed to read string at %p", ipg.tpi_name);
+		return (WALK_ERR);
+	}
+	/*
+	 * If this property group is the one we're interested in or if the user
+	 * specified the "all" property group, we'll dump it
+	 */
+	if ((strncmp(pgrp, buf, sizeof (buf)) == 0) ||
+	    (strncmp(pgrp, "all", sizeof (buf)) == 0)) {
+
+		mdb_printf("  group: %-32s version: %d, stability: %s/%s\n",
+		    buf, ipg.tpi_version, stab_lvls[ipg.tpi_namestab],
+		    stab_lvls[ipg.tpi_datastab]);
+
+		(void) mdb_pwalk("topo_proplist", dump_propval, NULL, curr_pg);
+	}
+	return (WALK_NEXT);
+}
+
+
+/*
+ * Recursive function to dump the specified node and all of it's children
+ */
+/*ARGSUSED*/
+static int
+dump_tnode(uintptr_t addr, const void *data, void *arg)
+{
+	tnode_t node;
+	char pname[255], buf[80], old_pname[255];
+
+	if (!addr) {
+		return (WALK_NEXT);
+	}
+
+	if (mdb_vread(&node, sizeof (node), addr) != sizeof (node)) {
+		mdb_warn("failed to read tnode_t at %p", addr);
+		return (WALK_ERR);
+	}
+	if (mdb_readstr(buf, sizeof (buf), (uintptr_t)node.tn_name) < 0) {
+		(void) mdb_snprintf(buf, sizeof (buf), "<%p>",
+		    node.tn_name);
+	}
+
+	if (is_root) {
+		mdb_snprintf(pname, sizeof (pname), "%s", parent);
+		is_root = 0;
+	} else {
+		mdb_snprintf(pname, sizeof (pname), "%s/%s=%u",
+		    parent, buf, node.tn_instance);
+
+		if (verbose)
+			mdb_printf("%s\n  tnode_t: %p\n", pname, addr);
+		else
+			mdb_printf("%s\n", pname);
+	}
+	mdb_snprintf(old_pname, sizeof (old_pname), "%s", parent);
+	mdb_snprintf(parent, sizeof (parent), "%s", pname);
+
+	if (pgrp)
+		(void) mdb_pwalk("topo_pgroup", dump_pgroup, NULL, addr);
+
+	(void) mdb_pwalk("topo_nodehash", dump_tnode, NULL, addr);
+	mdb_snprintf(parent, sizeof (parent), "%s", old_pname);
+
+	return (WALK_NEXT);
+}
+
+
+/*
+ * Given a topo_hdl_t *, the topo dcmd dumps the topo tree.  The format of the
+ * output is modeled after fmtopo.  Like fmtopo, by default, we'll dump the
+ * "hc" scheme tree.  The user can optionally specify a different tree via the
+ * "-s <scheme>" option.
+ *
+ * Specifying the "-v" option provides more verbose output.  Currently it
+ * outputs the tnode_t * addr for each node, which is useful if you want to
+ * dump it with the topo_node dcmd.
+ *
+ * The functionality of the "-P" option is similar to fmtopo.
+ */
+/*ARGSUSED*/
+static int
+fmtopo(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
+{
+	char product[36], *opt_s = NULL, *opt_P = NULL;
+	topo_hdl_t th;
+	tnode_t *tree_root;
+	uint_t opt_v = FALSE;
+	char *def_scheme = "hc";
+
+	if (mdb_getopts(argc, argv, 'v', MDB_OPT_SETBITS, TRUE, &opt_v,
+	    's', MDB_OPT_STR, &opt_s, 'P', MDB_OPT_STR, &opt_P, NULL)
+	    != argc) {
+		return (DCMD_USAGE);
+	}
+
+	if (opt_s) {
+		tgt_scheme = opt_s;
+	} else {
+		tgt_scheme = def_scheme;
+	}
+
+	pgrp = opt_P;
+	verbose = opt_v;
+	is_root = 1;
+
+	/*
+	 * Read in the topo_handle and some of its string fields from
+	 * the target's addr space
+	 */
+	if (mdb_vread(&th, sizeof (th), addr) != sizeof (th)) {
+		mdb_warn("failed to read topo_hdl_t at %p", addr);
+		return (DCMD_ERR);
+	}
+
+	if (mdb_readstr(product, sizeof (product), (uintptr_t)th.th_product)
+	    < 0) {
+
+		(void) mdb_snprintf(product, sizeof (product), "<%p>",
+		    th.th_product);
+	}
+
+	mdb_snprintf(parent, sizeof (parent),
+	    "%s://:product-id=%s", tgt_scheme, product);
+
+	/*
+	 * Walk the list of topo trees, looking for the one that is for the
+	 * scheme we're interested in.
+	 */
+	tree_root = NULL;
+	mdb_pwalk("topo_tree", find_tree_root, &tree_root, addr);
+
+	if (! tree_root) {
+		mdb_warn("failed to find a topo tree for scheme %s\n",
+		    tgt_scheme);
+		return (DCMD_ERR);
+	}
+
+	return (dump_tnode((uintptr_t)tree_root, NULL, NULL));
+}
+
+
+static int
+ttree_walk_init(mdb_walk_state_t *wsp)
+{
+	topo_hdl_t th;
+
+	if (wsp->walk_addr == NULL) {
+		mdb_warn("NULL topo_hdl_t passed in");
+		return (WALK_ERR);
+	}
+
+	if (mdb_vread(&th, sizeof (th), wsp->walk_addr) != sizeof (th)) {
+		mdb_warn("failed to read topo_hdl_t at %p", wsp->walk_addr);
+		return (WALK_ERR);
+	}
+
+	wsp->walk_addr = (uintptr_t)th.th_trees.l_next;
+	wsp->walk_data = mdb_alloc(sizeof (ttree_t), UM_SLEEP);
+
+	return (WALK_NEXT);
+}
+
+
+static int
+ttree_walk_step(mdb_walk_state_t *wsp)
+{
+	int rv;
+	ttree_t *tree;
+
+	if (wsp->walk_addr == NULL)
+		return (WALK_DONE);
+
+	if (mdb_vread(wsp->walk_data, sizeof (ttree_t), wsp->walk_addr)
+	    != sizeof (ttree_t)) {
+
+		mdb_warn("failed to read ttree_t at %p", wsp->walk_addr);
+		return (WALK_ERR);
+	}
+
+	rv = wsp->walk_callback(wsp->walk_addr, wsp->walk_data,
+	    wsp->walk_cbdata);
+
+	tree = (ttree_t *)wsp->walk_data;
+	wsp->walk_addr = (uintptr_t)tree->tt_list.l_next;
+
+	return (rv);
+}
+
+
+static void
+ttree_walk_fini(mdb_walk_state_t *wsp)
+{
+	mdb_free(wsp->walk_data, sizeof (ttree_t));
+}
+
+
+static int
+tmod_walk_init(mdb_walk_state_t *wsp)
+{
+	topo_hdl_t th;
+
+	if (wsp->walk_addr == NULL) {
+		mdb_warn("NULL topo_hdl_t passed in");
+		return (WALK_ERR);
+	}
+
+	if (mdb_vread(&th, sizeof (th), wsp->walk_addr) != sizeof (th)) {
+		mdb_warn("failed to read topo_hdl_t at %p", wsp->walk_addr);
+		return (WALK_ERR);
+	}
+
+	if (mdb_vread(&tmh, sizeof (topo_modhash_t), (uintptr_t)th.th_modhash)
+	    == -1) {
+
+		mdb_warn("failed to read topo_modhash_t at %p", wsp->walk_addr);
+		return (WALK_DONE);
+	}
+
+	hash_idx = 0;
+
+	if (mdb_vread(&(wsp->walk_addr), sizeof (uintptr_t *),
+	    (uintptr_t)(tmh.mh_hash)) != sizeof (tnode_t *)) {
+
+		mdb_warn("failed to read %u bytes at %p", sizeof (tnode_t *),
+		    tmh.mh_hash);
+		return (WALK_ERR);
+	}
+
+	wsp->walk_data = mdb_alloc(sizeof (topo_mod_t), UM_SLEEP);
+
+	return (WALK_NEXT);
+}
+
+
+static int
+tmod_walk_step(mdb_walk_state_t *wsp)
+{
+	int rv;
+	topo_mod_t *tm;
+
+	if (wsp->walk_addr == NULL)
+		return (WALK_DONE);
+
+	if (mdb_vread(wsp->walk_data, sizeof (topo_mod_t), wsp->walk_addr)
+	    == -1) {
+
+		mdb_warn("failed to read topo_mod_t at %p", wsp->walk_addr);
+		return (WALK_DONE);
+	}
+
+	rv = wsp->walk_callback(wsp->walk_addr, wsp->walk_data,
+	    wsp->walk_cbdata);
+
+	tm = (topo_mod_t *)wsp->walk_data;
+
+	if (tm->tm_next)
+		wsp->walk_addr = (uintptr_t)tm->tm_next;
+	else if (++hash_idx < tmh.mh_hashlen)
+		if (mdb_vread(&(wsp->walk_addr), sizeof (uintptr_t *),
+		    (uintptr_t)(tmh.mh_hash+hash_idx)) != sizeof (tnode_t *)) {
+
+			mdb_warn("failed to read %u bytes at %p",
+			    sizeof (tnode_t *), tmh.mh_hash+hash_idx);
+			return (DCMD_ERR);
+		}
+	else
+		wsp->walk_addr = NULL;
+
+	return (rv);
+}
+
+static void
+tmod_walk_fini(mdb_walk_state_t *wsp)
+{
+	mdb_free(wsp->walk_data, sizeof (topo_mod_t));
+}
+
+
+static int
+tpg_walk_init(mdb_walk_state_t *wsp)
+{
+	tnode_t node;
+
+	if (wsp->walk_addr == NULL) {
+		mdb_warn("NULL tnode_t passed in");
+		return (WALK_ERR);
+	}
+
+	if (mdb_vread(&node, sizeof (node), wsp->walk_addr) != sizeof (node)) {
+		mdb_warn("failed to read tnode_t at %p", wsp->walk_addr);
+		return (WALK_ERR);
+	}
+
+	wsp->walk_addr = (uintptr_t)node.tn_pgroups.l_next;
+	wsp->walk_data = mdb_alloc(sizeof (topo_pgroup_t), UM_SLEEP);
+
+	return (WALK_NEXT);
+}
+
+
+static int
+tpg_walk_step(mdb_walk_state_t *wsp)
+{
+	int rv;
+	topo_pgroup_t *tpgp;
+
+	if (wsp->walk_addr == NULL)
+		return (WALK_DONE);
+
+	if (mdb_vread(wsp->walk_data, sizeof (topo_pgroup_t), wsp->walk_addr)
+	    == -1) {
+
+		mdb_warn("failed to read topo_pgroup_t at %p", wsp->walk_addr);
+		return (WALK_DONE);
+	}
+
+	curr_pg = wsp->walk_addr;
+	rv = wsp->walk_callback(wsp->walk_addr, wsp->walk_data,
+	    wsp->walk_cbdata);
+
+	tpgp = (topo_pgroup_t *)wsp->walk_data;
+	wsp->walk_addr = (uintptr_t)tpgp->tpg_list.l_next;
+
+	return (rv);
+}
+
+
+static void
+tpg_walk_fini(mdb_walk_state_t *wsp)
+{
+	mdb_free(wsp->walk_data, sizeof (topo_pgroup_t));
+}
+
+
+static int
+tpl_walk_init(mdb_walk_state_t *wsp)
+{
+	topo_pgroup_t pg;
+
+	if (wsp->walk_addr == NULL) {
+		mdb_warn("NULL topo_pgroup_t passed in");
+		return (WALK_ERR);
+	}
+
+	if (mdb_vread(&pg, sizeof (pg), wsp->walk_addr) != sizeof (pg)) {
+		mdb_warn("failed to read topo_pgroup_t at %p", wsp->walk_addr);
+		return (WALK_ERR);
+	}
+
+	wsp->walk_addr = (uintptr_t)pg.tpg_pvals.l_next;
+	wsp->walk_data = mdb_alloc(sizeof (topo_proplist_t), UM_SLEEP);
+
+	return (WALK_NEXT);
+}
+
+
+static int
+tpl_walk_step(mdb_walk_state_t *wsp)
+{
+	int rv;
+	topo_proplist_t *plp;
+
+	if (wsp->walk_addr == NULL)
+		return (WALK_DONE);
+
+	if (mdb_vread(wsp->walk_data, sizeof (topo_proplist_t), wsp->walk_addr)
+	    == -1) {
+
+		mdb_warn("failed to read topo_proplist_t at %p",
+		    wsp->walk_addr);
+		return (WALK_DONE);
+	}
+	plp = (topo_proplist_t *)wsp->walk_data;
+
+	rv = wsp->walk_callback(wsp->walk_addr, wsp->walk_data,
+	    wsp->walk_cbdata);
+
+	wsp->walk_addr = (uintptr_t)plp->tp_list.l_next;
+
+	return (rv);
+}
+
+
+static void
+tpl_walk_fini(mdb_walk_state_t *wsp)
+{
+	mdb_free(wsp->walk_data, sizeof (topo_proplist_t));
+}
+
+
+static int
+tnh_walk_init(mdb_walk_state_t *wsp)
+{
+	tnode_t node;
+	tnwalk_state_t *state;
+
+	if (wsp->walk_addr == NULL) {
+		mdb_warn("NULL tnode_t passed in");
+		return (WALK_ERR);
+	}
+
+	if (mdb_vread(&node, sizeof (node), wsp->walk_addr) != sizeof (node)) {
+		mdb_warn("failed to read tnode_t at %p", wsp->walk_addr);
+		return (WALK_ERR);
+	}
+
+	state = mdb_zalloc(sizeof (tnwalk_state_t), UM_SLEEP);
+
+	state->curr_hash = (topo_nodehash_t *)node.tn_children.l_next;
+	state->hash_idx = 0;
+	wsp->walk_data = state;
+
+	return (WALK_NEXT);
+}
+
+
+static int
+tnh_walk_step(mdb_walk_state_t *wsp)
+{
+	tnwalk_state_t *state = wsp->walk_data;
+	int rv, i = state->hash_idx++;
+	tnode_t *npp;
+
+	if (state->curr_hash == NULL)
+		return (WALK_DONE);
+
+	if (mdb_vread(&(state->hash), sizeof (topo_nodehash_t),
+	    (uintptr_t)state->curr_hash) != sizeof (topo_nodehash_t)) {
+
+		mdb_warn("failed to read topo_nodehash_t at %p",
+		    (uintptr_t)state->curr_hash);
+		return (WALK_ERR);
+	}
+
+	if (mdb_vread(&npp, sizeof (tnode_t *),
+	    (uintptr_t)(state->hash.th_nodearr+i)) != sizeof (tnode_t *)) {
+
+		mdb_warn("failed to read %u bytes at %p", sizeof (tnode_t *),
+		    state->hash.th_nodearr+i);
+		return (WALK_ERR);
+	}
+	wsp->walk_addr = (uintptr_t)npp;
+
+	rv = wsp->walk_callback(wsp->walk_addr, state, wsp->walk_cbdata);
+
+	if (state->hash_idx >= state->hash.th_arrlen) {
+		/*
+		 * move on to the next child hash bucket
+		 */
+		state->curr_hash =
+		    (topo_nodehash_t *)(state->hash.th_list.l_next);
+		state->hash_idx = 0;
+	}
+
+	return (rv);
+}
+
+
+static void
+tnh_walk_fini(mdb_walk_state_t *wsp)
+{
+	mdb_free(wsp->walk_data, sizeof (tnwalk_state_t));
+}
+
+
+static const mdb_dcmd_t dcmds[] = {
+	{ "topo_handle", "", "print contents of a topo handle", topo_handle,
+		NULL },
+	{ "topo_module", "", "print contents of a topo module handle",
+		topo_module, NULL },
+	{ "topo_node", "", "print contents of a topo node", topo_node, NULL },
+	{ "fmtopo", "[-P <pgroup>][-s <scheme>][-v]",
+	    "print topology of the given handle", fmtopo, NULL },
+	{ NULL }
+};
+
+static const mdb_walker_t walkers[] = {
+	{ "topo_tree", "walk the tree list for a given topo handle",
+		ttree_walk_init, ttree_walk_step, ttree_walk_fini, NULL },
+	{ "topo_module", "walk the module hash for a given topo handle",
+		tmod_walk_init, tmod_walk_step, tmod_walk_fini, NULL },
+	{ "topo_pgroup", "walk the property groups for a given topo node",
+		tpg_walk_init, tpg_walk_step, tpg_walk_fini, NULL },
+	{ "topo_proplist", "walk the property list for a given property group",
+		tpl_walk_init, tpl_walk_step, tpl_walk_fini, NULL },
+	{ "topo_nodehash", "walk the child nodehash for a given topo node",
+		tnh_walk_init, tnh_walk_step, tnh_walk_fini, NULL },
+	{ NULL }
+};
+
+static const mdb_modinfo_t modinfo = {
+	MDB_API_VERSION, dcmds, walkers
+};
+
+const mdb_modinfo_t *
+_mdb_init(void)
+{
+	return (&modinfo);
+}
--- a/usr/src/cmd/mdb/intel/amd64/genunix/Makefile	Fri Dec 22 09:18:37 2006 -0800
+++ b/usr/src/cmd/mdb/intel/amd64/genunix/Makefile	Fri Dec 22 11:30:38 2006 -0800
@@ -38,6 +38,7 @@
 	cyclic.c \
 	devinfo.c \
 	findstack.c \
+	fm.c \
 	genunix.c \
 	kgrep.c \
 	kmem.c \
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/usr/src/cmd/mdb/intel/amd64/libtopo/Makefile	Fri Dec 22 11:30:38 2006 -0800
@@ -0,0 +1,38 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+
+#
+# Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
+# Use is subject to license terms.
+#
+#ident	"%Z%%M%	%I%	%E% SMI"
+
+MODULE = libtopo.so
+MDBTGT = proc
+
+MODSRCS = libtopo.c
+
+include ../../../../Makefile.cmd
+include ../../../../Makefile.cmd.64
+include ../../Makefile.amd64
+include ../../../Makefile.module
+
+CPPFLAGS += -I$(SRC)/lib/fm/topo/libtopo/common
--- a/usr/src/cmd/mdb/intel/ia32/genunix/Makefile	Fri Dec 22 09:18:37 2006 -0800
+++ b/usr/src/cmd/mdb/intel/ia32/genunix/Makefile	Fri Dec 22 11:30:38 2006 -0800
@@ -38,6 +38,7 @@
 	cyclic.c \
 	devinfo.c \
 	findstack.c \
+	fm.c \
 	genunix.c \
 	kgrep.c \
 	kmem.c \
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/usr/src/cmd/mdb/intel/ia32/libtopo/Makefile	Fri Dec 22 11:30:38 2006 -0800
@@ -0,0 +1,37 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+
+#
+# Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
+# Use is subject to license terms.
+#
+#ident	"%Z%%M%	%I%	%E% SMI"
+
+MODULE = libtopo.so
+MDBTGT = proc
+
+MODSRCS = libtopo.c
+
+include ../../../../Makefile.cmd
+include ../../Makefile.ia32
+include ../../../Makefile.module
+
+CPPFLAGS += -I$(SRC)/lib/fm/topo/libtopo/common
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/usr/src/cmd/mdb/sparc/v7/libtopo/Makefile	Fri Dec 22 11:30:38 2006 -0800
@@ -0,0 +1,37 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+
+#
+# Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
+# Use is subject to license terms.
+#
+#ident	"%Z%%M%	%I%	%E% SMI"
+
+MODULE = libtopo.so
+MDBTGT = proc
+
+MODSRCS = libtopo.c
+
+include ../../../../Makefile.cmd
+include ../../Makefile.sparcv7
+include ../../../Makefile.module
+
+CPPFLAGS += -I$(SRC)/lib/fm/topo/libtopo/common
--- a/usr/src/cmd/mdb/sparc/v9/genunix/Makefile	Fri Dec 22 09:18:37 2006 -0800
+++ b/usr/src/cmd/mdb/sparc/v9/genunix/Makefile	Fri Dec 22 11:30:38 2006 -0800
@@ -38,6 +38,7 @@
 	cyclic.c \
 	devinfo.c \
 	findstack.c \
+	fm.c \
 	genunix.c \
 	kgrep.c \
 	kmem.c \
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/usr/src/cmd/mdb/sparc/v9/libtopo/Makefile	Fri Dec 22 11:30:38 2006 -0800
@@ -0,0 +1,38 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+
+#
+# Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
+# Use is subject to license terms.
+#
+#ident	"%Z%%M%	%I%	%E% SMI"
+
+MODULE = libtopo.so
+MDBTGT = proc
+
+MODSRCS = libtopo.c
+
+include ../../../../Makefile.cmd
+include ../../../../Makefile.cmd.64
+include ../../Makefile.sparcv9
+include ../../../Makefile.module
+
+CPPFLAGS += -I$(SRC)/lib/fm/topo/libtopo/common
--- a/usr/src/lib/fm/topo/libtopo/common/hc.c	Fri Dec 22 09:18:37 2006 -0800
+++ b/usr/src/lib/fm/topo/libtopo/common/hc.c	Fri Dec 22 11:30:38 2006 -0800
@@ -163,6 +163,9 @@
 	struct utsname uts;
 	char *prod, *csn, *server;
 
+	if (auth == NULL)
+		return;
+
 	if (topo_pgroup_create(node, &auth_pgroup, &err) != 0) {
 		if (err != ETOPO_PROP_DEFD)
 			return;
@@ -210,7 +213,7 @@
 /*ARGSUSED*/
 int
 hc_enum(topo_mod_t *mod, tnode_t *pnode, const char *name, topo_instance_t min,
-    topo_instance_t max, void *notused1, void *arg)
+    topo_instance_t max, void *notused1, void *notused2)
 {
 	nvlist_t *pfmri = NULL;
 	nvlist_t *nvl;
@@ -233,8 +236,7 @@
 	}
 
 	(void) topo_node_resource(pnode, &pfmri, &err);
-	if (arg == NULL)
-		auth = topo_mod_auth(mod, pnode);
+	auth = topo_mod_auth(mod, pnode);
 	nvl = hc_fmri_create(mod, pfmri, FM_HC_SCHEME_VERSION, name, min,
 	    auth, NULL, NULL, NULL);
 	nvlist_free(pfmri);	/* callee ignores NULLs */
@@ -251,8 +253,7 @@
 		return (-1);
 	}
 
-	if (arg == NULL)
-		hc_prop_set(node, auth);
+	hc_prop_set(node, auth);
 	nvlist_free(nvl);
 	nvlist_free(auth);
 
--- a/usr/src/lib/fm/topo/libtopo/common/libtopo.h	Fri Dec 22 09:18:37 2006 -0800
+++ b/usr/src/lib/fm/topo/libtopo/common/libtopo.h	Fri Dec 22 11:30:38 2006 -0800
@@ -128,11 +128,10 @@
 extern int topo_fmri_asru(topo_hdl_t *, nvlist_t *, nvlist_t **, int *);
 extern int topo_fmri_fru(topo_hdl_t *, nvlist_t *, nvlist_t **,
     int *);
+extern int topo_fmri_label(topo_hdl_t *, nvlist_t *, char **, int *);
 extern int topo_fmri_compare(topo_hdl_t *, nvlist_t *, nvlist_t *, int *);
 extern int topo_fmri_invoke(topo_hdl_t *, nvlist_t *, topo_walk_cb_t, void *,
     int *);
-extern nvlist_t *topo_fmri_create(topo_hdl_t *, const char *, const char *,
-    topo_instance_t, nvlist_t *, int *);
 
 /*
  * Topo node utilities: callable from topo_walk_step() callback or module
--- a/usr/src/lib/fm/topo/libtopo/common/mapfile-vers	Fri Dec 22 09:18:37 2006 -0800
+++ b/usr/src/lib/fm/topo/libtopo/common/mapfile-vers	Fri Dec 22 11:30:38 2006 -0800
@@ -36,6 +36,7 @@
 	topo_fmri_expand;
 	topo_fmri_fru;
 	topo_fmri_invoke;
+	topo_fmri_label;
 	topo_fmri_nvl2str;
 	topo_fmri_present;
 	topo_fmri_str2nvl;
--- a/usr/src/lib/fm/topo/libtopo/common/mem.c	Fri Dec 22 09:18:37 2006 -0800
+++ b/usr/src/lib/fm/topo/libtopo/common/mem.c	Fri Dec 22 11:30:38 2006 -0800
@@ -123,10 +123,10 @@
 	 * If we have a DIMM offset, include it in the string.  If we have a
 	 * PA then use that.  Otherwise just format the unum element.
 	 */
-	if (nvlist_lookup_uint64(nvl, FM_FMRI_MEM_OFFSET, &val) == 0) {
+	if (nvlist_lookup_uint64(in, FM_FMRI_MEM_OFFSET, &val) == 0) {
 		format = FM_FMRI_SCHEME_MEM ":///%1$s/"
 		    FM_FMRI_MEM_OFFSET "=%2$llx";
-	} else if (nvlist_lookup_uint64(nvl, FM_FMRI_MEM_PHYSADDR, &val) == 0) {
+	} else if (nvlist_lookup_uint64(in, FM_FMRI_MEM_PHYSADDR, &val) == 0) {
 		format = FM_FMRI_SCHEME_MEM ":///%1$s/"
 		    FM_FMRI_MEM_PHYSADDR "=%2$llx";
 	} else
--- a/usr/src/lib/fm/topo/libtopo/common/mod.c	Fri Dec 22 09:18:37 2006 -0800
+++ b/usr/src/lib/fm/topo/libtopo/common/mod.c	Fri Dec 22 11:30:38 2006 -0800
@@ -42,6 +42,7 @@
 #include <gelf.h>
 
 #include <topo_method.h>
+#include <topo_subr.h>
 #include <mod.h>
 
 static int mod_enum(topo_mod_t *, tnode_t *, const char *, topo_instance_t,
@@ -49,10 +50,14 @@
 static void mod_release(topo_mod_t *, tnode_t *);
 static int mod_fmri_create_meth(topo_mod_t *, tnode_t *, topo_version_t,
     nvlist_t *, nvlist_t **);
+static int mod_fmri_nvl2str(topo_mod_t *, tnode_t *, topo_version_t,
+    nvlist_t *, nvlist_t **);
 
 static const topo_method_t mod_methods[] = {
 	{ TOPO_METH_FMRI, TOPO_METH_FMRI_DESC, TOPO_METH_FMRI_VERSION,
 	    TOPO_STABILITY_INTERNAL, mod_fmri_create_meth },
+	{ TOPO_METH_NVL2STR, TOPO_METH_NVL2STR_DESC, TOPO_METH_NVL2STR_VERSION,
+	    TOPO_STABILITY_INTERNAL, mod_fmri_nvl2str },
 	{ NULL }
 };
 
@@ -101,21 +106,20 @@
 	topo_method_unregister_all(mod, node);
 }
 
-static char *
-mod_binary_path_get(topo_mod_t *mp, char *objpath)
+static int
+mod_binary_path_get(topo_mod_t *mp, const char *objpath)
 {
-	static char Pathbuf[PATH_MAX];
 	Elf *elf = NULL;
 	Elf_Scn *scn = NULL;
-	Elf_Data *edata;
 	GElf_Ehdr ehdr;
 	GElf_Shdr shdr;
 	int fd;
 
 	if ((fd = open(objpath, O_RDONLY)) < 0) {
-		topo_mod_dprintf(mp, "failed to open %s", objpath);
-		goto mbpg_bail;
+		topo_mod_dprintf(mp, "unable to open %s\n", objpath);
+		return (-1);
 	}
+
 	if (elf_version(EV_CURRENT) == EV_NONE) {
 		topo_mod_dprintf(mp, "Elf version out of whack\n");
 		goto mbpg_bail;
@@ -141,16 +145,15 @@
 		    ehdr.e_shstrndx, (size_t)shdr.sh_name);
 		if (strcmp(sh_name, ".filename") != 0)
 			continue;
-		if ((edata = elf_getdata(scn, NULL)) == NULL) {
+		if (elf_getdata(scn, NULL) == NULL) {
 			topo_mod_dprintf(mp, "no filename data");
 			break;
 		}
-		(void) strlcpy(Pathbuf, edata->d_buf, PATH_MAX);
 		break;
 	}
 	elf_end(elf);
 	(void) close(fd);
-	return (Pathbuf);
+	return (0);
 
 mbpg_bail:
 	if (elf != NULL)
@@ -158,7 +161,7 @@
 	if (fd >= 0)
 		(void) close(fd);
 	(void) topo_mod_seterrno(mp, EMOD_METHOD_INVAL);
-	return (NULL);
+	return (-1);
 }
 
 static int
@@ -178,7 +181,6 @@
 	mi.mi_id = mi.mi_nextid = id;
 	mi.mi_info = MI_INFO_ONE | MI_INFO_NOBASE;
 	if (modctl(MODINFO, id, &mi) < 0) {
-		topo_mod_dprintf(mp, "failed to get modinfo for %s", path);
 		return (topo_mod_seterrno(mp, EMOD_METHOD_INVAL));
 	}
 	mi.mi_name[MODMAXNAMELEN - 1] = '\0';
@@ -199,9 +201,7 @@
 mod_fmri_create(topo_mod_t *mp, const char *driver)
 {
 	nvlist_t *out = NULL;
-	nvlist_t *pkg = NULL;
 	char objpath[PATH_MAX];
-	char *path = NULL;
 
 	if (topo_mod_nvalloc(mp, &out, NV_UNIQUE_NAME) != 0) {
 		(void) topo_mod_seterrno(mp, EMOD_FMRI_NVL);
@@ -210,27 +210,20 @@
 
 	(void) snprintf(objpath, PATH_MAX, "%s/%s/object", OBJFS_ROOT, driver);
 
-	if ((path = mod_binary_path_get(mp, objpath)) == NULL)
-		goto mfc_bail;
-
-	if (mod_nvl_data(mp, out, objpath) < 0)
+	/*
+	 * Validate the module object ELF header if possible
+	 */
+	if (mod_binary_path_get(mp, objpath) < 0)
 		goto mfc_bail;
 
-	pkg = topo_mod_pkgfmri(mp, FM_PKG_SCHEME_VERSION, path);
-	if (pkg == NULL) {
+	if (mod_nvl_data(mp, out, objpath) < 0) {
+		topo_mod_dprintf(mp, "failed to get modinfo for %s", driver);
 		goto mfc_bail;
 	}
 
-	if (nvlist_add_nvlist(out, FM_FMRI_MOD_PKG, pkg) != 0) {
-		(void) topo_mod_seterrno(mp, EMOD_FMRI_NVL);
-		goto mfc_bail;
-	}
-	nvlist_free(pkg);
-
 	return (out);
 
 mfc_bail:
-	nvlist_free(pkg);
 	nvlist_free(out);
 	return (NULL);
 }
@@ -257,8 +250,123 @@
 	if (modnvl == NULL) {
 		*out = NULL;
 		topo_mod_dprintf(mp, "failed to create contained mod FMRI\n");
-		return (topo_mod_seterrno(mp, EMOD_FMRI_NVL));
+		return (-1);
 	}
 	*out = modnvl;
 	return (0);
 }
+
+#define	MAXINTSTR	11
+
+static ssize_t
+fmri_nvl2str(nvlist_t *nvl, char *buf, size_t buflen)
+{
+	nvlist_t *anvl = NULL;
+	uint8_t version;
+	ssize_t size = 0;
+	int32_t modid;
+	char *achas = NULL;
+	char *aprod = NULL;
+	char *asrvr = NULL;
+	char *modname = NULL;
+	char numbuf[MAXINTSTR];
+	int more_auth = 0;
+	int err;
+
+	if (nvlist_lookup_uint8(nvl, FM_VERSION, &version) != 0 ||
+	    version > FM_MOD_SCHEME_VERSION)
+		return (-1);
+
+	/* Get authority, if present */
+	err = nvlist_lookup_nvlist(nvl, FM_FMRI_AUTHORITY, &anvl);
+	if (err != 0 && err != ENOENT)
+		return (-1);
+
+	/*
+	 *  For brevity, we only include the module name and id
+	 *  present in the FMRI in our output string.  The FMRI
+	 *  also has data on the package containing the module.
+	 */
+
+	/* There must be a module name */
+	err = nvlist_lookup_string(nvl, FM_FMRI_MOD_NAME, &modname);
+	if (err != 0 || modname == NULL)
+		return (-1);
+
+	/* There must be a module id */
+	err = nvlist_lookup_int32(nvl, FM_FMRI_MOD_ID, &modid);
+	if (err != 0)
+		return (-1);
+
+	if (anvl != NULL) {
+		(void) nvlist_lookup_string(anvl,
+		    FM_FMRI_AUTH_PRODUCT, &aprod);
+		(void) nvlist_lookup_string(anvl,
+		    FM_FMRI_AUTH_CHASSIS, &achas);
+		(void) nvlist_lookup_string(anvl,
+		    FM_FMRI_AUTH_SERVER, &asrvr);
+		if (aprod != NULL)
+			more_auth++;
+		if (achas != NULL)
+			more_auth++;
+		if (asrvr != NULL)
+			more_auth++;
+	}
+
+	/* mod:// */
+	topo_fmristr_build(&size, buf, buflen, FM_FMRI_SCHEME_MOD, NULL, "://");
+
+	/* authority, if any */
+	if (aprod != NULL)
+		topo_fmristr_build(&size, buf, buflen, aprod,
+		    ":" FM_FMRI_AUTH_PRODUCT "=", NULL);
+	if (achas != NULL)
+		topo_fmristr_build(&size, buf, buflen, achas,
+		    ":" FM_FMRI_AUTH_CHASSIS "=", NULL);
+	if (asrvr != NULL)
+		topo_fmristr_build(&size, buf, buflen, asrvr,
+		    ":" FM_FMRI_AUTH_SERVER "=", NULL);
+
+	/* module parts */
+	topo_fmristr_build(&size, buf, buflen, modname,
+	    "/" FM_FMRI_MOD_NAME "=", "/");
+
+	(void) snprintf(numbuf, MAXINTSTR, "%d", modid);
+	topo_fmristr_build(&size, buf, buflen, numbuf, FM_FMRI_MOD_ID "=",
+	    NULL);
+
+	return (size);
+}
+
+/*ARGSUSED*/
+static int
+mod_fmri_nvl2str(topo_mod_t *mod, tnode_t *node, topo_version_t version,
+    nvlist_t *nvl, nvlist_t **out)
+{
+	ssize_t len;
+	char *name = NULL;
+	nvlist_t *fmristr;
+
+	if (version > TOPO_METH_NVL2STR_VERSION)
+		return (topo_mod_seterrno(mod, EMOD_VER_NEW));
+
+	if ((len = fmri_nvl2str(nvl, NULL, 0)) == 0 ||
+	    (name = topo_mod_alloc(mod, len + 1)) == NULL ||
+	    fmri_nvl2str(nvl, name, len + 1) == 0) {
+		if (name != NULL)
+			topo_mod_free(mod, name, len + 1);
+		return (topo_mod_seterrno(mod, EMOD_FMRI_NVL));
+	}
+
+	if (topo_mod_nvalloc(mod, &fmristr, NV_UNIQUE_NAME) != 0)
+		return (topo_mod_seterrno(mod, EMOD_FMRI_NVL));
+	if (nvlist_add_string(fmristr, "fmri-string", name) != 0) {
+		topo_mod_free(mod, name, len + 1);
+		nvlist_free(fmristr);
+		return (topo_mod_seterrno(mod, EMOD_FMRI_NVL));
+	}
+	topo_mod_free(mod, name, len + 1);
+	*out = fmristr;
+
+	return (0);
+}
--- a/usr/src/lib/fm/topo/libtopo/common/topo_builtin.c	Fri Dec 22 09:18:37 2006 -0800
+++ b/usr/src/lib/fm/topo/libtopo/common/topo_builtin.c	Fri Dec 22 11:30:38 2006 -0800
@@ -47,7 +47,7 @@
 	{ "pkg", PKG_VERSION, pkg_init, pkg_fini },
 	{ "mod", MOD_VERSION, mod_init, mod_fini },
 	{ "hc", HC_VERSION, hc_init, hc_fini },		/* hc must go last */
-	{ NULL, NULL, NULL }
+	{ NULL, 0, NULL, NULL }
 };
 
 static int
--- a/usr/src/lib/fm/topo/libtopo/common/topo_error.h	Fri Dec 22 09:18:37 2006 -0800
+++ b/usr/src/lib/fm/topo/libtopo/common/topo_error.h	Fri Dec 22 11:30:38 2006 -0800
@@ -80,6 +80,7 @@
     ETOPO_ENUM_PARTIAL,	/* partial enumeration completed for client */
     ETOPO_ENUM_NOMAP,	/* no topology map file for enumeration */
     ETOPO_ENUM_FATAL,	/* fatal enumeration error */
+    ETOPO_ENUM_RECURS,	/* recursive enumertation detected */
     ETOPO_FMRI_NVL,	/* nvlist allocation failure for FMRI */
     ETOPO_FMRI_VERSION, /* invalid FMRI scheme version */
     ETOPO_FMRI_MALFORM,	/* malformed FMRI */
--- a/usr/src/lib/fm/topo/libtopo/common/topo_fmri.c	Fri Dec 22 09:18:37 2006 -0800
+++ b/usr/src/lib/fm/topo/libtopo/common/topo_fmri.c	Fri Dec 22 11:30:38 2006 -0800
@@ -274,66 +274,159 @@
 	return (0);
 }
 
-struct rsrc {
-	int rs_err;
-	int rs_flag;
-	nvlist_t **rs_fprop;
-	nvlist_t *rs_priv;
+struct prop_lookup {
+	int pl_err;
+	topo_type_t pl_type;
+	const char *pl_group;
+	const char *pl_name;
+	nvlist_t **pl_prop;
+	nvlist_t *pl_resource;
 };
 
-/*ARGSUSED*/
 static int
-get_prop(topo_hdl_t *thp, tnode_t *node, void *pdata)
+prop_lookup(topo_hdl_t *thp, tnode_t *node, void *pdata)
 {
-	struct rsrc *rsp = (struct rsrc *)pdata;
+	int rc;
+	nvlist_t *r1;
+	struct prop_lookup *plp = (struct prop_lookup *)pdata;
+
+	if (topo_node_resource(node, &r1, &plp->pl_err) != 0)
+		return (TOPO_WALK_ERR);
+
+	rc = topo_fmri_compare(thp, r1, plp->pl_resource, &plp->pl_err);
+	nvlist_free(r1);
+	if (rc == 0)
+		return (TOPO_WALK_NEXT);
+	if (rc < 0)
+		return (TOPO_WALK_ERR);
 
-	if (rsp->rs_flag == 0) {
-		if (topo_node_asru(node, rsp->rs_fprop, rsp->rs_priv,
-		    &rsp->rs_err) < 0)
-			return (-1);
+	/*
+	 * Special case for dynamically created ASRU and FRU
+	 */
+	if (strcmp(plp->pl_group, TOPO_PGROUP_PROTOCOL) == 0) {
+		if (strcmp(plp->pl_name, TOPO_PROP_ASRU) == 0) {
+			if (topo_node_asru(node, plp->pl_prop, plp->pl_resource,
+			    &plp->pl_err) < 0) {
+				return (TOPO_WALK_ERR);
+			}
+			return (0);
+		} else if (strcmp(plp->pl_name, TOPO_PROP_FRU) == 0) {
+			if (topo_node_fru(node, plp->pl_prop, plp->pl_resource,
+			    &plp->pl_err) < 0) {
+				return (TOPO_WALK_ERR);
+			}
+			return (0);
+		}
+	}
 
-		return (0);
-	} else {
-		if (topo_node_fru(node, rsp->rs_fprop, rsp->rs_priv,
-		    &rsp->rs_err) < 0)
-			return (-1);
+	switch (plp->pl_type) {
+		case TOPO_TYPE_STRING:
+		{
+			char *str;
+			if (topo_prop_get_string(node, plp->pl_group,
+			    plp->pl_name, &str, &plp->pl_err) < 0)
+				return (TOPO_WALK_ERR);
 
-		return (0);
+			if (nvlist_add_string(*plp->pl_prop, "prop", str)
+			    != 0) {
+				topo_hdl_strfree(thp, str);
+				plp->pl_err = ETOPO_PROP_NVL;
+				return (TOPO_WALK_ERR);
+			}
+			topo_hdl_strfree(thp, str);
+			return (TOPO_WALK_TERMINATE);
+		}
+		default:
+			plp->pl_err = ETOPO_PROP_TYPE;
+			return (TOPO_WALK_ERR);
 	}
+
 }
 
-int
-topo_fmri_asru(topo_hdl_t *thp, nvlist_t *nvl, nvlist_t **asru, int *err)
+static int
+fmri_prop(topo_hdl_t *thp, nvlist_t *resource, const char *pgname,
+    const char *pname, topo_type_t type, nvlist_t **prop, int *err)
 {
-	struct rsrc r;
+	int rc;
+	topo_walk_t *wp;
+	char *scheme;
+	struct prop_lookup pl;
+
+	if (nvlist_lookup_string(resource, FM_FMRI_SCHEME, &scheme)   != 0)
+		return (set_error(thp, ETOPO_METHOD_INVAL, err,
+		    "fmri_prop", NULL));
 
-	r.rs_flag = 0;
-	r.rs_err = 0;
-	r.rs_priv = nvl;
-	r.rs_fprop = asru;
-	if (topo_fmri_invoke(thp, nvl, get_prop, &r, err) < 0) {
+	pl.pl_resource = resource;
+	pl.pl_err = 0;
+	pl.pl_type = type;
+	pl.pl_group = pgname;
+	pl.pl_name = pname;
+	pl.pl_prop = prop;
+	if ((wp = topo_walk_init(thp, scheme, prop_lookup, &pl, err)) == NULL)
+		return (set_error(thp, pl.pl_err, err, "fmri_prop", NULL));
 
-		return (set_error(thp, *err, err, "topo_fmri_asru", NULL));
+	rc = topo_walk_step(wp, TOPO_WALK_CHILD);
+	topo_walk_fini(wp);
+
+	if (rc == TOPO_WALK_ERR) {
+		return (set_error(thp, pl.pl_err, err, "fmri_prop", NULL));
 	}
 
 	return (0);
 }
 
 int
-topo_fmri_fru(topo_hdl_t *thp, nvlist_t *nvl, nvlist_t **fru,
-    int *err)
+topo_fmri_asru(topo_hdl_t *thp, nvlist_t *nvl, nvlist_t **asru, int *err)
 {
-	struct rsrc r;
+	if (fmri_prop(thp, nvl, TOPO_PGROUP_PROTOCOL, TOPO_PROP_ASRU,
+	    TOPO_TYPE_FMRI, asru, err) < 0)
+		return (set_error(thp, *err, err, "topo_fmri_asru", NULL));
+
+	return (0);
+}
+
+int
+topo_fmri_fru(topo_hdl_t *thp, nvlist_t *nvl, nvlist_t **fru, int *err)
+{
+
+	if (fmri_prop(thp, nvl, TOPO_PGROUP_PROTOCOL, TOPO_PROP_FRU,
+	    TOPO_TYPE_FMRI, fru, err) < 0)
+		return (set_error(thp, *err, err, "topo_fmri_fru", NULL));
+
+	return (0);
+}
 
-	r.rs_flag = 1;
-	r.rs_err = 0;
-	r.rs_priv = nvl;
-	r.rs_fprop = fru;
-	if (topo_fmri_invoke(thp, nvl, get_prop, &r, err) < 0) {
+int
+topo_fmri_label(topo_hdl_t *thp, nvlist_t *fmri, char **label, int *err)
+{
+	nvlist_t *nvl, *fru;
+	char *str;
+
+	if (topo_fmri_fru(thp, fmri, &fru, err) < 0)
+		return (set_error(thp, *err, err, "topo_fmri_label", NULL));
+
+	if (topo_hdl_nvalloc(thp, &nvl, NV_UNIQUE_NAME) < 0)
+		return (set_error(thp, ETOPO_PROP_NVL, err, "topo_fmri_label",
+		    NULL));
 
-		return (set_error(thp, *err, err, "topo_fmri_fru", NULL));
+	if (fmri_prop(thp, fru, TOPO_PGROUP_PROTOCOL, TOPO_PROP_LABEL,
+	    TOPO_TYPE_STRING, &nvl, err) < 0) {
+		nvlist_free(fru);
+		return (set_error(thp, *err, err, "topo_fmri_label", nvl));
 	}
 
+	nvlist_free(fru);
+
+	if (nvlist_lookup_string(nvl, "prop", &str) != 0)
+		return (set_error(thp, ETOPO_PROP_NVL, err, "topo_fmri_label",
+		    nvl));
+
+	if ((*label = topo_hdl_strdup(thp, str)) == NULL)
+		return (set_error(thp, ETOPO_PROP_NOMEM, err,
+		    "topo_fmri_label", nvl));
+
+	nvlist_free(nvl);
+
 	return (0);
 }
 
@@ -378,7 +471,7 @@
 	return (rc);
 }
 
-struct topo_lookup {
+struct topo_invoke {
 	nvlist_t *tl_resource;
 	topo_walk_cb_t tl_func;
 	int tl_ret;
@@ -386,10 +479,10 @@
 };
 
 static int
-walk_lookup(topo_hdl_t *thp, tnode_t *node, void *pdata)
+walk_invoke(topo_hdl_t *thp, tnode_t *node, void *pdata)
 {
 	int rc;
-	struct topo_lookup *tlp = (struct topo_lookup *)pdata;
+	struct topo_invoke *tlp = (struct topo_invoke *)pdata;
 	nvlist_t *r1, *r2 = tlp->tl_resource;
 
 	if (topo_node_resource(node, &r1, &tlp->tl_ret) != 0)
@@ -414,7 +507,7 @@
 	int err;
 	topo_walk_t *wp;
 	char *scheme;
-	struct topo_lookup tl;
+	struct topo_invoke tl;
 
 	if (nvlist_lookup_string(nvl, FM_FMRI_SCHEME, &scheme)   != 0)
 		return (set_error(thp, ETOPO_METHOD_INVAL, ret,
@@ -424,7 +517,7 @@
 	tl.tl_func = cb_f;
 	tl.tl_pdata = pdata;
 	tl.tl_ret = 0;
-	if ((wp = topo_walk_init(thp, scheme, walk_lookup, &tl, &err)) == NULL)
+	if ((wp = topo_walk_init(thp, scheme, walk_invoke, &tl, &err)) == NULL)
 		return (set_error(thp, err, ret, "topo_fmri_invoke", NULL));
 
 	err = topo_walk_step(wp, TOPO_WALK_CHILD);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/usr/src/lib/fm/topo/libtopo/common/topo_fmri.h	Fri Dec 22 11:30:38 2006 -0800
@@ -0,0 +1,46 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+
+/*
+ * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef _TOPO_FMRI_H
+#define	_TOPO_FMRI_H
+
+#pragma ident	"%Z%%M%	%I%	%E% SMI"
+
+#include <sys/nvpair.h>
+#include <stdio.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern nvlist_t *topo_fmri_create(topo_hdl_t *, const char *, const char *,
+    topo_instance_t, nvlist_t *, int *);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _TOPO_FMRI_H */
--- a/usr/src/lib/fm/topo/libtopo/common/topo_hc.h	Fri Dec 22 09:18:37 2006 -0800
+++ b/usr/src/lib/fm/topo/libtopo/common/topo_hc.h	Fri Dec 22 11:30:38 2006 -0800
@@ -69,6 +69,7 @@
 #define	TOPO_PGROUP_IO		"io"
 #define	TOPO_IO_DEVTYPE		"devtype"
 #define	TOPO_IO_DRIVER		"driver"
+#define	TOPO_IO_MODULE		"module"
 #define	TOPO_IO_DEV		"dev"
 #define	TOPO_IO_DEV_PATH	"devfs-path"
 #define	TOPO_IO_AP_PATH		"ap-path"
--- a/usr/src/lib/fm/topo/libtopo/common/topo_mod.c	Fri Dec 22 09:18:37 2006 -0800
+++ b/usr/src/lib/fm/topo/libtopo/common/topo_mod.c	Fri Dec 22 11:30:38 2006 -0800
@@ -77,6 +77,7 @@
 #include <topo_alloc.h>
 #include <topo_error.h>
 #include <topo_file.h>
+#include <topo_fmri.h>
 #include <topo_module.h>
 #include <topo_method.h>
 #include <topo_string.h>
@@ -461,8 +462,8 @@
 		return (set_fmri_err(mod, EMOD_FMRI_NVL));
 	}
 
-	if ((fmri = topo_fmri_create(mod->tm_hdl, FM_FMRI_SCHEME_CPU,
-	    FM_FMRI_SCHEME_CPU, 0, args, &err)) == NULL) {
+	if ((fmri = topo_fmri_create(mod->tm_hdl, FM_FMRI_SCHEME_PKG,
+	    FM_FMRI_SCHEME_PKG, 0, args, &err)) == NULL) {
 		nvlist_free(args);
 		return (set_fmri_err(mod, err));
 	}
@@ -493,8 +494,8 @@
 		return (set_fmri_err(mod, EMOD_FMRI_NVL));
 	}
 
-	if ((fmri = topo_fmri_create(mod->tm_hdl, FM_FMRI_SCHEME_CPU,
-	    FM_FMRI_SCHEME_CPU, 0, args, &err)) == NULL) {
+	if ((fmri = topo_fmri_create(mod->tm_hdl, FM_FMRI_SCHEME_MOD,
+	    FM_FMRI_SCHEME_MOD, 0, args, &err)) == NULL) {
 		nvlist_free(args);
 		return (set_fmri_err(mod, err));
 	}
--- a/usr/src/lib/fm/topo/libtopo/common/topo_xml.c	Fri Dec 22 09:18:37 2006 -0800
+++ b/usr/src/lib/fm/topo/libtopo/common/topo_xml.c	Fri Dec 22 11:30:38 2006 -0800
@@ -702,14 +702,28 @@
 	if ((str = xmlGetProp(nn, (xmlChar *)Static)) != NULL) {
 		if (xmlStrcmp(str, (xmlChar *)True) == 0)
 			s = 1;
+		xmlFree(str);
 	}
 
-	if (topo_mod_enumerate(rd->rd_mod, rd->rd_pn, rd->rd_finfo->tf_scheme,
-	    rd->rd_name, inst, inst, s == 1 ? &s : NULL) < 0)
+	if (s == 0) {
+		if (topo_mod_enumerate(rd->rd_mod, rd->rd_pn,
+		    rd->rd_finfo->tf_scheme, rd->rd_name, inst, inst,
+		    s == 1 ? &s : NULL) < 0)
+			goto nodedone;
+	}
+	ntn = topo_node_lookup(rd->rd_pn, rd->rd_name, inst);
+	if (ntn == NULL) {
+
+		/*
+		 * If this is a static node declaration, we can
+		 * ignore the lookup failure and continue
+		 * processing.  Otherwise, something
+		 * went wrong during enumeration
+		 */
+		if (s == 1)
+			rv = 0;
 		goto nodedone;
-	ntn = topo_node_lookup(rd->rd_pn, rd->rd_name, inst);
-	if (ntn == NULL)
-		goto nodedone;
+	}
 
 	if ((newi = tf_idata_new(mp, inst, ntn)) == NULL) {
 		topo_dprintf(mp->tm_hdl, TOPO_DBG_ERR,
@@ -748,13 +762,21 @@
 		(void) topo_mod_seterrno(mp, ETOPO_PRSR_NOATTR);
 		goto enodedone;
 	}
+
+	/*
+	 * Check for recursive enumeration
+	 */
+	if (strcmp(einfo->te_name, mp->tm_name) == 0) {
+		topo_dprintf(mp->tm_hdl, TOPO_DBG_ERR,
+		    "Recursive enumeration detected for %s\n",
+		    einfo->te_name);
+		(void) topo_mod_seterrno(mp, ETOPO_ENUM_RECURS);
+		goto enodedone;
+	}
 	if (xmlattr_to_int(mp, en, Version, &ui) < 0)
 		goto enodedone;
 	einfo->te_vers = (int)ui;
-	/*
-	 * FMXXX must deal with name-stability and apply-methods (which are
-	 * child xmlNodes)
-	 */
+
 	return (einfo);
 
 enodedone:
@@ -822,7 +844,7 @@
 	    rd->rd_name, topo_node_name(rd->rd_pn));
 	e = topo_node_range_create(mp,
 	    rd->rd_pn, rd->rd_name, rd->rd_min, rd->rd_max);
-	if (e != 0) {
+	if (e != 0 && topo_mod_errno(mp) != ETOPO_NODE_DUP) {
 		topo_dprintf(mp->tm_hdl, TOPO_DBG_ERR,
 		    "Range create failed due to %s.\n",
 		    topo_strerror(topo_mod_errno(mp)));
--- a/usr/src/lib/fm/topo/modules/SUNW,SPARC-Enterprise/ioboard/opl_hostbridge.c	Fri Dec 22 09:18:37 2006 -0800
+++ b/usr/src/lib/fm/topo/modules/SUNW,SPARC-Enterprise/ioboard/opl_hostbridge.c	Fri Dec 22 11:30:38 2006 -0800
@@ -111,6 +111,7 @@
 	tnode_t *rcn;
 	const char *slot_name;
 	char *dnpath;
+	nvlist_t *mod;
 
 	rcn = opl_node_create(mp, parent, PCIEX_ROOT, inst, (void *)dnode);
 	if (rcn == NULL) {
@@ -205,6 +206,14 @@
 	    TOPO_PROP_IMMUTABLE, OPL_PX_DRV, &err) != 0) {
 		topo_mod_dprintf(mp, "Failed to set DRIVER property\n");
 	}
+	if ((mod = topo_mod_modfmri(mp, FM_MOD_SCHEME_VERSION, OPL_PX_DRV))
+	    == NULL || topo_prop_set_fmri(rcn, TOPO_PGROUP_IO,
+	    TOPO_IO_MODULE, TOPO_PROP_IMMUTABLE, mod,  &err) != 0) {
+		topo_mod_dprintf(mp, "Failed to set MODULE property\n");
+	}
+	if (mod != NULL)
+		nvlist_free(mod);
+
 	/* This is a PCIEX Root Complex */
 	if (topo_prop_set_string(rcn, TOPO_PGROUP_PCI, TOPO_PCI_EXCAP,
 	    TOPO_PROP_IMMUTABLE, PCIEX_ROOT, &err) != 0) {
--- a/usr/src/lib/fm/topo/modules/common/pcibus/did_props.c	Fri Dec 22 09:18:37 2006 -0800
+++ b/usr/src/lib/fm/topo/modules/common/pcibus/did_props.c	Fri Dec 22 11:30:38 2006 -0800
@@ -52,6 +52,8 @@
     const char *, const char *, const char *);
 static int DRIVERprop_set(tnode_t *, did_t *,
     const char *, const char *, const char *);
+static int MODULEprop_set(tnode_t *, did_t *,
+    const char *, const char *, const char *);
 static int EXCAP_set(tnode_t *, did_t *,
     const char *, const char *, const char *);
 static int BDF_set(tnode_t *, did_t *,
@@ -91,6 +93,7 @@
 	{ DI_DEVTYPPROP, &io_pgroup, TOPO_IO_DEVTYPE, maybe_di_chars_copy },
 	{ DI_DEVIDPROP, &pci_pgroup, TOPO_PCI_DEVID, maybe_di_uint_to_str },
 	{ NULL, &io_pgroup, TOPO_IO_DRIVER, DRIVERprop_set },
+	{ NULL, &io_pgroup, TOPO_IO_MODULE, MODULEprop_set },
 	{ NULL, &pci_pgroup, TOPO_PCI_EXCAP, EXCAP_set },
 	{ DI_CLASSPROP, &pci_pgroup, TOPO_PCI_CLASS, maybe_di_uint_to_str },
 	{ DI_VENDIDPROP, &pci_pgroup, TOPO_PCI_VENDID, maybe_di_uint_to_str },
@@ -108,6 +111,7 @@
 txprop_t Bus_common_props[] = {
 	{ DI_DEVTYPPROP, &io_pgroup, TOPO_IO_DEVTYPE, maybe_di_chars_copy },
 	{ NULL, &io_pgroup, TOPO_IO_DRIVER, DRIVERprop_set },
+	{ NULL, &io_pgroup, TOPO_IO_MODULE, MODULEprop_set },
 	{ NULL, &protocol_pgroup, TOPO_PROP_LABEL, label_set },
 	{ NULL, &protocol_pgroup, TOPO_PROP_FRU, FRU_set },
 	{ NULL, &protocol_pgroup, TOPO_PROP_ASRU, ASRU_set }
@@ -117,6 +121,7 @@
 	{ NULL, &io_pgroup, TOPO_IO_DEV, DEVprop_set },
 	{ DI_DEVTYPPROP, &io_pgroup, TOPO_IO_DEVTYPE, maybe_di_chars_copy },
 	{ NULL, &io_pgroup, TOPO_IO_DRIVER, DRIVERprop_set },
+	{ NULL, &io_pgroup, TOPO_IO_MODULE, MODULEprop_set },
 	{ NULL, &pci_pgroup, TOPO_PCI_EXCAP, EXCAP_set },
 	{ NULL, &pci_pgroup, TOPO_PCI_BDF, BDF_set },
 	{ NULL, &protocol_pgroup, TOPO_PROP_LABEL, label_set },
@@ -139,6 +144,7 @@
 txprop_t HB_common_props[] = {
 	{ NULL, &io_pgroup, TOPO_IO_DEV, DEVprop_set },
 	{ NULL, &io_pgroup, TOPO_IO_DRIVER, DRIVERprop_set },
+	{ NULL, &io_pgroup, TOPO_IO_MODULE, MODULEprop_set },
 	{ NULL, &protocol_pgroup, TOPO_PROP_LABEL, label_set },
 	{ NULL, &protocol_pgroup, TOPO_PROP_FRU, FRU_set },
 	{ NULL, &protocol_pgroup, TOPO_PROP_ASRU, ASRU_set }
@@ -599,6 +605,33 @@
 
 /*ARGSUSED*/
 static int
+MODULEprop_set(tnode_t *tn, did_t *pd,
+    const char *dpnm, const char *tpgrp, const char *tpnm)
+{
+	nvlist_t *mod;
+	topo_mod_t *mp;
+	char *dnm;
+	int err;
+
+	if ((dnm = di_driver_name(did_dinode(pd))) == NULL)
+		return (0);
+
+	mp = did_mod(pd);
+	if ((mod = topo_mod_modfmri(mp, FM_MOD_SCHEME_VERSION, dnm)) == NULL)
+		return (-1); /* mod errno set */
+
+	if (topo_prop_set_fmri(tn, tpgrp, tpnm, TOPO_PROP_IMMUTABLE, mod,
+	    &err) < 0) {
+		nvlist_free(mod);
+		return (topo_mod_seterrno(mp, err));
+	}
+	nvlist_free(mod);
+
+	return (0);
+}
+
+/*ARGSUSED*/
+static int
 maybe_di_chars_copy(tnode_t *tn, did_t *pd,
     const char *dpnm, const char *tpgrp, const char *tpnm)
 {
--- a/usr/src/lib/fm/topo/modules/i86pc/chip/chip.c	Fri Dec 22 09:18:37 2006 -0800
+++ b/usr/src/lib/fm/topo/modules/i86pc/chip/chip.c	Fri Dec 22 11:30:38 2006 -0800
@@ -72,20 +72,22 @@
 static const topo_modops_t chip_ops =
 	{ chip_enum, NULL};
 static const topo_modinfo_t chip_info =
-	{ "chip", FM_FMRI_SCHEME_HC, CHIP_VERSION, &chip_ops };
+	{ CHIP_NODE_NAME, FM_FMRI_SCHEME_HC, CHIP_VERSION, &chip_ops };
 
 static const topo_pgroup_info_t cs_pgroup =
-	{ CS_PGROUP, TOPO_STABILITY_PRIVATE, TOPO_STABILITY_PRIVATE, 1 };
+	{ PGNAME(CS), TOPO_STABILITY_PRIVATE, TOPO_STABILITY_PRIVATE, 1 };
 static const topo_pgroup_info_t dimm_pgroup =
-	{ DIMM_PGROUP, TOPO_STABILITY_PRIVATE, TOPO_STABILITY_PRIVATE, 1 };
+	{ PGNAME(DIMM), TOPO_STABILITY_PRIVATE, TOPO_STABILITY_PRIVATE, 1 };
 static const topo_pgroup_info_t mc_pgroup =
-	{ MCT_PGROUP, TOPO_STABILITY_PRIVATE, TOPO_STABILITY_PRIVATE, 1 };
+	{ PGNAME(MCT), TOPO_STABILITY_PRIVATE, TOPO_STABILITY_PRIVATE, 1 };
 static const topo_pgroup_info_t chip_pgroup =
-	{ CHIP_PGROUP, TOPO_STABILITY_PRIVATE, TOPO_STABILITY_PRIVATE, 1 };
+	{ PGNAME(CHIP), TOPO_STABILITY_PRIVATE, TOPO_STABILITY_PRIVATE, 1 };
+static const topo_pgroup_info_t cpu_pgroup =
+	{ PGNAME(CPU), TOPO_STABILITY_PRIVATE, TOPO_STABILITY_PRIVATE, 1 };
 static const topo_pgroup_info_t rank_pgroup =
-	{ RANK_PGROUP, TOPO_STABILITY_PRIVATE, TOPO_STABILITY_PRIVATE, 1 };
+	{ PGNAME(RANK), TOPO_STABILITY_PRIVATE, TOPO_STABILITY_PRIVATE, 1 };
 static const topo_pgroup_info_t chan_pgroup =
-	{ CHAN_PGROUP, TOPO_STABILITY_PRIVATE, TOPO_STABILITY_PRIVATE, 1 };
+	{ PGNAME(CHAN), TOPO_STABILITY_PRIVATE, TOPO_STABILITY_PRIVATE, 1 };
 
 const topo_method_t rank_methods[] = {
 	{ TOPO_METH_ASRU_COMPUTE, TOPO_METH_ASRU_COMPUTE_DESC,
@@ -169,33 +171,61 @@
 }
 
 static int
-chip_strprop(tnode_t *cnode, kstat_t *ksp, const char *name)
+add_kstat_strprop(topo_mod_t *mod, tnode_t *node, kstat_t *ksp,
+    const char *pgname, const char *pname)
+{
+	int err = 0;
+	kstat_named_t *k;
+
+	if ((k = kstat_data_lookup(ksp, (char *)pname)) == NULL)
+		return (-1);
+
+	if (topo_prop_set_string(node, pgname, pname,
+	    TOPO_PROP_IMMUTABLE, k->value.str.addr.ptr, &err) == 0) {
+		return (0);
+	} else {
+		whinge(mod, &err, "chip_strprop: failed to add '%s'\n",
+		    pname);
+		return (-1);
+	}
+}
+
+static int
+add_kstat_longprop(topo_mod_t *mod, tnode_t *node, kstat_t *ksp,
+    const char *pgname, const char *pname)
 {
 	int err;
 	kstat_named_t *k;
 
-	if ((k = kstat_data_lookup(ksp, (char *)name)) == NULL)
-		return (0);
+	if ((k = kstat_data_lookup(ksp, (char *)pname)) == NULL)
+		return (-1);
 
-	(void) topo_prop_set_string(cnode, CHIP_PGROUP, name,
-	    TOPO_PROP_IMMUTABLE, k->value.str.addr.ptr, &err);
-
-	return (-1);
+	if (topo_prop_set_int32(node, pgname, pname,
+	    TOPO_PROP_IMMUTABLE, k->value.l, &err) == 0) {
+		return (0);
+	} else {
+		whinge(mod, &err, "chip_longprop: failed to add '%s'\n",
+		    pname);
+		return (-1);
+	}
 }
 
 static int
-chip_longprop(tnode_t *cnode, kstat_t *ksp, const char *name)
+add_kstat_longprops(topo_mod_t *mod, tnode_t *node, kstat_t *ksp,
+    const char *pgname, ...)
 {
-	int err;
-	kstat_named_t *k;
+	const char *pname;
+	va_list ap;
+	int nerr = 0;
 
-	if ((k = kstat_data_lookup(ksp, (char *)name)) == NULL)
-		return (0);
+	va_start(ap, pgname);
+	while ((pname = va_arg(ap, const char *)) != NULL) {
+		if (add_kstat_longprop(mod, node, ksp, pgname, pname) != 0)
+			nerr++;		/* have whinged elsewhere */
+	}
+	va_end(ap);
 
-	(void) topo_prop_set_int32(cnode, CHIP_PGROUP, name,
-	    TOPO_PROP_IMMUTABLE, k->value.l, &err);
-
-	return (-1);
+	return (nerr == 0 ? 0 : -1);
 }
 
 static int
@@ -320,6 +350,16 @@
 			    "failed\n");
 		}
 		(void) topo_node_fru_set(cnode, NULL, 0, &err);
+
+		(void) topo_pgroup_create(cnode, &cpu_pgroup, &err);
+
+		(void) topo_prop_set_uint32(cnode, PGNAME(CPU), "cpuid",
+		    TOPO_PROP_IMMUTABLE, cpuid, &err);
+
+		if (add_kstat_longprops(mod, cnode, chip->chip_cpustats[cpuid],
+		    PGNAME(CPU), CPU_CHIP_ID, CPU_CORE_ID, CPU_CLOG_ID,
+		    NULL) != 0)
+			nerr++;		/* have whinged elsewhere */
 	}
 
 	return (nerr == 0 ? 0 : -1);
@@ -328,45 +368,90 @@
 static int
 nvprop_add(topo_mod_t *mod, nvpair_t *nvp, const char *pgname, tnode_t *node)
 {
-	int err = 0;
+	int success = 0;
+	int err;
 	char *pname = nvpair_name(nvp);
 
 	switch (nvpair_type(nvp)) {
 	case DATA_TYPE_BOOLEAN_VALUE: {
 		boolean_t val;
 
-		if (nvpair_value_boolean_value(nvp, &val) == 0) {
-			(void) topo_prop_set_string(node, pgname, pname,
-			    TOPO_PROP_IMMUTABLE, val ? "true" : "false", &err);
-		}
-		return (0);
+		if (nvpair_value_boolean_value(nvp, &val) == 0 &&
+		    topo_prop_set_string(node, pgname, pname,
+		    TOPO_PROP_IMMUTABLE, val ? "true" : "false", &err) == 0)
+			success = 1;
+		break;
+	}
+
+	case DATA_TYPE_UINT32: {
+		uint32_t val;
+
+		if (nvpair_value_uint32(nvp, &val) == 0 &&
+		    topo_prop_set_uint32(node, pgname, pname,
+		    TOPO_PROP_IMMUTABLE, val, &err) == 0)
+			success = 1;
+		break;
 	}
 
 	case DATA_TYPE_UINT64: {
 		uint64_t val;
 
-		if (nvpair_value_uint64(nvp, &val) == 0) {
-			(void) topo_prop_set_uint64(node, pgname, pname,
-			    TOPO_PROP_IMMUTABLE, val, &err);
-		}
-		return (0);
+		if (nvpair_value_uint64(nvp, &val) == 0 &&
+		    topo_prop_set_uint64(node, pgname, pname,
+		    TOPO_PROP_IMMUTABLE, val, &err) == 0)
+			success = 1;
+		break;
+	}
+
+	case DATA_TYPE_UINT32_ARRAY: {
+		uint32_t *arrp;
+		uint_t nelem;
+
+		if (nvpair_value_uint32_array(nvp, &arrp, &nelem) == 0 &&
+		    nelem > 0 && topo_prop_set_uint32_array(node, pgname, pname,
+		    TOPO_PROP_IMMUTABLE, arrp, nelem, &err) == 0)
+			success = 1;
+		break;
 	}
 
 	case DATA_TYPE_STRING: {
 		char *str;
 
-		if (nvpair_value_string(nvp, &str) == 0)
-			(void) topo_prop_set_string(node, pgname, pname,
-			    TOPO_PROP_IMMUTABLE, str, &err);
-		return (0);
+		if (nvpair_value_string(nvp, &str) == 0 &&
+		    topo_prop_set_string(node, pgname, pname,
+		    TOPO_PROP_IMMUTABLE, str, &err) == 0)
+			success = 1;
+		break;
 	}
 
 	default:
 		whinge(mod, &err, "nvprop_add: Can't handle type %d for "
 		    "'%s' in property group %s of %s node\n",
 		    nvpair_type(nvp), pname, pgname, topo_node_name(node));
-		return (1);
+		break;
 	}
+
+	return (success ? 0 : 1);
+}
+
+static int
+chip_htconfig(topo_mod_t *mod, tnode_t *cnode, nvlist_t *htnvl)
+{
+	nvpair_t *nvp;
+	int nerr = 0;
+
+	if (strcmp(topo_node_name(cnode), CHIP_NODE_NAME) != 0) {
+		whinge(mod, &nerr, "chip_htconfig: must pass a chip node!");
+		return (-1);
+	}
+
+	for (nvp = nvlist_next_nvpair(htnvl, NULL); nvp != NULL;
+	    nvp = nvlist_next_nvpair(htnvl, nvp)) {
+		if (nvprop_add(mod, nvp, PGNAME(CHIP), cnode) != 0)
+			nerr++;
+	}
+
+	return (nerr == 0 ? 0 : -1);
 }
 
 static int
@@ -384,7 +469,7 @@
 	 * channel A is in use (i.e., running in 64-bit mode).  Only
 	 * the socket 754 package has a single channel.
 	 */
-	if (topo_prop_get_string(pnode, MCT_PGROUP, "socket",
+	if (topo_prop_get_string(pnode, PGNAME(MCT), "socket",
 	    &socket, &err) != 0)
 		return (-1);
 
@@ -417,7 +502,7 @@
 
 		(void) topo_pgroup_create(chnode, &chan_pgroup, &err);
 
-		(void) topo_prop_set_string(chnode, CHAN_PGROUP, "channel",
+		(void) topo_prop_set_string(chnode, PGNAME(CHAN), "channel",
 		    TOPO_PROP_IMMUTABLE, i == 0 ? "A" : "B", &err);
 	}
 
@@ -471,7 +556,7 @@
 
 		for (nvp = nvlist_next_nvpair(csarr[i], NULL); nvp != NULL;
 		    nvp = nvlist_next_nvpair(csarr[i], nvp)) {
-			nerr += nvprop_add(mod, nvp, CS_PGROUP, csnode);
+			nerr += nvprop_add(mod, nvp, PGNAME(CS), csnode);
 		}
 	}
 
@@ -588,7 +673,8 @@
 		return (nerr);
 	}
 
-	if (topo_prop_get_uint64(pnode, DIMM_PGROUP, "size", &dsz, &err) == 0) {
+	if (topo_prop_get_uint64(pnode, PGNAME(DIMM), "size", &dsz,
+	    &err) == 0) {
 		rsz = dsz / ncs;
 	} else {
 		whinge(mod, &nerr, "rank_create: parent dimm has no size\n");
@@ -628,13 +714,13 @@
 
 		(void) topo_pgroup_create(ranknode, &rank_pgroup, &err);
 
-		(void) topo_prop_set_uint64(ranknode, RANK_PGROUP, "size",
+		(void) topo_prop_set_uint64(ranknode, PGNAME(RANK), "size",
 		    TOPO_PROP_IMMUTABLE, rsz, &err);
 
-		(void) topo_prop_set_string(ranknode, RANK_PGROUP, "csname",
+		(void) topo_prop_set_string(ranknode, PGNAME(RANK), "csname",
 		    TOPO_PROP_IMMUTABLE, csnamearr[i], &err);
 
-		(void) topo_prop_set_uint64(ranknode, RANK_PGROUP, "csnum",
+		(void) topo_prop_set_uint64(ranknode, PGNAME(RANK), "csnum",
 		    TOPO_PROP_IMMUTABLE, csnumarr[i], &err);
 	}
 
@@ -718,7 +804,7 @@
 			    strcmp(nvpair_name(nvp), "csnames") == 0)
 				continue;	/* used in rank_create() */
 
-			nerr += nvprop_add(mod, nvp, DIMM_PGROUP, dimmnode);
+			nerr += nvprop_add(mod, nvp, PGNAME(DIMM), dimmnode);
 		}
 
 		nerr += rank_create(mod, dimmnode, dimmarr[i], auth);
@@ -833,15 +919,25 @@
 
 	for (nvp = nvlist_next_nvpair(mc, NULL); nvp != NULL;
 	    nvp = nvlist_next_nvpair(mc, nvp)) {
-		if (nvpair_type(nvp) == DATA_TYPE_NVLIST_ARRAY &&
-		    (strcmp(nvpair_name(nvp), "cslist") == 0 ||
-		    strcmp(nvpair_name(nvp), "dimmlist") == 0)) {
+		char *name = nvpair_name(nvp);
+		data_type_t type = nvpair_type(nvp);
+
+		if (type == DATA_TYPE_NVLIST_ARRAY &&
+		    (strcmp(name, "cslist") == 0 ||
+		    strcmp(name, "dimmlist") == 0)) {
+			continue;
+		} else if (type == DATA_TYPE_UINT8 &&
+		    strcmp(name, MC_NVLIST_VERSTR) == 0) {
 			continue;
-		} else if (nvpair_type(nvp) == DATA_TYPE_UINT8 &&
-		    strcmp(nvpair_name(nvp), MC_NVLIST_VERSTR) == 0) {
-			continue;
+		} else if (type == DATA_TYPE_NVLIST &&
+		    strcmp(name, "htconfig") == 0) {
+			nvlist_t *htnvl;
+
+			(void) nvpair_value_nvlist(nvp, &htnvl);
+			if (chip_htconfig(mod, pnode, htnvl) != 0)
+				rc = -1;
 		} else {
-			if (nvprop_add(mod, nvp, MCT_PGROUP, mcnode) != 0)
+			if (nvprop_add(mod, nvp, PGNAME(MCT), mcnode) != 0)
 				rc = -1;
 		}
 	}
@@ -931,10 +1027,13 @@
 		nvlist_free(fmri);
 
 		(void) topo_pgroup_create(cnode, &chip_pgroup, &err);
-		(void) chip_strprop(cnode, ksp, CHIP_VENDOR_ID);
-		(void) chip_longprop(cnode, ksp, CHIP_FAMILY);
-		(void) chip_longprop(cnode, ksp, CHIP_MODEL);
-		(void) chip_longprop(cnode, ksp, CHIP_STEPPING);
+		if (add_kstat_strprop(mod, cnode, ksp, PGNAME(CHIP),
+		    CHIP_VENDOR_ID) != 0)
+			nerr++;		/* have whinged elsewhere */
+
+		if (add_kstat_longprops(mod, cnode, ksp, PGNAME(CHIP),
+		    CHIP_FAMILY, CHIP_MODEL, CHIP_STEPPING, NULL) != 0)
+			nerr++;		/* have whinged elsewhere */
 
 		if (cpu_create(mod, cnode, CPU_NODE_NAME, chipid, chip, auth)
 		    != 0 || mc_create(mod, cnode, MCT_NODE_NAME, auth) != 0)
@@ -962,7 +1061,7 @@
 
 	auth = topo_mod_auth(mod, pnode);
 
-	if (strcmp(name, "chip") == 0)
+	if (strcmp(name, CHIP_NODE_NAME) == 0)
 		rv = chip_create(mod, pnode, name, min, max, chip, auth);
 
 	nvlist_free(auth);
--- a/usr/src/lib/fm/topo/modules/i86pc/chip/chip.h	Fri Dec 22 09:18:37 2006 -0800
+++ b/usr/src/lib/fm/topo/modules/i86pc/chip/chip.h	Fri Dec 22 11:30:38 2006 -0800
@@ -38,6 +38,7 @@
 
 #define	CHIP_VERSION		TOPO_VERSION
 
+#define	CHIP_NODE_NAME	"chip"
 #define	MCT_NODE_NAME	"memory-controller"
 #define	CHAN_NODE_NAME	"dram-channel"
 #define	CPU_NODE_NAME	"cpu"
@@ -45,21 +46,23 @@
 #define	DIMM_NODE_NAME	"dimm"
 #define	RANK_NODE_NAME	"rank"
 
-#define	CHIP_PGROUP	"chip-properties"
-#define	MCT_PGROUP	MCT_NODE_NAME "-properties"
-#define	CHAN_PGROUP	CHAN_NODE_NAME "-properties"
-#define	CS_PGROUP	CS_NODE_NAME "-properties"
-#define	DIMM_PGROUP	DIMM_NODE_NAME "-properties"
-#define	RANK_PGROUP	RANK_NODE_NAME "-properties"
+#define	PGNAME(prefix)	(prefix##_NODE_NAME "-properties")
 
 /*
- * CHIP_PGROUP properties
+ * chip-properties
  */
-#define	CHIP_VENDOR_ID	"vendor-id"
+#define	CHIP_VENDOR_ID	"vendor_id"
 #define	CHIP_FAMILY	"family"
 #define	CHIP_MODEL	"model"
 #define	CHIP_STEPPING	"stepping"
 
+/*
+ * cpu-properties
+ */
+#define	CPU_CHIP_ID	"chip_id"
+#define	CPU_CORE_ID	"core_id"
+#define	CPU_CLOG_ID	"clog_id"
+
 typedef struct chip {
 	kstat_ctl_t *chip_kc;
 	kstat_t **chip_cpustats;
--- a/usr/src/pkgdefs/SUNW0on/prototype_com	Fri Dec 22 09:18:37 2006 -0800
+++ b/usr/src/pkgdefs/SUNW0on/prototype_com	Fri Dec 22 11:30:38 2006 -0800
@@ -46,7 +46,6 @@
 f none usr/lib/locale/C/LC_MESSAGES/AMD.po               644 root bin
 f none usr/lib/locale/C/LC_MESSAGES/DISK.po              644 root bin
 f none usr/lib/locale/C/LC_MESSAGES/FMD.po               644 root bin
-f none usr/lib/locale/C/LC_MESSAGES/SMF.po               644 root bin
 f none usr/lib/locale/C/LC_MESSAGES/SUN4.po              644 root bin
 f none usr/lib/locale/C/LC_MESSAGES/SUN4U.po             644 root bin
 f none usr/lib/locale/C/LC_MESSAGES/SUN4V.po             644 root bin
--- a/usr/src/pkgdefs/SUNWfmd/prototype_com	Fri Dec 22 09:18:37 2006 -0800
+++ b/usr/src/pkgdefs/SUNWfmd/prototype_com	Fri Dec 22 11:30:38 2006 -0800
@@ -47,7 +47,6 @@
 d none usr/lib/fm/dict 755 root bin
 f none usr/lib/fm/dict/DISK.dict 444 root bin
 f none usr/lib/fm/dict/FMD.dict 444 root bin
-f none usr/lib/fm/dict/SMF.dict 444 root bin
 f none usr/lib/fm/dict/SUNOS.dict 444 root bin
 f none usr/lib/fm/dict/PCI.dict 444 root bin
 f none usr/lib/fm/dict/ZFS.dict 444 root bin
@@ -112,7 +111,6 @@
 d none usr/lib/locale/C/LC_MESSAGES 755 root bin
 f none usr/lib/locale/C/LC_MESSAGES/DISK.mo 444 root bin
 f none usr/lib/locale/C/LC_MESSAGES/FMD.mo 444 root bin
-f none usr/lib/locale/C/LC_MESSAGES/SMF.mo 444 root bin
 f none usr/lib/locale/C/LC_MESSAGES/SUNOS.mo 444 root bin
 f none usr/lib/locale/C/LC_MESSAGES/PCI.mo 444 root bin
 f none usr/lib/locale/C/LC_MESSAGES/ZFS.mo 444 root bin
--- a/usr/src/pkgdefs/SUNWmdb/prototype_com	Fri Dec 22 09:18:37 2006 -0800
+++ b/usr/src/pkgdefs/SUNWmdb/prototype_com	Fri Dec 22 11:30:38 2006 -0800
@@ -48,6 +48,7 @@
 f none usr/lib/mdb/proc/libnvpair.so 555 root sys
 f none usr/lib/mdb/proc/libproc.so 555 root sys
 f none usr/lib/mdb/proc/libsysevent.so 555 root sys
+f none usr/lib/mdb/proc/libtopo.so 555 root sys
 f none usr/lib/mdb/proc/libumem.so 555 root sys
 f none usr/lib/mdb/proc/libuutil.so 555 root sys
 f none usr/lib/mdb/proc/mdb_ds.so 555 root sys
--- a/usr/src/pkgdefs/SUNWmdb/prototype_i386	Fri Dec 22 09:18:37 2006 -0800
+++ b/usr/src/pkgdefs/SUNWmdb/prototype_i386	Fri Dec 22 11:30:38 2006 -0800
@@ -107,6 +107,7 @@
 f none usr/lib/mdb/proc/amd64/libnvpair.so 555 root sys
 f none usr/lib/mdb/proc/amd64/libproc.so 555 root sys
 f none usr/lib/mdb/proc/amd64/libsysevent.so 555 root sys
+f none usr/lib/mdb/proc/amd64/libtopo.so 555 root sys
 f none usr/lib/mdb/proc/amd64/libumem.so 555 root sys
 f none usr/lib/mdb/proc/amd64/libuutil.so 555 root sys
 f none usr/lib/mdb/proc/amd64/mdb_ds.so 555 root sys
--- a/usr/src/pkgdefs/SUNWmdb/prototype_sparc	Fri Dec 22 09:18:37 2006 -0800
+++ b/usr/src/pkgdefs/SUNWmdb/prototype_sparc	Fri Dec 22 11:30:38 2006 -0800
@@ -77,6 +77,7 @@
 f none usr/lib/mdb/proc/sparcv9/libnvpair.so 555 root sys
 f none usr/lib/mdb/proc/sparcv9/libproc.so 555 root sys
 f none usr/lib/mdb/proc/sparcv9/libsysevent.so 555 root sys
+f none usr/lib/mdb/proc/sparcv9/libtopo.so 555 root sys
 f none usr/lib/mdb/proc/sparcv9/libumem.so 555 root sys
 f none usr/lib/mdb/proc/sparcv9/libuutil.so 555 root sys
 f none usr/lib/mdb/proc/sparcv9/mdb_ds.so 555 root sys
--- a/usr/src/tools/scripts/bfu.sh	Fri Dec 22 09:18:37 2006 -0800
+++ b/usr/src/tools/scripts/bfu.sh	Fri Dec 22 11:30:38 2006 -0800
@@ -4615,6 +4615,10 @@
 	rm -f $usr/lib/fm/SUN4U.dict
 	rm -f $usr/lib/fm/SUNOS.dict
 
+	# Remove unused SMF dictionary
+	rm -f $root/usr/lib/fm/dict/SMF.dict
+	rm -f $root/usr/lib/locale/C/LC_MESSAGES/SMF.mo
+
 	#
 	# Remove old FMA .eft files and directories
 	#
--- a/usr/src/uts/common/sys/fm/protocol.h	Fri Dec 22 09:18:37 2006 -0800
+++ b/usr/src/uts/common/sys/fm/protocol.h	Fri Dec 22 11:30:38 2006 -0800
@@ -94,6 +94,7 @@
 #define	FM_FAULT_FRU_LABEL		"fru-label"
 #define	FM_FAULT_CERTAINTY		"certainty"
 #define	FM_FAULT_RESOURCE		"resource"
+#define	FM_FAULT_LOCATION		"location"
 
 /* resource event versions and payload member names */
 #define	FM_RSRC_VERS0			0
@@ -241,6 +242,8 @@
 
 /* legacy-hc scheme member names */
 #define	FM_FMRI_LEGACY_HC		"component"
+#define	FM_FMRI_LEGACY_HC_PREFIX	FM_FMRI_SCHEME_HC":///" \
+    FM_FMRI_LEGACY_HC"="
 
 /* mem scheme member names */
 #define	FM_FMRI_MEM_UNUM		"unum"
--- a/usr/src/uts/i86pc/io/mc/mcamd.h	Fri Dec 22 09:18:37 2006 -0800
+++ b/usr/src/uts/i86pc/io/mc/mcamd.h	Fri Dec 22 11:30:38 2006 -0800
@@ -78,10 +78,17 @@
  */
 
 /*
+ * Function 0 (HT Config) offsets
+ */
+#define	MC_HT_REG_RTBL_NODE_0	0x40
+#define	MC_HT_REG_RTBL_INCR	4
+#define	MC_HT_REG_NODEID	0x60
+#define	MC_HT_REG_UNITID	0x64
+
+/*
  * Function 1 (address mask) offsets for DRAM base, DRAM limit, DRAM hole
  * registers.
  */
-#define	MC_AM_REG_NODE_NUM	8	/* Number of DRAM nodes */
 #define	MC_AM_REG_DRAMBASE_0	0x40	/* Offset for DRAM Base 0 */
 #define	MC_AM_REG_DRAMLIM_0	0x44	/* Offset for DRAM Limit 0 */
 #define	MC_AM_REG_DRAM_INCR	8	/* incr between base/limit pairs */
@@ -207,6 +214,9 @@
  * Memory controller config register values
  */
 typedef struct mc_cfgregs {
+	mcamd_cfgreg_t mcr_htroute[MC_CHIP_MAXNODES];
+	mcamd_cfgreg_t mcr_htnodeid;
+	mcamd_cfgreg_t mcr_htunitid;
 	mcamd_cfgreg_t mcr_drambase;
 	mcamd_cfgreg_t mcr_dramlimit;
 	mcamd_cfgreg_t mcr_dramhole;
--- a/usr/src/uts/i86pc/io/mc/mcamd_dimmcfg.h	Fri Dec 22 09:18:37 2006 -0800
+++ b/usr/src/uts/i86pc/io/mc/mcamd_dimmcfg.h	Fri Dec 22 11:30:38 2006 -0800
@@ -32,6 +32,10 @@
 #include <sys/types.h>
 #include <sys/mc_amd.h>
 
+#ifdef __cplusplus
+extern "C" {
+#endif
+
 typedef struct mcdcfg_csl mcdcfg_csl_t;
 typedef struct mcdcfg_rslt mcdcfg_rslt_t;
 
--- a/usr/src/uts/i86pc/io/mc/mcamd_drv.c	Fri Dec 22 09:18:37 2006 -0800
+++ b/usr/src/uts/i86pc/io/mc/mcamd_drv.c	Fri Dec 22 11:30:38 2006 -0800
@@ -221,44 +221,13 @@
 		(void) nvlist_add_uint64(nvl, name, value);
 }
 
-static nvlist_t *
-mc_nvl_create(mc_t *mc)
+static void
+mc_nvl_add_cslist(nvlist_t *mcnvl, mc_t *mc)
 {
 	mc_cs_t *mccs = mc->mc_cslist;
-	nvlist_t *cslist[MC_CHIP_NCS], *dimmlist[MC_CHIP_NDIMM];
-	nvlist_t *mcnvl;
-	mc_dimm_t *mcd;
+	nvlist_t *cslist[MC_CHIP_NCS];
 	int nelem, i;
 
-	(void) nvlist_alloc(&mcnvl, NV_UNIQUE_NAME, KM_SLEEP);
-
-	/*
-	 * Any changes to member names, types, value semantics or to
-	 * whether they are optional or required should result in
-	 * a new version number *after* an ARC case since this nvlist_t
-	 * is intended to become a contracted interface.
-	 */
-	(void) nvlist_add_uint8(mcnvl, MC_NVLIST_VERSTR, MC_NVLIST_VERS1);
-
-	mc_nvl_add_prop(mcnvl, mc, MCAMD_PROP_NUM, 0);
-	mc_nvl_add_prop(mcnvl, mc, MCAMD_PROP_REV, 0);
-	(void) nvlist_add_string(mcnvl, "revname", mc->mc_revname);
-	mc_nvl_add_socket(mcnvl, mc);
-	mc_nvl_add_ecctype(mcnvl, mc);
-
-	mc_nvl_add_prop(mcnvl, mc, MCAMD_PROP_BASE_ADDR, 0);
-	mc_nvl_add_prop(mcnvl, mc, MCAMD_PROP_LIM_ADDR, 0);
-	mc_nvl_add_prop(mcnvl, mc, MCAMD_PROP_ILEN, 0);
-	mc_nvl_add_prop(mcnvl, mc, MCAMD_PROP_ILSEL, 0);
-	mc_nvl_add_prop(mcnvl, mc, MCAMD_PROP_CSINTLVFCTR, 0);
-	mc_nvl_add_prop(mcnvl, mc, MCAMD_PROP_DRAMHOLE_SIZE, 0);
-	mc_nvl_add_prop(mcnvl, mc, MCAMD_PROP_ACCESS_WIDTH, 0);
-	mc_nvl_add_prop(mcnvl, mc, MCAMD_PROP_CSBANKMAPREG, 0);
-	mc_nvl_add_prop(mcnvl, mc, MCAMD_PROP_BANKSWZL, 0);
-	mc_nvl_add_prop(mcnvl, mc, MCAMD_PROP_MOD64MUX, 0);
-	mc_nvl_add_prop(mcnvl, mc, MCAMD_PROP_SPARECS, 1);
-	mc_nvl_add_prop(mcnvl, mc, MCAMD_PROP_BADCS, 1);
-
 	for (nelem = 0; mccs != NULL; mccs = mccs->mccs_next, nelem++) {
 		nvlist_t **csp = &cslist[nelem];
 		char csname[MCDCFG_CSNAMELEN];
@@ -292,6 +261,14 @@
 	(void) nvlist_add_nvlist_array(mcnvl, "cslist", cslist, nelem);
 	for (i = 0; i < nelem; i++)
 		nvlist_free(cslist[i]);
+}
+
+static void
+mc_nvl_add_dimmlist(nvlist_t *mcnvl, mc_t *mc)
+{
+	nvlist_t *dimmlist[MC_CHIP_NDIMM];
+	mc_dimm_t *mcd;
+	int nelem, i;
 
 	for (nelem = 0, mcd = mc->mc_dimmlist; mcd != NULL;
 	    mcd = mcd->mcd_next, nelem++) {
@@ -325,6 +302,93 @@
 	(void) nvlist_add_nvlist_array(mcnvl, "dimmlist", dimmlist, nelem);
 	for (i = 0; i < nelem; i++)
 		nvlist_free(dimmlist[i]);
+}
+
+static void
+mc_nvl_add_htconfig(nvlist_t *mcnvl, mc_t *mc)
+{
+	mc_cfgregs_t *mcr = &mc->mc_cfgregs;
+	union mcreg_htroute *htrp = (union mcreg_htroute *)&mcr->mcr_htroute[0];
+	union mcreg_nodeid *nip = (union mcreg_nodeid *)&mcr->mcr_htnodeid;
+	union mcreg_unitid *uip = (union mcreg_unitid *)&mcr->mcr_htunitid;
+	int ndcnt = HT_COHERENTNODES(nip);
+	uint32_t BCRte[MC_CHIP_MAXNODES];
+	uint32_t RPRte[MC_CHIP_MAXNODES];
+	uint32_t RQRte[MC_CHIP_MAXNODES];
+	nvlist_t *nvl;
+	int i;
+
+	(void) nvlist_alloc(&nvl, NV_UNIQUE_NAME, KM_SLEEP);
+
+	(void) nvlist_add_uint32(nvl, "NodeId", MCREG_FIELD_CMN(nip, NodeId));
+	(void) nvlist_add_uint32(nvl, "CoherentNodes", HT_COHERENTNODES(nip));
+	(void) nvlist_add_uint32(nvl, "SbNode", MCREG_FIELD_CMN(nip, SbNode));
+	(void) nvlist_add_uint32(nvl, "LkNode", MCREG_FIELD_CMN(nip, LkNode));
+	(void) nvlist_add_uint32(nvl, "SystemCoreCount",
+	    HT_SYSTEMCORECOUNT(nip));
+
+	(void) nvlist_add_uint32(nvl, "C0Unit", MCREG_FIELD_CMN(uip, C0Unit));
+	(void) nvlist_add_uint32(nvl, "C1Unit", MCREG_FIELD_CMN(uip, C1Unit));
+	(void) nvlist_add_uint32(nvl, "McUnit", MCREG_FIELD_CMN(uip, McUnit));
+	(void) nvlist_add_uint32(nvl, "HbUnit", MCREG_FIELD_CMN(uip, HbUnit));
+	(void) nvlist_add_uint32(nvl, "SbLink", MCREG_FIELD_CMN(uip, SbLink));
+
+	if (ndcnt <= MC_CHIP_MAXNODES) {
+		for (i = 0; i < ndcnt; i++, htrp++) {
+			BCRte[i] = MCREG_FIELD_CMN(htrp, BCRte);
+			RPRte[i] = MCREG_FIELD_CMN(htrp, RPRte);
+			RQRte[i] = MCREG_FIELD_CMN(htrp, RQRte);
+		}
+
+		(void) nvlist_add_uint32_array(nvl, "BroadcastRoutes",
+		    &BCRte[0], ndcnt);
+		(void) nvlist_add_uint32_array(nvl, "ResponseRoutes",
+		    &RPRte[0], ndcnt);
+		(void) nvlist_add_uint32_array(nvl, "RequestRoutes",
+		    &RQRte[0], ndcnt);
+	}
+
+	(void) nvlist_add_nvlist(mcnvl, "htconfig", nvl);
+	nvlist_free(nvl);
+}
+
+static nvlist_t *
+mc_nvl_create(mc_t *mc)
+{
+	nvlist_t *mcnvl;
+
+	(void) nvlist_alloc(&mcnvl, NV_UNIQUE_NAME, KM_SLEEP);
+
+	/*
+	 * Since this nvlist is used in populating the topo tree changes
+	 * made here may propogate through to changed property names etc
+	 * in the topo tree.  Some properties in the topo tree will be
+	 * contracted via ARC, so be careful what you change here.
+	 */
+	(void) nvlist_add_uint8(mcnvl, MC_NVLIST_VERSTR, MC_NVLIST_VERS1);
+
+	mc_nvl_add_prop(mcnvl, mc, MCAMD_PROP_NUM, 0);
+	mc_nvl_add_prop(mcnvl, mc, MCAMD_PROP_REV, 0);
+	(void) nvlist_add_string(mcnvl, "revname", mc->mc_revname);
+	mc_nvl_add_socket(mcnvl, mc);
+	mc_nvl_add_ecctype(mcnvl, mc);
+
+	mc_nvl_add_prop(mcnvl, mc, MCAMD_PROP_BASE_ADDR, 0);
+	mc_nvl_add_prop(mcnvl, mc, MCAMD_PROP_LIM_ADDR, 0);
+	mc_nvl_add_prop(mcnvl, mc, MCAMD_PROP_ILEN, 0);
+	mc_nvl_add_prop(mcnvl, mc, MCAMD_PROP_ILSEL, 0);
+	mc_nvl_add_prop(mcnvl, mc, MCAMD_PROP_CSINTLVFCTR, 0);
+	mc_nvl_add_prop(mcnvl, mc, MCAMD_PROP_DRAMHOLE_SIZE, 0);
+	mc_nvl_add_prop(mcnvl, mc, MCAMD_PROP_ACCESS_WIDTH, 0);
+	mc_nvl_add_prop(mcnvl, mc, MCAMD_PROP_CSBANKMAPREG, 0);
+	mc_nvl_add_prop(mcnvl, mc, MCAMD_PROP_BANKSWZL, 0);
+	mc_nvl_add_prop(mcnvl, mc, MCAMD_PROP_MOD64MUX, 0);
+	mc_nvl_add_prop(mcnvl, mc, MCAMD_PROP_SPARECS, 1);
+	mc_nvl_add_prop(mcnvl, mc, MCAMD_PROP_BADCS, 1);
+
+	mc_nvl_add_cslist(mcnvl, mc);
+	mc_nvl_add_dimmlist(mcnvl, mc);
+	mc_nvl_add_htconfig(mcnvl, mc);
 
 	return (mcnvl);
 }
@@ -547,6 +611,27 @@
 }
 
 /*
+ * Function 0 - HyperTransport Technology Configuration
+ */
+static void
+mc_mkprops_htcfg(mc_pcicfg_hdl_t cfghdl, mc_t *mc)
+{
+	union mcreg_nodeid nodeid;
+	off_t offset;
+	int i;
+
+	mc->mc_cfgregs.mcr_htnodeid = MCREG_VAL32(&nodeid) =
+	    mc_pcicfg_get32(cfghdl, MC_HT_REG_NODEID);
+
+	mc->mc_cfgregs.mcr_htunitid = mc_pcicfg_get32(cfghdl, MC_HT_REG_UNITID);
+
+	for (i = 0, offset = MC_HT_REG_RTBL_NODE_0;
+	    i < HT_COHERENTNODES(&nodeid);
+	    i++, offset += MC_HT_REG_RTBL_INCR)
+		mc->mc_cfgregs.mcr_htroute[i] = mc_pcicfg_get32(cfghdl, offset);
+}
+
+/*
  * Function 1 Configuration - Address Map (see BKDG 3.4.4 DRAM Address Map)
  *
  * Read the Function 1 Address Map for each potential DRAM node.  The Base
@@ -561,19 +646,19 @@
 static void
 mc_mkprops_addrmap(mc_pcicfg_hdl_t cfghdl, mc_t *mc)
 {
-	union mcreg_drambase base[MC_AM_REG_NODE_NUM];
-	union mcreg_dramlimit lim[MC_AM_REG_NODE_NUM];
+	union mcreg_drambase base[MC_CHIP_MAXNODES];
+	union mcreg_dramlimit lim[MC_CHIP_MAXNODES];
 	mc_props_t *mcp = &mc->mc_props;
 	mc_cfgregs_t *mcr = &mc->mc_cfgregs;
 	union mcreg_dramhole hole;
 	int i;
 
 	mc_prop_read_pair(cfghdl,
-	    (uint32_t *)base, MC_AM_REG_DRAMBASE_0, MC_AM_REG_NODE_NUM,
-	    (uint32_t *)lim, MC_AM_REG_DRAMLIM_0, MC_AM_REG_NODE_NUM,
+	    (uint32_t *)base, MC_AM_REG_DRAMBASE_0, MC_CHIP_MAXNODES,
+	    (uint32_t *)lim, MC_AM_REG_DRAMLIM_0, MC_CHIP_MAXNODES,
 	    MC_AM_REG_DRAM_INCR);
 
-	for (i = 0; i < MC_AM_REG_NODE_NUM; i++) {
+	for (i = 0; i < MC_CHIP_MAXNODES; i++) {
 		/*
 		 * Don't create properties for empty nodes.
 		 */
@@ -907,7 +992,7 @@
 
 static const mc_bind_map_t mc_bind_map[] = {
 	{ MC_FUNC_HTCONFIG_BINDNM, MC_FUNC_HTCONFIG,
-	    "AMD Memory Controller (HT Configuration)", NULL },
+	    "AMD Memory Controller (HT Configuration)", mc_mkprops_htcfg },
 	{ MC_FUNC_ADDRMAP_BINDNM, MC_FUNC_ADDRMAP,
 	    "AMD Memory Controller (Address Map)", mc_mkprops_addrmap },
 	{ MC_FUNC_DRAMCTL_BINDNM, MC_FUNC_DRAMCTL,
--- a/usr/src/uts/intel/os/driver_aliases	Fri Dec 22 09:18:37 2006 -0800
+++ b/usr/src/uts/intel/os/driver_aliases	Fri Dec 22 11:30:38 2006 -0800
@@ -26,5 +26,6 @@
 mpt "pciex1000,56"
 mpt "pciex1000,58"
 ibd "ib.ipib"
+mc-amd "pci1022,1100"
 mc-amd "pci1022,1101"
 mc-amd "pci1022,1102"
--- a/usr/src/uts/intel/sys/mc_amd.h	Fri Dec 22 09:18:37 2006 -0800
+++ b/usr/src/uts/intel/sys/mc_amd.h	Fri Dec 22 11:30:38 2006 -0800
@@ -30,6 +30,10 @@
 #include <sys/mc.h>
 #include <sys/x86_archext.h>
 
+#ifdef __cplusplus
+extern "C" {
+#endif
+
 /*
  * The mc-amd driver exports an nvlist to userland, where the primary
  * consumer is the "chip" topology enumerator for this platform type which
@@ -97,15 +101,6 @@
 #define	MC_NVLIST_VERS		MC_NVLIST_VERS1
 
 /*
- * Definitions describing various memory controller constant properties and
- * the structure of configuration registers.
- */
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/*
  * Constants and feature/revision test macros that are not expected to vary
  * among different AMD family 0xf processor revisions.
  */
@@ -228,6 +223,58 @@
 #define	MCREG_FIELD_revFG(up, field)	_MCREG_FIELD(up, revFG, field)
 
 /*
+ * Function 0 - HT Configuration: Routing Table Node Register
+ */
+union mcreg_htroute {
+	uint32_t	_val32;
+	struct {
+		uint32_t	RQRte:4;	/*  3:0 */
+		uint32_t	reserved1:4;	/*  7:4 */
+		uint32_t	RPRte:4;	/* 11:8 */
+		uint32_t	reserved2:4;	/* 15:12 */
+		uint32_t	BCRte:4;	/* 19:16 */
+		uint32_t	reserved3:12;	/* 31:20 */
+	} _fmt_cmn;
+};
+
+/*
+ * Function 0 - HT Configuration: Node ID Register
+ */
+union mcreg_nodeid {
+	uint32_t	_val32;
+	struct {
+		uint32_t	NodeId:3;	/*  2:0 */
+		uint32_t	reserved1:1;	/*  3:3 */
+		uint32_t	NodeCnt:3;	/*  6:4 */
+		uint32_t	reserved2:1;	/*  7:7 */
+		uint32_t	SbNode:3;	/* 10:8 */
+		uint32_t	reserved3:1;	/* 11:11 */
+		uint32_t	LkNode:3;	/* 14:12 */
+		uint32_t	reserved4:1;	/* 15:15 */
+		uint32_t	CpuCnt:4;	/* 19:16 */
+		uint32_t	reserved:12;	/* 31:20 */
+	} _fmt_cmn;
+};
+
+#define	HT_COHERENTNODES(up)	(MCREG_FIELD_CMN(up, NodeCnt) + 1)
+#define	HT_SYSTEMCORECOUNT(up)	(MCREG_FIELD_CMN(up, CpuCnt) + 1)
+
+/*
+ * Function 0 - HT Configuration: Unit ID Register
+ */
+union mcreg_unitid {
+	uint32_t	_val32;
+	struct {
+		uint32_t	C0Unit:2;	/*  1:0 */
+		uint32_t	C1Unit:2;	/*  3:2 */
+		uint32_t	McUnit:2;	/*  5:4 */
+		uint32_t	HbUnit:2;	/*  7:6 */
+		uint32_t	SbLink:2;	/*  9:8 */
+		uint32_t	reserved:22;	/* 31:10 */
+	} _fmt_cmn;
+};
+
+/*
  * Function 1 - DRAM Address Map: DRAM Base i Registers
  *
  */