x86/mm: fully honor PS bits in guest page table walks

In L4 entries it is currently unconditionally reserved (and hence
should, when set, always result in a reserved bit page fault), and is
reserved on hardware not supporting 1Gb pages (and hence should, when
set, similarly cause a reserved bit page fault on such hardware).

This is CVE-2016-4480 / XSA-176.

Signed-off-by: Jan Beulich <jbeulich@suse.com>
Reviewed-by: Andrew Cooper <andrew.cooper3@citrix.com>
Tested-by: Andrew Cooper <andrew.cooper3@citrix.com>
master commit: 46699c7393
master date: 2016-05-17 14:41:14 +0200
This commit is contained in:
Jan Beulich committed 2016-05-17 14:56:46 +02:00
1 parent ab6f899313
commit 09f9f792b5
1 file changed
+8 -1
+8 -1
View File
@@ -186,6 +186,11 @@ guest_walk_tables(struct vcpu *v, struct p2m_domain *p2m,
rc |= _PAGE_PRESENT;
goto out;
}
if ( gflags & _PAGE_PSE )
{
rc |= _PAGE_PSE | _PAGE_INVALID_BIT;
goto out;
}
rc |= ((gflags & mflags) ^ mflags);
/* Map the l3 table */
@@ -206,7 +211,7 @@ guest_walk_tables(struct vcpu *v, struct p2m_domain *p2m,
}
rc |= ((gflags & mflags) ^ mflags);
pse1G = (gflags & _PAGE_PSE) && guest_supports_1G_superpages(v);
pse1G = !!(gflags & _PAGE_PSE);
if ( pse1G )
{
@@ -226,6 +231,8 @@ guest_walk_tables(struct vcpu *v, struct p2m_domain *p2m,
/* _PAGE_PSE_PAT not set: remove _PAGE_PAT from flags. */
flags &= ~_PAGE_PAT;
if ( !guest_supports_1G_superpages(v) )
rc |= _PAGE_PSE | _PAGE_INVALID_BIT;
if ( gfn_x(start) & GUEST_L3_GFN_MASK & ~0x1 )
rc |= _PAGE_INVALID_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.