04cc2ce9dd47f64f1e7fa4158bc6bc55ea980fb7
[3rdparty/ote_partner/tlk.git] / include / kernel / task.h
1 /*
2  * Copyright (c) 2012-2014, 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_KERN_SEC_VA  = (1 << 29),
52         TM_IO           = (1 << 30),
53 } tmflags_t;
54
55 /* first 3 flag bits equate to prog header PF_* flags */
56 #define PF_FLAG_MASK    (TM_UR | TM_UW | TM_UX)
57
58 typedef struct task_map
59 {
60         /* either contiguous physaddr or pagelist */
61         union {
62                 paddr_t contig;
63                 paddr_t *pagelist;
64         } u_phys;
65         addr_t vaddr;
66         u_int  offset;
67         u_int  size;
68         u_int  id;
69
70         tmflags_t flags;
71         void *map_attrs;
72
73         struct list_node node;
74 } task_map_t;
75
76 typedef struct
77 {
78         te_service_id_t uuid;
79         u_int    multi_instance;
80         u_int    min_stack_size;
81         u_int    min_heap_size;
82         u_int    map_io_mem_cnt;
83         u_int    restrict_access;
84         u_int    manifest_exists;
85         u_int    authorizations;
86         u_int    initial_state;
87         u_int    config_entry_cnt;
88         u_int    *config_blob;
89 } task_props_t;
90
91 /* task lifecycle states
92  */
93 typedef enum {
94         TASK_STATE_UNKNOWN = 0,
95         TASK_STATE_INIT,
96         TASK_STATE_ACTIVE,
97         TASK_STATE_BLOCKED,
98         TASK_STATE_TERMINATED
99 } task_state_t;
100
101 typedef enum {
102         TASK_TYPE_UNKNOWN = 0,
103         TASK_TYPE_STATIC,
104         TASK_TYPE_LOADED
105 } task_type_t;
106
107 typedef struct task
108 {
109         addr_t entry;
110
111         addr_t start_code;
112         addr_t end_code;
113         addr_t start_data;
114         addr_t end_data;
115         addr_t end_bss;
116         addr_t start_brk;
117         addr_t curr_brk;
118         addr_t end_brk;
119
120         /* field offset hard coded */
121         u_int context_id;
122
123         /* field offset hard coded */
124         paddr_t page_table;
125
126         struct list_node map_list;
127
128         task_map_t *stack_map;
129         vaddr_t sp;
130
131         struct list_node thread_node;
132         task_props_t props;
133         u_int te_instances;
134
135         struct list_node *valloc_list;
136         u_int valloc_start;
137         u_int valloc_end;
138
139         Elf32_Ehdr *elf_hdr;
140
141         task_state_t task_state;
142         task_type_t task_type;
143         u_int task_index;
144         char task_name[OTE_TASK_NAME_MAX_LENGTH];
145         unsigned char task_private_data[OTE_TASK_PRIVATE_DATA_LENGTH];
146         uint32_t task_size;
147         struct list_node node;
148 } task_t;
149
150 void task_init();
151 void task_early_init();
152
153 addr_t task_find_address_space(task_t *taskp, u_int size, u_int align);
154 void task_add_mapping(task_t *taskp, task_map_t *mptr);
155 void task_delete_mapping(task_t *taskp, task_map_t *mptr);
156 task_map_t *task_find_mapping(task_t *taskp, addr_t vaddr, u_int size);
157 task_map_t *task_find_mapping_by_id(task_t *taskp, u_int id);
158 status_t task_get_physaddr(task_t *taskp, addr_t vaddr, paddr_t *paddr);
159 bool task_valid_address(vaddr_t addr, u_int size);
160 task_t *task_find_task_by_uuid(te_service_id_t *uuid);
161
162 /*! Lookup task by its task slot index in task_list.
163  *
164  * \param index[in] task index (0..(task_count-1)).
165  *
166  * \return Return pointer to task or NULL if index is >= task_count.
167  *
168  * This may return a pointer to inactive task slot.
169  */
170 task_t *task_find_task_by_index(uint32_t index);
171
172 /*! Return a pointer to const char C-string PREFIXtasknameSUFFIX if task has a name,
173  * otherwise return pointer to "".
174  *
175  * PREFIX and SUFFIX may be NULL (treated as empty strings).
176  *
177  * BUF must be at least length(PREFIX)+OTE_TASK_NAME_MAX_LENGTH+length(SUFFIX), buffer length in BUFLEN.
178  */
179 const char *task_get_name_str(const task_t *task, const char *prefix, const char *suffix,
180                               char *buf, uint32_t buflen);
181
182 /*! Log the uuid of TASKP at dprintf LEVEL with optional PREFIX string.
183  *
184  * \param LEVEL defines dprintf() level to conditionally print at.
185  * \param PREFIX is an optional string prefix (or NULL).
186  * \param TASKP is the task which uuid is to be printed in "hex-dash" format
187  */
188 void task_print_uuid(uint32_t level, const char *prefix, const task_t *taskp);
189
190 status_t task_prepare(char *task_addr, u_int task_size, task_t *taskp,
191                       Elf32_Shdr **bss_pad_shdr_p, task_type_t task_type);
192
193 status_t task_init_one_task(task_t *task);
194
195 /*! Atomically commit task (and set it's index) to the known task list
196  * unless there is an error.
197  *
198  * UUID duplicates are atomically checked here.
199  *
200  * \param task_p[in] task object pointer.
201  *
202  * \return NO_ERROR on success and on failure:
203  *         ERR_TOO_MANY_TASKS if not more tasks can be installed (out of memory)
204  *         ERR_ALREADY_EXISTS if a task with matching uuid already exists
205  *         ERR_INVALID_ARGS if parameters are invalid.
206  */
207 status_t task_register(task_t **task_p);
208
209 /*! return the number of currently existing active tasks */
210 u_int task_get_active_count(void);
211
212 /*! return the number of registered tasks since boot */
213 u_int task_get_count(void);
214
215 #endif /* ASSEMBLY */
216 #endif /* __KERNEL_TASK_H */