• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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