ept_entry_t *table, *ept_entry = NULL;
unsigned long gfn_remainder = gfn;
unsigned int i, target = order / EPT_TABLE_ORDER;
+ unsigned long fn_mask = !mfn_eq(mfn, INVALID_MFN) ? (gfn | mfn_x(mfn)) : gfn;
int ret, rc = 0;
bool_t entry_written = 0;
bool_t direct_mmio = (p2mt == p2m_mmio_direct);
* 2. gfn not exceeding guest physical address width.
* 3. passing a valid order.
*/
- if ( ((gfn | mfn_x(mfn)) & ((1UL << order) - 1)) ||
+ if ( (fn_mask & ((1UL << order) - 1)) ||
((u64)gfn >> ((ept->wl + 1) * EPT_TABLE_ORDER)) ||
(order % EPT_TABLE_ORDER) )
return -EINVAL;
while ( todo )
{
if ( hap_enabled(d) )
- order = (!((gfn | mfn_x(mfn) | todo) &
- ((1ul << PAGE_ORDER_1G) - 1)) &&
+ {
+ unsigned long fn_mask = !mfn_eq(mfn, INVALID_MFN) ?
+ (gfn | mfn_x(mfn) | todo) : (gfn | todo);
+
+ order = (!(fn_mask & ((1ul << PAGE_ORDER_1G) - 1)) &&
hap_has_1gb) ? PAGE_ORDER_1G :
- (!((gfn | mfn_x(mfn) | todo) &
- ((1ul << PAGE_ORDER_2M) - 1)) &&
+ (!(fn_mask & ((1ul << PAGE_ORDER_2M) - 1)) &&
hap_has_2mb) ? PAGE_ORDER_2M : PAGE_ORDER_4K;
+ }
else
order = 0;