From patchwork Wed Sep 10 00:52:02 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Roy Franz X-Patchwork-Id: 37164 Return-Path: X-Original-To: linaro@patches.linaro.org Delivered-To: linaro@patches.linaro.org Received: from mail-qc0-f198.google.com (mail-qc0-f198.google.com [209.85.216.198]) by ip-10-151-82-157.ec2.internal (Postfix) with ESMTPS id C559B20566 for ; Wed, 10 Sep 2014 00:54:27 +0000 (UTC) Received: by mail-qc0-f198.google.com with SMTP id m20sf942802qcx.1 for ; Tue, 09 Sep 2014 17:54:27 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:delivered-to:from:to:date:message-id:in-reply-to :references:cc:subject:precedence:list-id:list-unsubscribe:list-post :list-help:list-subscribe:mime-version:sender:errors-to :x-original-sender:x-original-authentication-results:mailing-list :list-archive:content-type:content-transfer-encoding; bh=IsDNnKBm6hsUYj9FAGGihXx98rp+yW5H7DdPQ6BHAos=; b=i36PUH+I/UU9H/6ir6CyBwsasxTuBddY5palVKz9WxEJCIHyWKVmuWIAPgg6h1W2DR MXO/y/w6a2SRAf1TEEcRtNzXo2WTSPL5enqpW11AOFJjRJd7okvctFunDdob6/XPJ0uD 4RFUixz2INyILJnES3u44NZiX1hUW387o0wfsgEeV2/SyTvDmPMjpDJPJNssSFm+5T99 Bt3SfNgFtmQntVpwrncOZ8BssMdmLKU91xK93obAS3gaSjSn8kgqzK7KrD11Q46SjQKU VmDKu6A4k3jmDsUJK216Tj7r4Ep8Yqcru00F8O6yhmzfLQeXTb7EL4vAPzjo8Q1ScdNi uHkw== X-Gm-Message-State: ALoCoQm8iSlq/mLUZzOvv14HVtQUS/ZQ/2YdtXjMIkJ8tYdNkfRYYewgop6GtDtsHfvRGu7De7Yo X-Received: by 10.236.30.133 with SMTP id k5mr7637250yha.28.1410310467592; Tue, 09 Sep 2014 17:54:27 -0700 (PDT) X-BeenThere: patchwork-forward@linaro.org Received: by 10.140.22.17 with SMTP id 17ls2282238qgm.63.gmail; Tue, 09 Sep 2014 17:54:27 -0700 (PDT) X-Received: by 10.52.111.232 with SMTP id il8mr3860686vdb.22.1410310467521; Tue, 09 Sep 2014 17:54:27 -0700 (PDT) Received: from mail-vc0-f169.google.com (mail-vc0-f169.google.com [209.85.220.169]) by mx.google.com with ESMTPS id v8si5827880vcx.74.2014.09.09.17.54.27 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Tue, 09 Sep 2014 17:54:27 -0700 (PDT) Received-SPF: pass (google.com: domain of patch+caf_=patchwork-forward=linaro.org@linaro.org designates 209.85.220.169 as permitted sender) client-ip=209.85.220.169; Received: by mail-vc0-f169.google.com with SMTP id ik5so1360315vcb.0 for ; Tue, 09 Sep 2014 17:54:27 -0700 (PDT) X-Received: by 10.52.36.176 with SMTP id r16mr3227489vdj.70.1410310467419; Tue, 09 Sep 2014 17:54:27 -0700 (PDT) X-Forwarded-To: patchwork-forward@linaro.org X-Forwarded-For: patch@linaro.org patchwork-forward@linaro.org Delivered-To: patch@linaro.org Received: by 10.221.45.67 with SMTP id uj3csp363873vcb; Tue, 9 Sep 2014 17:54:27 -0700 (PDT) X-Received: by 10.140.29.35 with SMTP id a32mr54643539qga.39.1410310466364; Tue, 09 Sep 2014 17:54:26 -0700 (PDT) Received: from lists.xen.org (lists.xen.org. [50.57.142.19]) by mx.google.com with ESMTPS id n94si17231052qgn.55.2014.09.09.17.54.25 for (version=TLSv1 cipher=RC4-SHA bits=128/128); Tue, 09 Sep 2014 17:54:26 -0700 (PDT) Received-SPF: none (google.com: xen-devel-bounces@lists.xen.org does not designate permitted sender hosts) client-ip=50.57.142.19; Received: from localhost ([127.0.0.1] helo=lists.xen.org) by lists.xen.org with esmtp (Exim 4.72) (envelope-from ) id 1XRW9G-0006Jr-9x; Wed, 10 Sep 2014 00:52:38 +0000 Received: from mail6.bemta3.messagelabs.com ([195.245.230.39]) by lists.xen.org with esmtp (Exim 4.72) (envelope-from ) id 1XRW9E-0006Ht-Dd for xen-devel@lists.xen.org; Wed, 10 Sep 2014 00:52:36 +0000 Received: from [85.158.137.68:7020] by server-2.bemta-3.messagelabs.com id 7D/2E-09149-3D0AF045; Wed, 10 Sep 2014 00:52:35 +0000 X-Env-Sender: roy.franz@linaro.org X-Msg-Ref: server-5.tower-31.messagelabs.com!1410310353!13550928!1 X-Originating-IP: [209.85.213.169] X-SpamReason: No, hits=0.0 required=7.0 tests= X-StarScan-Received: X-StarScan-Version: 6.11.3; banners=-,-,- X-VirusChecked: Checked Received: (qmail 9489 invoked from network); 10 Sep 2014 00:52:34 -0000 Received: from mail-ig0-f169.google.com (HELO mail-ig0-f169.google.com) (209.85.213.169) by server-5.tower-31.messagelabs.com with RC4-SHA encrypted SMTP; 10 Sep 2014 00:52:34 -0000 Received: by mail-ig0-f169.google.com with SMTP id r2so516432igi.4 for ; Tue, 09 Sep 2014 17:52:33 -0700 (PDT) X-Received: by 10.42.227.10 with SMTP id iy10mr42167324icb.3.1410310352944; Tue, 09 Sep 2014 17:52:32 -0700 (PDT) Received: from rfranz-v430.caveonetworks.com (64.2.3.195.ptr.us.xo.net. [64.2.3.195]) by mx.google.com with ESMTPSA id dx10sm654825igb.4.2014.09.09.17.52.31 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 09 Sep 2014 17:52:32 -0700 (PDT) From: Roy Franz To: xen-devel@lists.xen.org, ian.campbell@citrix.com, stefano.stabellini@citrix.com, tim@xen.org, jbeulich@suse.com, keir@xen.org Date: Tue, 9 Sep 2014 17:52:02 -0700 Message-Id: <1410310325-4509-13-git-send-email-roy.franz@linaro.org> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1410310325-4509-1-git-send-email-roy.franz@linaro.org> References: <1410310325-4509-1-git-send-email-roy.franz@linaro.org> Cc: Roy Franz , fu.wei@linaro.org Subject: [Xen-devel] [PATCH V4 12/15] Add efi_arch_use_config_file() function to control use of config file X-BeenThere: xen-devel@lists.xen.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: List-Unsubscribe: , List-Post: , List-Help: , List-Subscribe: , MIME-Version: 1.0 Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org X-Removed-Original-Auth: Dkim didn't pass. X-Original-Sender: roy.franz@linaro.org X-Original-Authentication-Results: mx.google.com; spf=pass (google.com: domain of patch+caf_=patchwork-forward=linaro.org@linaro.org designates 209.85.220.169 as permitted sender) smtp.mail=patch+caf_=patchwork-forward=linaro.org@linaro.org Mailing-list: list patchwork-forward@linaro.org; contact patchwork-forward+owners@linaro.org X-Google-Group-Id: 836684582541 List-Archive: The x86 EFI build of Xen always uses a configuration file to load modules, but the ARM version can either use a config file to specify the modules, or be loaded by GRUB in which case GRUB loads the modules and adds them to the DTB that is passed to Xen. Add the efi_arch_use_config_file() to indicate if a configuration file is required. For x86, this will always be true. ARM will examine the DTB passed via EFI configuration table (if any), and if it contains module information will use that that not use the configuration file at all. Add Emacs footer to efi-boot.h and boot.c Signed-off-by: Roy Franz --- xen/common/efi/boot.c | 177 ++++++++++++++++++++++------------------- xen/include/asm-x86/efi-boot.h | 14 ++++ 2 files changed, 108 insertions(+), 83 deletions(-) diff --git a/xen/common/efi/boot.c b/xen/common/efi/boot.c index 1630dde..36bcfe4 100644 --- a/xen/common/efi/boot.c +++ b/xen/common/efi/boot.c @@ -574,8 +574,7 @@ efi_start(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable) EFI_SHIM_LOCK_PROTOCOL *shim_lock; EFI_GRAPHICS_OUTPUT_PROTOCOL *gop = NULL; EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *mode_info; - EFI_FILE_HANDLE dir_handle; - union string section = { NULL }, name, file_name, cfg_file_name = {NULL}; + union string section = { NULL }, name = { NULL }, file_name, cfg_file_name = {NULL}; bool_t base_video = 0; UINT32 mmap_desc_ver = 0; UINTN mmap_size, mmap_desc_size, mmap_key = 0; @@ -594,9 +593,6 @@ efi_start(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable) efi_arch_load_addr_check(loaded_image); - /* Get the file system interface. */ - dir_handle = get_parent_handle(loaded_image, &file_name.w); - argc = get_argv(0, NULL, loaded_image->LoadOptions, loaded_image->LoadOptionsSize, &options); if ( argc > 0 && @@ -688,104 +684,111 @@ efi_start(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable) if ( EFI_ERROR(status) ) gop = NULL; - /* Read and parse the config file. */ - if ( !cfg_file_name.w ) + if ( efi_arch_use_config_file(SystemTable) ) { - CHAR16 *tail; + EFI_FILE_HANDLE dir_handle; - while ( (tail = point_tail(file_name.w)) != NULL ) + /* Get the file system interface. */ + dir_handle = get_parent_handle(loaded_image, &file_name.w); + /* Read and parse the config file. */ + if ( !cfg_file_name.w ) { - wstrcpy(tail, L".cfg"); - if ( read_file(dir_handle, &cfg, w2s(&file_name)) ) - break; - *tail = 0; + CHAR16 *tail; + + while ( (tail = point_tail(file_name.w)) != NULL ) + { + wstrcpy(tail, L".cfg"); + if ( read_file(dir_handle, &cfg, w2s(&file_name)) ) + break; + *tail = 0; + } + if ( !tail ) + blexit(L"No configuration file found."); + PrintStr(L"Using configuration file '"); + s2w(&file_name); + PrintStr(file_name.w); + PrintStr(L"'\r\n"); + efi_bs->FreePool(file_name.w); } - if ( !tail ) - blexit(L"No configuration file found."); - PrintStr(L"Using configuration file '"); - s2w(&file_name); - PrintStr(file_name.w); - PrintStr(L"'\r\n"); - efi_bs->FreePool(file_name.w); - } - else if ( !read_file(dir_handle, &cfg, w2s(&cfg_file_name)) ) - blexit(L"Configuration file not found."); - pre_parse(&cfg); + else if ( !read_file(dir_handle, &cfg, w2s(&cfg_file_name)) ) + blexit(L"Configuration file not found."); + pre_parse(&cfg); - if ( section.w ) - w2s(§ion); - else - section.s = get_value(&cfg, "global", "default"); + if ( section.w ) + w2s(§ion); + else + section.s = get_value(&cfg, "global", "default"); - for ( ; ; ) - { - name.s = get_value(&cfg, section.s, "kernel"); - if ( name.s ) - break; - name.s = get_value(&cfg, "global", "chain"); - if ( !name.s ) - break; - efi_bs->FreePages(cfg.addr, PFN_UP(cfg.size)); - cfg.addr = 0; - if ( !read_file(dir_handle, &cfg, name.s) ) + for ( ; ; ) { - PrintStr(L"Chained configuration file '"); - PrintStr(name.w); + name.s = get_value(&cfg, section.s, "kernel"); + if ( name.s ) + break; + name.s = get_value(&cfg, "global", "chain"); + if ( !name.s ) + break; + efi_bs->FreePages(cfg.addr, PFN_UP(cfg.size)); + cfg.addr = 0; + if ( !read_file(dir_handle, &cfg, name.s) ) + { + PrintStr(L"Chained configuration file '"); + PrintStr(name.w); + efi_bs->FreePool(name.w); + blexit(L"'not found."); + } + pre_parse(&cfg); efi_bs->FreePool(name.w); - blexit(L"'not found."); } - pre_parse(&cfg); - efi_bs->FreePool(name.w); - } - if ( !name.s ) - blexit(L"No Dom0 kernel image specified."); - - efi_arch_cfg_file(dir_handle, section.s); + if ( !name.s ) + blexit(L"No Dom0 kernel image specified."); - read_file(dir_handle, &kernel, name.s); + efi_arch_cfg_file(dir_handle, section.s); - if ( !EFI_ERROR(efi_bs->LocateProtocol(&shim_lock_guid, NULL, - (void **)&shim_lock)) && - (status = shim_lock->Verify(kernel.ptr, kernel.size)) != EFI_SUCCESS ) + read_file(dir_handle, &kernel, name.s); + if ( !EFI_ERROR(efi_bs->LocateProtocol(&shim_lock_guid, NULL, + (void **)&shim_lock)) && + (status = shim_lock->Verify(kernel.ptr, kernel.size)) != EFI_SUCCESS ) PrintErrMesg(L"Dom0 kernel image could not be verified", status); - name.s = get_value(&cfg, section.s, "ramdisk"); - if ( name.s ) - { - read_file(dir_handle, &ramdisk, name.s); - } + name.s = get_value(&cfg, section.s, "ramdisk"); + if ( name.s ) + { + read_file(dir_handle, &ramdisk, name.s); + } - name.s = get_value(&cfg, section.s, "xsm"); - if ( name.s ) - { - read_file(dir_handle, &xsm, name.s); - } + name.s = get_value(&cfg, section.s, "xsm"); + if ( name.s ) + { + read_file(dir_handle, &xsm, name.s); + } - cols = rows = depth = 0; - if ( !base_video ) - { - name.cs = get_value(&cfg, section.s, "video"); - if ( !name.cs ) - name.cs = get_value(&cfg, "global", "video"); - if ( name.cs && !strncmp(name.cs, "gfx-", 4) ) + cols = rows = depth = 0; + if ( !base_video ) { - cols = simple_strtoul(name.cs + 4, &name.cs, 10); - if ( *name.cs == 'x' ) - rows = simple_strtoul(name.cs + 1, &name.cs, 10); - if ( *name.cs == 'x' ) - depth = simple_strtoul(name.cs + 1, &name.cs, 10); - if ( *name.cs ) - cols = rows = depth = 0; + name.cs = get_value(&cfg, section.s, "video"); + if ( !name.cs ) + name.cs = get_value(&cfg, "global", "video"); + if ( name.cs && !strncmp(name.cs, "gfx-", 4) ) + { + cols = simple_strtoul(name.cs + 4, &name.cs, 10); + if ( *name.cs == 'x' ) + rows = simple_strtoul(name.cs + 1, &name.cs, 10); + if ( *name.cs == 'x' ) + depth = simple_strtoul(name.cs + 1, &name.cs, 10); + if ( *name.cs ) + cols = rows = depth = 0; + } } - } + name.s = get_value(&cfg, section.s, "options"); - name.s = get_value(&cfg, section.s, "options"); - efi_arch_handle_cmdline(argc ? *argv : NULL, options, name.s); + efi_bs->FreePages(cfg.addr, PFN_UP(cfg.size)); + cfg.addr = 0; + + dir_handle->Close(dir_handle); - efi_bs->FreePages(cfg.addr, PFN_UP(cfg.size)); - cfg.addr = 0; + efi_arch_handle_cmdline(argc ? *argv : NULL, options, name.s); + } - dir_handle->Close(dir_handle); efi_arch_edd(); /* XXX Collect EDID info. */ @@ -818,3 +821,11 @@ efi_start(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable) for( ; ; ); /* not reached */ } +/* + * Local variables: + * mode: C + * c-file-style: "BSD" + * c-basic-offset: 4 + * indent-tabs-mode: nil + * End: + */ diff --git a/xen/include/asm-x86/efi-boot.h b/xen/include/asm-x86/efi-boot.h index e7e9b15..65483d3 100644 --- a/xen/include/asm-x86/efi-boot.h +++ b/xen/include/asm-x86/efi-boot.h @@ -1063,3 +1063,17 @@ static void __init efi_arch_load_addr_check(EFI_LOADED_IMAGE *loaded_image) blexit(L"Xen must be loaded at a 2Mb boundary."); trampoline_xen_phys_start = xen_phys_start; } + +static __init bool_t efi_arch_use_config_file(EFI_SYSTEM_TABLE *SystemTable) +{ + return 1; /* x86 always uses a config file */ +} + +/* + * Local variables: + * mode: C + * c-file-style: "BSD" + * c-basic-offset: 4 + * indent-tabs-mode: nil + * End: + */