Index: /trunk/src/VBox/Main/idl/VirtualBox.xidl
===================================================================
--- /trunk/src/VBox/Main/idl/VirtualBox.xidl	(revision 101317)
+++ /trunk/src/VBox/Main/idl/VirtualBox.xidl	(revision 101318)
@@ -2704,5 +2704,5 @@
   <interface
     name="IVirtualBox" extends="$unknown"
-    uuid="901ac662-0b6e-4b19-a0ac-21cb54d4d5b2"
+    uuid="d644ad1e-c501-4fc7-9ab6-aa6d763bc540"
     wsmap="managed"
     rest="managed"
@@ -3893,4 +3893,9 @@
         downloaded from.
       </desc>
+      <param name="platformArchitecture" type="PlatformArchitecture" dir="in">
+        <desc>
+          Architecture of firmware to check.
+        </desc>
+      </param>
       <param name="firmwareType" type="FirmwareType" dir="in">
         <desc>
Index: /trunk/src/VBox/Main/include/ConsoleImpl.h
===================================================================
--- /trunk/src/VBox/Main/include/ConsoleImpl.h	(revision 101317)
+++ /trunk/src/VBox/Main/include/ConsoleImpl.h	(revision 101318)
@@ -1256,4 +1256,8 @@
 DECL_HIDDEN_THROW(Utf8Str *) GetExtraDataBoth(IVirtualBox *pVirtualBox, IMachine *pMachine, const char *pszName, Utf8Str *pStrValue);
 
+#ifndef VBOX_WITH_EFI_IN_DD2
+DECLHIDDEN(int) findEfiRom(IVirtualBox* vbox, PlatformArchitecture_T aPlatformArchitecture, FirmwareType_T aFirmwareType, Utf8Str *pEfiRomFile);
+#endif
+
 #endif /* !MAIN_INCLUDED_ConsoleImpl_h */
 /* vi: set tabstop=4 shiftwidth=4 expandtab: */
Index: /trunk/src/VBox/Main/include/VirtualBoxImpl.h
===================================================================
--- /trunk/src/VBox/Main/include/VirtualBoxImpl.h	(revision 101317)
+++ /trunk/src/VBox/Main/include/VirtualBoxImpl.h	(revision 101318)
@@ -438,5 +438,6 @@
                                    ComPtr<ICloudNetwork> &aNetwork);
     HRESULT removeCloudNetwork(const ComPtr<ICloudNetwork> &aNetwork);
-    HRESULT checkFirmwarePresent(FirmwareType_T aFirmwareType,
+    HRESULT checkFirmwarePresent(PlatformArchitecture_T aPlatformArchitecture,
+                                 FirmwareType_T aFirmwareType,
                                  const com::Utf8Str &aVersion,
                                  com::Utf8Str &aUrl,
Index: /trunk/src/VBox/Main/src-client/ConsoleImplConfigCommon.cpp
===================================================================
--- /trunk/src/VBox/Main/src-client/ConsoleImplConfigCommon.cpp	(revision 101317)
+++ /trunk/src/VBox/Main/src-client/ConsoleImplConfigCommon.cpp	(revision 101318)
@@ -3421,2 +3421,23 @@
 }
 
+
+#ifndef VBOX_WITH_EFI_IN_DD2
+DECLHIDDEN(int) findEfiRom(IVirtualBox* vbox, PlatformArchitecture_T aPlatformArchitecture, FirmwareType_T aFirmwareType, Utf8Str *pEfiRomFile)
+{
+    Bstr aFilePath, empty;
+    BOOL fPresent = FALSE;
+    HRESULT hrc = vbox->CheckFirmwarePresent(aPlatformArchitecture, aFirmwareType, empty.raw(),
+                                             empty.asOutParam(), aFilePath.asOutParam(), &fPresent);
+    AssertComRCReturn(hrc, Global::vboxStatusCodeFromCOM(hrc));
+
+    if (!fPresent)
+    {
+        LogRel(("Failed to find an EFI ROM file.\n"));
+        return VERR_FILE_NOT_FOUND;
+    }
+
+    *pEfiRomFile = Utf8Str(aFilePath);
+
+    return VINF_SUCCESS;
+}
+#endif
Index: /trunk/src/VBox/Main/src-client/ConsoleImplConfigX86.cpp
===================================================================
--- /trunk/src/VBox/Main/src-client/ConsoleImplConfigX86.cpp	(revision 101317)
+++ /trunk/src/VBox/Main/src-client/ConsoleImplConfigX86.cpp	(revision 101318)
@@ -194,25 +194,4 @@
     }
 };
-
-#ifndef VBOX_WITH_EFI_IN_DD2
-static int findEfiRom(IVirtualBox* vbox, FirmwareType_T aFirmwareType, Utf8Str *pEfiRomFile)
-{
-    Bstr aFilePath, empty;
-    BOOL fPresent = FALSE;
-    HRESULT hrc = vbox->CheckFirmwarePresent(aFirmwareType, empty.raw(),
-                                             empty.asOutParam(), aFilePath.asOutParam(), &fPresent);
-    AssertComRCReturn(hrc, Global::vboxStatusCodeFromCOM(hrc));
-
-    if (!fPresent)
-    {
-        LogRel(("Failed to find an EFI ROM file.\n"));
-        return VERR_FILE_NOT_FOUND;
-    }
-
-    *pEfiRomFile = Utf8Str(aFilePath);
-
-    return VINF_SUCCESS;
-}
-#endif
 
 /**
@@ -1676,5 +1655,5 @@
 #else
             Utf8Str efiRomFile;
-            vrc = findEfiRom(virtualBox, eFwType, &efiRomFile);
+            vrc = findEfiRom(virtualBox, PlatformArchitecture_x86, eFwType, &efiRomFile);
             AssertRCReturn(vrc, vrc);
             const char *pszEfiRomFile = efiRomFile.c_str();
Index: /trunk/src/VBox/Main/src-server/VirtualBoxImpl.cpp
===================================================================
--- /trunk/src/VBox/Main/src-server/VirtualBoxImpl.cpp	(revision 101317)
+++ /trunk/src/VBox/Main/src-server/VirtualBoxImpl.cpp	(revision 101318)
@@ -470,4 +470,18 @@
 };
 
+
+/**
+ * VirtualBox firmware descriptor.
+ */
+typedef struct VBOXFWDESC
+{
+    FirmwareType_T  enmType;
+    bool            fBuiltIn;
+    const char     *pszFileName;
+    const char     *pszUrl;
+} VBoxFwDesc;
+typedef const VBOXFWDESC *PVBOXFWDESC;
+
+
 // constructor / destructor
 /////////////////////////////////////////////////////////////////////////////
@@ -1885,5 +1899,6 @@
 }
 
-HRESULT VirtualBox::checkFirmwarePresent(FirmwareType_T aFirmwareType,
+HRESULT VirtualBox::checkFirmwarePresent(PlatformArchitecture_T aPlatformArchitecture,
+                                         FirmwareType_T aFirmwareType,
                                          const com::Utf8Str &aVersion,
                                          com::Utf8Str &aUrl,
@@ -1893,12 +1908,5 @@
     NOREF(aVersion);
 
-    static const struct
-    {
-        FirmwareType_T  enmType;
-        bool            fBuiltIn;
-        const char     *pszFileName;
-        const char     *pszUrl;
-    }
-    firmwareDesc[] =
+    static const VBOXFWDESC s_FwDescX86[] =
     {
         {   FirmwareType_BIOS,    true,  NULL,             NULL },
@@ -1914,13 +1922,42 @@
     };
 
-    for (size_t i = 0; i < sizeof(firmwareDesc) / sizeof(firmwareDesc[0]); i++)
-    {
-        if (aFirmwareType != firmwareDesc[i].enmType)
+    static const VBOXFWDESC s_FwDescArm[] =
+    {
+#ifdef VBOX_WITH_EFI_IN_DD2
+        {   FirmwareType_EFI32,   true,  "VBoxEFIAArch32.fd",   NULL },
+        {   FirmwareType_EFI64,   true,  "VBoxEFIAArch64.fd",   NULL },
+#else
+        {   FirmwareType_EFI32,   false, "VBoxEFIAArch32.fd",   "http://virtualbox.org/firmware/VBoxEFIAArch32.fd" },
+        {   FirmwareType_EFI64,   false, "VBoxEFIAArch64.fd",   "http://virtualbox.org/firmware/VBoxEFIAArch64.fd" },
+#endif
+    };
+
+    PVBOXFWDESC pFwDesc = NULL;
+    uint32_t cFwDesc = 0;
+    if (aPlatformArchitecture == PlatformArchitecture_x86)
+    {
+        pFwDesc = &s_FwDescX86[0];
+        cFwDesc = RT_ELEMENTS(s_FwDescX86);
+    }
+    else if (aPlatformArchitecture == PlatformArchitecture_ARM)
+    {
+        pFwDesc = &s_FwDescArm[0];
+        cFwDesc = RT_ELEMENTS(s_FwDescArm);
+    }
+    else
+        return E_INVALIDARG;
+
+    for (size_t i = 0; i < cFwDesc; i++)
+    {
+        if (aFirmwareType != pFwDesc->enmType)
+        {
+            pFwDesc++;
             continue;
+        }
 
         /* compiled-in firmware */
-        if (firmwareDesc[i].fBuiltIn)
-        {
-            aFile = firmwareDesc[i].pszFileName;
+        if (pFwDesc->fBuiltIn)
+        {
+            aFile = pFwDesc->pszFileName;
             *aResult = TRUE;
             break;
@@ -1928,5 +1965,5 @@
 
         Utf8Str    fullName;
-        Utf8StrFmt shortName("Firmware%c%s", RTPATH_DELIMITER, firmwareDesc[i].pszFileName);
+        Utf8StrFmt shortName("Firmware%c%s", RTPATH_DELIMITER, pFwDesc->pszFileName);
         int vrc = i_calculateFullPath(shortName, fullName);
         AssertRCReturn(vrc, VBOX_E_IPRT_ERROR);
@@ -1941,5 +1978,5 @@
         vrc = RTPathExecDir(szVBoxPath, RTPATH_MAX);
         AssertRCReturn(vrc, VBOX_E_IPRT_ERROR);
-        vrc = RTPathAppend(szVBoxPath, sizeof(szVBoxPath), firmwareDesc[i].pszFileName);
+        vrc = RTPathAppend(szVBoxPath, sizeof(szVBoxPath), pFwDesc->pszFileName);
         AssertRCReturn(vrc, VBOX_E_IPRT_ERROR);
         if (RTFileExists(szVBoxPath))
@@ -1951,5 +1988,5 @@
 
         /** @todo account for version in the URL */
-        aUrl = firmwareDesc[i].pszUrl;
+        aUrl = pFwDesc->pszUrl;
         *aResult = FALSE;
 
