mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 02:01:24 +01:00
x86/pv: Only use the guest frame in pv_map_ldt_shadow_page()
pv_map_ldt_shadow_page() takes the whole guest PTE, adds _PAGE_RW to it, then installs it into Xen's pagetables. It has had this behaviour ever since LDT support was added in 2003. However, it allows the guest to control the software available bits and cacheability. This happens to be benign right now, but is bad form. Use only the guest frame, and construct the mapping as regular RW frame, and notably includes NX. This is how the GDT logic already works. Fixes:005c272397("Finished virtualisation of x86 LDT") Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com> Reviewed-by: Jan Beulich <jbeulich@suse.com> master commit:1cc1f4d7a0master date: 2026-07-14 17:31:08 +0100
This commit is contained in:
1 parent
c87190b879
commit
0ef8e9b371
1 file changed
+3
-3
@@ -52,7 +52,7 @@ bool pv_map_ldt_shadow_page(unsigned int offset)
|
||||
struct vcpu *curr = current;
|
||||
struct domain *currd = curr->domain;
|
||||
struct page_info *page;
|
||||
l1_pgentry_t gl1e, *pl1e;
|
||||
l1_pgentry_t gl1e, *pl1e, nl1e;
|
||||
unsigned long linear = curr->arch.pv.ldt_base + offset;
|
||||
|
||||
BUG_ON(in_irq());
|
||||
@@ -87,9 +87,9 @@ bool pv_map_ldt_shadow_page(unsigned int offset)
|
||||
}
|
||||
|
||||
pl1e = &pv_ldt_ptes(curr)[offset >> PAGE_SHIFT];
|
||||
l1e_add_flags(gl1e, _PAGE_RW);
|
||||
nl1e = l1e_from_pfn(l1e_get_pfn(gl1e), __PAGE_HYPERVISOR_RW);
|
||||
|
||||
l1e_write(pl1e, gl1e);
|
||||
l1e_write(pl1e, nl1e);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||