189c9728dSJens Wiklander /* SPDX-License-Identifier: BSD-2-Clause */ 289c9728dSJens Wiklander /* 389c9728dSJens Wiklander * Copyright (c) 2014, STMicroelectronics International N.V. 489c9728dSJens Wiklander */ 589c9728dSJens Wiklander #ifndef TEE_MMU_H 689c9728dSJens Wiklander #define TEE_MMU_H 789c9728dSJens Wiklander 889c9728dSJens Wiklander #include <tee_api_types.h> 989c9728dSJens Wiklander #include <kernel/tee_ta_manager.h> 1089c9728dSJens Wiklander #include <kernel/user_ta.h> 1189c9728dSJens Wiklander 1283117aedSEtienne Carriere /* Allocate context resources like ASID and MMU table information */ 1389c9728dSJens Wiklander TEE_Result vm_info_init(struct user_mode_ctx *uctx); 1489c9728dSJens Wiklander 1583117aedSEtienne Carriere /* Release context resources like ASID */ 1689c9728dSJens Wiklander void vm_info_final(struct user_mode_ctx *uctx); 1789c9728dSJens Wiklander 1889c9728dSJens Wiklander /* 1989c9728dSJens Wiklander * Creates a memory map of a mobj. 2089c9728dSJens Wiklander * Desired virtual address can be specified in @va otherwise @va must be 2189c9728dSJens Wiklander * initialized to 0 if the next available can be chosen. 2289c9728dSJens Wiklander * 2389c9728dSJens Wiklander * @pad_begin and @pad_end specify how much extra free space should be kept 2489c9728dSJens Wiklander * when establishing the map. This allows mapping the first part of for 2589c9728dSJens Wiklander * instance an ELF file while knowing that the next part which has to be of 2689c9728dSJens Wiklander * a certain offset from the first part also will succeed. 2789c9728dSJens Wiklander */ 2889c9728dSJens Wiklander 2989c9728dSJens Wiklander TEE_Result vm_map_pad(struct user_mode_ctx *uctx, vaddr_t *va, size_t len, 3089c9728dSJens Wiklander uint32_t prot, uint32_t flags, struct mobj *mobj, 3189c9728dSJens Wiklander size_t offs, size_t pad_begin, size_t pad_end, 3289c9728dSJens Wiklander size_t align); 3389c9728dSJens Wiklander 3489c9728dSJens Wiklander /* 3589c9728dSJens Wiklander * Creates a memory map of a mobj. 3689c9728dSJens Wiklander * Desired virtual address can be specified in @va otherwise @va must be 3789c9728dSJens Wiklander * initialized to 0 if the next available can be chosen. 3889c9728dSJens Wiklander */ 3989c9728dSJens Wiklander static inline TEE_Result vm_map(struct user_mode_ctx *uctx, vaddr_t *va, 4089c9728dSJens Wiklander size_t len, uint32_t prot, uint32_t flags, 4189c9728dSJens Wiklander struct mobj *mobj, size_t offs) 4289c9728dSJens Wiklander { 4389c9728dSJens Wiklander return vm_map_pad(uctx, va, len, prot, flags, mobj, offs, 0, 0, 0); 4489c9728dSJens Wiklander } 4589c9728dSJens Wiklander 4689c9728dSJens Wiklander TEE_Result vm_remap(struct user_mode_ctx *uctx, vaddr_t *new_va, vaddr_t old_va, 4789c9728dSJens Wiklander size_t len, size_t pad_begin, size_t pad_end); 4889c9728dSJens Wiklander 4989c9728dSJens Wiklander TEE_Result vm_get_flags(struct user_mode_ctx *uctx, vaddr_t va, size_t len, 5089c9728dSJens Wiklander uint32_t *flags); 5189c9728dSJens Wiklander 5289c9728dSJens Wiklander TEE_Result vm_get_prot(struct user_mode_ctx *uctx, vaddr_t va, size_t len, 5389c9728dSJens Wiklander uint16_t *prot); 5489c9728dSJens Wiklander 5589c9728dSJens Wiklander TEE_Result vm_set_prot(struct user_mode_ctx *uctx, vaddr_t va, size_t len, 5689c9728dSJens Wiklander uint32_t prot); 5789c9728dSJens Wiklander 5889c9728dSJens Wiklander TEE_Result vm_unmap(struct user_mode_ctx *uctx, vaddr_t va, size_t len); 5989c9728dSJens Wiklander 6089c9728dSJens Wiklander /* Map parameters for a user TA */ 6189c9728dSJens Wiklander TEE_Result vm_map_param(struct user_mode_ctx *uctx, struct tee_ta_param *param, 6289c9728dSJens Wiklander void *param_va[TEE_NUM_PARAMS]); 6389c9728dSJens Wiklander void vm_clean_param(struct user_mode_ctx *uctx); 6489c9728dSJens Wiklander 6589c9728dSJens Wiklander TEE_Result vm_add_rwmem(struct user_mode_ctx *uctx, struct mobj *mobj, 6689c9728dSJens Wiklander vaddr_t *va); 6789c9728dSJens Wiklander void vm_rem_rwmem(struct user_mode_ctx *uctx, struct mobj *mobj, vaddr_t va); 6889c9728dSJens Wiklander 6989c9728dSJens Wiklander /* 7089c9728dSJens Wiklander * User mode private memory is defined as user mode image static segment 7189c9728dSJens Wiklander * (code, ro/rw static data, heap, stack). The sole other virtual memory 7289c9728dSJens Wiklander * mapped to user mode are memref parameters. These later are considered 7389c9728dSJens Wiklander * outside user mode private memory as it might be accessed by the user 7489c9728dSJens Wiklander * mode context and its client(s). 7589c9728dSJens Wiklander */ 7689c9728dSJens Wiklander bool vm_buf_is_inside_um_private(const struct user_mode_ctx *uctx, 7789c9728dSJens Wiklander const void *va, size_t size); 7889c9728dSJens Wiklander 7989c9728dSJens Wiklander bool vm_buf_intersects_um_private(const struct user_mode_ctx *uctx, 8089c9728dSJens Wiklander const void *va, size_t size); 8189c9728dSJens Wiklander 8289c9728dSJens Wiklander TEE_Result vm_buf_to_mboj_offs(const struct user_mode_ctx *uctx, 8389c9728dSJens Wiklander const void *va, size_t size, 8489c9728dSJens Wiklander struct mobj **mobj, size_t *offs); 8589c9728dSJens Wiklander 8683117aedSEtienne Carriere /* Helper function for virt_to_phys(), shouldn't be used directly elsewhere */ 8789c9728dSJens Wiklander TEE_Result vm_va2pa(const struct user_mode_ctx *uctx, void *ua, paddr_t *pa); 8889c9728dSJens Wiklander 8983117aedSEtienne Carriere /* Helper function for phys_to_virt(), shouldn't be used directly elsewhere */ 90*c2e4eb43SAnton Rybakov void *vm_pa2va(const struct user_mode_ctx *uctx, paddr_t pa, size_t pa_size); 9189c9728dSJens Wiklander 9283117aedSEtienne Carriere /* 9383117aedSEtienne Carriere * Return TEE_SUCCESS or TEE_ERROR_ACCESS_DENIED when buffer exists or return 9483117aedSEtienne Carriere * another TEE_Result code. 9583117aedSEtienne Carriere */ 9689c9728dSJens Wiklander TEE_Result vm_check_access_rights(const struct user_mode_ctx *uctx, 9789c9728dSJens Wiklander uint32_t flags, uaddr_t uaddr, size_t len); 9889c9728dSJens Wiklander 9983117aedSEtienne Carriere /* Set user context @ctx or core privileged context if @ctx is NULL */ 10089c9728dSJens Wiklander void vm_set_ctx(struct ts_ctx *ctx); 10189c9728dSJens Wiklander 10289c9728dSJens Wiklander #endif /*TEE_MMU_H*/ 103