/* SPDX-License-Identifier: BSD-2-Clause */ /* Copyright (c) 2018, EPAM Systems. All rights reserved. */ #ifndef KERNEL_VIRTUALIZATION_H #define KERNEL_VIRTUALIZATION_H #include #include #include #include #define HYP_CLNT_ID 0 #if defined(CFG_VIRTUALIZATION) /** * virt_guest_created() - create new VM partition * @guest_id: VM id provided by hypervisor * * This function is called by hypervisor (via fast SMC) * when hypervisor creates new guest VM, so OP-TEE * can prepare partition for that VM */ TEE_Result virt_guest_created(uint16_t guest_id); /** * virt_guest_destroyed() - destroy existing VM partition * @guest_id: VM id provided by hypervisor * * This function is called by hypervisor (via fast SMC) * when hypervisor is ready to destroy guest VM. Hypervisor * must ensure that there are no ongoing calls from this * VM right now. */ TEE_Result virt_guest_destroyed(uint16_t guest_id); /** * virt_set_guest() - set guest VM context for current core * @guest_id: VM id provided by hypervisor * * This function switches memory partitions, so TEE part of * OP-TEE will see memory associated with current guest. * It should be called on entry to OP-TEE */ TEE_Result virt_set_guest(uint16_t guest_id); /** * virt_unset_guest() - set default memory partition * * This function should be called upon leaving OP-TEE, * to switch to default memory partition, so all TEE-specific * memory will be unmapped. This is safety measure to ensure * that TEE memory is untouched when there is no active VM. */ void virt_unset_guest(void); /** * virt_on_stdcall() - std call hook * * This hook is called on every std call, but really is needed * only once: to initialize TEE runtime for current guest VM */ void virt_on_stdcall(void); /* * Next function are needed because virtualization subsystem manages * memory in own way. There is no one static memory map, instead * every guest gets own memory map. */ /** * virt_init_memory() - initialize memory for virtualization subsystem * @memory_map: current OP-TEE memory map */ void virt_init_memory(struct tee_mmap_region *memory_map); /** * virt_get_memory_map() - get current memory map */ struct tee_mmap_region *virt_get_memory_map(void); /** * virt_get_ta_ram() - get TA RAM mapping for current VM * @start: beginning of TA RAM returned here * @end: end of TA RAM returned here */ void virt_get_ta_ram(vaddr_t *start, vaddr_t *end); #else static inline TEE_Result virt_guest_created(uint16_t guest_id __unused) { return TEE_ERROR_NOT_SUPPORTED; } static inline TEE_Result virt_guest_destroyed(uint16_t guest_id __unused) { return TEE_ERROR_NOT_SUPPORTED; } static inline TEE_Result virt_set_guest(uint16_t guest_id __unused) { return TEE_ERROR_NOT_SUPPORTED; } static inline void virt_unset_guest(void) { } static inline void virt_on_stdcall(void) { } static inline struct tee_mmap_region *virt_get_memory_map(void) { return NULL; } static inline void virt_get_ta_ram(vaddr_t *start __unused, vaddr_t *end __unused) { } static inline void virt_init_memory(struct tee_mmap_region *memory_map __unused) { } #endif /*CFG_VIRTUALIZATION*/ #endif /* KERNEL_VIRTUALIZATION_H */