]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - arch/x86/xen/enlighten.c
Merge branch 'x86-paravirt-for-linus' of git://git.kernel.org/pub/scm/linux/kernel...
[linux.git] / arch / x86 / xen / enlighten.c
index ddab5390d5482659eda2a0d363f0950bdc8b39b4..53d4f680c9b59f498d41148325cd5a96ef1723e3 100644 (file)
@@ -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>
@@ -1305,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
@@ -1507,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. */
@@ -1588,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;