From patchwork Thu Sep 18 22:50:03 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Roy Franz X-Patchwork-Id: 37617 Return-Path: X-Original-To: linaro@patches.linaro.org Delivered-To: linaro@patches.linaro.org Received: from mail-wg0-f69.google.com (mail-wg0-f69.google.com [74.125.82.69]) by ip-10-151-82-157.ec2.internal (Postfix) with ESMTPS id 889452054E for ; Thu, 18 Sep 2014 22:52:25 +0000 (UTC) Received: by mail-wg0-f69.google.com with SMTP id b13sf1034135wgh.0 for ; Thu, 18 Sep 2014 15:52:24 -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=bRl4XxoHdvMHvcAtW0K81TEhaFsfAU3CF0NNO9orCg0=; b=Gnl2RMLBQr1jiM6KLrdGdDFAPCElvjnrrogtCZqUN7brzjPUrgzWH4POm6BwSojfxv Mk0ABeprIULFI8/4mVnTYTLCEqnSjWD36unLj3f2Zg6SNeHTY/6FOP2BkscZ2HMWGXoZ DSNbbrC+5JtXUw6O326GrnJLMPTYpPUgPgUuoytO8jT7NbxF81RTvCGUEj7SdUTfikHy c/QhnKi926jkqFSeCRjum1GJeM++ZkKhf8dSyuY69URKWKtiArcD+Wg8cczl0f5ZFizh mS1ofW89Fli7RTSYawEo1ttsbKxUHFsdZjX0xwFOJWEs3Xq/Tr5eYk11PgHsMLECNilW 4YcA== X-Gm-Message-State: ALoCoQmCrpqpqhUBjteUsPVMVeANHyccBYBacSDcVHQkTp6vzR03TAX5LzMXnqVFE5KwM8rk/ybt X-Received: by 10.112.131.33 with SMTP id oj1mr1223242lbb.7.1411080744420; Thu, 18 Sep 2014 15:52:24 -0700 (PDT) X-BeenThere: patchwork-forward@linaro.org Received: by 10.152.5.169 with SMTP id t9ls129267lat.74.gmail; Thu, 18 Sep 2014 15:52:23 -0700 (PDT) X-Received: by 10.152.5.9 with SMTP id o9mr2581077lao.95.1411080743937; Thu, 18 Sep 2014 15:52:23 -0700 (PDT) Received: from mail-la0-f53.google.com (mail-la0-f53.google.com [209.85.215.53]) by mx.google.com with ESMTPS id m10si114383lam.90.2014.09.18.15.52.23 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Thu, 18 Sep 2014 15:52:23 -0700 (PDT) Received-SPF: pass (google.com: domain of patch+caf_=patchwork-forward=linaro.org@linaro.org designates 209.85.215.53 as permitted sender) client-ip=209.85.215.53; Received: by mail-la0-f53.google.com with SMTP id ge10so2057422lab.26 for ; Thu, 18 Sep 2014 15:52:23 -0700 (PDT) X-Received: by 10.112.171.202 with SMTP id aw10mr2663456lbc.52.1411080743863; Thu, 18 Sep 2014 15:52:23 -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.112.130.169 with SMTP id of9csp843144lbb; Thu, 18 Sep 2014 15:52:23 -0700 (PDT) X-Received: by 10.53.13.227 with SMTP id fb3mr1629184vdd.18.1411080742521; Thu, 18 Sep 2014 15:52:22 -0700 (PDT) Received: from lists.xen.org (lists.xen.org. [50.57.142.19]) by mx.google.com with ESMTPS id g6si65302vdg.48.2014.09.18.15.52.22 for (version=TLSv1 cipher=RC4-SHA bits=128/128); Thu, 18 Sep 2014 15:52:22 -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 1XUkX5-0006QI-Ri; Thu, 18 Sep 2014 22:50:35 +0000 Received: from mail6.bemta3.messagelabs.com ([195.245.230.39]) by lists.xen.org with esmtp (Exim 4.72) (envelope-from ) id 1XUkX4-0006OO-GE for xen-devel@lists.xen.org; Thu, 18 Sep 2014 22:50:34 +0000 Received: from [85.158.137.68:37871] by server-11.bemta-3.messagelabs.com id 18/AB-01568-9B16B145; Thu, 18 Sep 2014 22:50:33 +0000 X-Env-Sender: roy.franz@linaro.org X-Msg-Ref: server-16.tower-31.messagelabs.com!1411080630!15426692!1 X-Originating-IP: [209.85.220.43] 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 30100 invoked from network); 18 Sep 2014 22:50:32 -0000 Received: from mail-pa0-f43.google.com (HELO mail-pa0-f43.google.com) (209.85.220.43) by server-16.tower-31.messagelabs.com with RC4-SHA encrypted SMTP; 18 Sep 2014 22:50:32 -0000 Received: by mail-pa0-f43.google.com with SMTP id fa1so2498516pad.30 for ; Thu, 18 Sep 2014 15:50:30 -0700 (PDT) X-Received: by 10.66.65.230 with SMTP id a6mr10043901pat.18.1411080630546; Thu, 18 Sep 2014 15:50:30 -0700 (PDT) Received: from rfranz-t520.swisscom.com (70-35-38-154.static.wiline.com. [70.35.38.154]) by mx.google.com with ESMTPSA id ig4sm66332pbb.55.2014.09.18.15.50.29 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Thu, 18 Sep 2014 15:50:29 -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: Thu, 18 Sep 2014 15:50:03 -0700 Message-Id: <1411080607-32365-13-git-send-email-roy.franz@linaro.org> X-Mailer: git-send-email 2.1.0 In-Reply-To: <1411080607-32365-1-git-send-email-roy.franz@linaro.org> References: <1411080607-32365-1-git-send-email-roy.franz@linaro.org> Cc: Roy Franz , fu.wei@linaro.org Subject: [Xen-devel] [PATCH V5 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.215.53 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 Acked-by: Jan Beulich --- xen/common/efi/boot.c | 178 +++++++++++++++++++++-------------------- xen/include/asm-x86/efi-boot.h | 14 ++++ 2 files changed, 106 insertions(+), 86 deletions(-) diff --git a/xen/common/efi/boot.c b/xen/common/efi/boot.c index f4ef308..006a73c 100644 --- a/xen/common/efi/boot.c +++ b/xen/common/efi/boot.c @@ -684,7 +684,6 @@ 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}; bool_t base_video = 0; UINT32 mmap_desc_ver = 0; @@ -711,9 +710,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 && @@ -809,109 +805,119 @@ 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; + /* Get the file system interface. */ + dir_handle = get_parent_handle(loaded_image, &file_name.w); - while ( (tail = point_tail(file_name.w)) != NULL ) + /* Read and parse the config file. */ + if ( !cfg_file_name.w ) { - wstrcpy(tail, L".cfg"); - if ( read_file(dir_handle, &cfg, file_name.w, NULL) ) - break; - *tail = 0; + CHAR16 *tail; + + while ( (tail = point_tail(file_name.w)) != NULL ) + { + wstrcpy(tail, L".cfg"); + if ( read_file(dir_handle, &cfg, file_name.w, NULL) ) + break; + *tail = 0; + } + if ( !tail ) + blexit(L"No configuration file found."); + PrintStr(L"Using configuration file '"); + PrintStr(file_name.w); + PrintStr(L"'\r\n"); } - if ( !tail ) - blexit(L"No configuration file found."); - PrintStr(L"Using configuration file '"); - PrintStr(file_name.w); - PrintStr(L"'\r\n"); - } - else if ( !read_file(dir_handle, &cfg, cfg_file_name.w, NULL) ) - blexit(L"Configuration file not found."); - pre_parse(&cfg); + else if ( !read_file(dir_handle, &cfg, cfg_file_name.w, NULL) ) + 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, s2w(&name), NULL) ) + 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, s2w(&name), NULL) ) + { + 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_early(dir_handle, section.s); - option_str = split_string(name.s); - read_file(dir_handle, &kernel, s2w(&name), option_str); - efi_bs->FreePool(name.w); + if ( !name.s ) + blexit(L"No Dom0 kernel image specified."); - 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); + efi_arch_cfg_file_early(dir_handle, section.s); - name.s = get_value(&cfg, section.s, "ramdisk"); - if ( name.s ) - { option_str = split_string(name.s); - read_file(dir_handle, &ramdisk, s2w(&name), option_str); + read_file(dir_handle, &kernel, s2w(&name), option_str); efi_bs->FreePool(name.w); - } - name.s = get_value(&cfg, section.s, "xsm"); - if ( name.s ) - { - option_str = split_string(name.s); - read_file(dir_handle, &xsm, s2w(&name), option_str); - efi_bs->FreePool(name.w); - } + 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, "options"); - efi_arch_handle_cmdline(argc ? *argv : NULL, options, name.s); + name.s = get_value(&cfg, section.s, "ramdisk"); + if ( name.s ) + { + option_str = split_string(name.s); + read_file(dir_handle, &ramdisk, s2w(&name), option_str); + efi_bs->FreePool(name.w); + } - 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) ) + name.s = get_value(&cfg, section.s, "xsm"); + if ( name.s ) { - 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; + option_str = split_string(name.s); + read_file(dir_handle, &xsm, s2w(&name), option_str); + efi_bs->FreePool(name.w); } - } - efi_arch_cfg_file_late(dir_handle, section.s); - efi_bs->FreePages(cfg.addr, PFN_UP(cfg.size)); - cfg.addr = 0; + name.s = get_value(&cfg, section.s, "options"); + efi_arch_handle_cmdline(argc ? *argv : NULL, options, 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 = 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; + } + } - dir_handle->Close(dir_handle); + efi_arch_cfg_file_late(dir_handle, section.s); + + efi_bs->FreePages(cfg.addr, PFN_UP(cfg.size)); + cfg.addr = 0; + + dir_handle->Close(dir_handle); + + } if ( gop && !base_video ) { diff --git a/xen/include/asm-x86/efi-boot.h b/xen/include/asm-x86/efi-boot.h index 2a3a2b6..3ff593d 100644 --- a/xen/include/asm-x86/efi-boot.h +++ b/xen/include/asm-x86/efi-boot.h @@ -628,3 +628,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: + */