51e517e6-AMD-IOMMU-allocate-IRTEs.patch 51e5183f-AMD-IOMMU-untie-remap-and-vector-maps.patch 51e63df6-VMX-fix-interaction-of-APIC-V-and-Viridian-emulation.patch 52146070-ACPI-fix-acpi_os_map_memory.patch 5214d26a-VT-d-warn-about-CFI-being-enabled-by-firmware.patch 5215d094-Nested-VMX-Check-whether-interrupt-is-blocked-by-TPR.patch 5215d0c5-Nested-VMX-Force-check-ISR-when-L2-is-running.patch 5215d135-Nested-VMX-Clear-APIC-v-control-bit-in-vmcs02.patch 5215d2d5-Nested-VMX-Update-APIC-v-RVI-SVI-when-vmexit-to-L1.patch 5215d8b0-Correct-X2-APIC-HVM-emulation.patch - Dropped 520d417d-xen-Add-stdbool.h-workaround-for-BSD.patch OBS-URL: https://build.opensuse.org/package/show/Virtualization/xen?expand=0&rev=267
133 lines
4.2 KiB
Diff
133 lines
4.2 KiB
Diff
References: bnc#833251, bnc#834751
|
|
|
|
# Commit 2ee9cbf9d8eaeff6e21222905d22dbd58dc5fe29
|
|
# Date 2013-08-21 08:38:40 +0200
|
|
# Author Jan Beulich <jbeulich@suse.com>
|
|
# Committer Jan Beulich <jbeulich@suse.com>
|
|
ACPI: fix acpi_os_map_memory()
|
|
|
|
It using map_domain_page() was entirely wrong. Use __acpi_map_table()
|
|
instead for the time being, with locking added as the mappings it
|
|
produces get replaced with subsequent invocations. Using locking in
|
|
this way is acceptable here since the only two runtime callers are
|
|
acpi_os_{read,write}_memory(), which don't leave mappings pending upon
|
|
returning to their callers.
|
|
|
|
Also fix __acpi_map_table()'s first parameter's type - while benign for
|
|
unstable, backports to pre-4.3 trees will need this.
|
|
|
|
Signed-off-by: Jan Beulich <jbeulich@suse.com>
|
|
|
|
# Commit c5ba8ed4c6f005d332a49d93a3ef8ff2b690b256
|
|
# Date 2013-08-21 08:40:22 +0200
|
|
# Author Jan Beulich <jbeulich@suse.com>
|
|
# Committer Jan Beulich <jbeulich@suse.com>
|
|
ACPI: use ioremap() in acpi_os_map_memory()
|
|
|
|
This drops the post-boot use of __acpi_map_table() here again (together
|
|
with the somewhat awkward locking), in favor of using ioremap().
|
|
|
|
Signed-off-by: Jan Beulich <jbeulich@suse.com>
|
|
|
|
--- a/xen/arch/x86/acpi/lib.c
|
|
+++ b/xen/arch/x86/acpi/lib.c
|
|
@@ -39,7 +39,7 @@ u32 __read_mostly x86_acpiid_to_apicid[M
|
|
* from the fixed base. That's why we start at FIX_ACPI_END and
|
|
* count idx down while incrementing the phys address.
|
|
*/
|
|
-char *__acpi_map_table(unsigned long phys, unsigned long size)
|
|
+char *__acpi_map_table(paddr_t phys, unsigned long size)
|
|
{
|
|
unsigned long base, offset, mapped_size;
|
|
int idx;
|
|
--- a/xen/drivers/acpi/osl.c
|
|
+++ b/xen/drivers/acpi/osl.c
|
|
@@ -38,6 +38,7 @@
|
|
#include <xen/spinlock.h>
|
|
#include <xen/domain_page.h>
|
|
#include <xen/efi.h>
|
|
+#include <xen/vmap.h>
|
|
|
|
#define _COMPONENT ACPI_OS_SERVICES
|
|
ACPI_MODULE_NAME("osl")
|
|
@@ -83,14 +84,25 @@ acpi_physical_address __init acpi_os_get
|
|
}
|
|
}
|
|
|
|
-void __iomem *__init
|
|
+void __iomem *
|
|
acpi_os_map_memory(acpi_physical_address phys, acpi_size size)
|
|
{
|
|
- return __acpi_map_table((unsigned long)phys, size);
|
|
+ if (system_state >= SYS_STATE_active) {
|
|
+ unsigned long pfn = PFN_DOWN(phys);
|
|
+ unsigned int offs = phys & (PAGE_SIZE - 1);
|
|
+
|
|
+ /* The low first Mb is always mapped. */
|
|
+ if ( !((phys + size - 1) >> 20) )
|
|
+ return __va(phys);
|
|
+ return __vmap(&pfn, PFN_UP(offs + size), 1, 1, PAGE_HYPERVISOR_NOCACHE) + offs;
|
|
+ }
|
|
+ return __acpi_map_table(phys, size);
|
|
}
|
|
|
|
-void __init acpi_os_unmap_memory(void __iomem * virt, acpi_size size)
|
|
+void acpi_os_unmap_memory(void __iomem * virt, acpi_size size)
|
|
{
|
|
+ if (system_state >= SYS_STATE_active)
|
|
+ vunmap((void *)((unsigned long)virt & PAGE_MASK));
|
|
}
|
|
|
|
acpi_status acpi_os_read_port(acpi_io_address port, u32 * value, u32 width)
|
|
@@ -133,9 +145,8 @@ acpi_status
|
|
acpi_os_read_memory(acpi_physical_address phys_addr, u32 * value, u32 width)
|
|
{
|
|
u32 dummy;
|
|
- void __iomem *virt_addr;
|
|
+ void __iomem *virt_addr = acpi_os_map_memory(phys_addr, width >> 3);
|
|
|
|
- virt_addr = map_domain_page(phys_addr>>PAGE_SHIFT);
|
|
if (!value)
|
|
value = &dummy;
|
|
|
|
@@ -153,7 +164,7 @@ acpi_os_read_memory(acpi_physical_addres
|
|
BUG();
|
|
}
|
|
|
|
- unmap_domain_page(virt_addr);
|
|
+ acpi_os_unmap_memory(virt_addr, width >> 3);
|
|
|
|
return AE_OK;
|
|
}
|
|
@@ -161,9 +172,7 @@ acpi_os_read_memory(acpi_physical_addres
|
|
acpi_status
|
|
acpi_os_write_memory(acpi_physical_address phys_addr, u32 value, u32 width)
|
|
{
|
|
- void __iomem *virt_addr;
|
|
-
|
|
- virt_addr = map_domain_page(phys_addr>>PAGE_SHIFT);
|
|
+ void __iomem *virt_addr = acpi_os_map_memory(phys_addr, width >> 3);
|
|
|
|
switch (width) {
|
|
case 8:
|
|
@@ -179,7 +188,7 @@ acpi_os_write_memory(acpi_physical_addre
|
|
BUG();
|
|
}
|
|
|
|
- unmap_domain_page(virt_addr);
|
|
+ acpi_os_unmap_memory(virt_addr, width >> 3);
|
|
|
|
return AE_OK;
|
|
}
|
|
--- a/xen/include/xen/acpi.h
|
|
+++ b/xen/include/xen/acpi.h
|
|
@@ -56,7 +56,7 @@ typedef int (*acpi_table_handler) (struc
|
|
typedef int (*acpi_table_entry_handler) (struct acpi_subtable_header *header, const unsigned long end);
|
|
|
|
unsigned int acpi_get_processor_id (unsigned int cpu);
|
|
-char * __acpi_map_table (unsigned long phys_addr, unsigned long size);
|
|
+char * __acpi_map_table (paddr_t phys_addr, unsigned long size);
|
|
int acpi_boot_init (void);
|
|
int acpi_boot_table_init (void);
|
|
int acpi_numa_init (void);
|