1*89c9728dSJens Wiklander /* SPDX-License-Identifier: BSD-2-Clause */ 2*89c9728dSJens Wiklander /* 3*89c9728dSJens Wiklander * Copyright (c) 2014, STMicroelectronics International N.V. 4*89c9728dSJens Wiklander */ 5*89c9728dSJens Wiklander #ifndef TEE_MMU_H 6*89c9728dSJens Wiklander #define TEE_MMU_H 7*89c9728dSJens Wiklander 8*89c9728dSJens Wiklander #include <tee_api_types.h> 9*89c9728dSJens Wiklander #include <kernel/tee_ta_manager.h> 10*89c9728dSJens Wiklander #include <kernel/user_ta.h> 11*89c9728dSJens Wiklander 12*89c9728dSJens Wiklander /*----------------------------------------------------------------------------- 13*89c9728dSJens Wiklander * Allocate context resources like ASID and MMU table information 14*89c9728dSJens Wiklander *---------------------------------------------------------------------------*/ 15*89c9728dSJens Wiklander TEE_Result vm_info_init(struct user_mode_ctx *uctx); 16*89c9728dSJens Wiklander 17*89c9728dSJens Wiklander /*----------------------------------------------------------------------------- 18*89c9728dSJens Wiklander * Release context resources like ASID 19*89c9728dSJens Wiklander *---------------------------------------------------------------------------*/ 20*89c9728dSJens Wiklander void vm_info_final(struct user_mode_ctx *uctx); 21*89c9728dSJens Wiklander 22*89c9728dSJens Wiklander /* 23*89c9728dSJens Wiklander * Creates a memory map of a mobj. 24*89c9728dSJens Wiklander * Desired virtual address can be specified in @va otherwise @va must be 25*89c9728dSJens Wiklander * initialized to 0 if the next available can be chosen. 26*89c9728dSJens Wiklander * 27*89c9728dSJens Wiklander * @pad_begin and @pad_end specify how much extra free space should be kept 28*89c9728dSJens Wiklander * when establishing the map. This allows mapping the first part of for 29*89c9728dSJens Wiklander * instance an ELF file while knowing that the next part which has to be of 30*89c9728dSJens Wiklander * a certain offset from the first part also will succeed. 31*89c9728dSJens Wiklander */ 32*89c9728dSJens Wiklander 33*89c9728dSJens Wiklander TEE_Result vm_map_pad(struct user_mode_ctx *uctx, vaddr_t *va, size_t len, 34*89c9728dSJens Wiklander uint32_t prot, uint32_t flags, struct mobj *mobj, 35*89c9728dSJens Wiklander size_t offs, size_t pad_begin, size_t pad_end, 36*89c9728dSJens Wiklander size_t align); 37*89c9728dSJens Wiklander 38*89c9728dSJens Wiklander /* 39*89c9728dSJens Wiklander * Creates a memory map of a mobj. 40*89c9728dSJens Wiklander * Desired virtual address can be specified in @va otherwise @va must be 41*89c9728dSJens Wiklander * initialized to 0 if the next available can be chosen. 42*89c9728dSJens Wiklander */ 43*89c9728dSJens Wiklander static inline TEE_Result vm_map(struct user_mode_ctx *uctx, vaddr_t *va, 44*89c9728dSJens Wiklander size_t len, uint32_t prot, uint32_t flags, 45*89c9728dSJens Wiklander struct mobj *mobj, size_t offs) 46*89c9728dSJens Wiklander { 47*89c9728dSJens Wiklander return vm_map_pad(uctx, va, len, prot, flags, mobj, offs, 0, 0, 0); 48*89c9728dSJens Wiklander } 49*89c9728dSJens Wiklander 50*89c9728dSJens Wiklander TEE_Result vm_remap(struct user_mode_ctx *uctx, vaddr_t *new_va, vaddr_t old_va, 51*89c9728dSJens Wiklander size_t len, size_t pad_begin, size_t pad_end); 52*89c9728dSJens Wiklander 53*89c9728dSJens Wiklander TEE_Result vm_get_flags(struct user_mode_ctx *uctx, vaddr_t va, size_t len, 54*89c9728dSJens Wiklander uint32_t *flags); 55*89c9728dSJens Wiklander 56*89c9728dSJens Wiklander TEE_Result vm_get_prot(struct user_mode_ctx *uctx, vaddr_t va, size_t len, 57*89c9728dSJens Wiklander uint16_t *prot); 58*89c9728dSJens Wiklander 59*89c9728dSJens Wiklander TEE_Result vm_set_prot(struct user_mode_ctx *uctx, vaddr_t va, size_t len, 60*89c9728dSJens Wiklander uint32_t prot); 61*89c9728dSJens Wiklander 62*89c9728dSJens Wiklander TEE_Result vm_unmap(struct user_mode_ctx *uctx, vaddr_t va, size_t len); 63*89c9728dSJens Wiklander 64*89c9728dSJens Wiklander /* Map parameters for a user TA */ 65*89c9728dSJens Wiklander TEE_Result vm_map_param(struct user_mode_ctx *uctx, struct tee_ta_param *param, 66*89c9728dSJens Wiklander void *param_va[TEE_NUM_PARAMS]); 67*89c9728dSJens Wiklander void vm_clean_param(struct user_mode_ctx *uctx); 68*89c9728dSJens Wiklander 69*89c9728dSJens Wiklander TEE_Result vm_add_rwmem(struct user_mode_ctx *uctx, struct mobj *mobj, 70*89c9728dSJens Wiklander vaddr_t *va); 71*89c9728dSJens Wiklander void vm_rem_rwmem(struct user_mode_ctx *uctx, struct mobj *mobj, vaddr_t va); 72*89c9728dSJens Wiklander 73*89c9728dSJens Wiklander /* 74*89c9728dSJens Wiklander * User mode private memory is defined as user mode image static segment 75*89c9728dSJens Wiklander * (code, ro/rw static data, heap, stack). The sole other virtual memory 76*89c9728dSJens Wiklander * mapped to user mode are memref parameters. These later are considered 77*89c9728dSJens Wiklander * outside user mode private memory as it might be accessed by the user 78*89c9728dSJens Wiklander * mode context and its client(s). 79*89c9728dSJens Wiklander */ 80*89c9728dSJens Wiklander bool vm_buf_is_inside_um_private(const struct user_mode_ctx *uctx, 81*89c9728dSJens Wiklander const void *va, size_t size); 82*89c9728dSJens Wiklander 83*89c9728dSJens Wiklander bool vm_buf_intersects_um_private(const struct user_mode_ctx *uctx, 84*89c9728dSJens Wiklander const void *va, size_t size); 85*89c9728dSJens Wiklander 86*89c9728dSJens Wiklander TEE_Result vm_buf_to_mboj_offs(const struct user_mode_ctx *uctx, 87*89c9728dSJens Wiklander const void *va, size_t size, 88*89c9728dSJens Wiklander struct mobj **mobj, size_t *offs); 89*89c9728dSJens Wiklander 90*89c9728dSJens Wiklander /*----------------------------------------------------------------------------- 91*89c9728dSJens Wiklander * vm_va2pa - Translate virtual user address to physical address 92*89c9728dSJens Wiklander * given the user context. 93*89c9728dSJens Wiklander * Interface is deprecated, use virt_to_phys() instead. 94*89c9728dSJens Wiklander *---------------------------------------------------------------------------*/ 95*89c9728dSJens Wiklander TEE_Result vm_va2pa(const struct user_mode_ctx *uctx, void *ua, paddr_t *pa); 96*89c9728dSJens Wiklander 97*89c9728dSJens Wiklander /*----------------------------------------------------------------------------- 98*89c9728dSJens Wiklander * vm_pa2va - Translate physical address to virtual user address 99*89c9728dSJens Wiklander * given the user context. 100*89c9728dSJens Wiklander * Interface is deprecated, use phys_to_virt() instead. 101*89c9728dSJens Wiklander *---------------------------------------------------------------------------*/ 102*89c9728dSJens Wiklander TEE_Result vm_pa2va(const struct user_mode_ctx *uctx, paddr_t pa, void **va); 103*89c9728dSJens Wiklander 104*89c9728dSJens Wiklander TEE_Result vm_check_access_rights(const struct user_mode_ctx *uctx, 105*89c9728dSJens Wiklander uint32_t flags, uaddr_t uaddr, size_t len); 106*89c9728dSJens Wiklander 107*89c9728dSJens Wiklander /*----------------------------------------------------------------------------- 108*89c9728dSJens Wiklander * If ctx is NULL user mapping is removed and ASID set to 0 109*89c9728dSJens Wiklander *---------------------------------------------------------------------------*/ 110*89c9728dSJens Wiklander void vm_set_ctx(struct ts_ctx *ctx); 111*89c9728dSJens Wiklander 112*89c9728dSJens Wiklander #endif /*TEE_MMU_H*/ 113