1 /* 2 * Copyright (c) 2023 Institute of Parallel And Distributed Systems (IPADS), Shanghai Jiao Tong University (SJTU) 3 * Licensed under the Mulan PSL v2. 4 * You can use this software according to the terms and conditions of the Mulan PSL v2. 5 * You may obtain a copy of Mulan PSL v2 at: 6 * http://license.coscl.org.cn/MulanPSL2 7 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR 8 * IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR 9 * PURPOSE. 10 * See the Mulan PSL v2 for more details. 11 */ 12 #ifndef OBJECT_MEMORY_H 13 #define OBJECT_MEMORY_H 14 15 #include <common/radix.h> 16 #include <object/cap_group.h> 17 #ifdef CHCORE_OH_TEE 18 #include <common/tee_uuid.h> 19 #endif /* CHCORE_OH_TEE */ 20 21 typedef unsigned pmo_type_t; 22 #define PMO_ANONYM 0 /* lazy allocation */ 23 #define PMO_DATA 1 /* immediate allocation */ 24 #define PMO_FILE 2 /* file backed */ 25 #define PMO_SHM 3 /* shared memory */ 26 #define PMO_USER_PAGER 4 /* support user pager */ 27 #define PMO_DEVICE 5 /* memory mapped device registers */ 28 #define PMO_DATA_NOCACHE 6 /* non-cacheable immediate allocation */ 29 #ifdef CHCORE_OH_TEE 30 #define PMO_TZ_NS 7 /* TrustZone non-secure memory */ 31 #endif /* CHCORE_OH_TEE */ 32 33 #define PMO_FORBID 10 /* Forbidden area: avoid overflow */ 34 35 #ifdef CHCORE_OH_TEE 36 struct ns_pmo_private { 37 bool mapped; 38 struct cap_group *creater; 39 vaddr_t vaddr; 40 size_t len; 41 }; 42 struct tee_shm_private { 43 struct tee_uuid uuid; 44 struct cap_group *owner; 45 }; 46 #endif /* CHCORE_OH_TEE */ 47 48 /* This struct represents some physical memory resource */ 49 struct pmobject { 50 paddr_t start; 51 size_t size; 52 pmo_type_t type; 53 /* record physical pages for on-demand-paging pmo */ 54 struct radix *radix; 55 /* 56 * The field of 'private' depends on 'type'. 57 * PMO_FILE: it points to fmap_fault_pool 58 * others: NULL 59 */ 60 void *private; 61 #ifdef CHCORE_OH_TEE 62 struct lock owner_lock; 63 struct cap_group *owner; 64 #endif /* CHCORE_OH_TEE */ 65 }; 66 67 /* kernel internal interfaces */ 68 cap_t create_pmo(size_t size, pmo_type_t type, struct cap_group *cap_group, 69 paddr_t paddr, struct pmobject **new_pmo); 70 void commit_page_to_pmo(struct pmobject *pmo, unsigned long index, paddr_t pa); 71 paddr_t get_page_from_pmo(struct pmobject *pmo, unsigned long index); 72 int map_pmo_in_current_cap_group(cap_t pmo_cap, unsigned long addr, 73 unsigned long perm); 74 void pmo_deinit(void *pmo_ptr); 75 76 /* syscalls */ 77 cap_t sys_create_device_pmo(unsigned long paddr, unsigned long size); 78 cap_t sys_create_pmo(unsigned long size, pmo_type_t type); 79 int sys_write_pmo(cap_t pmo_cap, unsigned long offset, unsigned long user_ptr, 80 unsigned long len); 81 int sys_read_pmo(cap_t pmo_cap, unsigned long offset, unsigned long user_ptr, 82 unsigned long len); 83 int sys_get_phys_addr(vaddr_t va, paddr_t *pa_buf); 84 int sys_map_pmo(cap_t target_cap_group_cap, cap_t pmo_cap, unsigned long addr, 85 unsigned long perm, unsigned long len); 86 int sys_unmap_pmo(cap_t target_cap_group_cap, cap_t pmo_cap, 87 unsigned long addr); 88 unsigned long sys_handle_brk(unsigned long addr, unsigned long heap_start); 89 int sys_handle_mprotect(unsigned long addr, unsigned long length, int prot); 90 unsigned long sys_get_free_mem_size(void); 91 int sys_tee_create_ns_pmo(unsigned long paddr, unsigned long size); 92 93 #ifdef CHCORE_OH_TEE 94 95 cap_t sys_create_ns_pmo(cap_t cap_group, unsigned long paddr, 96 unsigned long size); 97 int sys_destroy_ns_pmo(cap_t cap_group, cap_t pmo); 98 99 cap_t sys_create_tee_shared_pmo(cap_t cap_group, struct tee_uuid *uuid, 100 unsigned long size, cap_t *self_cap); 101 int sys_transfer_pmo_owner(cap_t pmo, cap_t cap_group); 102 #endif /* CHCORE_OH_TEE */ 103 104 #endif /* OBJECT_MEMORY_H */ 105