efi.update_capsule           = xen_efi_update_capsule;
        efi.query_capsule_caps       = xen_efi_query_capsule_caps;
        efi.get_next_high_mono_count = xen_efi_get_next_high_mono_count;
-       efi.reset_system             = NULL; /* Functionality provided by Xen. */
+       efi.reset_system             = xen_efi_reset_system;
 }
 EXPORT_SYMBOL_GPL(xen_efi_runtime_setup);
 
        .update_capsule           = xen_efi_update_capsule,
        .query_capsule_caps       = xen_efi_query_capsule_caps,
        .get_next_high_mono_count = xen_efi_get_next_high_mono_count,
-       .reset_system             = NULL, /* Functionality provided by Xen. */
+       .reset_system             = xen_efi_reset_system,
        .set_virtual_address_map  = NULL, /* Not used under Xen. */
        .flags                    = 0     /* Initialized later. */
 };
 
 #include <xen/interface/xen.h>
 #include <xen/interface/platform.h>
 #include <xen/xen.h>
+#include <xen/xen-ops.h>
 
 #include <asm/page.h>
 
        return efi_data(op).status;
 }
 EXPORT_SYMBOL_GPL(xen_efi_query_capsule_caps);
+
+void xen_efi_reset_system(int reset_type, efi_status_t status,
+                         unsigned long data_size, efi_char16_t *data)
+{
+       switch (reset_type) {
+       case EFI_RESET_COLD:
+       case EFI_RESET_WARM:
+               xen_reboot(SHUTDOWN_reboot);
+               break;
+       case EFI_RESET_SHUTDOWN:
+               xen_reboot(SHUTDOWN_poweroff);
+               break;
+       default:
+               BUG();
+       }
+}
+EXPORT_SYMBOL_GPL(xen_efi_reset_system);
 
 efi_status_t xen_efi_query_capsule_caps(efi_capsule_header_t **capsules,
                                        unsigned long count, u64 *max_size,
                                        int *reset_type);
+void xen_efi_reset_system(int reset_type, efi_status_t status,
+                         unsigned long data_size, efi_char16_t *data);
+
 
 #ifdef CONFIG_PREEMPT