|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH] arm: dom0less: add TEE support
Allow to provide TEE type for a Dom0less guest via "xen,tee"
property. Create appropriate nodes in the guests' device tree and
initialize tee subsystem for it.
Signed-off-by: Volodymyr Babchuk <volodymyr_babchuk@xxxxxxxx>
---
xen/arch/arm/dom0less-build.c | 69 +++++++++++++++++++++++++++++++
xen/arch/arm/include/asm/kernel.h | 3 ++
2 files changed, 72 insertions(+)
diff --git a/xen/arch/arm/dom0less-build.c b/xen/arch/arm/dom0less-build.c
index fb63ec6fd1..1ea3ecc45c 100644
--- a/xen/arch/arm/dom0less-build.c
+++ b/xen/arch/arm/dom0less-build.c
@@ -15,6 +15,7 @@
#include <asm/domain_build.h>
#include <asm/static-memory.h>
#include <asm/static-shmem.h>
+#include <asm/tee/tee.h>
bool __init is_dom0less_mode(void)
{
@@ -277,6 +278,42 @@ static int __init make_vpl011_uart_node(struct kernel_info
*kinfo)
}
#endif
+#ifdef CONFIG_OPTEE
+static int __init make_optee_node(struct kernel_info *kinfo)
+{
+ void *fdt = kinfo->fdt;
+ int res;
+
+ res = fdt_begin_node(fdt, "firmware");
+ if ( res )
+ return res;
+
+ res = fdt_begin_node(fdt, "optee");
+ if ( res )
+ return res;
+
+ res = fdt_property_string(fdt, "compatible", "linaro,optee-tz");
+ if ( res )
+ return res;
+
+ res = fdt_property_string(fdt, "method", "hvc");
+ if ( res )
+ return res;
+
+ /* end of "optee" */
+ res = fdt_end_node(fdt);
+ if ( res )
+ return res;
+
+ /* end of "firmware" */
+ res = fdt_end_node(fdt);
+ if ( res )
+ return res;
+
+ return 0;
+}
+#endif
+
/*
* Scan device tree properties for passthrough specific information.
* Returns < 0 on error
@@ -650,6 +687,15 @@ static int __init prepare_dtb_domU(struct domain *d,
struct kernel_info *kinfo)
if ( ret )
goto err;
+#ifdef CONFIG_OPTEE
+ if ( kinfo->tee_type == XEN_DOMCTL_CONFIG_TEE_OPTEE)
+ {
+ ret = make_optee_node(kinfo);
+ if ( ret )
+ goto err;
+ }
+#endif
+
/*
* domain_handle_dtb_bootmodule has to be called before the rest of
* the device tree is generated because it depends on the value of
@@ -743,6 +789,9 @@ static int __init construct_domU(struct domain *d,
{
struct kernel_info kinfo = {};
const char *dom0less_enhanced;
+#ifdef CONFIG_TEE
+ const char *tee;
+#endif
int rc;
u64 mem;
u32 p2m_mem_mb;
@@ -786,6 +835,18 @@ static int __init construct_domU(struct domain *d,
else if ( rc == 0 && !strcmp(dom0less_enhanced, "no-xenstore") )
kinfo.dom0less_feature = DOM0LESS_ENHANCED_NO_XS;
+#ifdef CONFIG_TEE
+ rc = dt_property_read_string(node, "xen,tee", &tee);
+ if ( rc == -EILSEQ ||
+ rc == -ENODATA ||
+ (rc == 0 && !strcmp(tee, "none")) )
+ {
+ if ( !hardware_domain )
+ kinfo.tee_type = XEN_DOMCTL_CONFIG_TEE_NONE;
+ }
+ else if ( rc == 0 && !strcmp(tee, "optee") )
+ kinfo.tee_type = XEN_DOMCTL_CONFIG_TEE_OPTEE;
+#endif
if ( vcpu_create(d, 0) == NULL )
return -ENOMEM;
@@ -824,6 +885,14 @@ static int __init construct_domU(struct domain *d,
return rc;
}
+#ifdef CONFIG_TEE
+ if ( kinfo.tee_type )
+ {
+ rc = tee_domain_init(d, kinfo.tee_type);
+ if ( rc < 0 )
+ return rc;
+ }
+#endif
rc = prepare_dtb_domU(d, &kinfo);
if ( rc < 0 )
return rc;
diff --git a/xen/arch/arm/include/asm/kernel.h
b/xen/arch/arm/include/asm/kernel.h
index 0a23e86c2d..7e7b3f4d56 100644
--- a/xen/arch/arm/include/asm/kernel.h
+++ b/xen/arch/arm/include/asm/kernel.h
@@ -57,6 +57,9 @@ struct kernel_info {
/* Enable pl011 emulation */
bool vpl011;
+ /* TEE type */
+ uint16_t tee_type;
+
/* Enable/Disable PV drivers interfaces */
uint16_t dom0less_feature;
--
2.45.1
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |