[Docs] Added Information about Secure Monitor
[3rdparty/ote_partner/tlk.git] / include / kernel / task.h
1 /*
2  * Copyright (c) 2012-2015, NVIDIA CORPORATION. All rights reserved
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining
5  * a copy of this software and associated documentation files
6  * (the "Software"), to deal in the Software without restriction,
7  * including without limitation the rights to use, copy, modify, merge,
8  * publish, distribute, sublicense, and/or sell copies of the Software,
9  * and to permit persons to whom the Software is furnished to do so,
10  * subject to the following conditions:
11  *
12  * The above copyright notice and this permission notice shall be
13  * included in all copies or substantial portions of the Software.
14  *
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
18  * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
19  * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
20  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
21  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22  */
23 #ifndef __KERNEL_TASK_H
24 #define __KERNEL_TASK_H
25
26 /* offsets within task_t */
27 #define TASK_CONTEXTID          0x24
28 #define TASK_PAGETABLE          0x28
29
30 #ifndef ASSEMBLY
31
32 #include <sys/types.h>
33 #include <arch/task.h>
34 #include <list.h>
35 #include <kernel/elf.h>
36
37 #include <lib/ote/ote_protocol.h>
38
39 #define TASK_START_ADDR         0x8000
40 #define TASK_STACK_ADDR         MAX_TASK_SIZE
41
42 typedef enum {
43         TM_UX           = (1 << 0),
44         TM_UW           = (1 << 1),
45         TM_UR           = (1 << 2),
46         TM_PHYS_CONTIG  = (1 << 20),
47         TM_NS_MEM       = (1 << 21),
48         TM_NS_MEM_PRIV  = (1 << 22),
49         TM_SEC_VA       = (1 << 23),
50         TM_KERN_VA      = (1 << 24),
51         TM_PHYS_ALLOCATED = (1 << 28),
52         TM_KERN_SEC_VA  = (1 << 29),
53         TM_IO           = (1 << 30),
54 } tmflags_t;
55
56 /* first 3 flag bits equate to prog header PF_* flags */
57 #define PF_FLAG_MASK    (TM_UR | TM_UW | TM_UX)
58
59 typedef struct task_map
60 {
61         /* either contiguous physaddr or pagelist */
62         union {
63                 paddr_t contig;
64                 paddr_t *pagelist;
65         } u_phys;
66         addr_t vaddr;
67         u_int  offset;
68         u_int  size;
69         u_int  id;
70
71         tmflags_t flags;
72         void *map_attrs;
73
74         struct list_node node;
75 } task_map_t;
76
77 typedef struct
78 {
79         te_service_id_t uuid;
80         u_int    multi_instance;
81         u_int    min_stack_size;
82         u_int    min_heap_size;
83         u_int    map_io_mem_cnt;
84         u_int    restrict_access;
85         u_int    manifest_exists;
86         u_int    authorizations;
87         u_int    initial_state;
88         u_int    config_entry_cnt;
89         u_int    *config_blob;
90 } task_props_t;
91
92 /* task lifecycle states
93  */
94 typedef enum {
95         TASK_STATE_UNKNOWN = 0,
96         TASK_STATE_INIT,
97         TASK_STATE_STARTING,
98         TASK_STATE_ACTIVE,
99         TASK_STATE_BLOCKED,
100         TASK_STATE_TERMINATED
101 } task_state_t;
102
103 typedef enum {
104         TASK_TYPE_UNKNOWN = 0,
105         TASK_TYPE_STATIC,
106         TASK_TYPE_LOADED
107 } task_type_t;
108
109 typedef struct task
110 {
111         addr_t entry;
112
113         addr_t start_code;
114         addr_t end_code;
115         addr_t start_data;
116         addr_t end_data;
117         addr_t end_bss;
118         addr_t start_brk;
119         addr_t curr_brk;
120         addr_t end_brk;
121
122         /* field offset hard coded */
123         u_int context_id;
124
125         /* field offset hard coded */
126         paddr_t page_table;
127
128         struct list_node map_list;
129
130         task_map_t *stack_map;
131         vaddr_t sp;
132
133         struct list_node thread_node;
134         task_props_t props;
135         u_int te_instances;
136
137         struct list_node *valloc_list;
138         u_int valloc_start;
139         u_int valloc_end;
140
141         Elf32_Ehdr *elf_hdr;
142
143         task_state_t task_state;
144         task_type_t task_type;
145         u_int task_index;
146         char task_name[OTE_TASK_NAME_MAX_LENGTH];
147         unsigned char task_private_data[OTE_TASK_PRIVATE_DATA_LENGTH];
148         uint32_t task_size;
149         struct list_node node;
150
151         /* bitfield of events task has registered for.  */
152         uint32_t ta_events_mask;
153 } task_t;
154
155 void task_init();
156 void task_early_init();
157
158 addr_t task_find_address_space(task_t *taskp, u_int size, u_int align);
159 void task_add_mapping(task_t *taskp, task_map_t *mptr);
160 void task_delete_mapping(task_t *taskp, task_map_t *mptr);
161 task_map_t *task_find_mapping(task_t *taskp, addr_t vaddr, u_int size);
162 task_map_t *task_find_mapping_by_id(task_t *taskp, u_int id);
163 status_t task_get_physaddr(task_t *taskp, addr_t vaddr, paddr_t *paddr);
164 bool task_valid_address(vaddr_t addr, u_int size);
165 task_t *task_find_task_by_uuid(te_service_id_t *uuid);
166
167 /*! Lookup task by its task slot index in task_list.
168  *
169  * \param index[in] task index (0..(task_count-1)).
170  *
171  * \return Return pointer to task or NULL if index is >= task_count.
172  *
173  * This may return a pointer to inactive task slot.
174  */
175 task_t *task_find_task_by_index(uint32_t index);
176
177 /*! Return a pointer to const char C-string PREFIXtasknameSUFFIX if task has a name,
178  * otherwise return pointer to "".
179  *
180  * On entry buf is a pointer to memory area of length buflen characters.
181  *
182  * \param task[in]      get taskname from here
183  * \param prefix[in]    added before task name, if not null
184  * \param suffix[in]    added after task name, if not null
185  * \param buf[in/out]   if task has a name, will contain "prefixTASKNAMEsuffix" C-string
186  * \param buflen[in]    buf length (must be long enough to contain prefix, task name, suffix and nul)
187  */
188 const char *task_get_name_str(const task_t *task, const char *prefix, const char *suffix,
189                               char *buf, uint32_t buflen);
190
191 /*! Log the uuid && name of taskp at dprintf() level with optional prefix string.
192  *
193  * \param level  defines dprintf() level to conditionally print at.
194  * \param prefix is an optional string prefix (or NULL).
195  * \param taskp  is the task which uuid is to be printed in "hex-dash" format
196  */
197 void task_print_id(uint32_t level, const char *prefix, const task_t *taskp);
198
199 /*! Log the uuid at dprintf() level.
200  *
201  * \param level defines dprintf() level to conditionally print at.
202  * \param uuid  is an UUID to log.
203  */
204 void task_print_uuid(uint32_t level, const te_service_id_t *uuid);
205
206 status_t task_prepare(char *task_addr, u_int task_size, task_t *taskp,
207                       Elf32_Shdr **bss_pad_shdr_p, task_type_t task_type);
208
209 status_t task_init_one_task(task_t *task);
210
211 /*! Atomically commit task (and set it's index) to the known task list
212  * unless there is an error.
213  *
214  * UUID duplicates are atomically checked here.
215  *
216  * \param task_p[in] task object pointer.
217  *
218  * \return NO_ERROR on success and on failure:
219  *         ERR_TOO_MANY_TASKS if not more tasks can be installed (out of memory)
220  *         ERR_ALREADY_EXISTS if a task with matching uuid already exists
221  *         ERR_INVALID_ARGS if parameters are invalid.
222  */
223 status_t task_register(task_t **task_p);
224
225 /*! return a const pointer to task_list header node */
226 const struct list_node *task_get_task_list(void);
227
228 /*! return the number of currently existing active tasks */
229 u_int task_get_active_count(void);
230
231 /*! return the number of registered tasks since boot */
232 u_int task_get_count(void);
233
234 /*! set the requested callbacks for ta events */
235 status_t task_register_ta_events(task_t *task, uint32_t events_mask);
236
237 /*! schedule tasks that have requested callbacks for event.  */
238 status_t task_signal_ta_event(enum ta_event_id event, void *arg);
239
240 #endif /* ASSEMBLY */
241 #endif /* __KERNEL_TASK_H */