diff options
Diffstat (limited to 'arch/x86/xen/enlighten.c')
| -rw-r--r-- | arch/x86/xen/enlighten.c | 42 | 
1 files changed, 39 insertions, 3 deletions
diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c index a8f8844b8d3..95dccce8e97 100644 --- a/arch/x86/xen/enlighten.c +++ b/arch/x86/xen/enlighten.c @@ -63,6 +63,7 @@  #include <asm/stackprotector.h>  #include <asm/hypervisor.h>  #include <asm/mwait.h> +#include <asm/pci_x86.h>  #ifdef CONFIG_ACPI  #include <linux/acpi.h> @@ -809,9 +810,40 @@ static void xen_io_delay(void)  }  #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)  { -	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) @@ -849,6 +881,8 @@ static void set_xen_basic_apic_ops(void)  	apic->icr_write = xen_apic_icr_write;  	apic->wait_icr_idle = xen_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 @@ -1365,8 +1399,10 @@ asmlinkage void __init xen_start_kernel(void)  		/* Make sure ACS will be enabled */  		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_setup_runstate_info(0);  |