From patchwork Thu Jun 26 16:45:49 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ian Campbell X-Patchwork-Id: 32581 Return-Path: X-Original-To: linaro@patches.linaro.org Delivered-To: linaro@patches.linaro.org Received: from mail-pa0-f72.google.com (mail-pa0-f72.google.com [209.85.220.72]) by ip-10-151-82-157.ec2.internal (Postfix) with ESMTPS id 7A8D6201EF for ; Thu, 26 Jun 2014 16:47:55 +0000 (UTC) Received: by mail-pa0-f72.google.com with SMTP id rd3sf14741932pab.11 for ; Thu, 26 Jun 2014 09:47:54 -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:mime-version:cc:subject:precedence:list-id :list-unsubscribe:list-post:list-help:list-subscribe:sender :errors-to:x-original-sender:x-original-authentication-results :mailing-list:list-archive:content-type:content-transfer-encoding; bh=FhyF9oJzAhlcPsx78ZdsO4c3PDgsVyH9XISCrow61BQ=; b=PJjj+yu7yuYvdUoWryXI+pjWbbcehg9jBuJUEcVcvFhEOOSlcVlT37kX2iXKcnCpRm 138AhWY9EQGTYj6gtqJcuYS7OgJJ786W+C8v8PLsM3q4Z7+g0i8B3SsyueBkzp6unCXA tv9zNkWuOdiKBQd+o6fxKlTEWEWK9rROW5UKJgv58qkZBJ7QDNox1ICCMV9r6lz43KSk utZW9FbrF+Uj9XWpK0e95y9WgNCIB+CriTeACZ7OmLCajsL43bEidnMYXfbDHqkSP6+1 8W2TBQJkhao1lxSEr1MEeV5+FBFntJb6CtnzaysEJ0JriEj1mfYL7Dz/rRb91+d786Gd E/LQ== X-Gm-Message-State: ALoCoQmuK8dc53CAiHO4MjLIG5FfDOuocIS4DsYy7zRJhM6iUFtbzbizD1W1kwq/Y3NIGPpJ/Z+S X-Received: by 10.66.236.136 with SMTP id uu8mr8180912pac.13.1403801274791; Thu, 26 Jun 2014 09:47:54 -0700 (PDT) X-BeenThere: patchwork-forward@linaro.org Received: by 10.140.26.204 with SMTP id 70ls271972qgv.21.gmail; Thu, 26 Jun 2014 09:47:54 -0700 (PDT) X-Received: by 10.220.81.194 with SMTP id y2mr14728920vck.29.1403801274556; Thu, 26 Jun 2014 09:47:54 -0700 (PDT) Received: from mail-ve0-f170.google.com (mail-ve0-f170.google.com [209.85.128.170]) by mx.google.com with ESMTPS id n9si4903166vex.51.2014.06.26.09.47.54 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Thu, 26 Jun 2014 09:47:54 -0700 (PDT) Received-SPF: pass (google.com: domain of patch+caf_=patchwork-forward=linaro.org@linaro.org designates 209.85.128.170 as permitted sender) client-ip=209.85.128.170; Received: by mail-ve0-f170.google.com with SMTP id i13so3992758veh.15 for ; Thu, 26 Jun 2014 09:47:54 -0700 (PDT) X-Received: by 10.52.248.146 with SMTP id ym18mr12421971vdc.8.1403801274447; Thu, 26 Jun 2014 09:47:54 -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.37.5 with SMTP id tc5csp44121vcb; Thu, 26 Jun 2014 09:47:54 -0700 (PDT) X-Received: by 10.58.207.33 with SMTP id lt1mr1975940vec.63.1403801273998; Thu, 26 Jun 2014 09:47:53 -0700 (PDT) Received: from lists.xen.org (lists.xen.org. [50.57.142.19]) by mx.google.com with ESMTPS id hr4si4892021veb.106.2014.06.26.09.47.53 for (version=TLSv1 cipher=RC4-SHA bits=128/128); Thu, 26 Jun 2014 09:47:53 -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 1X0CoI-0004Of-64; Thu, 26 Jun 2014 16:46:06 +0000 Received: from mail6.bemta14.messagelabs.com ([193.109.254.103]) by lists.xen.org with esmtp (Exim 4.72) (envelope-from ) id 1X0CoB-0004JM-Rh for xen-devel@lists.xen.org; Thu, 26 Jun 2014 16:46:00 +0000 Received: from [193.109.254.147:29180] by server-9.bemta-14.messagelabs.com id BD/33-14237-64E4CA35; Thu, 26 Jun 2014 16:45:58 +0000 X-Env-Sender: Ian.Campbell@citrix.com X-Msg-Ref: server-7.tower-27.messagelabs.com!1403801155!13901856!1 X-Originating-IP: [66.165.176.89] X-SpamReason: No, hits=0.0 required=7.0 tests=sa_preprocessor: VHJ1c3RlZCBJUDogNjYuMTY1LjE3Ni44OSA9PiAyMDMwMDc=\n X-StarScan-Received: X-StarScan-Version: 6.11.3; banners=-,-,- X-VirusChecked: Checked Received: (qmail 16195 invoked from network); 26 Jun 2014 16:45:57 -0000 Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89) by server-7.tower-27.messagelabs.com with RC4-SHA encrypted SMTP; 26 Jun 2014 16:45:57 -0000 X-IronPort-AV: E=Sophos;i="5.01,554,1400025600"; d="scan'208";a="147655583" Received: from accessns.citrite.net (HELO FTLPEX01CL01.citrite.net) ([10.9.154.239]) by FTLPIPO01.CITRIX.COM with ESMTP; 26 Jun 2014 16:45:52 +0000 Received: from ukmail1.uk.xensource.com (10.80.16.128) by smtprelay.citrix.com (10.13.107.78) with Microsoft SMTP Server id 14.3.181.6; Thu, 26 Jun 2014 12:45:52 -0400 Received: from marilith-n13-p0.uk.xensource.com ([10.80.229.115] helo=marilith-n13.uk.xensource.com.) by ukmail1.uk.xensource.com with esmtp (Exim 4.69) (envelope-from ) id 1X0Co3-0002AU-Uy; Thu, 26 Jun 2014 17:45:52 +0100 From: Ian Campbell To: Date: Thu, 26 Jun 2014 17:45:49 +0100 Message-ID: <1403801151-11007-7-git-send-email-ian.campbell@citrix.com> X-Mailer: git-send-email 1.7.10.4 In-Reply-To: <1403801130.31742.1.camel@kazak.uk.xensource.com> References: <1403801130.31742.1.camel@kazak.uk.xensource.com> MIME-Version: 1.0 X-DLP: MIA1 Cc: julien.grall@linaro.org, tim@xen.org, Ian Campbell , stefano.stabellini@eu.citrix.com Subject: [Xen-devel] [PATCH v2 7/9] xen: arm: store per-boot module type instead of relying on index 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: , 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: ian.campbell@citrix.com X-Original-Authentication-Results: mx.google.com; spf=pass (google.com: domain of patch+caf_=patchwork-forward=linaro.org@linaro.org designates 209.85.128.170 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: This is more natural and better matches how multiboot is actually supposed to work. Signed-off-by: Ian Campbell --- v2: Fix XSM s/bootmodulekind/bootmodule_kind/ Print which module we aren't adding Only (and explictly) preserve Xen in discard_initial_modules --- xen/arch/arm/bootfdt.c | 49 +++++++++++++++---------------------------- xen/arch/arm/domain_build.c | 20 +++++++++++------- xen/arch/arm/kernel.c | 15 ++++++------- xen/arch/arm/setup.c | 47 ++++++++++++++++++++++++++++++++++++----- xen/include/asm-arm/setup.h | 27 ++++++++++++++++-------- xen/xsm/xsm_policy.c | 19 ++++++++++++++--- 6 files changed, 114 insertions(+), 63 deletions(-) diff --git a/xen/arch/arm/bootfdt.c b/xen/arch/arm/bootfdt.c index e48a64b..b42a789 100644 --- a/xen/arch/arm/bootfdt.c +++ b/xen/arch/arm/bootfdt.c @@ -165,23 +165,22 @@ static void __init process_multiboot_node(const void *fdt, int node, { const struct fdt_property *prop; const __be32 *cell; - int nr; - struct bootmodule *mod; + bootmodule_kind kind; + paddr_t start, size; + const char *cmdline; int len; if ( fdt_node_check_compatible(fdt, node, "xen,linux-zimage") == 0 || fdt_node_check_compatible(fdt, node, "multiboot,kernel") == 0 ) - nr = MOD_KERNEL; + kind = BOOTMOD_KERNEL; else if ( fdt_node_check_compatible(fdt, node, "xen,linux-initrd") == 0 || fdt_node_check_compatible(fdt, node, "multiboot,ramdisk") == 0 ) - nr = MOD_INITRD; + kind = BOOTMOD_RAMDISK; else if ( fdt_node_check_compatible(fdt, node, "xen,xsm-policy") == 0 ) - nr = MOD_XSM; + kind = BOOTMOD_XSM; else panic("%s not a known xen multiboot type\n", name); - mod = &bootinfo.modules.module[nr]; - prop = fdt_get_property(fdt, node, "reg", &len); if ( !prop ) panic("node %s missing `reg' property\n", name); @@ -191,22 +190,19 @@ static void __init process_multiboot_node(const void *fdt, int node, name); cell = (const __be32 *)prop->data; - device_tree_get_reg(&cell, address_cells, size_cells, - &mod->start, &mod->size); + device_tree_get_reg(&cell, address_cells, size_cells, &start, &size); prop = fdt_get_property(fdt, node, "bootargs", &len); if ( prop ) { - if ( len > sizeof(mod->cmdline) ) - panic("module %d command line too long\n", nr); - - safe_strcpy(mod->cmdline, prop->data); + if ( len > BOOTMOD_MAX_CMDLINE ) + panic("module %s command line too long\n", name); + cmdline = prop->data; } else - mod->cmdline[0] = 0; + cmdline = NULL; - if ( nr > bootinfo.modules.nr_mods ) - bootinfo.modules.nr_mods = nr; + add_boot_module(kind, start, size, cmdline); } static void __init process_chosen_node(const void *fdt, int node, @@ -214,7 +210,6 @@ static void __init process_chosen_node(const void *fdt, int node, u32 address_cells, u32 size_cells) { const struct fdt_property *prop; - struct bootmodule *mod = &bootinfo.modules.module[MOD_INITRD]; paddr_t start, end; int len; @@ -253,10 +248,7 @@ static void __init process_chosen_node(const void *fdt, int node, printk("Initrd %"PRIpaddr"-%"PRIpaddr"\n", start, end); - mod->start = start; - mod->size = end - start; - - bootinfo.modules.nr_mods = max(MOD_INITRD, bootinfo.modules.nr_mods); + add_boot_module(BOOTMOD_RAMDISK, start, end-start, NULL); } static int __init early_scan_node(const void *fdt, @@ -286,7 +278,7 @@ static void __init early_print_info(void) mi->bank[i].start, mi->bank[i].start + mi->bank[i].size - 1); printk("\n"); - for ( i = 1 ; i < mods->nr_mods + 1; i++ ) + for ( i = 1 ; i < mods->nr_mods; i++ ) printk("MODULE[%d]: %"PRIpaddr" - %"PRIpaddr" %s\n", i, mods->module[i].start, @@ -314,18 +306,13 @@ static void __init early_print_info(void) */ size_t __init boot_fdt_info(const void *fdt, paddr_t paddr) { - struct bootmodule *mod; int ret; ret = fdt_check_header(fdt); if ( ret < 0 ) panic("No valid device tree\n"); - mod = &bootinfo.modules.module[MOD_FDT]; - mod->start = paddr; - mod->size = fdt_totalsize(fdt); - - bootinfo.modules.nr_mods = max(MOD_FDT, bootinfo.modules.nr_mods); + add_boot_module(BOOTMOD_FDT, paddr, fdt_totalsize(fdt), NULL); device_tree_for_each_node((void *)fdt, early_scan_node, NULL); early_print_info(); @@ -345,10 +332,8 @@ const char *boot_fdt_cmdline(const void *fdt) prop = fdt_get_property(fdt, node, "xen,xen-bootargs", NULL); if ( prop == NULL ) { - struct bootmodule *dom0_mod = NULL; - - if ( bootinfo.modules.nr_mods >= MOD_KERNEL ) - dom0_mod = &bootinfo.modules.module[MOD_KERNEL]; + struct bootmodule *dom0_mod = + boot_module_find_by_kind(BOOTMOD_KERNEL); if (fdt_get_property(fdt, node, "xen,dom0-bootargs", NULL) || ( dom0_mod && dom0_mod->cmdline[0] ) ) diff --git a/xen/arch/arm/domain_build.c b/xen/arch/arm/domain_build.c index 5eef8a3..c1a54e5 100644 --- a/xen/arch/arm/domain_build.c +++ b/xen/arch/arm/domain_build.c @@ -161,9 +161,10 @@ static int write_properties(struct domain *d, struct kernel_info *kinfo, int res = 0; int had_dom0_bootargs = 0; - if ( bootinfo.modules.nr_mods >= MOD_KERNEL && - bootinfo.modules.module[MOD_KERNEL].cmdline[0] ) - bootargs = &bootinfo.modules.module[MOD_KERNEL].cmdline[0]; + struct bootmodule *mod = boot_module_find_by_kind(BOOTMOD_KERNEL); + + if ( mod && mod->cmdline[0] ) + bootargs = &mod->cmdline[0]; dt_for_each_property_node (node, prop) { @@ -210,6 +211,8 @@ static int write_properties(struct domain *d, struct kernel_info *kinfo, if ( dt_node_path_is_equal(node, "/chosen") ) { + struct bootmodule *mod = boot_module_find_by_kind(BOOTMOD_RAMDISK); + if ( bootargs ) { res = fdt_property(kinfo->fdt, "bootargs", bootargs, @@ -222,7 +225,7 @@ static int write_properties(struct domain *d, struct kernel_info *kinfo, * If the bootloader provides an initrd, we must create a placeholder * for the initrd properties. The values will be replaced later. */ - if ( bootinfo.modules.module[MOD_INITRD].size ) + if ( mod && mod->size ) { u64 a = 0; res = fdt_property(kinfo->fdt, "linux,initrd-start", &a, sizeof(a)); @@ -976,18 +979,21 @@ static void dtb_load(struct kernel_info *kinfo) static void initrd_load(struct kernel_info *kinfo) { + struct bootmodule *mod = boot_module_find_by_kind(BOOTMOD_RAMDISK); paddr_t load_addr = kinfo->initrd_paddr; - paddr_t paddr = bootinfo.modules.module[MOD_INITRD].start; - paddr_t len = bootinfo.modules.module[MOD_INITRD].size; + paddr_t paddr, len; unsigned long offs; int node; int res; __be32 val[2]; __be32 *cellp; - if ( !len ) + if ( !mod || !mod->size ) return; + paddr = mod->start; + len = mod->size; + printk("Loading dom0 initrd from %"PRIpaddr" to 0x%"PRIpaddr"-0x%"PRIpaddr"\n", paddr, load_addr, load_addr + len); diff --git a/xen/arch/arm/kernel.c b/xen/arch/arm/kernel.c index ce5b95a..230ff8f 100644 --- a/xen/arch/arm/kernel.c +++ b/xen/arch/arm/kernel.c @@ -68,8 +68,8 @@ static void place_modules(struct kernel_info *info, paddr_t kernbase, paddr_t kernend) { /* Align DTB and initrd size to 2Mb. Linux only requires 4 byte alignment */ - const paddr_t initrd_len = - ROUNDUP(bootinfo.modules.module[MOD_INITRD].size, MB(2)); + const struct bootmodule *mod = boot_module_find_by_kind(BOOTMOD_RAMDISK); + const paddr_t initrd_len = ROUNDUP(mod ? mod->size : 0, MB(2)); const paddr_t dtb_len = ROUNDUP(fdt_totalsize(info->fdt), MB(2)); const paddr_t modsize = initrd_len + dtb_len; @@ -372,20 +372,21 @@ err: int kernel_probe(struct kernel_info *info) { + struct bootmodule *mod = boot_module_find_by_kind(BOOTMOD_KERNEL); int rc; paddr_t start, size; - start = bootinfo.modules.module[MOD_KERNEL].start; - size = bootinfo.modules.module[MOD_KERNEL].size; - - if ( !size ) + if ( !mod || !mod->size ) { printk(XENLOG_ERR "Missing kernel boot module?\n"); return -ENOENT; } - printk("Loading kernel from boot module %d\n", MOD_KERNEL); + start = mod->start; + size = mod->size; + + printk("Loading kernel from boot module @ %"PRIpaddr"\n", start); #ifdef CONFIG_ARM_64 rc = kernel_zimage64_probe(info, start, size); diff --git a/xen/arch/arm/setup.c b/xen/arch/arm/setup.c index f1ae408..96ed13b 100644 --- a/xen/arch/arm/setup.c +++ b/xen/arch/arm/setup.c @@ -183,17 +183,56 @@ static void dt_unreserved_regions(paddr_t s, paddr_t e, cb(s, e); } +void add_boot_module(bootmodule_kind kind, paddr_t start, paddr_t size, + const char *cmdline) +{ + struct bootmodules *mods = &bootinfo.modules; + struct bootmodule *mod; + + if ( mods->nr_mods == MAX_MODULES ) + { + printk("Ignoring %s boot module at %"PRIpaddr"-%"PRIpaddr" (too many)\n", + boot_module_kind_as_string(kind), start, start + size); + return; + } + + mod = &mods->module[mods->nr_mods++]; + mod->kind = kind; + mod->start = start; + mod->size = size; + if ( cmdline ) + safe_strcpy(mod->cmdline, cmdline); + else + mod->cmdline[0] = 0; + +} + +struct bootmodule * __init boot_module_find_by_kind(bootmodule_kind kind) +{ + struct bootmodules *mods = &bootinfo.modules; + struct bootmodule *mod; + int i; + for (i = 0 ; i < mods->nr_mods ; i++ ) + { + mod = &mods->module[i]; + if ( mod->kind == kind ) + return mod; + } + return NULL; +} + void __init discard_initial_modules(void) { struct bootmodules *mi = &bootinfo.modules; int i; - for ( i = MOD_DISCARD_FIRST; i <= mi->nr_mods; i++ ) + for ( i = 0; i <= mi->nr_mods; i++ ) { paddr_t s = mi->module[i].start; paddr_t e = s + PAGE_ALIGN(mi->module[i].size); - dt_unreserved_regions(s, e, init_domheap_pages, 0); + if ( mi->module[i].kind != BOOTMOD_XEN ) + dt_unreserved_regions(s, e, init_domheap_pages, 0); } mi->nr_mods = 0; @@ -360,9 +399,7 @@ static paddr_t __init get_xen_paddr(void) printk("Placing Xen at 0x%"PRIpaddr"-0x%"PRIpaddr"\n", paddr, paddr + min_size); - bootinfo.modules.module[MOD_XEN].start = paddr; - bootinfo.modules.module[MOD_XEN].size = min_size; - + add_boot_module(BOOTMOD_XEN, paddr, min_size, NULL); return paddr; } diff --git a/xen/include/asm-arm/setup.h b/xen/include/asm-arm/setup.h index 85aa866..fe4997b 100644 --- a/xen/include/asm-arm/setup.h +++ b/xen/include/asm-arm/setup.h @@ -5,14 +5,17 @@ #define NR_MEM_BANKS 8 -#define MOD_XEN 0 -#define MOD_FDT 1 -#define MOD_KERNEL 2 -#define MOD_INITRD 3 -#define MOD_XSM 4 -#define NR_MODULES 5 +#define MAX_MODULES 5 /* Current maximum useful modules */ + +typedef enum { + BOOTMOD_XEN, + BOOTMOD_FDT, + BOOTMOD_KERNEL, + BOOTMOD_RAMDISK, + BOOTMOD_XSM, + BOOTMOD_UNKNOWN +} bootmodule_kind; -#define MOD_DISCARD_FIRST MOD_FDT struct membank { paddr_t start; @@ -24,16 +27,18 @@ struct meminfo { struct membank bank[NR_MEM_BANKS]; }; +#define BOOTMOD_MAX_CMDLINE 1024 struct bootmodule { + bootmodule_kind kind; paddr_t start; paddr_t size; - char cmdline[1024]; + char cmdline[BOOTMOD_MAX_CMDLINE]; }; struct bootmodules { int nr_mods; /* Module 0 is Xen itself, followed by the provided modules-proper */ - struct bootmodule module[NR_MODULES]; + struct bootmodule module[MAX_MODULES]; }; struct bootinfo { @@ -56,6 +61,10 @@ void discard_initial_modules(void); size_t __init boot_fdt_info(const void *fdt, paddr_t paddr); const char __init *boot_fdt_cmdline(const void *fdt); +void add_boot_module(bootmodule_kind kind, paddr_t start, paddr_t size, + const char *cmdline); +struct bootmodule *boot_module_find_by_kind(bootmodule_kind kind); + #endif /* * Local variables: diff --git a/xen/xsm/xsm_policy.c b/xen/xsm/xsm_policy.c index a0dee09..6e0bb78 100644 --- a/xen/xsm/xsm_policy.c +++ b/xen/xsm/xsm_policy.c @@ -77,13 +77,16 @@ int __init xsm_multiboot_policy_init(unsigned long *module_map, #ifdef HAS_DEVICE_TREE int __init xsm_dt_policy_init(void) { - paddr_t paddr = early_info.modules.module[MOD_XSM].start; - paddr_t len = early_info.modules.module[MOD_XSM].size; + struct bootmodule *mod = boot_module_find_by_kind(BOOTMOD_XSM); + paddr_t paddr, len; xsm_magic_t magic; - if ( !len ) + if ( !mod || !mod->size ) return 0; + paddr = mod->start; + len = mod->size; + copy_from_paddr(&magic, paddr, sizeof(magic)); if ( magic != XSM_MAGIC ) @@ -106,3 +109,13 @@ int __init xsm_dt_policy_init(void) return 0; } #endif + +/* + * Local variables: + * mode: C + * c-file-style: "BSD" + * c-basic-offset: 4 + * tab-width: 4 + * indent-tabs-mode: nil + * End: + */