From patchwork Fri Mar 21 15:22:13 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Julien Grall X-Patchwork-Id: 26852 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 F06F7203AB for ; Fri, 21 Mar 2014 15:24:06 +0000 (UTC) Received: by mail-ob0-f200.google.com with SMTP id gq1sf9378740obb.7 for ; Fri, 21 Mar 2014 08:24:06 -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=kgFVpE55HjTcrpz4qIQbBA5Rx3LwnyMTcLb+WjzOU3w=; b=j/mcKAlK7ZrQjCc49Ge5iXKjgm2U4QbgWD2PBKJJHlZC86lJDc3eFrrSpcjK214tT4 zn8OlwLEvSmidcRPjs7Fibo3hP+jYwhxP2kXEGYFfbcrpyM8mhZhetm9A2X51xPR9/0k ogeMBhQl3HL1VkwGqYCG0FcH4z1GadJQFuXX9T/q50+5nU0WHsFpPn5PluadiMVjGR2b E0cs/HEmEIWR5YK+qhFaP770/Lgk/zrAHXEzZYW1IY6BxleUg63tL5iDKZJJpLnOaRjV VYnYmEMek0ouvMwn3kvLNqLJ1vlcPP1VLMXwtdluSebLRv9czfOCsVuD21y8OYPMykRg lqZg== X-Gm-Message-State: ALoCoQmVr7haOeqEPCCqLZ2sf0Wl6oAtX3UV0m412EZp74GF4MWZ77xdIgxyY2Hwvx2gNd2YRk7c X-Received: by 10.182.43.137 with SMTP id w9mr125611obl.29.1395415446577; Fri, 21 Mar 2014 08:24:06 -0700 (PDT) X-BeenThere: patchwork-forward@linaro.org Received: by 10.140.24.110 with SMTP id 101ls688687qgq.88.gmail; Fri, 21 Mar 2014 08:24:06 -0700 (PDT) X-Received: by 10.58.221.102 with SMTP id qd6mr1103654vec.47.1395415446387; Fri, 21 Mar 2014 08:24:06 -0700 (PDT) Received: from mail-vc0-f172.google.com (mail-vc0-f172.google.com [209.85.220.172]) by mx.google.com with ESMTPS id b2si1177224vcz.200.2014.03.21.08.24.06 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Fri, 21 Mar 2014 08:24:06 -0700 (PDT) Received-SPF: neutral (google.com: 209.85.220.172 is neither permitted nor denied by best guess record for domain of patch+caf_=patchwork-forward=linaro.org@linaro.org) client-ip=209.85.220.172; Received: by mail-vc0-f172.google.com with SMTP id la4so2767478vcb.17 for ; Fri, 21 Mar 2014 08:24:06 -0700 (PDT) X-Received: by 10.58.152.142 with SMTP id uy14mr5680244veb.4.1395415446278; Fri, 21 Mar 2014 08:24:06 -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.220.78.9 with SMTP id i9csp39079vck; Fri, 21 Mar 2014 08:24:05 -0700 (PDT) X-Received: by 10.140.104.103 with SMTP id z94mr30743368qge.91.1395415445776; Fri, 21 Mar 2014 08:24:05 -0700 (PDT) Received: from lists.xen.org (lists.xen.org. [50.57.142.19]) by mx.google.com with ESMTPS id g2si1632092qab.38.2014.03.21.08.24.04 for (version=TLSv1 cipher=RC4-SHA bits=128/128); Fri, 21 Mar 2014 08:24:05 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of xen-devel-bounces@lists.xen.org designates 50.57.142.19 as permitted sender) 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 1WR1HA-00076L-BZ; Fri, 21 Mar 2014 15:22:28 +0000 Received: from mail6.bemta14.messagelabs.com ([193.109.254.103]) by lists.xen.org with esmtp (Exim 4.72) (envelope-from ) id 1WR1H9-00074Y-Ar for xen-devel@lists.xenproject.org; Fri, 21 Mar 2014 15:22:27 +0000 Received: from [193.109.254.147:53990] by server-6.bemta-14.messagelabs.com id D7/AC-13066-1395C235; Fri, 21 Mar 2014 15:22:25 +0000 X-Env-Sender: julien.grall@linaro.org X-Msg-Ref: server-2.tower-27.messagelabs.com!1395415344!3335924!1 X-Originating-IP: [74.125.83.42] X-SpamReason: No, hits=0.0 required=7.0 tests= X-StarScan-Received: X-StarScan-Version: 6.11.1; banners=-,-,- X-VirusChecked: Checked Received: (qmail 26549 invoked from network); 21 Mar 2014 15:22:24 -0000 Received: from mail-ee0-f42.google.com (HELO mail-ee0-f42.google.com) (74.125.83.42) by server-2.tower-27.messagelabs.com with RC4-SHA encrypted SMTP; 21 Mar 2014 15:22:24 -0000 Received: by mail-ee0-f42.google.com with SMTP id d17so1940413eek.29 for ; Fri, 21 Mar 2014 08:22:24 -0700 (PDT) X-Received: by 10.15.42.138 with SMTP id u10mr48642111eev.7.1395415341811; Fri, 21 Mar 2014 08:22:21 -0700 (PDT) Received: from belegaer.uk.xensource.com. ([185.25.64.249]) by mx.google.com with ESMTPSA id m8sm12218015eeg.11.2014.03.21.08.22.20 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 21 Mar 2014 08:22:21 -0700 (PDT) From: Julien Grall To: xen-devel@lists.xenproject.org Date: Fri, 21 Mar 2014 15:22:13 +0000 Message-Id: <1395415334-31538-4-git-send-email-julien.grall@linaro.org> X-Mailer: git-send-email 1.7.10.4 In-Reply-To: <1395415334-31538-1-git-send-email-julien.grall@linaro.org> References: <1395415334-31538-1-git-send-email-julien.grall@linaro.org> Cc: stefano.stabellini@citrix.com, Daniel De Graaf , Julien Grall , tim@xen.org, ian.campbell@citrix.com Subject: [Xen-devel] [PATCH v4 3/4] xen/xsm: Add support for device tree 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: julien.grall@linaro.org X-Original-Authentication-Results: mx.google.com; spf=neutral (google.com: 209.85.220.172 is neither permitted nor denied by best guess record for domain of patch+caf_=patchwork-forward=linaro.org@linaro.org) 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 patch adds a new module "xen,xsm-policy" to allow the user to load the XSM policy when Xen is booting. Signed-off-by: Julien Grall Acked-by: Daniel De Graaf Acked-by: Ian Campbell --- Changes in v4: - Rename xsm-blob into xsm-policy Changes in v3: - xfree is able to handle NULL correctly Changes in v2: - Use xsm_core_init function --- docs/misc/arm/device-tree/booting.txt | 1 + xen/common/device_tree.c | 2 ++ xen/include/xen/device_tree.h | 3 ++- xen/include/xsm/xsm.h | 12 +++++++++++ xen/xsm/xsm_core.c | 26 +++++++++++++++++++++++ xen/xsm/xsm_policy.c | 37 +++++++++++++++++++++++++++++++++ 6 files changed, 80 insertions(+), 1 deletion(-) diff --git a/docs/misc/arm/device-tree/booting.txt b/docs/misc/arm/device-tree/booting.txt index 07fde27..a7fb52b 100644 --- a/docs/misc/arm/device-tree/booting.txt +++ b/docs/misc/arm/device-tree/booting.txt @@ -16,6 +16,7 @@ Each node contains the following properties: - "linux-zimage" -- the dom0 kernel - "linux-initrd" -- the dom0 ramdisk + - "xsm-policy" -- XSM policy blob - reg diff --git a/xen/common/device_tree.c b/xen/common/device_tree.c index 55716a8..e047d7f 100644 --- a/xen/common/device_tree.c +++ b/xen/common/device_tree.c @@ -354,6 +354,8 @@ static void __init process_multiboot_node(const void *fdt, int node, nr = MOD_KERNEL; else if ( fdt_node_check_compatible(fdt, node, "xen,linux-initrd") == 0) nr = MOD_INITRD; + else if ( fdt_node_check_compatible(fdt, node, "xen,xsm-policy") == 0 ) + nr = MOD_XSM; else early_panic("%s not a known xen multiboot type\n", name); diff --git a/xen/include/xen/device_tree.h b/xen/include/xen/device_tree.h index 9a8c3de..76faf11 100644 --- a/xen/include/xen/device_tree.h +++ b/xen/include/xen/device_tree.h @@ -24,7 +24,8 @@ #define MOD_FDT 1 #define MOD_KERNEL 2 #define MOD_INITRD 3 -#define NR_MODULES 4 +#define MOD_XSM 4 +#define NR_MODULES 5 #define MOD_DISCARD_FIRST MOD_FDT diff --git a/xen/include/xsm/xsm.h b/xen/include/xsm/xsm.h index 4863e41..2cd3a3b 100644 --- a/xen/include/xsm/xsm.h +++ b/xen/include/xsm/xsm.h @@ -652,6 +652,11 @@ extern int xsm_multiboot_policy_init(unsigned long *module_map, void *(*bootstrap_map)(const module_t *)); #endif +#ifdef HAS_DEVICE_TREE +extern int xsm_dt_init(void); +extern int xsm_dt_policy_init(void); +#endif + extern int register_xsm(struct xsm_operations *ops); extern int unregister_xsm(struct xsm_operations *ops); @@ -671,6 +676,13 @@ static inline int xsm_multiboot_init (unsigned long *module_map, } #endif +#ifdef HAS_DEVICE_TREE +static inline int xsm_dt_init(void) +{ + return 0; +} +#endif + #endif /* XSM_ENABLE */ #endif /* __XSM_H */ diff --git a/xen/xsm/xsm_core.c b/xen/xsm/xsm_core.c index 24b0ff4..0ac6d03 100644 --- a/xen/xsm/xsm_core.c +++ b/xen/xsm/xsm_core.c @@ -85,6 +85,32 @@ int __init xsm_multiboot_init(unsigned long *module_map, } #endif +#ifdef HAS_DEVICE_TREE +int __init xsm_dt_init(void) +{ + int ret = 0; + + printk("XSM Framework v" XSM_FRAMEWORK_VERSION " initialized\n"); + + if ( XSM_MAGIC ) + { + ret = xsm_dt_policy_init(); + if ( ret ) + { + printk("%s: Error initializing policy (rc = %d).\n", + __FUNCTION__, ret); + return -EINVAL; + } + } + + ret = xsm_core_init(); + + xfree(policy_buffer); + + return ret; +} +#endif + int register_xsm(struct xsm_operations *ops) { if ( verify(ops) ) diff --git a/xen/xsm/xsm_policy.c b/xen/xsm/xsm_policy.c index 3d5f66a..a0dee09 100644 --- a/xen/xsm/xsm_policy.c +++ b/xen/xsm/xsm_policy.c @@ -23,6 +23,10 @@ #include #endif #include +#ifdef HAS_DEVICE_TREE +# include +# include +#endif char *__initdata policy_buffer = NULL; u32 __initdata policy_size = 0; @@ -69,3 +73,36 @@ int __init xsm_multiboot_policy_init(unsigned long *module_map, return rc; } #endif + +#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; + xsm_magic_t magic; + + if ( !len ) + return 0; + + copy_from_paddr(&magic, paddr, sizeof(magic)); + + if ( magic != XSM_MAGIC ) + { + printk(XENLOG_ERR "xsm: Invalid magic for XSM blob got 0x%x " + "expected 0x%x\n", magic, XSM_MAGIC); + return -EINVAL; + } + + printk("xsm: Policy len = 0x%"PRIpaddr" start at 0x%"PRIpaddr"\n", + len, paddr); + + policy_buffer = xmalloc_bytes(len); + if ( !policy_buffer ) + return -ENOMEM; + + copy_from_paddr(policy_buffer, paddr, len); + policy_size = len; + + return 0; +} +#endif