xref: /optee_os/core/include/mm/vm.h (revision 66257dc2ba12a35555b6df7572be5f2f79a5002b)
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 
65*66257dc2SJens Wiklander /*
66*66257dc2SJens Wiklander  * These two functions are deprecated and should only be called from
67*66257dc2SJens Wiklander  * mobj_seccpy_shm_alloc() and mobj_seccpy_shm_free().
68*66257dc2SJens Wiklander  */
6989c9728dSJens Wiklander TEE_Result vm_add_rwmem(struct user_mode_ctx *uctx, struct mobj *mobj,
7089c9728dSJens Wiklander 			vaddr_t *va);
7189c9728dSJens Wiklander void vm_rem_rwmem(struct user_mode_ctx *uctx, struct mobj *mobj, vaddr_t va);
7289c9728dSJens Wiklander 
7389c9728dSJens Wiklander /*
7489c9728dSJens Wiklander  * User mode private memory is defined as user mode image static segment
7589c9728dSJens Wiklander  * (code, ro/rw static data, heap, stack). The sole other virtual memory
7689c9728dSJens Wiklander  * mapped to user mode are memref parameters. These later are considered
7789c9728dSJens Wiklander  * outside user mode private memory as it might be accessed by the user
7889c9728dSJens Wiklander  * mode context and its client(s).
7989c9728dSJens Wiklander  */
8089c9728dSJens Wiklander bool vm_buf_is_inside_um_private(const struct user_mode_ctx *uctx,
8189c9728dSJens Wiklander 				 const void *va, size_t size);
8289c9728dSJens Wiklander 
8389c9728dSJens Wiklander bool vm_buf_intersects_um_private(const struct user_mode_ctx *uctx,
8489c9728dSJens Wiklander 				  const void *va, size_t size);
8589c9728dSJens Wiklander 
8689c9728dSJens Wiklander TEE_Result vm_buf_to_mboj_offs(const struct user_mode_ctx *uctx,
8789c9728dSJens Wiklander 			       const void *va, size_t size,
8889c9728dSJens Wiklander 			       struct mobj **mobj, size_t *offs);
8989c9728dSJens Wiklander 
9083117aedSEtienne Carriere /* Helper function for virt_to_phys(), shouldn't be used directly elsewhere */
9189c9728dSJens Wiklander TEE_Result vm_va2pa(const struct user_mode_ctx *uctx, void *ua, paddr_t *pa);
9289c9728dSJens Wiklander 
9383117aedSEtienne Carriere /* Helper function for phys_to_virt(), shouldn't be used directly elsewhere */
94c2e4eb43SAnton Rybakov void *vm_pa2va(const struct user_mode_ctx *uctx, paddr_t pa, size_t pa_size);
9589c9728dSJens Wiklander 
9683117aedSEtienne Carriere /*
9783117aedSEtienne Carriere  * Return TEE_SUCCESS or TEE_ERROR_ACCESS_DENIED when buffer exists or return
9883117aedSEtienne Carriere  * another TEE_Result code.
9983117aedSEtienne Carriere  */
10089c9728dSJens Wiklander TEE_Result vm_check_access_rights(const struct user_mode_ctx *uctx,
10189c9728dSJens Wiklander 				  uint32_t flags, uaddr_t uaddr, size_t len);
10289c9728dSJens Wiklander 
10383117aedSEtienne Carriere /* Set user context @ctx or core privileged context if @ctx is NULL */
10489c9728dSJens Wiklander void vm_set_ctx(struct ts_ctx *ctx);
10589c9728dSJens Wiklander 
10668c6ad9aSJelle Sels struct mobj *vm_get_mobj(struct user_mode_ctx *uctx, vaddr_t va, size_t *len,
10768c6ad9aSJelle Sels 			 uint16_t *prot, size_t *offs);
10889c9728dSJens Wiklander #endif /*TEE_MMU_H*/
109