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
This commit is contained in:
parent
a3db11e053
commit
a83592093c
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=280848
@ -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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user