Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
SUSE:SLE-12-SP1:GA
xen.8005
5604f239-x86-PV-properly-populate-descriptor-ta...
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File 5604f239-x86-PV-properly-populate-descriptor-tables.patch of Package xen.8005
# Commit cf6d39f81992c29a637c603dbabf1e21a0ea563f # Date 2015-09-25 09:05:29 +0200 # Author Jan Beulich <jbeulich@suse.com> # Committer Jan Beulich <jbeulich@suse.com> x86/PV: properly populate descriptor tables Us extending the GDT limit past the Xen descriptors so far meant that guests (including user mode programs) accessing any descriptor table slot above the original OS'es limit but below the first Xen descriptor caused a #PF, converted to a #GP in our #PF handler. Which is quite different from the native behavior, where some of such accesses (LAR and LSL) don't fault. Mimic that behavior by mapping a blank page into unused slots. While not strictly required, treat the LDT the same for consistency. Reported-by: Andrew Cooper <andrew.cooper3@citrix.com> Signed-off-by: Jan Beulich <jbeulich@suse.com> Reviewed-by: Andrew Cooper <andrew.cooper3@citrix.com> # Commit 61031e64d3dafd2fb1953436444bf02eccb9b146 # Date 2015-10-27 14:46:12 +0100 # Author Jan Beulich <jbeulich@suse.com> # Committer Jan Beulich <jbeulich@suse.com> x86/PV: don't zero-map LDT This effectvely reverts the LDT related part of commit cf6d39f819 ("x86/PV: properly populate descriptor tables"), which broke demand paged LDT handling in guests. Reported-by: David Vrabel <david.vrabel@citrix.com> Diagnosed-by: Andrew Cooper <andrew.cooper3@citrix.com> Signed-off-by: Jan Beulich <jbeulich@suse.com> Tested-by: David Vrabel <david.vrabel@citrix.com> Reviewed-by: Andrew Cooper <andrew.cooper3@citrix.com> Index: xen-4.4.4-testing/xen/arch/x86/mm.c =================================================================== --- xen-4.4.4-testing.orig/xen/arch/x86/mm.c +++ xen-4.4.4-testing/xen/arch/x86/mm.c @@ -515,12 +515,12 @@ void update_cr3(struct vcpu *v) make_cr3(v, cr3_mfn); } +static const char __section(".bss.page_aligned") zero_page[PAGE_SIZE]; static void invalidate_shadow_ldt(struct vcpu *v, int flush) { l1_pgentry_t *pl1e; - int i; - unsigned long pfn; + unsigned int i; struct page_info *page; BUG_ON(unlikely(in_irq())); @@ -535,10 +535,10 @@ static void invalidate_shadow_ldt(struct for ( i = 16; i < 32; i++ ) { - pfn = l1e_get_pfn(pl1e[i]); - if ( pfn == 0 ) continue; + if ( !(l1e_get_flags(pl1e[i]) & _PAGE_PRESENT) ) + continue; + page = l1e_get_page(pl1e[i]); l1e_write(&pl1e[i], l1e_empty()); - page = mfn_to_page(pfn); ASSERT_PAGE_IS_TYPE(page, PGT_seg_desc_page); ASSERT_PAGE_IS_DOMAIN(page, v->domain); put_page_and_type(page); @@ -4329,16 +4329,18 @@ long do_update_va_mapping_otherdomain(un void destroy_gdt(struct vcpu *v) { l1_pgentry_t *pl1e; - int i; - unsigned long pfn; + unsigned int i; + unsigned long pfn, zero_pfn = PFN_DOWN(__pa(zero_page)); v->arch.pv_vcpu.gdt_ents = 0; pl1e = gdt_ldt_ptes(v->domain, v); for ( i = 0; i < FIRST_RESERVED_GDT_PAGE; i++ ) { - if ( (pfn = l1e_get_pfn(pl1e[i])) != 0 ) + pfn = l1e_get_pfn(pl1e[i]); + if ( (l1e_get_flags(pl1e[i]) & _PAGE_PRESENT) && pfn != zero_pfn ) put_page_and_type(mfn_to_page(pfn)); - l1e_write(&pl1e[i], l1e_empty()); + l1e_write(&pl1e[i], + l1e_from_pfn(zero_pfn, __PAGE_HYPERVISOR & ~_PAGE_RW)); v->arch.pv_vcpu.gdt_frames[i] = 0; } } @@ -4351,7 +4353,7 @@ long set_gdt(struct vcpu *v, struct domain *d = v->domain; l1_pgentry_t *pl1e; /* NB. There are 512 8-byte entries per GDT page. */ - int i, nr_pages = (entries + 511) / 512; + unsigned int i, nr_pages = (entries + 511) / 512; if ( entries > FIRST_RESERVED_GDT_ENTRY ) return -EINVAL;
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor