From patchwork Mon Sep 8 03:53:58 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Roy Franz X-Patchwork-Id: 36935 Return-Path: X-Original-To: linaro@patches.linaro.org Delivered-To: linaro@patches.linaro.org Received: from mail-ob0-f200.google.com (mail-ob0-f200.google.com [209.85.214.200]) by ip-10-151-82-157.ec2.internal (Postfix) with ESMTPS id 05D8A20491 for ; Mon, 8 Sep 2014 03:56:18 +0000 (UTC) Received: by mail-ob0-f200.google.com with SMTP id va2sf73896119obc.11 for ; Sun, 07 Sep 2014 20:56:18 -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=4h9RrBOCaONdveWv5b2ACW5d7r8nVCVCxykXAF3Y/Os=; b=d+1rLTXzEB3tAdvUI1d/Tc6Sx7CvX+YsWm+uAi0xqvZJtonRrWulDScyIwWvqPm7uR bDjXqsH1pyv9V10VOogTgPcC94KF99U9kLqh0YfAK5tq1QQ5/lEoNZe1j71K0i3++SKW biffbLCMpKuYCPRIpalMtO5Uyq6WQPVf5oEHWD0QNzl6P/EZ7y0yVoTWudbodbKUZL49 1aKj0iQ5Gahem5g7qzg5kkj41JExx3uhjY+A6CMbASGrSg49NKYzlAe4iMBAb/eLbnBU 1mW3vaTgFQLz5W6B9igh/hkEcT9pxN0CayhrIM+D44mZnGOq1/MMHRxKFkVBi1oH6hjB SX3g== X-Gm-Message-State: ALoCoQmwOG82oKhKnCBTaErOv+4s4wHQ6GIoLvOSVW+1sAVN64ibe4WmlkAhs4iAXKHmCTtzxPJL X-Received: by 10.182.232.164 with SMTP id tp4mr17044754obc.29.1410148578589; Sun, 07 Sep 2014 20:56:18 -0700 (PDT) X-BeenThere: patchwork-forward@linaro.org Received: by 10.140.33.246 with SMTP id j109ls1604121qgj.83.gmail; Sun, 07 Sep 2014 20:56:18 -0700 (PDT) X-Received: by 10.220.113.148 with SMTP id a20mr8382204vcq.30.1410148578499; Sun, 07 Sep 2014 20:56:18 -0700 (PDT) Received: from mail-vc0-f173.google.com (mail-vc0-f173.google.com [209.85.220.173]) by mx.google.com with ESMTPS id ut5si3514589vcb.26.2014.09.07.20.56.18 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Sun, 07 Sep 2014 20:56:18 -0700 (PDT) Received-SPF: pass (google.com: domain of patch+caf_=patchwork-forward=linaro.org@linaro.org designates 209.85.220.173 as permitted sender) client-ip=209.85.220.173; Received: by mail-vc0-f173.google.com with SMTP id le20so847959vcb.18 for ; Sun, 07 Sep 2014 20:56:18 -0700 (PDT) X-Received: by 10.52.83.227 with SMTP id t3mr18545595vdy.20.1410148578364; Sun, 07 Sep 2014 20:56:18 -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 uj3csp76458vcb; Sun, 7 Sep 2014 20:56:17 -0700 (PDT) X-Received: by 10.224.4.133 with SMTP id 5mr38558386qar.25.1410148577825; Sun, 07 Sep 2014 20:56:17 -0700 (PDT) Received: from lists.xen.org (lists.xen.org. [50.57.142.19]) by mx.google.com with ESMTPS id d4si9664004qaa.115.2014.09.07.20.56.17 for (version=TLSv1 cipher=RC4-SHA bits=128/128); Sun, 07 Sep 2014 20:56:17 -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 1XQq2H-00073j-0l; Mon, 08 Sep 2014 03:54:37 +0000 Received: from mail6.bemta4.messagelabs.com ([85.158.143.247]) by lists.xen.org with esmtp (Exim 4.72) (envelope-from ) id 1XQq2F-00071R-2U for xen-devel@lists.xen.org; Mon, 08 Sep 2014 03:54:35 +0000 Received: from [85.158.143.35:64211] by server-1.bemta-4.messagelabs.com id 54/84-05872-A782D045; Mon, 08 Sep 2014 03:54:34 +0000 X-Env-Sender: roy.franz@linaro.org X-Msg-Ref: server-8.tower-21.messagelabs.com!1410148472!12234858!1 X-Originating-IP: [209.85.220.42] 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 24612 invoked from network); 8 Sep 2014 03:54:33 -0000 Received: from mail-pa0-f42.google.com (HELO mail-pa0-f42.google.com) (209.85.220.42) by server-8.tower-21.messagelabs.com with RC4-SHA encrypted SMTP; 8 Sep 2014 03:54:33 -0000 Received: by mail-pa0-f42.google.com with SMTP id lj1so930338pab.1 for ; Sun, 07 Sep 2014 20:54:31 -0700 (PDT) X-Received: by 10.68.215.67 with SMTP id og3mr16278547pbc.30.1410148471483; Sun, 07 Sep 2014 20:54:31 -0700 (PDT) Received: from rfranz-i7.local (c-24-10-97-91.hsd1.ca.comcast.net. [24.10.97.91]) by mx.google.com with ESMTPSA id qy1sm7524053pbc.27.2014.09.07.20.54.30 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 07 Sep 2014 20:54:30 -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: Sun, 7 Sep 2014 20:53:58 -0700 Message-Id: <1410148441-18684-13-git-send-email-roy.franz@linaro.org> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1410148441-18684-1-git-send-email-roy.franz@linaro.org> References: <1410148441-18684-1-git-send-email-roy.franz@linaro.org> Cc: Roy Franz , fu.wei@linaro.org, linaro-uefi@lists.linaro.org Subject: [Xen-devel] [PATCH V3 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.173 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. Signed-off-by: Roy Franz --- xen/common/efi/boot.c | 169 +++++++++++++++++++++-------------------- xen/include/asm-x86/efi-boot.h | 4 + 2 files changed, 90 insertions(+), 83 deletions(-) diff --git a/xen/common/efi/boot.c b/xen/common/efi/boot.c index 1630dde..226189d 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; - efi_bs->FreePages(cfg.addr, PFN_UP(cfg.size)); - cfg.addr = 0; + dir_handle->Close(dir_handle); + + efi_arch_handle_cmdline(argc ? *argv : NULL, options, name.s); + } - dir_handle->Close(dir_handle); efi_arch_edd(); /* XXX Collect EDID info. */ diff --git a/xen/include/asm-x86/efi-boot.h b/xen/include/asm-x86/efi-boot.h index d7c6abc..1bd3545 100644 --- a/xen/include/asm-x86/efi-boot.h +++ b/xen/include/asm-x86/efi-boot.h @@ -1058,3 +1058,7 @@ 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 */ +}