summaryrefslogtreecommitdiff
path: root/core/include/mm/tee_mmu.h
diff options
context:
space:
mode:
Diffstat (limited to 'core/include/mm/tee_mmu.h')
-rw-r--r--core/include/mm/tee_mmu.h123
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