mirror of
https://github.com/xemu-project/xemu.git
synced 2025-02-24 14:41:08 +00:00
memory: unify PhysPageEntry::node and ::leaf
They have the same type, unify them. Signed-off-by: Avi Kivity <avi@redhat.com>
This commit is contained in:
parent
2999097bf1
commit
c19e8800d4
38
exec.c
38
exec.c
@ -193,10 +193,8 @@ static unsigned phys_sections_nb, phys_sections_nb_alloc;
|
|||||||
static uint16_t phys_section_unassigned;
|
static uint16_t phys_section_unassigned;
|
||||||
|
|
||||||
struct PhysPageEntry {
|
struct PhysPageEntry {
|
||||||
union {
|
/* index into phys_sections (last level) or phys_map_nodes (others) */
|
||||||
uint16_t leaf; /* index into phys_sections */
|
uint16_t ptr;
|
||||||
uint16_t node; /* index into phys_map_nodes */
|
|
||||||
} u;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Simple allocator for PhysPageEntry nodes */
|
/* Simple allocator for PhysPageEntry nodes */
|
||||||
@ -207,7 +205,7 @@ static unsigned phys_map_nodes_nb, phys_map_nodes_nb_alloc;
|
|||||||
|
|
||||||
/* This is a multi-level map on the physical address space.
|
/* This is a multi-level map on the physical address space.
|
||||||
The bottom level has pointers to MemoryRegionSections. */
|
The bottom level has pointers to MemoryRegionSections. */
|
||||||
static PhysPageEntry phys_map = { .u.node = PHYS_MAP_NODE_NIL };
|
static PhysPageEntry phys_map = { .ptr = PHYS_MAP_NODE_NIL };
|
||||||
|
|
||||||
static void io_mem_init(void);
|
static void io_mem_init(void);
|
||||||
static void memory_map_init(void);
|
static void memory_map_init(void);
|
||||||
@ -425,7 +423,7 @@ static uint16_t phys_map_node_alloc(void)
|
|||||||
assert(ret != PHYS_MAP_NODE_NIL);
|
assert(ret != PHYS_MAP_NODE_NIL);
|
||||||
assert(ret != phys_map_nodes_nb_alloc);
|
assert(ret != phys_map_nodes_nb_alloc);
|
||||||
for (i = 0; i < L2_SIZE; ++i) {
|
for (i = 0; i < L2_SIZE; ++i) {
|
||||||
phys_map_nodes[ret][i].u.node = PHYS_MAP_NODE_NIL;
|
phys_map_nodes[ret][i].ptr = PHYS_MAP_NODE_NIL;
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@ -443,22 +441,22 @@ static void phys_page_set_level(PhysPageEntry *lp, target_phys_addr_t *index,
|
|||||||
PhysPageEntry *p;
|
PhysPageEntry *p;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (lp->u.node == PHYS_MAP_NODE_NIL) {
|
if (lp->ptr == PHYS_MAP_NODE_NIL) {
|
||||||
lp->u.node = phys_map_node_alloc();
|
lp->ptr = phys_map_node_alloc();
|
||||||
p = phys_map_nodes[lp->u.node];
|
p = phys_map_nodes[lp->ptr];
|
||||||
if (level == 0) {
|
if (level == 0) {
|
||||||
for (i = 0; i < L2_SIZE; i++) {
|
for (i = 0; i < L2_SIZE; i++) {
|
||||||
p[i].u.leaf = phys_section_unassigned;
|
p[i].ptr = phys_section_unassigned;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
p = phys_map_nodes[lp->u.node];
|
p = phys_map_nodes[lp->ptr];
|
||||||
}
|
}
|
||||||
lp = &p[(*index >> (level * L2_BITS)) & (L2_SIZE - 1)];
|
lp = &p[(*index >> (level * L2_BITS)) & (L2_SIZE - 1)];
|
||||||
|
|
||||||
while (*nb && lp < &p[L2_SIZE]) {
|
while (*nb && lp < &p[L2_SIZE]) {
|
||||||
if (level == 0) {
|
if (level == 0) {
|
||||||
lp->u.leaf = leaf;
|
lp->ptr = leaf;
|
||||||
++*index;
|
++*index;
|
||||||
--*nb;
|
--*nb;
|
||||||
} else {
|
} else {
|
||||||
@ -487,14 +485,14 @@ static MemoryRegionSection phys_page_find(target_phys_addr_t index)
|
|||||||
uint16_t s_index = phys_section_unassigned;
|
uint16_t s_index = phys_section_unassigned;
|
||||||
|
|
||||||
for (i = P_L2_LEVELS - 1; i >= 0; i--) {
|
for (i = P_L2_LEVELS - 1; i >= 0; i--) {
|
||||||
if (lp.u.node == PHYS_MAP_NODE_NIL) {
|
if (lp.ptr == PHYS_MAP_NODE_NIL) {
|
||||||
goto not_found;
|
goto not_found;
|
||||||
}
|
}
|
||||||
p = phys_map_nodes[lp.u.node];
|
p = phys_map_nodes[lp.ptr];
|
||||||
lp = p[(index >> (i * L2_BITS)) & (L2_SIZE - 1)];
|
lp = p[(index >> (i * L2_BITS)) & (L2_SIZE - 1)];
|
||||||
}
|
}
|
||||||
|
|
||||||
s_index = lp.u.leaf;
|
s_index = lp.ptr;
|
||||||
not_found:
|
not_found:
|
||||||
section = phys_sections[s_index];
|
section = phys_sections[s_index];
|
||||||
index <<= TARGET_PAGE_BITS;
|
index <<= TARGET_PAGE_BITS;
|
||||||
@ -2576,19 +2574,19 @@ static void destroy_l2_mapping(PhysPageEntry *lp, unsigned level)
|
|||||||
unsigned i;
|
unsigned i;
|
||||||
PhysPageEntry *p;
|
PhysPageEntry *p;
|
||||||
|
|
||||||
if (lp->u.node == PHYS_MAP_NODE_NIL) {
|
if (lp->ptr == PHYS_MAP_NODE_NIL) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
p = phys_map_nodes[lp->u.node];
|
p = phys_map_nodes[lp->ptr];
|
||||||
for (i = 0; i < L2_SIZE; ++i) {
|
for (i = 0; i < L2_SIZE; ++i) {
|
||||||
if (level > 0) {
|
if (level > 0) {
|
||||||
destroy_l2_mapping(&p[i], level - 1);
|
destroy_l2_mapping(&p[i], level - 1);
|
||||||
} else {
|
} else {
|
||||||
destroy_page_desc(p[i].u.leaf);
|
destroy_page_desc(p[i].ptr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
lp->u.node = PHYS_MAP_NODE_NIL;
|
lp->ptr = PHYS_MAP_NODE_NIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void destroy_all_mappings(void)
|
static void destroy_all_mappings(void)
|
||||||
@ -3575,7 +3573,7 @@ static void core_begin(MemoryListener *listener)
|
|||||||
{
|
{
|
||||||
destroy_all_mappings();
|
destroy_all_mappings();
|
||||||
phys_sections_clear();
|
phys_sections_clear();
|
||||||
phys_map.u.node = PHYS_MAP_NODE_NIL;
|
phys_map.ptr = PHYS_MAP_NODE_NIL;
|
||||||
phys_section_unassigned = dummy_section(&io_mem_unassigned);
|
phys_section_unassigned = dummy_section(&io_mem_unassigned);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user