diff options
Diffstat (limited to 'core/include/mm/tee_mmu.h')
-rw-r--r-- | core/include/mm/tee_mmu.h | 123 |
1 files changed, 123 insertions, 0 deletions
diff --git a/core/include/mm/tee_mmu.h b/core/include/mm/tee_mmu.h new file mode 100644 index 0000000..062196d --- /dev/null +++ b/core/include/mm/tee_mmu.h @@ -0,0 +1,123 @@ +/* + * Copyright (c) 2014, STMicroelectronics International N.V. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef TEE_MMU_H +#define TEE_MMU_H + +#include <tee_api_types.h> +#include <kernel/tee_ta_manager.h> +#include <kernel/user_ta.h> + +/*----------------------------------------------------------------------------- + * Allocate context resources like ASID and MMU table information + *---------------------------------------------------------------------------*/ +TEE_Result tee_mmu_init(struct user_ta_ctx *utc); + +/*----------------------------------------------------------------------------- + * tee_mmu_final - Release context resources like ASID + *---------------------------------------------------------------------------*/ +void tee_mmu_final(struct user_ta_ctx *utc); + +/* Map stack of a user TA. */ +void tee_mmu_map_stack(struct user_ta_ctx *utc, struct mobj *mobj); +/* + * Map a code segment of a user TA, this function may be called multiple + * times if there's several segments. + */ +TEE_Result tee_mmu_map_add_segment(struct user_ta_ctx *utc, struct mobj *mobj, + size_t offs, size_t size, uint32_t prot); + +void tee_mmu_map_clear(struct user_ta_ctx *utc); + +/* Map parameters for a user TA */ +TEE_Result tee_mmu_map_param(struct user_ta_ctx *utc, + struct tee_ta_param *param, void *param_va[TEE_NUM_PARAMS]); + +/* + * If the rwmem area covers more than one page directory @pgdir_offset has + * to be honoured unless it's -1. + */ +TEE_Result tee_mmu_add_rwmem(struct user_ta_ctx *utc, struct mobj *mobj, + int pgdir_offset, vaddr_t *va); +void tee_mmu_rem_rwmem(struct user_ta_ctx *utc, struct mobj *mobj, vaddr_t va); + +/* + * TA private memory is defined as TA image static segment (code, ro/rw static + * data, heap, stack). The sole other virtual memory mapped to TA are memref + * parameters. These later are considered outside TA private memory as it + * might be accessed by the TA and its client(s). + */ +bool tee_mmu_is_vbuf_inside_ta_private(const struct user_ta_ctx *utc, + const void *va, size_t size); + +bool tee_mmu_is_vbuf_intersect_ta_private(const struct user_ta_ctx *utc, + const void *va, size_t size); + +TEE_Result tee_mmu_vbuf_to_mobj_offs(const struct user_ta_ctx *utc, + const void *va, size_t size, + struct mobj **mobj, size_t *offs); + +/*----------------------------------------------------------------------------- + * tee_mmu_user_va2pa - Translate virtual user address to physical address + * given the user context. + * Interface is deprecated, use virt_to_phys() instead. + *---------------------------------------------------------------------------*/ +TEE_Result tee_mmu_user_va2pa_helper(const struct user_ta_ctx *utc, void *ua, + paddr_t *pa); + +/*----------------------------------------------------------------------------- + * tee_mmu_user_va2pa - Translate physical address to virtual user address + * given the user context. + * Interface is deprecated, use phys_to_virt() instead. + *---------------------------------------------------------------------------*/ +TEE_Result tee_mmu_user_pa2va_helper(const struct user_ta_ctx *utc, + paddr_t pa, void **va); + +/*----------------------------------------------------------------------------- + * tee_mmu_check_access_rights - + *---------------------------------------------------------------------------*/ +TEE_Result tee_mmu_check_access_rights(const struct user_ta_ctx *utc, + uint32_t flags, uaddr_t uaddr, + size_t len); + +/*----------------------------------------------------------------------------- + * If ctx is NULL user mapping is removed and ASID set to 0 + *---------------------------------------------------------------------------*/ +void tee_mmu_set_ctx(struct tee_ta_ctx *ctx); +struct tee_ta_ctx *tee_mmu_get_ctx(void); + +/* Returns virtual address to which TA is loaded */ +uintptr_t tee_mmu_get_load_addr(const struct tee_ta_ctx *const ctx); + +/* init some allocation pools */ +void teecore_init_ta_ram(void); +void teecore_init_pub_ram(void); + +uint32_t tee_mmu_user_get_cache_attr(struct user_ta_ctx *utc, void *va); + +TEE_Result tee_mmu_register_shm(paddr_t pa, size_t len, uint32_t attr); + +#endif |