diff options
Diffstat (limited to 'arch/x86/xen/enlighten.c')
| -rw-r--r-- | arch/x86/xen/enlighten.c | 58 | 
1 files changed, 56 insertions, 2 deletions
diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c index c8e1c7b95c3..53d4f680c9b 100644 --- a/arch/x86/xen/enlighten.c +++ b/arch/x86/xen/enlighten.c @@ -31,6 +31,7 @@  #include <linux/pci.h>  #include <linux/gfp.h>  #include <linux/memblock.h> +#include <linux/edd.h>  #include <xen/xen.h>  #include <xen/events.h> @@ -1220,7 +1221,6 @@ static const struct pv_cpu_ops xen_cpu_ops __initconst = {  	.alloc_ldt = xen_alloc_ldt,  	.free_ldt = xen_free_ldt, -	.store_gdt = native_store_gdt,  	.store_idt = native_store_idt,  	.store_tr = xen_store_tr, @@ -1306,6 +1306,55 @@ static const struct machine_ops xen_machine_ops __initconst = {  	.emergency_restart = xen_emergency_restart,  }; +static void __init xen_boot_params_init_edd(void) +{ +#if IS_ENABLED(CONFIG_EDD) +	struct xen_platform_op op; +	struct edd_info *edd_info; +	u32 *mbr_signature; +	unsigned nr; +	int ret; + +	edd_info = boot_params.eddbuf; +	mbr_signature = boot_params.edd_mbr_sig_buffer; + +	op.cmd = XENPF_firmware_info; + +	op.u.firmware_info.type = XEN_FW_DISK_INFO; +	for (nr = 0; nr < EDDMAXNR; nr++) { +		struct edd_info *info = edd_info + nr; + +		op.u.firmware_info.index = nr; +		info->params.length = sizeof(info->params); +		set_xen_guest_handle(op.u.firmware_info.u.disk_info.edd_params, +				     &info->params); +		ret = HYPERVISOR_dom0_op(&op); +		if (ret) +			break; + +#define C(x) info->x = op.u.firmware_info.u.disk_info.x +		C(device); +		C(version); +		C(interface_support); +		C(legacy_max_cylinder); +		C(legacy_max_head); +		C(legacy_sectors_per_track); +#undef C +	} +	boot_params.eddbuf_entries = nr; + +	op.u.firmware_info.type = XEN_FW_DISK_MBR_SIGNATURE; +	for (nr = 0; nr < EDD_MBR_SIG_MAX; nr++) { +		op.u.firmware_info.index = nr; +		ret = HYPERVISOR_dom0_op(&op); +		if (ret) +			break; +		mbr_signature[nr] = op.u.firmware_info.u.disk_mbr_signature.mbr_signature; +	} +	boot_params.edd_mbr_sig_buf_entries = nr; +#endif +} +  /*   * Set up the GDT and segment registers for -fstack-protector.  Until   * we do this, we have to be careful not to call any stack-protected @@ -1508,6 +1557,8 @@ asmlinkage void __init xen_start_kernel(void)  		/* Avoid searching for BIOS MP tables */  		x86_init.mpparse.find_smp_config = x86_init_noop;  		x86_init.mpparse.get_smp_config = x86_init_uint_noop; + +		xen_boot_params_init_edd();  	}  #ifdef CONFIG_PCI  	/* PCI BIOS service won't work from a PV guest. */ @@ -1589,8 +1640,11 @@ static int __cpuinit xen_hvm_cpu_notify(struct notifier_block *self,  	switch (action) {  	case CPU_UP_PREPARE:  		xen_vcpu_setup(cpu); -		if (xen_have_vector_callback) +		if (xen_have_vector_callback) {  			xen_init_lock_cpu(cpu); +			if (xen_feature(XENFEAT_hvm_safe_pvclock)) +				xen_setup_timer(cpu); +		}  		break;  	default:  		break;  |