xref: /optee_os/core/include/mm/vm.h (revision 89c9728d981ff0f4a8edecc325858537441d721e)
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