@@ -195,7 +195,9 @@ p2m_next_level(struct p2m_domain *p2m, v
l1_pgentry_t *p2m_entry;
l1_pgentry_t new_entry;
void *next;
- int i;
+ struct page_info *pg;
+ unsigned int i, flags;
+ unsigned long pfn;
if ( !(p2m_entry = p2m_find_entry(*table, gfn_remainder, gfn,
shift, max)) )
@@ -204,8 +206,6 @@ p2m_next_level(struct p2m_domain *p2m, v
/* PoD/paging: Not present doesn't imply empty. */
if ( !l1e_get_flags(*p2m_entry) )
{
- struct page_info *pg;
-
pg = p2m_alloc_ptp(p2m, type);
if ( pg == NULL )
return -ENOMEM;
@@ -232,21 +232,17 @@ p2m_next_level(struct p2m_domain *p2m, v
}
}
- ASSERT(l1e_get_flags(*p2m_entry) & (_PAGE_PRESENT|_PAGE_PSE));
+ flags = l1e_get_flags(*p2m_entry);
+ pfn = l1e_get_pfn(*p2m_entry);
+ ASSERT(flags & (_PAGE_PRESENT|_PAGE_PSE));
/* split 1GB pages into 2MB pages */
- if ( type == PGT_l2_page_table && (l1e_get_flags(*p2m_entry) & _PAGE_PSE) )
+ if ( type == PGT_l2_page_table && (flags & _PAGE_PSE) )
{
- unsigned long flags, pfn;
- struct page_info *pg;
-
pg = p2m_alloc_ptp(p2m, PGT_l2_page_table);
if ( pg == NULL )
return -ENOMEM;
- flags = l1e_get_flags(*p2m_entry);
- pfn = l1e_get_pfn(*p2m_entry);
-
l1_entry = __map_domain_page(pg);
for ( i = 0; i < L2_PAGETABLE_ENTRIES; i++ )
{
@@ -263,19 +259,14 @@ p2m_next_level(struct p2m_domain *p2m, v
/* split single 2MB large page into 4KB page in P2M table */
- if ( type == PGT_l1_page_table && (l1e_get_flags(*p2m_entry) & _PAGE_PSE) )
+ if ( type == PGT_l1_page_table && (flags & _PAGE_PSE) )
{
- unsigned long flags, pfn;
- struct page_info *pg;
-
pg = p2m_alloc_ptp(p2m, PGT_l1_page_table);
if ( pg == NULL )
return -ENOMEM;
/* New splintered mappings inherit the flags of the old superpage,
* with a little reorganisation for the _PAGE_PSE_PAT bit. */
- flags = l1e_get_flags(*p2m_entry);
- pfn = l1e_get_pfn(*p2m_entry);
if ( pfn & 1 ) /* ==> _PAGE_PSE_PAT was set */
pfn -= 1; /* Clear it; _PAGE_PSE becomes _PAGE_PAT */
else