summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVikram Hegde <Vikram.Hegde@Sun.COM>2008-11-23 12:55:24 -0800
committerVikram Hegde <Vikram.Hegde@Sun.COM>2008-11-23 12:55:24 -0800
commit408a1f8e8d62a79cfb7c54491234b73c736aee40 (patch)
tree5c051c76d9359ab5612b67868215e756c399ccb1
parentc37d261606ca09ed88ad202dbbad83f95365e2be (diff)
downloadillumos-gate-408a1f8e8d62a79cfb7c54491234b73c736aee40.tar.gz
6753225 null pointer dereference panic in page_downgrade()
6774397 Intel PRO/1000 PT Quad Port LP server adapter needs unity map 6774406 WARNING: pcplusmp: mod_remove_by_name failed 16 messages on uniprocessor machines
-rw-r--r--usr/src/uts/i86pc/io/intel_iommu.c24
-rw-r--r--usr/src/uts/i86pc/os/mp_implfuncs.c2
-rw-r--r--usr/src/uts/i86pc/vm/vm_machdep.c6
3 files changed, 21 insertions, 11 deletions
diff --git a/usr/src/uts/i86pc/io/intel_iommu.c b/usr/src/uts/i86pc/io/intel_iommu.c
index 1a4fecbf78..8f4212b41d 100644
--- a/usr/src/uts/i86pc/io/intel_iommu.c
+++ b/usr/src/uts/i86pc/io/intel_iommu.c
@@ -2291,11 +2291,11 @@ drhd_only_for_gfx(intel_iommu_state_t *iommu)
}
/*
- * build_gfx_identity_map()
- * build identity map for the gfx device
+ * build_dev_identity_map()
+ * build identity map for a device
*/
static void
-build_gfx_identity_map(dev_info_t *dip)
+build_dev_identity_map(dev_info_t *dip)
{
struct memlist *mp;
dmar_domain_state_t *domain;
@@ -2307,8 +2307,6 @@ build_gfx_identity_map(dev_info_t *dip)
return;
}
- gfx_devinfo = dip;
-
ASSERT(bootops != NULL);
ASSERT(!modrootloaded);
mp = bootops->boot_mem->physinstalled;
@@ -2347,10 +2345,20 @@ build_isa_gfx_identity_walk(dev_info_t *dip, void *arg)
return (DDI_WALK_CONTINUE);
/* fix the gfx and fd */
- if (private->idp_is_display)
- build_gfx_identity_map(dip);
- else if (private->idp_is_lpc)
+ if (private->idp_is_display) {
+ gfx_devinfo = dip;
+ build_dev_identity_map(dip);
+ } else if (private->idp_is_lpc) {
lpc_devinfo = dip;
+ }
+
+ /* workaround for pci8086,10bc pci8086,11bc */
+ if ((strcmp(ddi_node_name(dip), "pci8086,10bc") == 0) ||
+ (strcmp(ddi_node_name(dip), "pci8086,11bc") == 0)) {
+ cmn_err(CE_CONT, "?Workaround for PRO/1000 PT Quad"
+ " Port LP Server Adapter applied\n");
+ build_dev_identity_map(dip);
+ }
return (DDI_WALK_CONTINUE);
}
diff --git a/usr/src/uts/i86pc/os/mp_implfuncs.c b/usr/src/uts/i86pc/os/mp_implfuncs.c
index eb943a0372..b5742b2c69 100644
--- a/usr/src/uts/i86pc/os/mp_implfuncs.c
+++ b/usr/src/uts/i86pc/os/mp_implfuncs.c
@@ -423,7 +423,7 @@ psm_install(void)
(void) strcpy(&machstring[0], cswp->psw_infop->p_mach_idstring);
err = mod_remove_by_name(cswp->psw_infop->p_mach_idstring);
if (err)
- cmn_err(CE_WARN, "%s: mod_remove_by_name failed %d",
+ cmn_err(CE_WARN, "!%s: mod_remove_by_name failed %d",
&machstring[0], err);
mutex_enter(&psmsw_lock);
}
diff --git a/usr/src/uts/i86pc/vm/vm_machdep.c b/usr/src/uts/i86pc/vm/vm_machdep.c
index 02aadc9f2a..231ded40be 100644
--- a/usr/src/uts/i86pc/vm/vm_machdep.c
+++ b/usr/src/uts/i86pc/vm/vm_machdep.c
@@ -3739,9 +3739,11 @@ page_get_physical(int flags)
if (pp != NULL) {
page_io_unlock(pp);
page_hashout(pp, NULL);
+ mutex_exit(&pgp_mutex);
+ page_downgrade(pp);
+ } else {
+ mutex_exit(&pgp_mutex);
}
- mutex_exit(&pgp_mutex);
- page_downgrade(pp);
return (pp);
}