0b6a879f0ce566af8fac2a4c2a478b092f6fd1b5
[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    install_priv;
86         u_int    immutable;
87         u_int    config_entry_cnt;
88         u_int    *config_blob;
89 } task_props_t;
90
91 /* task lifecycle states */
92 typedef enum {
93         TASK_STATE_UNKNOWN,
94         TASK_STATE_INIT,
95         TASK_STATE_ACTIVE,
96         TASK_STATE_TERMINATED
97 } task_state_t;
98
99 typedef enum {
100         TASK_TYPE_UNKNOWN,
101         TASK_TYPE_STATIC,
102         TASK_TYPE_LOADED
103 } task_type_t;
104
105 typedef struct task
106 {
107         addr_t entry;
108
109         addr_t start_code;
110         addr_t end_code;
111         addr_t start_data;
112         addr_t end_data;
113         addr_t end_bss;
114         addr_t start_brk;
115         addr_t curr_brk;
116         addr_t end_brk;
117
118         /* field offset hard coded */
119         u_int context_id;
120
121         /* field offset hard coded */
122         paddr_t page_table;
123
124         struct list_node map_list;
125
126         task_map_t *stack_map;
127         vaddr_t sp;
128
129         struct list_node thread_node;
130         task_props_t props;
131         u_int te_instances;
132
133         struct list_node *valloc_list;
134         u_int valloc_start;
135         u_int valloc_end;
136
137         Elf32_Ehdr *elf_hdr;
138
139         task_state_t task_state;
140         task_type_t task_type;
141         u_int task_index;
142         char task_name[ OTE_TASK_NAME_MAX_LENGTH ];
143         unsigned char task_private_data[ OTE_TASK_PRIVATE_DATA_LENGTH ];
144 } task_t;
145
146 void task_init();
147 void task_early_init();
148
149 addr_t task_find_address_space(task_t *taskp, u_int size, u_int align);
150 void task_add_mapping(task_t *taskp, task_map_t *mptr);
151 void task_delete_mapping(task_t *taskp, task_map_t *mptr);
152 task_map_t *task_find_mapping(task_t *taskp, addr_t vaddr, u_int size);
153 task_map_t *task_find_mapping_by_id(task_t *taskp, u_int id);
154 status_t task_get_physaddr(task_t *taskp, addr_t vaddr, paddr_t *paddr);
155 bool task_valid_address(vaddr_t addr, u_int size);
156 task_t *task_find_task_by_uuid(te_service_id_t *uuid);
157
158 /*! Lookup task by its task slot index in task_list.
159  *
160  * \param index[in] task index (0..(task_count-1)).
161  *
162  * \return Return pointer to task or NULL if index is >= task_count.
163  *
164  * This may return a pointer to inactive task slot.
165  */
166 task_t *task_find_task_by_index(uint32_t index);
167
168 /*! Log the uuid of TASKP at dprintf LEVEL with optional PREFIX string.
169  *
170  * \param LEVEL defines dprintf() level to conditionally print at.
171  * \param PREFIX is an optional string prefix (or NULL).
172  * \param TASKP is the task which uuid is to be printed in "hex-dash" format
173  */
174 void task_print_uuid(uint32_t level, const char *prefix, const task_t *taskp);
175
176 status_t task_prepare(char *task_addr, u_int task_size, task_t *taskp,
177                       Elf32_Shdr **bss_pad_shdr_p);
178
179 status_t task_init_one_task(task_t *task, u_int task_type);
180
181 /*! Atomically commit task (and set it's index) to the known task list
182  * unless there is an error. TASK_P value swapped to track the registered
183  * task header (old referenced task object is copied to task list and
184  * then cleared).
185  *
186  * UUID duplicates are atomically checked here.
187  *
188  * \param task_p[in/out] input task object pointer is atomically swapped to a
189  *                       registered task object pointer.
190  *
191  * \return NO_ERROR on success and on failure:
192  *         ERR_TOO_MANY_TASKS if not more tasks can be installed (out of memory)
193  *         ERR_ALREADY_EXISTS if a task with matching uuid already exists
194  *         ERR_INVALID_ARGS if parameters are invalid.
195  */
196 status_t task_register (task_t **task_p);
197
198 /*! Get a const reference to start of task list (task 0 object). */
199 const task_t *task_get_list(void);
200
201 /*! return the number of registered tasks */
202 u_int task_get_count(void);
203
204 /*! Return the max number of tasks that can be registered to the system.
205  * The actual number may be smaller depending on memory size vs task size.
206  */
207 u_int task_get_max_count(void);
208
209 #endif /* ASSEMBLY */
210 #endif /* __KERNEL_TASK_H */