|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [RFC 4/4] arm: tee: add basic OP-TEE mediator
Hi Volodymyr, On 17/10/17 19:57, Volodymyr Babchuk wrote: On Tue, Oct 17, 2017 at 06:30:13PM +0100, Julien Grall wrote:On 11/10/17 20:01, Volodymyr Babchuk wrote:Add basic OP-TEE mediator as an example how TEE mediator framework works. Currently it support only calls from Dom0. Calls from other guests will be declined. It maps OP-TEE static shared memory region into Dom0 address space, so Dom0 is the only domain which can work with older versions of OP-TEE. Also it alters SMC requests by\ adding domain id to request. OP-TEE can use this information to track requesters. Albeit being in early development stages, this mediator already can be used on systems where only Dom0 interacts with OP-TEE.A link to the spec would be useful here to be able to fully review this patch.Which spec? OP-TEE protocol? It was added in previous commit.So basically you are saying the header is the documentation of the API? There are not external documentation making easier to follow the version...?There are high-level documentation at [1]. All details are covered in headers. Thanks. It was tested on RCAR Salvator-M3 board.Is it with the stock op-tee? Or an updated version?Static SHM was tested with stock OP-TEE. Dynamic SHM was tested with my build. But my patches are already merged. OP-TEE 2.6.0 will support dynamic SHM out of the box.Signed-off-by: Volodymyr Babchuk <volodymyr_babchuk@xxxxxxxx> --- xen/arch/arm/tee/Kconfig | 4 ++ xen/arch/arm/tee/Makefile | 1 + xen/arch/arm/tee/optee.c | 178 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 183 insertions(+) create mode 100644 xen/arch/arm/tee/optee.c diff --git a/xen/arch/arm/tee/Kconfig b/xen/arch/arm/tee/Kconfig index e69de29..7c6b5c6 100644 --- a/xen/arch/arm/tee/Kconfig +++ b/xen/arch/arm/tee/Kconfig @@ -0,0 +1,4 @@ +config ARM_OPTEE + bool "Enable OP-TEE mediator" + default n + depends on ARM_TEE diff --git a/xen/arch/arm/tee/Makefile b/xen/arch/arm/tee/Makefile index c54d479..9d93b42 100644 --- a/xen/arch/arm/tee/Makefile +++ b/xen/arch/arm/tee/Makefile @@ -1 +1,2 @@ obj-y += tee.o +obj-$(CONFIG_ARM_OPTEE) += optee.o diff --git a/xen/arch/arm/tee/optee.c b/xen/arch/arm/tee/optee.c new file mode 100644 index 0000000..0220691 --- /dev/null +++ b/xen/arch/arm/tee/optee.c @@ -0,0 +1,178 @@ +/* + * xen/arch/arm/tee/optee.c + * + * OP-TEE mediator + * + * Volodymyr Babchuk <volodymyr_babchuk@xxxxxxxx> + * Copyright (c) 2017 EPAM Systems. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include <xen/types.h> +#include <xen/sched.h> + +#include <asm/p2m.h> +#include <asm/tee.h> + +#include "optee_msg.h" +#include "optee_smc.h" + +/* + * OP-TEE violates SMCCC when it defines own UID. So we need + * to place bytes in correct order.Can you please point the paragraph in the spec where it says that?Sure. I am not sure to understand what you mean here. Do you expect OP-TEE to block? Or send an interrupt later on to say the work is finish? [...] Thank you for the explanation, but I don't think this is addressing how this would prevent leaking data to the guest.+ current->domain->domain_id +1, + resp); + + set_user_reg(regs, 0, resp[0]); + set_user_reg(regs, 1, resp[1]); + set_user_reg(regs, 2, resp[2]); + set_user_reg(regs, 3, resp[3]);Who will do the sanity check of the return values? Each callers? If so, I would prefer that the results are stored in a temporary array and a separate helpers will write them into the domain once the sanity is done.Maybe there will be cases when call will be forwarded straight to OP-TEE and nobody in hypervisor will examine returned result. At least, at this moment there are such cases. Probably, in full-scalle mediator this will no longer be true.This would avoid to mistakenly expose unwanted data to a domain.Correct me, but set_user_reg() modifies data that will be stored in general purpose registers during return from trap handler. This can't expose any additional data to a domain.Which set_user_reg()? The helper does not do any modification... If you speak about the code below, then it is very confusing and error-prone.No, I was speaking about code above. The one that calls set_user_reg(). You leave your comment there, so I assumed you are talking about that part.If you separate the call from setting the guest registers then the you give a hint to the caller that maybe something has to be down and he can't blindly trust the result... My request is to move the set_user_reg(...) calls outside of call_forward. So this would make clear the mediator needs to examine the result values. To give you an example: call_forward(....) /* No need to sanitize value because... */ set_user_reg(...) set_user_reg(...)The caller may not need to examine the results. But at least it is clear compare to an helper hiding that. Note that the set_user_reg(...) calls could in a another helper.
But if you use is_domain_direct_mapped(d) here, what will happen if two guests asked for shared memory? But I am not sure what's the point of this check given OP-TEE is only supported for the Hardware Domain and you already have a check for that.Because I will remove outer check. But this check will remain. In this way older OP-TEEs (without virtualization support) will still be accessible>from Dom0/HWDom.+ if ( current->domain->domain_id != 0 )Please use is_hardware_domain(current->domain) and not open-code the check.+ return false; + + forward_call(regs); + + /* Return error back to the guest */ + if ( get_user_reg(regs, 0) != OPTEE_SMC_RETURN_OK) + return true;This is quite confusing to read, I think it would make sense that forward_call return the error.Good idea, thanks.+ + shm_start = get_user_reg(regs, 1); + shm_size = get_user_reg(regs, 2); + + /* Dom0 is mapped 1:1 */Please don't make this assumption or at least add ASSERT(is_domain_direct_mapped(d));Thanks. I'll check this in runtime, as I mentioned above.+ rc = map_regions_p2mt(current->domain, gaddr_to_gfn(shm_start),Rather than using current->domain everywhere, I would prefer if you introduce a temporary variable for the domain.Okay.+ shm_size / PAGE_SIZE,Please PFN_DOWN(...).+ maddr_to_mfn(shm_start), + p2m_ram_rw);What is this shared memory for? I know this is the hardware domain, so using p2m_ram_rw would be ok. But I don't think this would be safe unless TEE do proper safety check.Linux kernel driver does memremap() in such place. OP-TEE maps it as non-secure RAM. This shared memory is used to pass information between OP-TEE OS and OP-TEE client. About which safety check you are talking?Well, does OP-TEE validate the data read from that shared region? But it seems that you don't plan to give part of the SHM to a guest, so it might be ok.OP-TEE surely validate all data from NW. Also OP-TEE is written in such way, that it reads from shared memory only once, to ensure that NW will not change data after validation. Mediator will do the same. What do you mean by the last bit? Also how OP-TEE will map this region? Cacheable...?Yes, cacheable, PR, PW, non-secure. To clarify my view. I am not against a temporary support of OP-TEE for the hardware domain in Xen. But it does not mean I would be ready to see the a full OP-TEE support for guests in Xen. Cheers, -- Julien Grall _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |