Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
SUSE:SLE-12:Update
xen.196
54325d2f-x86-restore-reserving-of-IO-APIC-pages...
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File 54325d2f-x86-restore-reserving-of-IO-APIC-pages-in-XENMEM_machine_memory_map-output.patch of Package xen.196
# Commit 9d8edc5a8b4a0937193f80da72abdb44c5aeaec6 # Date 2014-10-06 11:13:19 +0200 # Author Jan Beulich <jbeulich@suse.com> # Committer Jan Beulich <jbeulich@suse.com> x86: restore reserving of IO-APIC pages in XENMEM_machine_memory_map output Commit d1222afda4 ("x86: allow Dom0 read-only access to IO-APICs") had an unintended side effect: By no longer adding IO-APIC pages to Dom0's iomem_caps these also no longer get reported as reserved in the machine memory map presented to it (which got added there intentionally by commit b8a456caed ["x86: improve reporting through XENMEM_machine_memory_map"] because many BIOSes fail to add these). Signed-off-by: Jan Beulich <jbeulich@suse.com> Reviewed-by: Tim Deegan <tim@xen.org> --- a/xen/arch/x86/mm.c +++ b/xen/arch/x86/mm.c @@ -121,6 +121,7 @@ #include <xen/trace.h> #include <asm/setup.h> #include <asm/fixmap.h> +#include <asm/io_apic.h> #include <asm/pci.h> /* Mapping of the fixmap space needed early. */ @@ -4494,10 +4495,9 @@ struct memory_map_context struct xen_memory_map map; }; -static int handle_iomem_range(unsigned long s, unsigned long e, void *p) +static int _handle_iomem_range(unsigned long s, unsigned long e, + struct memory_map_context *ctxt) { - struct memory_map_context *ctxt = p; - if ( s > ctxt->s ) { e820entry_t ent; @@ -4520,6 +4520,31 @@ static int handle_iomem_range(unsigned l return 0; } +static int handle_iomem_range(unsigned long s, unsigned long e, void *p) +{ + int err = 0; + + do { + unsigned long low = -1UL; + unsigned int i; + + for ( i = 0; i < nr_ioapics; ++i ) + { + unsigned long mfn = paddr_to_pfn(mp_ioapics[i].mpc_apicaddr); + + if ( mfn >= s && mfn <= e && mfn < low ) + low = mfn; + } + if ( !(low + 1) ) + break; + if ( s < low ) + err = _handle_iomem_range(s, low - 1, p); + s = low + 1; + } while ( !err ); + + return err || s > e ? err : _handle_iomem_range(s, e, p); +} + int xenmem_add_to_physmap_one( struct domain *d, unsigned int space, @@ -4744,7 +4769,7 @@ long arch_memory_op(int op, XEN_GUEST_HA { unsigned long s = PFN_DOWN(e820.map[i].addr); - if ( s ) + if ( s > ctxt.s ) { rc = rangeset_report_ranges(current->domain->iomem_caps, ctxt.s, s - 1,
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