x86/paging: restrict physical address width reported to guests

Modern hardware may report more than 48 bits of physical address width.
For paging-external guests our P2M implementation does not cope with
larger values. Telling the guest of more available bits means misleading
it into perhaps trying to actually put some page there (like was e.g.
intermediately done in OVMF for the shared info page).

While there also convert the PV check to a paging-external one (which in
our current code base are synonyms of one another anyway).

Fixes: 5dbd60e16a ("x86/shadow: Correct guest behaviour when creating PTEs above maxphysaddr")
Signed-off-by: Jan Beulich <jbeulich@suse.com>
Reviewed-by: Roger Pau Monné <roger.pau@citrix.com>
master commit: b7635526ac
master date: 2021-10-19 10:08:30 +0200
This commit is contained in:
Jan Beulich committed 2021-11-19 09:38:42 +01:00
1 parent 0c3fde7b7e
commit 81e3fd1f3c
1 file changed
+11 -4
+11 -4
View File
@@ -391,11 +391,18 @@ static always_inline unsigned int paging_max_paddr_bits(const struct domain *d)
{
unsigned int bits = paging_mode_hap(d) ? hap_paddr_bits : paddr_bits;
if ( !IS_ENABLED(CONFIG_BIGMEM) && paging_mode_shadow(d) &&
!is_pv_domain(d) )
if ( paging_mode_external(d) )
{
/* Shadowed superpages store GFNs in 32-bit page_info fields. */
bits = min(bits, 32U + PAGE_SHIFT);
if ( !IS_ENABLED(CONFIG_BIGMEM) && paging_mode_shadow(d) )
{
/* Shadowed superpages store GFNs in 32-bit page_info fields. */
bits = min(bits, 32U + PAGE_SHIFT);
}
else
{
/* Both p2m-ept and p2m-pt only support 4-level page tables. */
bits = min(bits, 48U);
}
}
return bits;
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.