summaryrefslogtreecommitdiff
path: root/usr/src/uts/common
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/uts/common')
-rw-r--r--usr/src/uts/common/io/mem.c62
-rw-r--r--usr/src/uts/common/krtld/kobj.c4
-rw-r--r--usr/src/uts/common/krtld/kobj_stubs.c4
-rw-r--r--usr/src/uts/common/os/chip.c12
-rw-r--r--usr/src/uts/common/os/cpu.c52
-rw-r--r--usr/src/uts/common/os/ddifm.c29
-rw-r--r--usr/src/uts/common/os/fm.c184
-rw-r--r--usr/src/uts/common/os/kcpc.c44
-rw-r--r--usr/src/uts/common/os/modconf.c7
-rw-r--r--usr/src/uts/common/os/modctl.c97
-rw-r--r--usr/src/uts/common/os/panic.c3
-rw-r--r--usr/src/uts/common/os/policy.c8
-rw-r--r--usr/src/uts/common/sys/Makefile13
-rw-r--r--usr/src/uts/common/sys/chip.h1
-rw-r--r--usr/src/uts/common/sys/dumphdr.h3
-rw-r--r--usr/src/uts/common/sys/fm/cpu/UltraSPARC-II.h65
-rw-r--r--usr/src/uts/common/sys/fm/cpu/UltraSPARC-III.h446
-rw-r--r--usr/src/uts/common/sys/fm/cpu/UltraSPARC-T1.h66
-rw-r--r--usr/src/uts/common/sys/fm/protocol.h15
-rw-r--r--usr/src/uts/common/sys/fm/util.h10
-rw-r--r--usr/src/uts/common/sys/kobj.h4
-rw-r--r--usr/src/uts/common/sys/mem.h10
-rw-r--r--usr/src/uts/common/sys/modctl.h51
-rw-r--r--usr/src/uts/common/sys/policy.h3
24 files changed, 428 insertions, 765 deletions
diff --git a/usr/src/uts/common/io/mem.c b/usr/src/uts/common/io/mem.c
index 0569b0ebae..11667e8c59 100644
--- a/usr/src/uts/common/io/mem.c
+++ b/usr/src/uts/common/io/mem.c
@@ -68,13 +68,15 @@
#include <sys/debug.h>
#include <sys/fm/protocol.h>
-#ifdef __sparc
+#if defined(__sparc)
extern int cpu_get_mem_name(uint64_t, uint64_t *, uint64_t, char *, int, int *);
extern int cpu_get_mem_info(uint64_t, uint64_t, uint64_t *, uint64_t *,
uint64_t *, int *, int *, int *);
extern size_t cpu_get_name_bufsize(void);
extern int cpu_get_mem_sid(char *, char *, int, int *);
extern int cpu_get_mem_addr(char *, char *, uint64_t, uint64_t *);
+#elif defined(__i386) || defined(__amd64)
+#include <sys/cpu_module.h>
#endif /* __sparc */
/*
@@ -415,6 +417,9 @@ mmwrite(dev_t dev, struct uio *uio, cred_t *cred)
static int
mmioctl_vtop(intptr_t data)
{
+#ifdef _SYSCALL32
+ mem_vtop32_t vtop32;
+#endif
mem_vtop_t mem_vtop;
proc_t *p;
pfn_t pfn = (pfn_t)PFN_INVALID;
@@ -422,13 +427,36 @@ mmioctl_vtop(intptr_t data)
struct as *as;
struct seg *seg;
- if (copyin((void *)data, &mem_vtop, sizeof (mem_vtop_t)))
- return (EFAULT);
+ if (get_udatamodel() == DATAMODEL_NATIVE) {
+ if (copyin((void *)data, &mem_vtop, sizeof (mem_vtop_t)))
+ return (EFAULT);
+ }
+#ifdef _SYSCALL32
+ else {
+ if (copyin((void *)data, &vtop32, sizeof (mem_vtop32_t)))
+ return (EFAULT);
+ mem_vtop.m_as = (struct as *)vtop32.m_as;
+ mem_vtop.m_va = (void *)vtop32.m_va;
+
+ if (mem_vtop.m_as != NULL)
+ return (EINVAL);
+ }
+#endif
+
if (mem_vtop.m_as == &kas) {
pfn = hat_getpfnum(kas.a_hat, mem_vtop.m_va);
- } else if (mem_vtop.m_as == NULL) {
- return (EIO);
} else {
+ if (mem_vtop.m_as == NULL) {
+ /*
+ * Assume the calling process's address space if the
+ * caller didn't specify one.
+ */
+ p = curthread->t_procp;
+ if (p == NULL)
+ return (EIO);
+ mem_vtop.m_as = p->p_as;
+ }
+
mutex_enter(&pidlock);
for (p = practive; p != NULL; p = p->p_next) {
if (p->p_as == mem_vtop.m_as) {
@@ -461,8 +489,18 @@ mmioctl_vtop(intptr_t data)
mem_vtop.m_pfn = pfn;
if (pfn == PFN_INVALID)
return (EIO);
- if (copyout(&mem_vtop, (void *)data, sizeof (mem_vtop_t)))
- return (EFAULT);
+
+ if (get_udatamodel() == DATAMODEL_NATIVE) {
+ if (copyout(&mem_vtop, (void *)data, sizeof (mem_vtop_t)))
+ return (EFAULT);
+ }
+#ifdef _SYSCALL32
+ else {
+ vtop32.m_pfn = mem_vtop.m_pfn;
+ if (copyout(&vtop32, (void *)data, sizeof (mem_vtop32_t)))
+ return (EFAULT);
+ }
+#endif
return (0);
}
@@ -533,7 +571,7 @@ mmioctl_page_fmri_retire(int cmd, intptr_t data)
if ((err = mm_get_mem_fmri(&mpage, &nvl)) < 0)
return (err);
- if ((err = mm_get_paddr(nvl, &pa)) < 0) {
+ if ((err = mm_get_paddr(nvl, &pa)) != 0) {
nvlist_free(nvl);
return (err);
}
@@ -1120,7 +1158,7 @@ mm_get_paddr(nvlist_t *nvl, uint64_t *paddr)
* If the "offset" member is not present, then the address is
* retrieved from the "physaddr" member.
*/
-#ifdef __sparc
+#if defined(__sparc)
if (nvlist_lookup_uint64(nvl, FM_FMRI_MEM_OFFSET, &offset) != 0) {
if (nvlist_lookup_uint64(nvl, FM_FMRI_MEM_PHYSADDR, &pa) !=
0) {
@@ -1134,9 +1172,11 @@ mm_get_paddr(nvlist_t *nvl, uint64_t *paddr)
if ((err = cpu_get_mem_addr(unum, serids[0], offset, &pa)) != 0)
return (err);
}
-#else /* __i386, __amd64 */
- if (nvlist_lookup_uint64(nvl, FM_FMRI_MEM_PHYSADDR, &pa) != 0)
+#elif defined(__i386) || defined(__amd64)
+ if (cmi_mc_unumtopa(NULL, nvl, &pa) == 0)
return (EINVAL);
+#else
+#error "port me"
#endif /* __sparc */
*paddr = pa;
diff --git a/usr/src/uts/common/krtld/kobj.c b/usr/src/uts/common/krtld/kobj.c
index 6df0916ea0..003022d104 100644
--- a/usr/src/uts/common/krtld/kobj.c
+++ b/usr/src/uts/common/krtld/kobj.c
@@ -20,7 +20,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -2970,7 +2970,7 @@ kobj_getelfsym(char *name, void *mp, int *size)
}
uintptr_t
-kobj_lookup(void *mod, char *name)
+kobj_lookup(struct module *mod, const char *name)
{
Sym *sp;
diff --git a/usr/src/uts/common/krtld/kobj_stubs.c b/usr/src/uts/common/krtld/kobj_stubs.c
index 7bc82c5139..3d972194bb 100644
--- a/usr/src/uts/common/krtld/kobj_stubs.c
+++ b/usr/src/uts/common/krtld/kobj_stubs.c
@@ -20,7 +20,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -159,7 +159,7 @@ kobj_searchsym(struct module *mp, uintptr_t value, ulong_t *offset)
/*ARGSUSED*/
uintptr_t
-kobj_lookup(void *mod, char *name)
+kobj_lookup(struct module *mod, const char *name)
{
return (0);
}
diff --git a/usr/src/uts/common/os/chip.c b/usr/src/uts/common/os/chip.c
index b6fcbe89d2..8b0bfd765d 100644
--- a/usr/src/uts/common/os/chip.c
+++ b/usr/src/uts/common/os/chip.c
@@ -124,6 +124,18 @@ chip_find(chipid_t chipid)
return (NULL);
}
+chip_t *
+chip_lookup(chipid_t chipid)
+{
+ chip_t *chp;
+
+ mutex_enter(&cpu_lock);
+ chp = chip_find(chipid);
+ mutex_exit(&cpu_lock);
+
+ return (chp);
+}
+
#ifndef sun4v
/*
* Setup the kstats for this chip, if needed
diff --git a/usr/src/uts/common/os/cpu.c b/usr/src/uts/common/os/cpu.c
index e9f4453f81..674f8bd6e5 100644
--- a/usr/src/uts/common/os/cpu.c
+++ b/usr/src/uts/common/os/cpu.c
@@ -59,6 +59,9 @@
#include <sys/msacct.h>
#include <sys/time.h>
#include <sys/archsystm.h>
+#if defined(__i386) || defined(__amd64)
+#include <sys/x86_archext.h>
+#endif
extern int mp_cpu_start(cpu_t *);
extern int mp_cpu_stop(cpu_t *);
@@ -2067,12 +2070,19 @@ static struct {
kstat_named_t ci_clock_MHz;
kstat_named_t ci_chip_id;
kstat_named_t ci_implementation;
-#ifdef __sparcv9
+ kstat_named_t ci_brandstr;
+ kstat_named_t ci_core_id;
+#if defined(__sparcv9)
kstat_named_t ci_device_ID;
kstat_named_t ci_cpu_fru;
#endif
- kstat_named_t ci_brandstr;
- kstat_named_t ci_core_id;
+#if defined(__i386) || defined(__amd64)
+ kstat_named_t ci_vendorstr;
+ kstat_named_t ci_family;
+ kstat_named_t ci_model;
+ kstat_named_t ci_step;
+ kstat_named_t ci_clogid;
+#endif
} cpu_info_template = {
{ "state", KSTAT_DATA_CHAR },
{ "state_begin", KSTAT_DATA_LONG },
@@ -2081,12 +2091,19 @@ static struct {
{ "clock_MHz", KSTAT_DATA_LONG },
{ "chip_id", KSTAT_DATA_LONG },
{ "implementation", KSTAT_DATA_STRING },
-#ifdef __sparcv9
+ { "brand", KSTAT_DATA_STRING },
+ { "core_id", KSTAT_DATA_LONG },
+#if defined(__sparcv9)
{ "device_ID", KSTAT_DATA_UINT64 },
{ "cpu_fru", KSTAT_DATA_STRING },
#endif
- { "brand", KSTAT_DATA_STRING },
- { "core_id", KSTAT_DATA_LONG },
+#if defined(__i386) || defined(__amd64)
+ { "vendor_id", KSTAT_DATA_STRING },
+ { "family", KSTAT_DATA_INT32 },
+ { "model", KSTAT_DATA_INT32 },
+ { "stepping", KSTAT_DATA_INT32 },
+ { "clog_id", KSTAT_DATA_INT32 },
+#endif
};
static kmutex_t cpu_info_template_lock;
@@ -2132,13 +2149,23 @@ cpu_info_kstat_update(kstat_t *ksp, int rw)
cpu_info_template.ci_chip_id.value.l = chip_plat_get_chipid(cp);
kstat_named_setstr(&cpu_info_template.ci_implementation,
cp->cpu_idstr);
-#ifdef __sparcv9
+ kstat_named_setstr(&cpu_info_template.ci_brandstr, cp->cpu_brandstr);
+
+#if defined(__sparcv9)
cpu_info_template.ci_device_ID.value.ui64 =
cpunodes[cp->cpu_id].device_id;
kstat_named_setstr(&cpu_info_template.ci_cpu_fru, cpu_fru_fmri(cp));
#endif
- kstat_named_setstr(&cpu_info_template.ci_brandstr, cp->cpu_brandstr);
+#if defined(__i386) || defined(__amd64)
cpu_info_template.ci_core_id.value.l = chip_plat_get_coreid(cp);
+ kstat_named_setstr(&cpu_info_template.ci_vendorstr,
+ cpuid_getvendorstr(cp));
+ cpu_info_template.ci_family.value.l = cpuid_getfamily(cp);
+ cpu_info_template.ci_model.value.l = cpuid_getmodel(cp);
+ cpu_info_template.ci_step.value.l = cpuid_getstep(cp);
+ cpu_info_template.ci_clogid.value.l = chip_plat_get_clogid(cp);
+#endif
+
return (0);
}
@@ -2155,13 +2182,16 @@ cpu_info_kstat_create(cpu_t *cp)
zoneid = ALL_ZONES;
if ((cp->cpu_info_kstat = kstat_create_zone("cpu_info", cp->cpu_id,
NULL, "misc", KSTAT_TYPE_NAMED,
- sizeof (cpu_info_template) / sizeof (kstat_named_t),
- KSTAT_FLAG_VIRTUAL, zoneid)) != NULL) {
+ sizeof (cpu_info_template) / sizeof (kstat_named_t),
+ KSTAT_FLAG_VIRTUAL, zoneid)) != NULL) {
cp->cpu_info_kstat->ks_data_size += 2 * CPU_IDSTRLEN;
-#ifdef __sparcv9
+#if defined(__sparcv9)
cp->cpu_info_kstat->ks_data_size +=
strlen(cpu_fru_fmri(cp)) + 1;
#endif
+#if defined(__i386) || defined(__amd64)
+ cp->cpu_info_kstat->ks_data_size += X86_VENDOR_STRLEN;
+#endif
cp->cpu_info_kstat->ks_lock = &cpu_info_template_lock;
cp->cpu_info_kstat->ks_data = &cpu_info_template;
cp->cpu_info_kstat->ks_private = cp;
diff --git a/usr/src/uts/common/os/ddifm.c b/usr/src/uts/common/os/ddifm.c
index 911a7d9a2f..6edd829ba8 100644
--- a/usr/src/uts/common/os/ddifm.c
+++ b/usr/src/uts/common/os/ddifm.c
@@ -20,7 +20,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.
*/
@@ -477,7 +477,10 @@ ddi_fm_handler_register(dev_info_t *dip, ddi_err_func_t handler,
return;
}
- pdip = (dev_info_t *)DEVI(dip)->devi_parent;
+ if (dip == ddi_root_node())
+ pdip = dip;
+ else
+ pdip = (dev_info_t *)DEVI(dip)->devi_parent;
ASSERT(pdip);
@@ -529,7 +532,10 @@ ddi_fm_handler_unregister(dev_info_t *dip)
return;
}
- pdip = (dev_info_t *)DEVI(dip)->devi_parent;
+ if (dip == ddi_root_node())
+ pdip = dip;
+ else
+ pdip = (dev_info_t *)DEVI(dip)->devi_parent;
ASSERT(pdip);
@@ -581,10 +587,11 @@ ddi_fm_handler_unregister(dev_info_t *dip)
* This function must be called from a driver's attach(9E) entry point.
*/
void
-ddi_fm_init(dev_info_t *dip, int *fmcap, ddi_iblock_cookie_t *ibc)
+ddi_fm_init(dev_info_t *dip, int *fmcap, ddi_iblock_cookie_t *ibcp)
{
struct dev_info *devi = DEVI(dip);
struct i_ddi_fmhdl *fmhdl;
+ ddi_iblock_cookie_t ibc;
int pcap, newcap = DDI_FM_NOT_CAPABLE;
if (!DEVI_IS_ATTACHING(dip)) {
@@ -606,11 +613,12 @@ ddi_fm_init(dev_info_t *dip, int *fmcap, ddi_iblock_cookie_t *ibc)
* Initialize the default ibc. The parent may change it
* depending upon its capabilities.
*/
- *ibc = (ddi_iblock_cookie_t)ipltospl(FM_ERR_PIL);
+ ibc = (ddi_iblock_cookie_t)ipltospl(FM_ERR_PIL);
- pcap = i_ndi_busop_fm_init(dip, *fmcap, ibc);
+ pcap = i_ndi_busop_fm_init(dip, *fmcap, &ibc);
} else {
pcap = *fmcap;
+ ibc = *ibcp;
}
/* Initialize the per-device instance FM handle */
@@ -636,7 +644,7 @@ ddi_fm_init(dev_info_t *dip, int *fmcap, ddi_iblock_cookie_t *ibc)
fmhdl->fh_acc_cache = NULL;
fmhdl->fh_tgts = NULL;
fmhdl->fh_dip = dip;
- fmhdl->fh_ibc = *ibc;
+ fmhdl->fh_ibc = ibc;
mutex_init(&fmhdl->fh_lock, NULL, MUTEX_DRIVER, fmhdl->fh_ibc);
devi->devi_fmhdl = fmhdl;
@@ -672,7 +680,7 @@ ddi_fm_init(dev_info_t *dip, int *fmcap, ddi_iblock_cookie_t *ibc)
*/
if (DDI_FM_DMA_ERR_CAP(*fmcap) && DDI_FM_DMA_ERR_CAP(pcap)) {
- i_ndi_fmc_create(&fmhdl->fh_dma_cache, 2, *ibc);
+ i_ndi_fmc_create(&fmhdl->fh_dma_cache, 2, ibc);
/* Set-up dma chk capability prop */
if (ddi_getprop(DDI_DEV_T_ANY, dip, DDI_PROP_DONTPASS,
@@ -684,7 +692,7 @@ ddi_fm_init(dev_info_t *dip, int *fmcap, ddi_iblock_cookie_t *ibc)
}
if (DDI_FM_ACC_ERR_CAP(*fmcap) && DDI_FM_ACC_ERR_CAP(pcap)) {
- i_ndi_fmc_create(&fmhdl->fh_acc_cache, 2, *ibc);
+ i_ndi_fmc_create(&fmhdl->fh_acc_cache, 2, ibc);
/* Set-up dma chk capability prop */
if (ddi_getprop(DDI_DEV_T_ANY, dip, DDI_PROP_DONTPASS,
"fm-accchk-capable", 0) == 0)
@@ -700,6 +708,9 @@ ddi_fm_init(dev_info_t *dip, int *fmcap, ddi_iblock_cookie_t *ibc)
*/
fmhdl->fh_cap = newcap;
*fmcap = newcap;
+
+ if (ibcp != NULL)
+ *ibcp = ibc;
}
/*
diff --git a/usr/src/uts/common/os/fm.c b/usr/src/uts/common/os/fm.c
index 33e8357a88..897697c2dc 100644
--- a/usr/src/uts/common/os/fm.c
+++ b/usr/src/uts/common/os/fm.c
@@ -20,7 +20,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -60,7 +60,6 @@
#include <sys/sysevent.h>
#include <sys/sysevent_impl.h>
#include <sys/nvpair.h>
-#include <sys/nvpair_impl.h>
#include <sys/cmn_err.h>
#include <sys/cpuvar.h>
#include <sys/sysmacros.h>
@@ -73,6 +72,8 @@
#include <sys/cpuvar.h>
#include <sys/console.h>
#include <sys/panic.h>
+#include <sys/kobj.h>
+#include <sys/sunddi.h>
#include <sys/systeminfo.h>
#include <sys/sysevent/eventdefs.h>
#include <sys/fm/util.h>
@@ -614,15 +615,13 @@ fm_nvlist_create(nv_alloc_t *nva)
void
fm_nvlist_destroy(nvlist_t *nvl, int flag)
{
- nv_alloc_t *nvhdl;
-
- nvhdl = ((nvpriv_t *)(uintptr_t)nvl->nvl_priv)->nvp_nva;
+ nv_alloc_t *nva = nvlist_lookup_nv_alloc(nvl);
nvlist_free(nvl);
- if (nvhdl != NULL) {
+ if (nva != NULL) {
if (flag == FM_NVA_FREE)
- fm_nva_xdestroy(nvhdl);
+ fm_nva_xdestroy(nva);
}
}
@@ -820,53 +819,88 @@ fm_ereport_set(nvlist_t *ereport, int version, const char *erpt_class,
atomic_add_64(&erpt_kstat_data.erpt_set_failed.value.ui64, 1);
}
+/*
+ * Set-up and validate the members of an hc fmri according to;
+ *
+ * Member name Type Value
+ * ===================================================
+ * version uint8_t 0
+ * auth nvlist_t <auth>
+ * hc-name string <name>
+ * hc-id string <id>
+ *
+ * Note that auth and hc-id are optional members.
+ */
+
+#define HC_MAXPAIRS 20
+#define HC_MAXNAMELEN 50
+
static int
-i_fm_fmri_hc_set_v0(nvlist_t *hc, uint32_t size, va_list ap)
+fm_fmri_hc_set_common(nvlist_t *fmri, int version, const nvlist_t *auth)
{
- int i, ret;
- const char *name, *id;
- nvlist_t **hc_nvl;
+ if (version != FM_HC_SCHEME_VERSION) {
+ atomic_add_64(&erpt_kstat_data.fmri_set_failed.value.ui64, 1);
+ return (0);
+ }
- if (size <= 0)
+ if (nvlist_add_uint8(fmri, FM_VERSION, version) != 0 ||
+ nvlist_add_string(fmri, FM_FMRI_SCHEME, FM_FMRI_SCHEME_HC) != 0) {
+ atomic_add_64(&erpt_kstat_data.fmri_set_failed.value.ui64, 1);
return (0);
+ }
- hc_nvl = kmem_zalloc(size * sizeof (nvlist_t *), KM_SLEEP);
+ if (auth != NULL && nvlist_add_nvlist(fmri, FM_FMRI_AUTHORITY,
+ (nvlist_t *)auth) != 0) {
+ atomic_add_64(&erpt_kstat_data.fmri_set_failed.value.ui64, 1);
+ return (0);
+ }
- for (i = 0; i < size; ++i) {
- name = va_arg(ap, const char *);
- if (name == NULL) {
- ret = EINVAL;
- goto fail;
- }
- id = va_arg(ap, const char *);
- if ((hc_nvl[i] = fm_nvlist_create(
- ((nvpriv_t *)(uintptr_t)hc->nvl_priv)->nvp_nva)) == NULL) {
- ret = ENOMEM;
- goto fail;
+ return (1);
+}
+
+void
+fm_fmri_hc_set(nvlist_t *fmri, int version, const nvlist_t *auth,
+ nvlist_t *snvl, int npairs, ...)
+{
+ nv_alloc_t *nva = nvlist_lookup_nv_alloc(fmri);
+ nvlist_t *pairs[HC_MAXPAIRS];
+ va_list ap;
+ int i;
+
+ if (!fm_fmri_hc_set_common(fmri, version, auth))
+ return;
+
+ npairs = MIN(npairs, HC_MAXPAIRS);
+
+ va_start(ap, npairs);
+ for (i = 0; i < npairs; i++) {
+ const char *name = va_arg(ap, const char *);
+ uint32_t id = va_arg(ap, uint32_t);
+ char idstr[11];
+
+ (void) snprintf(idstr, sizeof (idstr), "%u", id);
+
+ pairs[i] = fm_nvlist_create(nva);
+ if (nvlist_add_string(pairs[i], FM_FMRI_HC_NAME, name) != 0 ||
+ nvlist_add_string(pairs[i], FM_FMRI_HC_ID, idstr) != 0) {
+ atomic_add_64(
+ &erpt_kstat_data.fmri_set_failed.value.ui64, 1);
}
- if ((ret = nvlist_add_string(hc_nvl[i], FM_FMRI_HC_NAME,
- name)) != 0)
- goto fail;
- if ((ret = nvlist_add_string(hc_nvl[i], FM_FMRI_HC_ID,
- id)) != 0)
- goto fail;
}
+ va_end(ap);
- if ((ret = nvlist_add_nvlist_array(hc, FM_FMRI_HC_LIST, hc_nvl,
- size)) != 0)
- goto fail;
+ if (nvlist_add_nvlist_array(fmri, FM_FMRI_HC_LIST, pairs, npairs) != 0)
+ atomic_add_64(&erpt_kstat_data.fmri_set_failed.value.ui64, 1);
- kmem_free(hc_nvl, size * sizeof (nvlist_t *));
- return (0);
+ for (i = 0; i < npairs; i++)
+ fm_nvlist_destroy(pairs[i], FM_NVA_RETAIN);
-fail:
- for (i = 0; i < size; ++i) {
- if (hc_nvl[i] != NULL)
- fm_nvlist_destroy(hc_nvl[i], FM_NVA_RETAIN);
+ if (snvl != NULL) {
+ if (nvlist_add_nvlist(fmri, FM_FMRI_HC_SPECIFIC, snvl) != 0) {
+ atomic_add_64(
+ &erpt_kstat_data.fmri_set_failed.value.ui64, 1);
+ }
}
-
- kmem_free(hc_nvl, size * sizeof (nvlist_t *));
- return (ret);
}
/*
@@ -930,47 +964,45 @@ fm_fmri_dev_set(nvlist_t *fmri_dev, int version, const nvlist_t *auth,
* cpumask uint8_t <cpu_mask>
* serial uint64_t <serial_id>
*
- * Note that auth is an optional member.
+ * Note that auth, cpumask, serial are optional members.
*
*/
void
fm_fmri_cpu_set(nvlist_t *fmri_cpu, int version, const nvlist_t *auth,
- uint32_t cpu_id, uint8_t cpu_mask, uint64_t serial_id)
+ uint32_t cpu_id, uint8_t *cpu_maskp, const char *serial_idp)
{
- if (version != CPU_SCHEME_VERSION0) {
- atomic_add_64(&erpt_kstat_data.fmri_set_failed.value.ui64, 1);
+ uint64_t *failedp = &erpt_kstat_data.fmri_set_failed.value.ui64;
+
+ if (version < CPU_SCHEME_VERSION1) {
+ atomic_add_64(failedp, 1);
return;
}
if (nvlist_add_uint8(fmri_cpu, FM_VERSION, version) != 0) {
- atomic_add_64(&erpt_kstat_data.fmri_set_failed.value.ui64, 1);
+ atomic_add_64(failedp, 1);
return;
}
if (nvlist_add_string(fmri_cpu, FM_FMRI_SCHEME,
FM_FMRI_SCHEME_CPU) != 0) {
- atomic_add_64(&erpt_kstat_data.fmri_set_failed.value.ui64, 1);
+ atomic_add_64(failedp, 1);
return;
}
- if (auth != NULL)
- if (nvlist_add_nvlist(fmri_cpu, FM_FMRI_AUTHORITY,
- (nvlist_t *)auth) != 0) {
- atomic_add_64(
- &erpt_kstat_data.fmri_set_failed.value.ui64, 1);
- }
+ if (auth != NULL && nvlist_add_nvlist(fmri_cpu, FM_FMRI_AUTHORITY,
+ (nvlist_t *)auth) != 0)
+ atomic_add_64(failedp, 1);
- if (nvlist_add_uint32(fmri_cpu, FM_FMRI_CPU_ID, cpu_id) != 0) {
- atomic_add_64(&erpt_kstat_data.fmri_set_failed.value.ui64, 1);
- }
+ if (nvlist_add_uint32(fmri_cpu, FM_FMRI_CPU_ID, cpu_id) != 0)
+ atomic_add_64(failedp, 1);
- if (nvlist_add_uint8(fmri_cpu, FM_FMRI_CPU_MASK, cpu_mask) != 0) {
- atomic_add_64(&erpt_kstat_data.fmri_set_failed.value.ui64, 1);
- }
+ if (cpu_maskp != NULL && nvlist_add_uint8(fmri_cpu, FM_FMRI_CPU_MASK,
+ *cpu_maskp) != 0)
+ atomic_add_64(failedp, 1);
- if (nvlist_add_uint64(fmri_cpu, FM_FMRI_CPU_SERIAL_ID, serial_id)
- != 0)
- atomic_add_64(&erpt_kstat_data.fmri_set_failed.value.ui64, 1);
+ if (serial_idp == NULL || nvlist_add_string(fmri_cpu,
+ FM_FMRI_CPU_SERIAL_ID, (char *)serial_idp) != 0)
+ atomic_add_64(failedp, 1);
}
/*
@@ -1159,3 +1191,29 @@ fm_ena_time_get(uint64_t ena)
return (time);
}
+
+/*
+ * Convert a getpcstack() trace to symbolic name+offset, and add the resulting
+ * string array to a Fault Management ereport as FM_EREPORT_PAYLOAD_NAME_STACK.
+ */
+void
+fm_payload_stack_add(nvlist_t *payload, const pc_t *stack, int depth)
+{
+ int i;
+ char *sym;
+ ulong_t off;
+ char *stkpp[FM_STK_DEPTH];
+ char buf[FM_STK_DEPTH * FM_SYM_SZ];
+ char *stkp = buf;
+
+ for (i = 0; i < depth && i != FM_STK_DEPTH; i++, stkp += FM_SYM_SZ) {
+ if ((sym = kobj_getsymname(stack[i], &off)) != NULL)
+ (void) snprintf(stkp, FM_SYM_SZ, "%s+%lx", sym, off);
+ else
+ (void) snprintf(stkp, FM_SYM_SZ, "%lx", (long)stack[i]);
+ stkpp[i] = stkp;
+ }
+
+ fm_payload_set(payload, FM_EREPORT_PAYLOAD_NAME_STACK,
+ DATA_TYPE_STRING_ARRAY, FM_STK_DEPTH, stkpp, NULL);
+}
diff --git a/usr/src/uts/common/os/kcpc.c b/usr/src/uts/common/os/kcpc.c
index f3bfd93d24..569344e8ca 100644
--- a/usr/src/uts/common/os/kcpc.c
+++ b/usr/src/uts/common/os/kcpc.c
@@ -19,8 +19,9 @@
*
* CDDL HEADER END
*/
+
/*
- * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -1515,41 +1516,12 @@ kcpc_invalidate(kthread_t *t)
int
kcpc_pcbe_tryload(const char *prefix, uint_t first, uint_t second, uint_t third)
{
- char modname[PCBE_NAMELEN];
- char stub[PCBE_NAMELEN];
-
- if (prefix != NULL)
- (void) snprintf(stub, PCBE_NAMELEN, "pcbe.%s", prefix);
- else
- (void) snprintf(stub, PCBE_NAMELEN, "pcbe");
-
- (void) snprintf(modname, PCBE_NAMELEN, "%s.%u.%u.%u",
- stub, first, second, third);
-
- DTRACE_PROBE1(kcpc__pcbe__spec, char *, modname);
-
- if (modload("pcbe", modname) >= 0)
- return (0);
-
- (void) snprintf(modname, PCBE_NAMELEN, "%s.%u.%u",
- stub, first, second);
- if (modload("pcbe", modname) >= 0)
- return (0);
-
- (void) snprintf(modname, PCBE_NAMELEN, "%s.%u", stub, first);
- if (modload("pcbe", modname) >= 0)
- return (0);
-
- if (prefix == NULL)
- /*
- * If no prefix was given, we have tried all possible
- * PCBE names.
- */
- return (-1);
+ uint_t s[3];
- (void) snprintf(modname, PCBE_NAMELEN, "%s", stub);
- if (modload("pcbe", modname) >= 0)
- return (0);
+ s[0] = first;
+ s[1] = second;
+ s[2] = third;
- return (-1);
+ return (modload_qualified("pcbe",
+ "pcbe", prefix, ".", s, 3) < 0 ? -1 : 0);
}
diff --git a/usr/src/uts/common/os/modconf.c b/usr/src/uts/common/os/modconf.c
index 2c033495bc..f270cad2a0 100644
--- a/usr/src/uts/common/os/modconf.c
+++ b/usr/src/uts/common/os/modconf.c
@@ -20,7 +20,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.
*/
@@ -101,6 +101,11 @@ struct mod_ops mod_miscops = {
mod_null, mod_null, mod_infonull
};
+/* CPU Modules */
+struct mod_ops mod_cpuops = {
+ mod_null, mod_null, mod_infonull
+};
+
/*
* Cryptographic Modules
*/
diff --git a/usr/src/uts/common/os/modctl.c b/usr/src/uts/common/os/modctl.c
index 73e0447ab1..e776a36310 100644
--- a/usr/src/uts/common/os/modctl.c
+++ b/usr/src/uts/common/os/modctl.c
@@ -19,6 +19,7 @@
*
* CDDL HEADER END
*/
+
/*
* Copyright 2006 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
@@ -84,15 +85,14 @@ static int modinfo(modid_t, struct modinfo *);
static void mod_uninstall_all(void);
static int mod_getinfo(struct modctl *, struct modinfo *);
-static struct modctl *allocate_modp(char *, char *);
+static struct modctl *allocate_modp(const char *, const char *);
static int mod_load(struct modctl *, int);
static void mod_unload(struct modctl *);
static int modinstall(struct modctl *);
static int moduninstall(struct modctl *);
-static struct modctl *mod_hold_by_name_common(struct modctl *, char *);
-static struct modctl *mod_hold_by_id(modid_t);
+static struct modctl *mod_hold_by_name_common(struct modctl *, const char *);
static struct modctl *mod_hold_next_by_id(modid_t);
static struct modctl *mod_hold_loaded_mod(struct modctl *, char *, int *);
static struct modctl *mod_hold_installed_mod(char *, int, int *);
@@ -1943,6 +1943,71 @@ modload(char *subdir, char *filename)
}
/*
+ * Load a module using a series of qualified names from most specific to least
+ * specific, e.g. for subdir "foo", p1 "bar", p2 "baz", we might try:
+ *
+ * foo/bar.baz.1.2.3
+ * foo/bar.baz.1.2
+ * foo/bar.baz.1
+ *
+ * Return the module ID on success; -1 if no module was loaded.
+ */
+int
+modload_qualified(const char *subdir, const char *p1,
+ const char *p2, const char *delim, uint_t suffv[], int suffc)
+{
+ char path[MOD_MAXPATH];
+ size_t n, resid = sizeof (path);
+ char *p = path;
+
+ char **dotv;
+ int i, rc, id;
+ modctl_t *mp;
+
+ if (p2 != NULL)
+ n = snprintf(p, resid, "%s/%s%s%s", subdir, p1, delim, p2);
+ else
+ n = snprintf(p, resid, "%s/%s", subdir, p1);
+
+ if (n >= resid)
+ return (-1);
+
+ p += n;
+ resid -= n;
+ dotv = kmem_alloc(sizeof (char *) * (suffc + 1), KM_SLEEP);
+
+ for (i = 0; i < suffc; i++) {
+ dotv[i] = p;
+ n = snprintf(p, resid, "%s%u", delim, suffv[i]);
+
+ if (n >= resid) {
+ kmem_free(dotv, sizeof (char *) * (suffc + 1));
+ return (-1);
+ }
+
+ p += n;
+ resid -= n;
+ }
+
+ dotv[suffc] = p;
+
+ for (i = suffc; i >= 0; i--) {
+ dotv[i][0] = '\0';
+ mp = mod_hold_installed_mod(path, 1, &rc);
+
+ if (mp != NULL) {
+ kmem_free(dotv, sizeof (char *) * (suffc + 1));
+ id = mp->mod_id;
+ mod_release_mod(mp);
+ return (id);
+ }
+ }
+
+ kmem_free(dotv, sizeof (char *) * (suffc + 1));
+ return (-1);
+}
+
+/*
* Load a module.
*/
int
@@ -2440,7 +2505,7 @@ modadd(struct modctl *mp)
/*ARGSUSED*/
static struct modctl *
-allocate_modp(char *filename, char *modname)
+allocate_modp(const char *filename, const char *modname)
{
struct modctl *mp;
@@ -2473,12 +2538,12 @@ modgetsymname(uintptr_t value, ulong_t *offset)
}
/*
- * Lookup a symbol in a specified module. This is a wrapper routine that
- * calls kobj_lookup(). kobj_lookup() may go away but this
- * wrapper will prevent callers from noticing.
+ * Lookup a symbol in a specified module. These are wrapper routines that
+ * call kobj_lookup(). kobj_lookup() may go away but these wrappers will
+ * prevent callers from noticing.
*/
uintptr_t
-modlookup(char *modname, char *symname)
+modlookup(const char *modname, const char *symname)
{
struct modctl *modp;
uintptr_t val;
@@ -2490,6 +2555,14 @@ modlookup(char *modname, char *symname)
return (val);
}
+uintptr_t
+modlookup_by_modctl(modctl_t *modp, const char *symname)
+{
+ ASSERT(modp->mod_ref > 0 || modp->mod_busy);
+
+ return (kobj_lookup(modp->mod_mp, symname));
+}
+
/*
* Ask the user for the name of the system file and the default path
* for modules.
@@ -3149,9 +3222,9 @@ mod_hold_by_modctl(struct modctl *mp, int f)
}
static struct modctl *
-mod_hold_by_name_common(struct modctl *dep, char *filename)
+mod_hold_by_name_common(struct modctl *dep, const char *filename)
{
- char *modname;
+ const char *modname;
struct modctl *mp;
char *curname, *newname;
int found = 0;
@@ -3232,12 +3305,12 @@ mod_hold_by_name_requisite(struct modctl *dep, char *filename)
}
struct modctl *
-mod_hold_by_name(char *filename)
+mod_hold_by_name(const char *filename)
{
return (mod_hold_by_name_common(NULL, filename));
}
-static struct modctl *
+struct modctl *
mod_hold_by_id(modid_t modid)
{
struct modctl *mp;
diff --git a/usr/src/uts/common/os/panic.c b/usr/src/uts/common/os/panic.c
index e085b0e586..87910574f5 100644
--- a/usr/src/uts/common/os/panic.c
+++ b/usr/src/uts/common/os/panic.c
@@ -20,7 +20,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -143,6 +143,7 @@
#include <sys/spl.h>
#include <sys/errorq.h>
#include <sys/panic.h>
+#include <sys/fm/util.h>
/*
* Panic variables which are set once during the QUIESCE state by the
diff --git a/usr/src/uts/common/os/policy.c b/usr/src/uts/common/os/policy.c
index 0dccc35dce..fe4a5c82df 100644
--- a/usr/src/uts/common/os/policy.c
+++ b/usr/src/uts/common/os/policy.c
@@ -20,7 +20,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -1279,6 +1279,12 @@ secpolicy_kmdb(const cred_t *scr)
return (PRIV_POLICY(scr, PRIV_ALL, B_FALSE, EPERM, NULL));
}
+int
+secpolicy_error_inject(const cred_t *scr)
+{
+ return (PRIV_POLICY(scr, PRIV_ALL, B_FALSE, EPERM, NULL));
+}
+
/*
* Processor sets, cpu configuration, resource pools.
*/
diff --git a/usr/src/uts/common/sys/Makefile b/usr/src/uts/common/sys/Makefile
index bb8e6e8d7a..f82a933903 100644
--- a/usr/src/uts/common/sys/Makefile
+++ b/usr/src/uts/common/sys/Makefile
@@ -20,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.
#
# ident "%Z%%M% %I% %E% SMI"
@@ -657,12 +657,6 @@ FMHDRS= \
protocol.h \
util.h
-sparc_FMCPUHDRS= \
- UltraSPARC-II.h \
- UltraSPARC-III.h \
- UltraSPARC-T1.h
-FMCPUHDRS=$($(MACH)_FMCPUHDRS)
-
FMIOHDRS= \
ddi.h \
pci.h \
@@ -920,7 +914,6 @@ CHECKHDRS= \
$(TAVORHDRS:%.h=ib/adapters/tavor/%.check) \
$(ISOHDRS:%.h=iso/%.check) \
$(FMHDRS:%.h=fm/%.check) \
- $(FMCPUHDRS:%.h=fm/cpu/%.check) \
$(FMIOHDRS:%.h=fm/io/%.check) \
$(FSHDRS:%.h=fs/%.check) \
$(LVMHDRS:%.h=lvm/%.check) \
@@ -955,8 +948,7 @@ CHECKHDRS= \
$(ROOTDCAMHDRS) \
$(ROOTISOHDRS) \
$(ROOTFMHDRS) \
- $(ROOTFMCPUHDRS) \
- $(ROOTFMIOHDRS) \
+ $(ROOTFMIOHDRS) \
$(ROOTFSHDRS) \
$(ROOTIBDHDRS) \
$(ROOTIBHDRS) \
@@ -1000,7 +992,6 @@ install_h: \
$(ROOTDCAMHDRS) \
$(ROOTISOHDRS) \
$(ROOTFMHDRS) \
- $(ROOTFMCPUHDRS) \
$(ROOTFMIOHDRS) \
$(ROOTFSHDRS) \
$(ROOTIBDHDRS) \
diff --git a/usr/src/uts/common/sys/chip.h b/usr/src/uts/common/sys/chip.h
index e33b521783..80b9541d9a 100644
--- a/usr/src/uts/common/sys/chip.h
+++ b/usr/src/uts/common/sys/chip.h
@@ -172,6 +172,7 @@ void chip_cpu_fini(cpu_t *);
void chip_cpu_assign(cpu_t *);
void chip_cpu_unassign(cpu_t *);
void chip_cpu_startup(cpu_t *);
+chip_t *chip_lookup(chipid_t);
void chip_bootstrap_cpu(cpu_t *);
void chip_cpu_move_part(cpu_t *, struct cpupart *,
diff --git a/usr/src/uts/common/sys/dumphdr.h b/usr/src/uts/common/sys/dumphdr.h
index 7be14a40ed..5949b218c8 100644
--- a/usr/src/uts/common/sys/dumphdr.h
+++ b/usr/src/uts/common/sys/dumphdr.h
@@ -20,7 +20,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.
*/
@@ -33,7 +33,6 @@
#include <sys/param.h>
#include <sys/utsname.h>
#include <sys/log.h>
-#include <sys/fm/util.h>
#ifdef __cplusplus
extern "C" {
diff --git a/usr/src/uts/common/sys/fm/cpu/UltraSPARC-II.h b/usr/src/uts/common/sys/fm/cpu/UltraSPARC-II.h
deleted file mode 100644
index c6013c9515..0000000000
--- a/usr/src/uts/common/sys/fm/cpu/UltraSPARC-II.h
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * 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
- */
-/*
- * Copyright 2004 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
- */
-
-#ifndef _SYS_FM_ULTRASPARC_II_H
-#define _SYS_FM_ULTRASPARC_II_H
-
-#pragma ident "%Z%%M% %I% %E% SMI"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Ereport class subcategories for UltraSPARC I, and II families */
-#define FM_EREPORT_CPU_USI "ultraSPARC-I"
-#define FM_EREPORT_CPU_USII "ultraSPARC-II"
-#define FM_EREPORT_CPU_USIIe "ultraSPARC-IIe"
-#define FM_EREPORT_CPU_USIIi "ultraSPARC-IIi"
-#define FM_EREPORT_CPU_UNSUPPORTED "unsupported"
-
-/*
- * FM Ereport definitions.
- */
-#define FM_EREPORT_CPU_USII_ISAP "isap"
-#define FM_EREPORT_CPU_USII_ETP "etp"
-#define FM_EREPORT_CPU_USII_IVUE "ivue"
-#define FM_EREPORT_CPU_USII_TO "to"
-#define FM_EREPORT_CPU_USII_BERR "berr"
-#define FM_EREPORT_CPU_USII_LDP "ldp"
-#define FM_EREPORT_CPU_USII_CP "cp"
-#define FM_EREPORT_CPU_USII_WP "wp"
-#define FM_EREPORT_CPU_USII_EDP "edp"
-#define FM_EREPORT_CPU_USII_UE "ue"
-#define FM_EREPORT_CPU_USII_CE "ce"
-#define FM_EREPORT_CPU_USII_ESCRUB_TAG "escrub-etp"
-#define FM_EREPORT_CPU_USII_ESCRUB_DATA "escrub-edp"
-#define FM_EREPORT_CPU_USII_UNKNOWN "unknown"
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* _SYS_FM_ULTRASPARC_II_H */
diff --git a/usr/src/uts/common/sys/fm/cpu/UltraSPARC-III.h b/usr/src/uts/common/sys/fm/cpu/UltraSPARC-III.h
deleted file mode 100644
index 6422868396..0000000000
--- a/usr/src/uts/common/sys/fm/cpu/UltraSPARC-III.h
+++ /dev/null
@@ -1,446 +0,0 @@
-/*
- * 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
- */
-/*
- * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
- */
-
-#ifndef _SYS_FM_ULTRASPARC_III_H
-#define _SYS_FM_ULTRASPARC_III_H
-
-#pragma ident "%Z%%M% %I% %E% SMI"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Ereport class subcategories for UltraSPARC III and IV families */
-#define FM_EREPORT_CPU_USIII "ultraSPARC-III"
-#define FM_EREPORT_CPU_USIIIplus "ultraSPARC-IIIplus"
-#define FM_EREPORT_CPU_USIIIi "ultraSPARC-IIIi"
-#define FM_EREPORT_CPU_USIIIiplus "ultraSPARC-IIIiplus"
-#define FM_EREPORT_CPU_USIV "ultraSPARC-IV"
-#define FM_EREPORT_CPU_USIVplus "ultraSPARC-IVplus"
-#define FM_EREPORT_CPU_UNSUPPORTED "unsupported"
-
-/*
- * Ereport payload definitions.
- */
-#define FM_EREPORT_PAYLOAD_NAME_AFSR "afsr"
-#define FM_EREPORT_PAYLOAD_NAME_AFAR "afar"
-#define FM_EREPORT_PAYLOAD_NAME_AFAR_STATUS "afar-status"
-#define FM_EREPORT_PAYLOAD_NAME_PC "pc"
-#define FM_EREPORT_PAYLOAD_NAME_TL "tl"
-#define FM_EREPORT_PAYLOAD_NAME_TT "tt"
-#define FM_EREPORT_PAYLOAD_NAME_PRIV "privileged"
-#define FM_EREPORT_PAYLOAD_NAME_ME "multiple"
-#define FM_EREPORT_PAYLOAD_NAME_SYND "syndrome"
-#define FM_EREPORT_PAYLOAD_NAME_SYND_STATUS "syndrome-status"
-#define FM_EREPORT_PAYLOAD_NAME_EMU_EMR_SIZE "emu-mask-size"
-#define FM_EREPORT_PAYLOAD_NAME_EMU_EMR_DATA "emu-mask-data"
-#define FM_EREPORT_PAYLOAD_NAME_EMU_ESR_SIZE "emu-shadow-size"
-#define FM_EREPORT_PAYLOAD_NAME_EMU_ESR_DATA "emu-shadow-data"
-#define FM_EREPORT_PAYLOAD_NAME_L2_WAYS "l2-cache-ways"
-#define FM_EREPORT_PAYLOAD_NAME_L2_DATA "l2-cache-data"
-#define FM_EREPORT_PAYLOAD_NAME_L3_WAYS "l3-cache-ways"
-#define FM_EREPORT_PAYLOAD_NAME_L3_DATA "l3-cache-data"
-#define FM_EREPORT_PAYLOAD_NAME_L1D_WAYS "dcache-ways"
-#define FM_EREPORT_PAYLOAD_NAME_L1D_DATA "dcache-data"
-#define FM_EREPORT_PAYLOAD_NAME_L1I_WAYS "icache-ways"
-#define FM_EREPORT_PAYLOAD_NAME_L1I_DATA "icache-data"
-#define FM_EREPORT_PAYLOAD_NAME_L1P_WAYS "pcache-ways"
-#define FM_EREPORT_PAYLOAD_NAME_L1P_DATA "pcache-data"
-#define FM_EREPORT_PAYLOAD_NAME_ITLB_ENTRIES "itlb-entries"
-#define FM_EREPORT_PAYLOAD_NAME_ITLB_DATA "itlb-data"
-#define FM_EREPORT_PAYLOAD_NAME_DTLB_ENTRIES "dtlb-entries"
-#define FM_EREPORT_PAYLOAD_NAME_DTLB_DATA "dtlb-data"
-#define FM_EREPORT_PAYLOAD_NAME_ERR_TYPE "error-type"
-#define FM_EREPORT_PAYLOAD_NAME_RESOURCE "resource"
-#define FM_EREPORT_PAYLOAD_NAME_VA "va"
-#define FM_EREPORT_PAYLOAD_NAME_AFSR_EXT "afsr-ext"
-#define FM_EREPORT_PAYLOAD_NAME_COPYFUNCTION "copy-function"
-#define FM_EREPORT_PAYLOAD_NAME_INSTRBLOCK "instr-block"
-#define FM_EREPORT_PAYLOAD_NAME_HOWDETECTED "how-detected"
-#define FM_EREPORT_PAYLOAD_NAME_ERR_DISP "error-disposition"
-
-#define FM_EREPORT_PAYLOAD_FLAG_AFSR 0x0000000000000001
-#define FM_EREPORT_PAYLOAD_FLAG_AFAR_STATUS 0x0000000000000002
-#define FM_EREPORT_PAYLOAD_FLAG_AFAR 0x0000000000000004
-#define FM_EREPORT_PAYLOAD_FLAG_PC 0x0000000000000008
-#define FM_EREPORT_PAYLOAD_FLAG_TL 0x0000000000000010
-#define FM_EREPORT_PAYLOAD_FLAG_TT 0x0000000000000020
-#define FM_EREPORT_PAYLOAD_FLAG_PRIV 0x0000000000000040
-#define FM_EREPORT_PAYLOAD_FLAG_ME 0x0000000000000080
-#define FM_EREPORT_PAYLOAD_FLAG_SYND 0x0000000000000100
-#define FM_EREPORT_PAYLOAD_FLAG_SYND_STATUS 0x0000000000000200
-#define FM_EREPORT_PAYLOAD_FLAG_EMU_EMR_SIZE 0x0000000000000400
-#define FM_EREPORT_PAYLOAD_FLAG_EMU_EMR_DATA 0x0000000000000800
-#define FM_EREPORT_PAYLOAD_FLAG_EMU_ESR_SIZE 0x0000000000001000
-#define FM_EREPORT_PAYLOAD_FLAG_EMU_ESR_DATA 0x0000000000002000
-#define FM_EREPORT_PAYLOAD_FLAG_L2_WAYS 0x0000000000004000
-#define FM_EREPORT_PAYLOAD_FLAG_L2_DATA 0x0000000000008000
-#define FM_EREPORT_PAYLOAD_FLAG_L1D_WAYS 0x0000000000010000
-#define FM_EREPORT_PAYLOAD_FLAG_L1D_DATA 0x0000000000020000
-#define FM_EREPORT_PAYLOAD_FLAG_L1I_WAYS 0x0000000000040000
-#define FM_EREPORT_PAYLOAD_FLAG_L1I_DATA 0x0000000000080000
-#define FM_EREPORT_PAYLOAD_FLAG_ERR_TYPE 0x0000000000100000
-#define FM_EREPORT_PAYLOAD_FLAG_RESOURCE 0x0000000000200000
-#define FM_EREPORT_PAYLOAD_FLAG_AFSR_EXT 0x0000000000400000
-#define FM_EREPORT_PAYLOAD_FLAG_L1P_WAYS 0x0000000000800000
-#define FM_EREPORT_PAYLOAD_FLAG_L1P_DATA 0x0000000001000000
-#define FM_EREPORT_PAYLOAD_FLAG_ITLB_ENTRIES 0x0000000002000000
-#define FM_EREPORT_PAYLOAD_FLAG_ITLB_DATA 0x0000000004000000
-#define FM_EREPORT_PAYLOAD_FLAG_DTLB_ENTRIES 0x0000000008000000
-#define FM_EREPORT_PAYLOAD_FLAG_DTLB_DATA 0x0000000010000000
-#define FM_EREPORT_PAYLOAD_FLAG_FAULT_VA 0x0000000020000000
-#define FM_EREPORT_PAYLOAD_FLAG_L3_WAYS 0x0000000040000000
-#define FM_EREPORT_PAYLOAD_FLAG_L3_DATA 0x0000000080000000
-#define FM_EREPORT_PAYLOAD_FLAG_COPYFUNCTION 0x0000000100000000
-#define FM_EREPORT_PAYLOAD_FLAG_INSTRBLOCK 0x0000000200000000
-#define FM_EREPORT_PAYLOAD_FLAG_HOWDETECTED 0x0000000400000000
-#define FM_EREPORT_PAYLOAD_FLAG_ERR_DISP 0x0000000800000000
-
-#define FM_EREPORT_PAYLOAD_FLAGS_AFAR \
- (FM_EREPORT_PAYLOAD_FLAG_AFAR | \
- FM_EREPORT_PAYLOAD_FLAG_AFAR_STATUS)
-#define FM_EREPORT_PAYLOAD_FLAGS_TRAP \
- (FM_EREPORT_PAYLOAD_FLAG_TL | \
- FM_EREPORT_PAYLOAD_FLAG_TT)
-#define FM_EREPORT_PAYLOAD_FLAGS_SYND \
- (FM_EREPORT_PAYLOAD_FLAG_SYND | \
- FM_EREPORT_PAYLOAD_FLAG_SYND_STATUS)
-#define FM_EREPORT_PAYLOAD_FLAGS_EMU \
- (FM_EREPORT_PAYLOAD_FLAG_EMU_EMR_SIZE | \
- FM_EREPORT_PAYLOAD_FLAG_EMU_EMR_DATA | \
- FM_EREPORT_PAYLOAD_FLAG_EMU_ESR_SIZE | \
- FM_EREPORT_PAYLOAD_FLAG_EMU_ESR_DATA)
-#define FM_EREPORT_PAYLOAD_FLAGS_L2 \
- (FM_EREPORT_PAYLOAD_FLAG_L2_WAYS | \
- FM_EREPORT_PAYLOAD_FLAG_L2_DATA)
-#define FM_EREPORT_PAYLOAD_FLAGS_L3 \
- (FM_EREPORT_PAYLOAD_FLAG_L3_WAYS | \
- FM_EREPORT_PAYLOAD_FLAG_L3_DATA)
-#define FM_EREPORT_PAYLOAD_FLAGS_L1D \
- (FM_EREPORT_PAYLOAD_FLAG_L1D_WAYS | \
- FM_EREPORT_PAYLOAD_FLAG_L1D_DATA)
-#define FM_EREPORT_PAYLOAD_FLAGS_L1I \
- (FM_EREPORT_PAYLOAD_FLAG_L1I_WAYS | \
- FM_EREPORT_PAYLOAD_FLAG_L1I_DATA)
-#define FM_EREPORT_PAYLOAD_FLAGS_L1P \
- (FM_EREPORT_PAYLOAD_FLAG_L1P_WAYS | \
- FM_EREPORT_PAYLOAD_FLAG_L1P_DATA)
-#define FM_EREPORT_PAYLOAD_FLAGS_L1 \
- (FM_EREPORT_PAYLOAD_FLAGS_L1D | \
- FM_EREPORT_PAYLOAD_FLAGS_L1I)
-#define FM_EREPORT_PAYLOAD_FLAGS_L1L2 \
- (FM_EREPORT_PAYLOAD_FLAGS_L1 | \
- FM_EREPORT_PAYLOAD_FLAGS_L2)
-#define FM_EREPORT_PAYLOAD_FLAGS_ITLB \
- (FM_EREPORT_PAYLOAD_FLAG_ITLB_ENTRIES | \
- FM_EREPORT_PAYLOAD_FLAG_ITLB_DATA)
-#define FM_EREPORT_PAYLOAD_FLAGS_DTLB \
- (FM_EREPORT_PAYLOAD_FLAG_DTLB_ENTRIES | \
- FM_EREPORT_PAYLOAD_FLAG_DTLB_DATA)
-#define FM_EREPORT_PAYLOAD_FLAGS_TLB \
- (FM_EREPORT_PAYLOAD_FLAGS_ITLB | \
- FM_EREPORT_PAYLOAD_FLAGS_DTLB)
-#define FM_EREPORT_PAYLOAD_FLAG_AFSRS \
- (FM_EREPORT_PAYLOAD_FLAG_AFSR | \
- FM_EREPORT_PAYLOAD_FLAG_AFSR_EXT)
-
-
-#define FM_EREPORT_PAYLOAD_UNKNOWN 0
-#define FM_EREPORT_PAYLOAD_INVALID_AFSR (FM_EREPORT_PAYLOAD_FLAG_AFSRS | \
- FM_EREPORT_PAYLOAD_FLAGS_AFAR | \
- FM_EREPORT_PAYLOAD_FLAG_PC | \
- FM_EREPORT_PAYLOAD_FLAGS_TRAP | \
- FM_EREPORT_PAYLOAD_FLAG_PRIV | \
- FM_EREPORT_PAYLOAD_FLAG_ME)
-#define FM_EREPORT_PAYLOAD_SYSTEM1 (FM_EREPORT_PAYLOAD_FLAG_AFSRS | \
- FM_EREPORT_PAYLOAD_FLAG_PC | \
- FM_EREPORT_PAYLOAD_FLAGS_TRAP | \
- FM_EREPORT_PAYLOAD_FLAG_PRIV | \
- FM_EREPORT_PAYLOAD_FLAG_ME)
-#define FM_EREPORT_PAYLOAD_SYSTEM2 (FM_EREPORT_PAYLOAD_FLAG_AFSRS | \
- FM_EREPORT_PAYLOAD_FLAGS_AFAR | \
- FM_EREPORT_PAYLOAD_FLAG_PC | \
- FM_EREPORT_PAYLOAD_FLAGS_TRAP | \
- FM_EREPORT_PAYLOAD_FLAG_PRIV | \
- FM_EREPORT_PAYLOAD_FLAG_ME | \
- FM_EREPORT_PAYLOAD_FLAGS_EMU)
-#define FM_EREPORT_PAYLOAD_SYSTEM3 (FM_EREPORT_PAYLOAD_FLAG_AFSR | \
- FM_EREPORT_PAYLOAD_FLAGS_AFAR | \
- FM_EREPORT_PAYLOAD_FLAG_PC | \
- FM_EREPORT_PAYLOAD_FLAGS_TRAP | \
- FM_EREPORT_PAYLOAD_FLAG_PRIV | \
- FM_EREPORT_PAYLOAD_FLAG_ME | \
- FM_EREPORT_PAYLOAD_FLAGS_L2)
-#define FM_EREPORT_PAYLOAD_IO (FM_EREPORT_PAYLOAD_FLAG_AFSR | \
- FM_EREPORT_PAYLOAD_FLAGS_AFAR | \
- FM_EREPORT_PAYLOAD_FLAG_PC | \
- FM_EREPORT_PAYLOAD_FLAGS_TRAP | \
- FM_EREPORT_PAYLOAD_FLAG_PRIV | \
- FM_EREPORT_PAYLOAD_FLAG_ME)
-#define FM_EREPORT_PAYLOAD_L2_TAG_PE (FM_EREPORT_PAYLOAD_FLAG_AFSR | \
- FM_EREPORT_PAYLOAD_FLAGS_AFAR | \
- FM_EREPORT_PAYLOAD_FLAG_PC | \
- FM_EREPORT_PAYLOAD_FLAGS_TRAP | \
- FM_EREPORT_PAYLOAD_FLAG_PRIV | \
- FM_EREPORT_PAYLOAD_FLAG_ME | \
- FM_EREPORT_PAYLOAD_FLAGS_L1L2)
-#define FM_EREPORT_PAYLOAD_L2_TAG_ECC (FM_EREPORT_PAYLOAD_FLAG_AFSRS | \
- FM_EREPORT_PAYLOAD_FLAGS_AFAR | \
- FM_EREPORT_PAYLOAD_FLAG_PC | \
- FM_EREPORT_PAYLOAD_FLAGS_TRAP | \
- FM_EREPORT_PAYLOAD_FLAG_PRIV | \
- FM_EREPORT_PAYLOAD_FLAG_ME | \
- FM_EREPORT_PAYLOAD_FLAGS_L1L2 | \
- FM_EREPORT_PAYLOAD_FLAGS_L3)
-#define FM_EREPORT_PAYLOAD_L3_TAG_ECC (FM_EREPORT_PAYLOAD_FLAG_AFSRS | \
- FM_EREPORT_PAYLOAD_FLAGS_AFAR | \
- FM_EREPORT_PAYLOAD_FLAG_PC | \
- FM_EREPORT_PAYLOAD_FLAGS_TRAP | \
- FM_EREPORT_PAYLOAD_FLAG_PRIV | \
- FM_EREPORT_PAYLOAD_FLAG_ME | \
- FM_EREPORT_PAYLOAD_FLAGS_L1L2 | \
- FM_EREPORT_PAYLOAD_FLAGS_L3)
-#define FM_EREPORT_PAYLOAD_L2_DATA (FM_EREPORT_PAYLOAD_FLAG_AFSRS | \
- FM_EREPORT_PAYLOAD_FLAGS_AFAR | \
- FM_EREPORT_PAYLOAD_FLAG_PC | \
- FM_EREPORT_PAYLOAD_FLAGS_TRAP | \
- FM_EREPORT_PAYLOAD_FLAG_PRIV | \
- FM_EREPORT_PAYLOAD_FLAG_ME | \
- FM_EREPORT_PAYLOAD_FLAGS_SYND | \
- FM_EREPORT_PAYLOAD_FLAGS_L1L2 | \
- FM_EREPORT_PAYLOAD_FLAG_RESOURCE | \
- FM_EREPORT_PAYLOAD_FLAGS_L3)
-#define FM_EREPORT_PAYLOAD_L3_DATA (FM_EREPORT_PAYLOAD_FLAG_AFSRS | \
- FM_EREPORT_PAYLOAD_FLAGS_AFAR | \
- FM_EREPORT_PAYLOAD_FLAG_PC | \
- FM_EREPORT_PAYLOAD_FLAGS_TRAP | \
- FM_EREPORT_PAYLOAD_FLAG_PRIV | \
- FM_EREPORT_PAYLOAD_FLAG_ME | \
- FM_EREPORT_PAYLOAD_FLAGS_SYND | \
- FM_EREPORT_PAYLOAD_FLAGS_L1L2 | \
- FM_EREPORT_PAYLOAD_FLAG_RESOURCE | \
- FM_EREPORT_PAYLOAD_FLAGS_L3)
-#define FM_EREPORT_PAYLOAD_MEMORY (FM_EREPORT_PAYLOAD_FLAG_AFSRS | \
- FM_EREPORT_PAYLOAD_FLAGS_AFAR | \
- FM_EREPORT_PAYLOAD_FLAG_PC | \
- FM_EREPORT_PAYLOAD_FLAGS_TRAP | \
- FM_EREPORT_PAYLOAD_FLAG_PRIV | \
- FM_EREPORT_PAYLOAD_FLAG_ME | \
- FM_EREPORT_PAYLOAD_FLAGS_SYND | \
- FM_EREPORT_PAYLOAD_FLAG_ERR_TYPE | \
- FM_EREPORT_PAYLOAD_FLAG_ERR_DISP | \
- FM_EREPORT_PAYLOAD_FLAGS_L1L2 | \
- FM_EREPORT_PAYLOAD_FLAG_RESOURCE | \
- FM_EREPORT_PAYLOAD_FLAGS_L3)
-#define FM_EREPORT_PAYLOAD_ICACHE_PE (FM_EREPORT_PAYLOAD_FLAG_PC | \
- FM_EREPORT_PAYLOAD_FLAGS_TRAP | \
- FM_EREPORT_PAYLOAD_FLAG_PRIV | \
- FM_EREPORT_PAYLOAD_FLAGS_L1I)
-#define FM_EREPORT_PAYLOAD_DCACHE_PE (FM_EREPORT_PAYLOAD_FLAG_PC | \
- FM_EREPORT_PAYLOAD_FLAGS_TRAP | \
- FM_EREPORT_PAYLOAD_FLAG_PRIV | \
- FM_EREPORT_PAYLOAD_FLAGS_L1D)
-#define FM_EREPORT_PAYLOAD_PCACHE_PE (FM_EREPORT_PAYLOAD_FLAG_PC | \
- FM_EREPORT_PAYLOAD_FLAGS_TRAP | \
- FM_EREPORT_PAYLOAD_FLAG_PRIV | \
- FM_EREPORT_PAYLOAD_FLAGS_L1P)
-#define FM_EREPORT_PAYLOAD_ITLB_PE (FM_EREPORT_PAYLOAD_FLAG_PC | \
- FM_EREPORT_PAYLOAD_FLAGS_TRAP | \
- FM_EREPORT_PAYLOAD_FLAG_PRIV | \
- FM_EREPORT_PAYLOAD_FLAGS_ITLB)
-#define FM_EREPORT_PAYLOAD_DTLB_PE (FM_EREPORT_PAYLOAD_FLAG_PC | \
- FM_EREPORT_PAYLOAD_FLAGS_TRAP | \
- FM_EREPORT_PAYLOAD_FLAG_PRIV | \
- FM_EREPORT_PAYLOAD_FLAGS_DTLB | \
- FM_EREPORT_PAYLOAD_FLAG_FAULT_VA)
-#define FM_EREPORT_PAYLOAD_FPU_HWCOPY (FM_EREPORT_PAYLOAD_FLAG_COPYFUNCTION |\
- FM_EREPORT_PAYLOAD_FLAG_INSTRBLOCK|\
- FM_EREPORT_PAYLOAD_FLAG_HOWDETECTED)
-/*
- * FM_EREPORT_PAYLOAD_UNKNOWN
- */
-#define FM_EREPORT_CPU_USIII_UNKNOWN "unknown"
-
-/*
- * FM_EREPORT_PAYLOAD_INVALID_AFSR
- */
-#define FM_EREPORT_CPU_USIII_INVALID_AFSR "invalid-afsr"
-
-/*
- * FM_EREPORT_PAYLOAD_SYSTEM1
- */
-#define FM_EREPORT_CPU_USIII_IVC "ivc"
-#define FM_EREPORT_CPU_USIII_IVU "ivu"
-#define FM_EREPORT_CPU_USIII_IMC "imc"
-#define FM_EREPORT_CPU_USIII_IMU "imu"
-#define FM_EREPORT_CPU_USIII_JETO "jeto"
-#define FM_EREPORT_CPU_USIII_SCE "sce"
-#define FM_EREPORT_CPU_USIII_JEIC "jeic"
-#define FM_EREPORT_CPU_USIII_JEIT "jeit"
-#define FM_EREPORT_CPU_USIII_JEIS "jeis"
-#define FM_EREPORT_CPU_USIII_ISAP "isap"
-#define FM_EREPORT_CPU_USIII_IVPE "ivpe"
-
-/*
- * FM_EREPORT_PAYLOAD_SYSTEM2
- */
-#define FM_EREPORT_CPU_USIII_PERR "perr"
-#define FM_EREPORT_CPU_USIII_IERR "ierr"
-
-/*
- * FM_EREPORT_PAYLOAD_SYSTEM3
- */
-#define FM_EREPORT_CPU_USIII_BP "bp"
-#define FM_EREPORT_CPU_USIII_WBP "wbp"
-
-/*
- * FM_EREPORT_PAYLOAD_IO
- */
-#define FM_EREPORT_CPU_USIII_TO "to"
-#define FM_EREPORT_CPU_USIII_BERR "berr"
-#define FM_EREPORT_CPU_USIII_DTO "dto"
-#define FM_EREPORT_CPU_USIII_DBERR "dberr"
-#define FM_EREPORT_CPU_USIII_OM "om"
-#define FM_EREPORT_CPU_USIII_UMS "ums"
-
-/*
- * FM_EREPORT_PAYLOAD_L2_TAG_PE
- */
-#define FM_EREPORT_CPU_USIII_ETP "etp"
-
-/*
- * FM_EREPORT_PAYLOAD_L2_TAG_ECC
- */
-#define FM_EREPORT_CPU_USIII_THCE "thce"
-#define FM_EREPORT_CPU_USIII_TSCE "tsce"
-#define FM_EREPORT_CPU_USIII_TUE "tue"
-#define FM_EREPORT_CPU_USIII_TUE_SH "tue-sh"
-#define FM_EREPORT_CPU_USIII_ETU "etu"
-#define FM_EREPORT_CPU_USIII_ETC "etc"
-#define FM_EREPORT_CPU_USIII_ETI "eti"
-#define FM_EREPORT_CPU_USIII_ETS "ets"
-
-/*
- * FM_EREPORT_PAYLOAD_L3_TAG_ECC
- */
-#define FM_EREPORT_CPU_USIII_L3_THCE "l3-thce"
-#define FM_EREPORT_CPU_USIII_L3_TUE "l3-tue"
-#define FM_EREPORT_CPU_USIII_L3_TUE_SH "l3-tue-sh"
-
-/*
- * FM_EREPORT_PAYLOAD_L2_DATA
- */
-#define FM_EREPORT_CPU_USIII_UCC "ucc"
-#define FM_EREPORT_CPU_USIII_UCU "ucu"
-#define FM_EREPORT_CPU_USIII_CPC "cpc"
-#define FM_EREPORT_CPU_USIII_CPU "cpu"
-#define FM_EREPORT_CPU_USIII_WDC "wdc"
-#define FM_EREPORT_CPU_USIII_WDU "wdu"
-#define FM_EREPORT_CPU_USIII_EDC "edc"
-#define FM_EREPORT_CPU_USIII_EDUBL "edu-bl"
-#define FM_EREPORT_CPU_USIII_EDUST "edu-st"
-
-/*
- * FM_EREPORT_PAYLOAD_L3_DATA
- */
-#define FM_EREPORT_CPU_USIII_L3_UCC "l3-ucc"
-#define FM_EREPORT_CPU_USIII_L3_UCU "l3-ucu"
-#define FM_EREPORT_CPU_USIII_L3_CPC "l3-cpc"
-#define FM_EREPORT_CPU_USIII_L3_CPU "l3-cpu"
-#define FM_EREPORT_CPU_USIII_L3_WDC "l3-wdc"
-#define FM_EREPORT_CPU_USIII_L3_WDU "l3-wdu"
-#define FM_EREPORT_CPU_USIII_L3_EDC "l3-edc"
-#define FM_EREPORT_CPU_USIII_L3_EDUBL "l3-edu-bl"
-#define FM_EREPORT_CPU_USIII_L3_EDUST "l3-edu-st"
-#define FM_EREPORT_CPU_USIII_L3_MECC "l3-mecc"
-
-/*
- * FM_EREPORT_PAYLOAD_MEMORY
- */
-#define FM_EREPORT_CPU_USIII_CE "ce"
-#define FM_EREPORT_CPU_USIII_RCE "rce"
-#define FM_EREPORT_CPU_USIII_FRC "frc"
-#define FM_EREPORT_CPU_USIII_EMC "emc"
-#define FM_EREPORT_CPU_USIII_UE "ue"
-#define FM_EREPORT_CPU_USIII_DUE "due"
-#define FM_EREPORT_CPU_USIII_RUE "rue"
-#define FM_EREPORT_CPU_USIII_FRU "fru"
-#define FM_EREPORT_CPU_USIII_EMU "emu"
-
-/*
- * FM_EREPORT_PAYLOAD_ICACHE_PE
- */
-#define FM_EREPORT_CPU_USIII_IPE "ipe"
-#define FM_EREPORT_CPU_USIII_IDSPE "idspe"
-#define FM_EREPORT_CPU_USIII_ITSPE "itspe"
-
-/*
- * FM_EREPORT_PAYLOAD_DCACHE_PE
- */
-#define FM_EREPORT_CPU_USIII_DPE "dpe"
-#define FM_EREPORT_CPU_USIII_DDSPE "ddspe"
-#define FM_EREPORT_CPU_USIII_DTSPE "dtspe"
-
-/*
- * FM_EREPORT_PAYLOAD_PCACHE_PE
- */
-#define FM_EREPORT_CPU_USIII_PDSPE "pdspe"
-
-
-/*
- * FM_EREPORT_PAYLOAD_DTLB_PE
- */
-#define FM_EREPORT_CPU_USIII_DTLBPE "dtlbpe"
-
-/*
- * FM_EREPORT_PAYLOAD_ITLB_PE
- */
-#define FM_EREPORT_CPU_USIII_ITLBPE "itlbpe"
-
-/*
- * FM_EREPORT_PAYLOAD_FPU_HWCOPY
- */
-#define FM_EREPORT_CPU_USIII_FPU_HWCOPY "fpu.hwcopy"
-
-/*
- * Magic values for cache dump logflags.
- * These flags are used to indicate that the structures
- * defined in cheetahregs.h to capture cache data contain
- * valid information.
- */
-#define EC_LOGFLAG_MAGIC 0xEC0106F1A6 /* =~ EC_LOGFLAG */
-#define DC_LOGFLAG_MAGIC 0xDC0106F1A6 /* =~ DC_LOGFLAG */
-#define IC_LOGFLAG_MAGIC 0x1C0106F1A6 /* =~ IC_LOGFLAG */
-#define PC_LOGFLAG_MAGIC 0x9C0106F1A6 /* =~ PC_LOGFLAG */
-#define IT_LOGFLAG_MAGIC 0x170106F1A6 /* =~ IT_LOGFLAG */
-#define DT_LOGFLAG_MAGIC 0xD70106F1A6 /* =~ DT_LOGFLAG */
-
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* _SYS_FM_ULTRASPARC_III_H */
diff --git a/usr/src/uts/common/sys/fm/cpu/UltraSPARC-T1.h b/usr/src/uts/common/sys/fm/cpu/UltraSPARC-T1.h
deleted file mode 100644
index e6ffdfe922..0000000000
--- a/usr/src/uts/common/sys/fm/cpu/UltraSPARC-T1.h
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * 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
- */
-/*
- * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
- */
-
-#ifndef _SYS_FM_ULTRASPARC_T1_H
-#define _SYS_FM_ULTRASPARC_T1_H
-
-#pragma ident "%Z%%M% %I% %E% SMI"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/*
- * header file for Niagara-specific ereports
- */
-
-#define FM_EREPORT_PAYLOAD_NAME_L2_AFSR "l2-afsr"
-#define FM_EREPORT_PAYLOAD_NAME_L2_REAL_AFAR "l2-real-afar"
-#define FM_EREPORT_PAYLOAD_NAME_L2_SYND "l2-synd"
-
-#define FM_EREPORT_PAYLOAD_NAME_DRAM_AFSR "dram-afsr"
-#define FM_EREPORT_PAYLOAD_NAME_DRAM_REAL_AFAR "dram-real-afar"
-#define FM_EREPORT_PAYLOAD_NAME_DRAM_SYND "dram-synd"
-
-#define FM_EREPORT_CPU_UST1_DAU "dau"
-#define FM_EREPORT_CPU_UST1_DAC "dac"
-#define FM_EREPORT_CPU_UST1_DSU "dsu"
-#define FM_EREPORT_CPU_UST1_DSC "dsc"
-
-/*
- * The following constants are also defined in UltraSPARC-III.h and
- * could possibly be moved into a common header file
- */
-
-#define FM_EREPORT_PAYLOAD_NAME_RESOURCE "resource"
-#define FM_EREPORT_PAYLOAD_NAME_ERR_TYPE "error-type"
-#define FM_EREPORT_PAYLOAD_NAME_ERR_DISP "error-disposition"
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* _SYS_FM_ULTRASPARC_T1_H */
diff --git a/usr/src/uts/common/sys/fm/protocol.h b/usr/src/uts/common/sys/fm/protocol.h
index 32f4d099f0..89b761ef6c 100644
--- a/usr/src/uts/common/sys/fm/protocol.h
+++ b/usr/src/uts/common/sys/fm/protocol.h
@@ -21,7 +21,7 @@
*/
/*
- * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -177,7 +177,8 @@ extern "C" {
#define FM_HC_VERS0 0
#define FM_HC_SCHEME_VERSION FM_HC_VERS0
#define CPU_SCHEME_VERSION0 0
-#define FM_CPU_SCHEME_VERSION CPU_SCHEME_VERSION0
+#define CPU_SCHEME_VERSION1 1
+#define FM_CPU_SCHEME_VERSION CPU_SCHEME_VERSION1
#define MEM_SCHEME_VERSION0 0
#define FM_MEM_SCHEME_VERSION MEM_SCHEME_VERSION0
#define MOD_SCHEME_VERSION0 0
@@ -194,6 +195,7 @@ extern "C" {
#define FM_FMRI_HC_ROOT "hc-root"
#define FM_FMRI_HC_LIST_SZ "hc-list-sz"
#define FM_FMRI_HC_LIST "hc-list"
+#define FM_FMRI_HC_SPECIFIC "hc-specific"
/* hc-list version and member names */
#define FM_FMRI_HC_NAME "hc-name"
@@ -202,6 +204,9 @@ extern "C" {
#define HC_LIST_VERSION0 0
#define FM_HC_LIST_VERSION HC_LIST_VERSION0
+/* hc-specific member names */
+#define FM_FMRI_HC_SPECIFIC_OFFSET "offset"
+
/* fmd module scheme member names */
#define FM_FMRI_FMD_NAME "mod-name"
#define FM_FMRI_FMD_VERSION "mod-version"
@@ -261,13 +266,13 @@ extern void fm_ereport_set(nvlist_t *, int, const char *, uint64_t,
const nvlist_t *, ...);
extern void fm_payload_set(nvlist_t *, ...);
extern int i_fm_payload_set(nvlist_t *, const char *, va_list);
-extern void fm_fmri_hc_set(nvlist_t *, int, const nvlist_t *, const char *,
- const char *, const char *, const char *, uint32_t, ...);
+extern void fm_fmri_hc_set(nvlist_t *, int, const nvlist_t *, nvlist_t *,
+ int, ...);
extern void fm_fmri_dev_set(nvlist_t *, int, const nvlist_t *, const char *,
const char *);
extern void fm_fmri_de_set(nvlist_t *, int, const nvlist_t *, const char *);
extern void fm_fmri_cpu_set(nvlist_t *, int, const nvlist_t *, uint32_t,
- uint8_t, uint64_t);
+ uint8_t *, const char *);
extern void fm_fmri_mem_set(nvlist_t *, int, const nvlist_t *, const char *,
const char *, uint64_t);
extern void fm_authority_set(nvlist_t *, int, const char *, const char *,
diff --git a/usr/src/uts/common/sys/fm/util.h b/usr/src/uts/common/sys/fm/util.h
index c0dc908ddc..33f5876cab 100644
--- a/usr/src/uts/common/sys/fm/util.h
+++ b/usr/src/uts/common/sys/fm/util.h
@@ -19,8 +19,9 @@
*
* 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.
*/
@@ -74,9 +75,14 @@ typedef struct erpt_dump {
} erpt_dump_t;
#ifdef _KERNEL
+#include <sys/systm.h>
+#define FM_STK_DEPTH 20 /* maximum stack depth */
+#define FM_SYM_SZ 64 /* maximum symbol size */
#define FM_ERR_PIL 2 /* PIL for ereport_errorq drain processing */
+#define FM_EREPORT_PAYLOAD_NAME_STACK "stack"
+
extern errorq_t *ereport_errorq;
extern void *ereport_dumpbuf;
extern size_t ereport_dumplen;
@@ -89,6 +95,8 @@ extern void fm_banner(void);
extern void fm_ereport_dump(void);
extern void fm_ereport_post(nvlist_t *, int);
+extern void fm_payload_stack_add(nvlist_t *, const pc_t *, int);
+
#endif /* _KERNEL */
#ifdef __cplusplus
diff --git a/usr/src/uts/common/sys/kobj.h b/usr/src/uts/common/sys/kobj.h
index c2f8b2f9cb..7d2bd0922e 100644
--- a/usr/src/uts/common/sys/kobj.h
+++ b/usr/src/uts/common/sys/kobj.h
@@ -20,7 +20,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -152,7 +152,7 @@ typedef struct {
extern int kobj_load_module(struct modctl *, int);
extern void kobj_unload_module(struct modctl *);
-extern uintptr_t kobj_lookup(void *, char *);
+extern uintptr_t kobj_lookup(struct module *, const char *);
extern Sym *kobj_lookup_all(struct module *, char *, int);
extern int kobj_addrcheck(void *, caddr_t);
extern int kobj_module_to_id(void *);
diff --git a/usr/src/uts/common/sys/mem.h b/usr/src/uts/common/sys/mem.h
index f6f749ef0e..d1307589a1 100644
--- a/usr/src/uts/common/sys/mem.h
+++ b/usr/src/uts/common/sys/mem.h
@@ -20,7 +20,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -55,6 +55,14 @@ typedef struct mem_vtop {
pfn_t m_pfn;
} mem_vtop_t;
+#if defined(_SYSCALL32)
+typedef struct mem_vtop32 {
+ uint32_t m_as;
+ uint32_t m_va;
+ uint32_t m_pfn;
+} mem_vtop32_t;
+#endif
+
/*
* Private ioctls for fmd(1M). These interfaces are Sun Private. Applications
* and drivers should not make use of these interfaces: they can change without
diff --git a/usr/src/uts/common/sys/modctl.h b/usr/src/uts/common/sys/modctl.h
index 06019d5f0f..d2f4cfd803 100644
--- a/usr/src/uts/common/sys/modctl.h
+++ b/usr/src/uts/common/sys/modctl.h
@@ -62,6 +62,9 @@ struct mod_ops {
* The defined set of mod_ops structures for each loadable module type
* Defined in modctl.c
*/
+#if defined(__i386) || defined(__amd64)
+extern struct mod_ops mod_cpuops;
+#endif
extern struct mod_ops mod_cryptoops;
extern struct mod_ops mod_driverops;
extern struct mod_ops mod_execops;
@@ -107,6 +110,17 @@ struct modlfs {
struct vfsdef_v3 *fs_vfsdef; /* version may actually vary */
};
+#if defined(__i386) || defined(__amd64)
+struct cmi_ops;
+
+/* For CPU modules */
+struct modlcpu {
+ struct mod_ops *cpu_modops;
+ char *cpu_linkinfo;
+ struct cmi_ops *cpu_cmiops;
+};
+#endif
+
/* For cryptographic providers */
struct modlcrypto {
struct mod_ops *crypto_modops;
@@ -417,7 +431,7 @@ struct modctl_list {
* are replicated in the modctl structure so that mod_containing_pc()
* doesn't have to grab any locks (modctls are persistent; modules are not.)
*/
-struct modctl {
+typedef struct modctl {
struct modctl *mod_next; /* &modules based list */
struct modctl *mod_prev;
int mod_id;
@@ -449,7 +463,7 @@ struct modctl {
int mod_gencount; /* # times loaded/unloaded */
struct modctl *mod_requisite_loading; /* mod circular dependency */
-};
+} modctl_t;
/*
* mod_loadflags
@@ -479,7 +493,10 @@ extern int moddebug;
* this is the head of a doubly linked list. Only the next and prev
* pointers are used
*/
-extern struct modctl modules;
+extern modctl_t modules;
+
+extern int modload_qualified(const char *,
+ const char *, const char *, const char *, uint_t[], int);
extern void mod_setup(void);
extern int modload(char *, char *);
@@ -494,7 +511,7 @@ extern int mod_remove_by_name(char *);
extern int mod_sysvar(const char *, const char *, u_longlong_t *);
extern int mod_sysctl(int, void *);
struct sysparam;
-extern int mod_hold_by_modctl(struct modctl *, int);
+extern int mod_hold_by_modctl(modctl_t *, int);
#define MOD_WAIT_ONCE 0x01
#define MOD_WAIT_FOREVER 0x02
#define MOD_LOCK_HELD 0x04
@@ -506,13 +523,15 @@ extern void mod_release_stub(struct mod_stub_info *);
extern void mod_askparams(void);
extern void mod_uninstall_daemon(void);
extern void modreap(void);
-extern struct modctl *mod_hold_by_name(char *);
-extern void mod_release_mod(struct modctl *);
-extern uintptr_t modlookup(char *, char *);
+extern modctl_t *mod_hold_by_id(modid_t);
+extern modctl_t *mod_hold_by_name(const char *);
+extern void mod_release_mod(modctl_t *);
+extern uintptr_t modlookup(const char *, const char *);
+extern uintptr_t modlookup_by_modctl(modctl_t *, const char *);
extern char *modgetsymname(uintptr_t, unsigned long *);
-extern void mod_release_requisites(struct modctl *);
-extern struct modctl *mod_load_requisite(struct modctl *, char *);
-extern struct modctl *mod_find_by_filename(char *, char *);
+extern void mod_release_requisites(modctl_t *);
+extern modctl_t *mod_load_requisite(modctl_t *, char *);
+extern modctl_t *mod_find_by_filename(char *, char *);
extern uintptr_t modgetsymvalue(char *, int);
extern void mod_rele_dev_by_major(major_t);
@@ -532,11 +551,11 @@ extern void read_class_file(void);
extern void setbootpath(char *);
extern void setbootfstype(char *);
-extern int install_stubs_by_name(struct modctl *, char *);
-extern void install_stubs(struct modctl *);
-extern void uninstall_stubs(struct modctl *);
-extern void reset_stubs(struct modctl *);
-extern struct modctl *mod_getctl(struct modlinkage *);
+extern int install_stubs_by_name(modctl_t *, char *);
+extern void install_stubs(modctl_t *);
+extern void uninstall_stubs(modctl_t *);
+extern void reset_stubs(modctl_t *);
+extern modctl_t *mod_getctl(struct modlinkage *);
extern major_t mod_name_to_major(char *);
extern modid_t mod_name_to_modid(char *);
extern char *mod_major_to_name(major_t);
@@ -550,7 +569,7 @@ extern char *mod_containing_pc(caddr_t);
extern int mod_in_autounload(void);
extern char *mod_modname(struct modlinkage *);
-extern int dev_minorperm(dev_info_t *dip, char *name, mperm_t *rmp);
+extern int dev_minorperm(dev_info_t *, char *, mperm_t *);
/*
* Declarations used for dynamic linking support routines. Interfaces
diff --git a/usr/src/uts/common/sys/policy.h b/usr/src/uts/common/sys/policy.h
index 3e1b260c1e..9653a58b0e 100644
--- a/usr/src/uts/common/sys/policy.h
+++ b/usr/src/uts/common/sys/policy.h
@@ -20,7 +20,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -88,6 +88,7 @@ boolean_t secpolicy_contract_event_choice(const cred_t *);
int secpolicy_coreadm(const cred_t *);
int secpolicy_cpc_cpu(const cred_t *);
int secpolicy_dispadm(const cred_t *);
+int secpolicy_error_inject(const cred_t *);
int secpolicy_excl_open(const cred_t *);
int secpolicy_fs_mount(cred_t *, vnode_t *, struct vfs *);
int secpolicy_fs_unmount(cred_t *, struct vfs *);