summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorzbb <zbb@FreeBSD.org>2015-03-30 09:49:54 +0000
committerzbb <zbb@FreeBSD.org>2015-03-30 09:49:54 +0000
commit861c5f13d020d7891f0d5ccaf93666cfc6577fd5 (patch)
treead6f6902451b9b9d29b8a182d570929e6e452480
parent17264df1ac30b5fc55d3f97fbb874499382e136a (diff)
downloadFreeBSD-src-861c5f13d020d7891f0d5ccaf93666cfc6577fd5.zip
FreeBSD-src-861c5f13d020d7891f0d5ccaf93666cfc6577fd5.tar.gz
Fix bug in xrefinfo_find() for 64-bit platforms
uintptr_t may be 64-bit on some platforms, therefore when finding xrefinfo by pointer to device the high word is being cut off due to cast to phandle_t which is 32-bit long by definition. Due to that we loose the high word of the address to compare with xi->dev's address. To fix that, first argument of xrefinfo_find() is extended to uintptr_t and is being cast to appropriate type (phandle_t) when compared. Submitted by: Zbigniew Bodek <zbb@semihalf.com> Reviewed by: nwhitehorn Obtained from: Semihalf
-rw-r--r--sys/dev/ofw/openfirm.c8
1 files changed, 4 insertions, 4 deletions
diff --git a/sys/dev/ofw/openfirm.c b/sys/dev/ofw/openfirm.c
index 7da5e58..b04dbc6 100644
--- a/sys/dev/ofw/openfirm.c
+++ b/sys/dev/ofw/openfirm.c
@@ -154,16 +154,16 @@ xrefinfo_init(void *unsed)
SYSINIT(xrefinfo, SI_SUB_KMEM, SI_ORDER_ANY, xrefinfo_init, NULL);
static struct xrefinfo *
-xrefinfo_find(phandle_t phandle, int find_by)
+xrefinfo_find(uintptr_t key, int find_by)
{
struct xrefinfo *rv, *xi;
rv = NULL;
mtx_lock(&xreflist_lock);
SLIST_FOREACH(xi, &xreflist, next_entry) {
- if ((find_by == FIND_BY_XREF && phandle == xi->xref) ||
- (find_by == FIND_BY_NODE && phandle == xi->node) ||
- (find_by == FIND_BY_DEV && phandle == (uintptr_t)xi->dev)) {
+ if ((find_by == FIND_BY_XREF && (phandle_t)key == xi->xref) ||
+ (find_by == FIND_BY_NODE && (phandle_t)key == xi->node) ||
+ (find_by == FIND_BY_DEV && key == (uintptr_t)xi->dev)) {
rv = xi;
break;
}
OpenPOWER on IntegriCloud