}
 }
 
-static void __init efi_systab_init(void *phys)
+static int __init efi_systab_init(void *phys)
 {
        efi.systab = early_ioremap((unsigned long)efi_phys.systab,
                                   sizeof(efi_system_table_t));
-       if (efi.systab == NULL)
+       if (efi.systab == NULL) {
                pr_err("Couldn't map the system table!\n");
+               return -ENOMEM;
+       }
        memcpy(&efi_systab, efi.systab, sizeof(efi_system_table_t));
        early_iounmap(efi.systab, sizeof(efi_system_table_t));
        efi.systab = &efi_systab;
        /*
         * Verify the EFI Table
         */
-       if (efi.systab->hdr.signature != EFI_SYSTEM_TABLE_SIGNATURE)
+       if (efi.systab->hdr.signature != EFI_SYSTEM_TABLE_SIGNATURE) {
                pr_err("System table signature incorrect!\n");
+               return -EINVAL;
+       }
        if ((efi.systab->hdr.revision >> 16) == 0)
                pr_err("Warning: System table version "
                       "%d.%02d, expected 1.00 or greater!\n",
                       efi.systab->hdr.revision >> 16,
                       efi.systab->hdr.revision & 0xffff);
+
+       return 0;
 }
 
-static void __init efi_config_init(u64 tables, int nr_tables)
+static int __init efi_config_init(u64 tables, int nr_tables)
 {
        efi_config_table_t *config_tables;
        int i, sz = sizeof(efi_config_table_t);
         */
        config_tables = early_ioremap(efi.systab->tables,
                                      efi.systab->nr_tables * sz);
-       if (config_tables == NULL)
+       if (config_tables == NULL) {
                pr_err("Could not map Configuration table!\n");
+               return -ENOMEM;
+       }
 
        pr_info("");
        for (i = 0; i < efi.systab->nr_tables; i++) {
        }
        pr_cont("\n");
        early_iounmap(config_tables, efi.systab->nr_tables * sz);
+
+       return 0;
 }
 
-static void __init efi_runtime_init(void)
+static int __init efi_runtime_init(void)
 {
        efi_runtime_services_t *runtime;
 
         */
        runtime = early_ioremap((unsigned long)efi.systab->runtime,
                                sizeof(efi_runtime_services_t));
-       if (runtime != NULL) {
-               /*
-                * We will only need *early* access to the following
-                * two EFI runtime services before set_virtual_address_map
-                * is invoked.
-                */
-               efi_phys.get_time = (efi_get_time_t *)runtime->get_time;
-               efi_phys.set_virtual_address_map =
-                       (efi_set_virtual_address_map_t *)
-                       runtime->set_virtual_address_map;
-               /*
-                * Make efi_get_time can be called before entering
-                * virtual mode.
-                */
-               efi.get_time = phys_efi_get_time;
-       } else
+       if (!runtime) {
                pr_err("Could not map the runtime service table!\n");
+               return -ENOMEM;
+       }
+       /*
+        * We will only need *early* access to the following
+        * two EFI runtime services before set_virtual_address_map
+        * is invoked.
+        */
+       efi_phys.get_time = (efi_get_time_t *)runtime->get_time;
+       efi_phys.set_virtual_address_map =
+               (efi_set_virtual_address_map_t *)
+               runtime->set_virtual_address_map;
+       /*
+        * Make efi_get_time can be called before entering
+        * virtual mode.
+        */
+       efi.get_time = phys_efi_get_time;
        early_iounmap(runtime, sizeof(efi_runtime_services_t));
+
+       return 0;
 }
 
-static void __init efi_memmap_init(void)
+static int __init efi_memmap_init(void)
 {
        /* Map the EFI memory map */
        memmap.map = early_ioremap((unsigned long)memmap.phys_map,
                                   memmap.nr_map * memmap.desc_size);
-       if (memmap.map == NULL)
+       if (memmap.map == NULL) {
                pr_err("Could not map the memory map!\n");
+               return -ENOMEM;
+       }
        memmap.map_end = memmap.map + (memmap.nr_map * memmap.desc_size);
 
        if (add_efi_memmap)
                do_add_efi_memmap();
+
+       return 0;
 }
 
 void __init efi_init(void)
                 ((__u64)boot_params.efi_info.efi_systab_hi<<32));
 #endif
 
-       efi_systab_init(efi_phys.systab);
+       if (efi_systab_init(efi_phys.systab)) {
+               efi_enabled = 0;
+               return;
+       }
 
        /*
         * Show what we know for posterity
                efi.systab->hdr.revision >> 16,
                efi.systab->hdr.revision & 0xffff, vendor);
 
-       efi_config_init(efi.systab->tables, efi.systab->nr_tables);
+       if (efi_config_init(efi.systab->tables, efi.systab->nr_tables)) {
+               efi_enabled = 0;
+               return;
+       }
 
-       efi_runtime_init();
+       if (efi_runtime_init()) {
+               efi_enabled = 0;
+               return;
+       }
 
-       efi_memmap_init();
+       if (efi_memmap_init()) {
+               efi_enabled = 0;
+               return;
+       }
 
 #ifdef CONFIG_X86_32
        x86_platform.get_wallclock = efi_get_time;