From: Jan Beulich Date: Mon, 6 Oct 2014 09:13:19 +0000 (+0200) Subject: x86: restore reserving of IO-APIC pages in XENMEM_machine_memory_map output X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~4271 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=9d8edc5a8b4a0937193f80da72abdb44c5aeaec6;p=xen.git 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 Reviewed-by: Tim Deegan --- diff --git a/xen/arch/x86/mm.c b/xen/arch/x86/mm.c index bfe9f05a3c..6cd7f45a92 100644 --- a/xen/arch/x86/mm.c +++ b/xen/arch/x86/mm.c @@ -122,6 +122,7 @@ #include #include #include +#include #include /* Mapping of the fixmap space needed early. */ @@ -4478,10 +4479,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; @@ -4504,6 +4504,31 @@ static int handle_iomem_range(unsigned long s, unsigned long e, void *p) 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, @@ -4731,7 +4756,7 @@ long arch_memory_op(unsigned long cmd, XEN_GUEST_HANDLE_PARAM(void) arg) { 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,