Commit 4ed6cede authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'stable/for-linus-3.4-rc6-tag' of...

Merge tag 'stable/for-linus-3.4-rc6-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/konrad/xen

Pull xen fixes from Konrad Rzeszutek Wilk:
 - fix to Kconfig to make it fit within 80 line characters,
 - two bootup fixes (AMD 8-core and with PCI BIOS),
 - cleanup code in a Xen PV fb driver,
 - and a crash fix when trying to see non-existent PTE's

* tag 'stable/for-linus-3.4-rc6-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/konrad/xen:
  xen/Kconfig: fix Kconfig layout
  xen/pci: don't use PCI BIOS service for configuration space accesses
  xen/pte: Fix crashes when trying to see non-existent PGD/PMD/PUD/PTEs
  xen/apic: Return the APIC ID (and version) for CPU 0.
  drivers/video/xen-fbfront.c: add missing cleanup code
parents e9b19cd4 1fd14432
...@@ -63,6 +63,7 @@ ...@@ -63,6 +63,7 @@
#include <asm/stackprotector.h> #include <asm/stackprotector.h>
#include <asm/hypervisor.h> #include <asm/hypervisor.h>
#include <asm/mwait.h> #include <asm/mwait.h>
#include <asm/pci_x86.h>
#ifdef CONFIG_ACPI #ifdef CONFIG_ACPI
#include <linux/acpi.h> #include <linux/acpi.h>
...@@ -809,9 +810,40 @@ static void xen_io_delay(void) ...@@ -809,9 +810,40 @@ static void xen_io_delay(void)
} }
#ifdef CONFIG_X86_LOCAL_APIC #ifdef CONFIG_X86_LOCAL_APIC
static unsigned long xen_set_apic_id(unsigned int x)
{
WARN_ON(1);
return x;
}
static unsigned int xen_get_apic_id(unsigned long x)
{
return ((x)>>24) & 0xFFu;
}
static u32 xen_apic_read(u32 reg) static u32 xen_apic_read(u32 reg)
{ {
return 0; struct xen_platform_op op = {
.cmd = XENPF_get_cpuinfo,
.interface_version = XENPF_INTERFACE_VERSION,
.u.pcpu_info.xen_cpuid = 0,
};
int ret = 0;
/* Shouldn't need this as APIC is turned off for PV, and we only
* get called on the bootup processor. But just in case. */
if (!xen_initial_domain() || smp_processor_id())
return 0;
if (reg == APIC_LVR)
return 0x10;
if (reg != APIC_ID)
return 0;
ret = HYPERVISOR_dom0_op(&op);
if (ret)
return 0;
return op.u.pcpu_info.apic_id << 24;
} }
static void xen_apic_write(u32 reg, u32 val) static void xen_apic_write(u32 reg, u32 val)
...@@ -849,6 +881,8 @@ static void set_xen_basic_apic_ops(void) ...@@ -849,6 +881,8 @@ static void set_xen_basic_apic_ops(void)
apic->icr_write = xen_apic_icr_write; apic->icr_write = xen_apic_icr_write;
apic->wait_icr_idle = xen_apic_wait_icr_idle; apic->wait_icr_idle = xen_apic_wait_icr_idle;
apic->safe_wait_icr_idle = xen_safe_apic_wait_icr_idle; apic->safe_wait_icr_idle = xen_safe_apic_wait_icr_idle;
apic->set_apic_id = xen_set_apic_id;
apic->get_apic_id = xen_get_apic_id;
} }
#endif #endif
...@@ -1365,8 +1399,10 @@ asmlinkage void __init xen_start_kernel(void) ...@@ -1365,8 +1399,10 @@ asmlinkage void __init xen_start_kernel(void)
/* Make sure ACS will be enabled */ /* Make sure ACS will be enabled */
pci_request_acs(); pci_request_acs();
} }
#ifdef CONFIG_PCI
/* PCI BIOS service won't work from a PV guest. */
pci_probe &= ~PCI_PROBE_BIOS;
#endif
xen_raw_console_write("about to get started...\n"); xen_raw_console_write("about to get started...\n");
xen_setup_runstate_info(0); xen_setup_runstate_info(0);
......
...@@ -353,8 +353,13 @@ static pteval_t pte_mfn_to_pfn(pteval_t val) ...@@ -353,8 +353,13 @@ static pteval_t pte_mfn_to_pfn(pteval_t val)
{ {
if (val & _PAGE_PRESENT) { if (val & _PAGE_PRESENT) {
unsigned long mfn = (val & PTE_PFN_MASK) >> PAGE_SHIFT; unsigned long mfn = (val & PTE_PFN_MASK) >> PAGE_SHIFT;
unsigned long pfn = mfn_to_pfn(mfn);
pteval_t flags = val & PTE_FLAGS_MASK; pteval_t flags = val & PTE_FLAGS_MASK;
val = ((pteval_t)mfn_to_pfn(mfn) << PAGE_SHIFT) | flags; if (unlikely(pfn == ~0))
val = flags & ~_PAGE_PRESENT;
else
val = ((pteval_t)pfn << PAGE_SHIFT) | flags;
} }
return val; return val;
......
...@@ -365,7 +365,7 @@ static int __devinit xenfb_probe(struct xenbus_device *dev, ...@@ -365,7 +365,7 @@ static int __devinit xenfb_probe(struct xenbus_device *dev,
struct fb_info *fb_info; struct fb_info *fb_info;
int fb_size; int fb_size;
int val; int val;
int ret; int ret = 0;
info = kzalloc(sizeof(*info), GFP_KERNEL); info = kzalloc(sizeof(*info), GFP_KERNEL);
if (info == NULL) { if (info == NULL) {
...@@ -458,26 +458,31 @@ static int __devinit xenfb_probe(struct xenbus_device *dev, ...@@ -458,26 +458,31 @@ static int __devinit xenfb_probe(struct xenbus_device *dev,
xenfb_init_shared_page(info, fb_info); xenfb_init_shared_page(info, fb_info);
ret = xenfb_connect_backend(dev, info); ret = xenfb_connect_backend(dev, info);
if (ret < 0) if (ret < 0) {
goto error; xenbus_dev_fatal(dev, ret, "xenfb_connect_backend");
goto error_fb;
}
ret = register_framebuffer(fb_info); ret = register_framebuffer(fb_info);
if (ret) { if (ret) {
fb_deferred_io_cleanup(fb_info);
fb_dealloc_cmap(&fb_info->cmap);
framebuffer_release(fb_info);
xenbus_dev_fatal(dev, ret, "register_framebuffer"); xenbus_dev_fatal(dev, ret, "register_framebuffer");
goto error; goto error_fb;
} }
info->fb_info = fb_info; info->fb_info = fb_info;
xenfb_make_preferred_console(); xenfb_make_preferred_console();
return 0; return 0;
error_nomem: error_fb:
ret = -ENOMEM; fb_deferred_io_cleanup(fb_info);
xenbus_dev_fatal(dev, ret, "allocating device memory"); fb_dealloc_cmap(&fb_info->cmap);
error: framebuffer_release(fb_info);
error_nomem:
if (!ret) {
ret = -ENOMEM;
xenbus_dev_fatal(dev, ret, "allocating device memory");
}
error:
xenfb_remove(dev); xenfb_remove(dev);
return ret; return ret;
} }
......
...@@ -183,15 +183,17 @@ config XEN_ACPI_PROCESSOR ...@@ -183,15 +183,17 @@ config XEN_ACPI_PROCESSOR
depends on XEN && X86 && ACPI_PROCESSOR && CPU_FREQ depends on XEN && X86 && ACPI_PROCESSOR && CPU_FREQ
default m default m
help help
This ACPI processor uploads Power Management information to the Xen hypervisor. This ACPI processor uploads Power Management information to the Xen
hypervisor.
To do that the driver parses the Power Management data and uploads said
information to the Xen hypervisor. Then the Xen hypervisor can select the To do that the driver parses the Power Management data and uploads
proper Cx and Pxx states. It also registers itslef as the SMM so that said information to the Xen hypervisor. Then the Xen hypervisor can
other drivers (such as ACPI cpufreq scaling driver) will not load. select the proper Cx and Pxx states. It also registers itslef as the
SMM so that other drivers (such as ACPI cpufreq scaling driver) will
To compile this driver as a module, choose M here: the not load.
module will be called xen_acpi_processor If you do not know what to choose,
select M here. If the CPUFREQ drivers are built in, select Y here. To compile this driver as a module, choose M here: the module will be
called xen_acpi_processor If you do not know what to choose, select
M here. If the CPUFREQ drivers are built in, select Y here.
endmenu endmenu
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment