93 lines
2.7 KiB
C
93 lines
2.7 KiB
C
/*
|
|
* Copyright (C) 2009 Apple Inc. All rights reserved.
|
|
*
|
|
* This document is the property of Apple Inc.
|
|
* It is considered confidential and proprietary.
|
|
*
|
|
* This document may not be reproduced or transmitted in any form,
|
|
* in whole or in part, without the express written permission of
|
|
* Apple Inc.
|
|
*/
|
|
/*
|
|
* Generic memory mapping functions.
|
|
*/
|
|
|
|
#include <sys/types.h>
|
|
#include <sys.h>
|
|
|
|
static struct mem_static_map_entry *
|
|
mem_static_find_virtual(uintptr_t addr, ptrdiff_t *offset)
|
|
{
|
|
struct mem_static_map_entry *mp;
|
|
|
|
for (mp = mem_static_map_entries; mp->size != 0; mp++) {
|
|
/* is this an entry in a cached mapping? */
|
|
if ((MAP_NO_ENTRY != mp->cached_base) &&
|
|
(addr >= mp->cached_base) &&
|
|
(addr <= (mp->cached_base + mp->size - 1))) {
|
|
*offset = addr - mp->cached_base;
|
|
return(mp);
|
|
}
|
|
|
|
/* is this an entry in an uncached mapping? */
|
|
if ((mp->uncached_base != MAP_NO_ENTRY) &&
|
|
(addr >= mp->uncached_base) &&
|
|
(addr <= (mp->uncached_base + mp->size - 1))) {
|
|
*offset = addr - mp->uncached_base;
|
|
return(mp);
|
|
}
|
|
}
|
|
return(NULL);
|
|
}
|
|
|
|
static struct mem_static_map_entry *
|
|
mem_static_find_physical(uintptr_t addr)
|
|
{
|
|
struct mem_static_map_entry *mp;
|
|
|
|
for (mp = mem_static_map_entries; mp->size != 0; mp++) {
|
|
/* is this an entry in a physical mapping? */
|
|
if ((MAP_NO_ENTRY != mp->physical_base) &&
|
|
(addr >= mp->physical_base) &&
|
|
(addr <= (mp->physical_base + mp->size - 1)))
|
|
return(mp);
|
|
}
|
|
return(NULL);
|
|
}
|
|
|
|
void *
|
|
mem_static_map_cached(uintptr_t ptr)
|
|
{
|
|
struct mem_static_map_entry *mp;
|
|
ptrdiff_t offset;
|
|
|
|
mp = mem_static_find_virtual(ptr, &offset);
|
|
if (NULL != mp)
|
|
return((void *)(mp->cached_base + offset));
|
|
return(MAP_FAILED);
|
|
}
|
|
|
|
void *
|
|
mem_static_map_uncached(uintptr_t ptr)
|
|
{
|
|
struct mem_static_map_entry *mp;
|
|
ptrdiff_t offset;
|
|
|
|
mp = mem_static_find_virtual(ptr, &offset);
|
|
if (NULL != mp)
|
|
return((void *)(mp->uncached_base + offset));
|
|
return(MAP_FAILED);
|
|
}
|
|
|
|
uintptr_t
|
|
mem_static_map_physical(uintptr_t ptr)
|
|
{
|
|
struct mem_static_map_entry *mp;
|
|
ptrdiff_t offset;
|
|
|
|
mp = mem_static_find_virtual(ptr, &offset);
|
|
if (NULL != mp)
|
|
return(mp->physical_base + offset);
|
|
return(MAP_NO_ENTRY);
|
|
}
|