#ifndef KERNEL_VIRTUALIZATION_H
#define KERNEL_VIRTUALIZATION_H
#include <mm/core_mmu.h>
#include <stdbool.h>
#include <stdint.h>
#include <tee_api_types.h>
#define HYP_CLNT_ID 0
#if defined(CFG_NS_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
#endif