First version
[3rdparty/ote_partner/tlk.git] / include / kernel / task.h
1 /*
2  * Copyright (c) 2012-2013, 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_IO           = (1 << 30),
52 } tmflags_t;
53
54 /* first 3 flag bits equate to prog header PF_* flags */
55 #define PF_FLAG_MASK    (TM_UR | TM_UW | TM_UX)
56
57 typedef struct task_map
58 {
59         /* either contiguous physaddr or pagelist */
60         union {
61                 paddr_t contig;
62                 paddr_t *pagelist;
63         } u_phys;
64         addr_t vaddr;
65         u_int  offset;
66         u_int  size;
67         u_int  id;
68
69         tmflags_t flags;
70         void *map_attrs;
71
72         struct list_node node;
73 } task_map_t;
74
75 typedef struct
76 {
77         te_service_id_t uuid;
78         u_int    multi_instance;
79         u_int    min_stack_size;
80         u_int    min_heap_size;
81         u_int    map_io_mem_cnt;
82         u_int    restrict_access;
83         u_int    manifest_exists;
84         u_int    install_priv;
85         u_int    immutable;
86         u_int    config_entry_cnt;
87         u_int    *config_blob;
88 } task_props_t;
89
90 /* task lifecycle states */
91 typedef enum {
92         TASK_STATE_UNKNOWN,
93         TASK_STATE_INIT,
94         TASK_STATE_ACTIVE,
95         TASK_STATE_TERMINATED
96 } task_state_t;
97
98 typedef enum {
99         TASK_TYPE_UNKNOWN,
100         TASK_TYPE_STATIC,
101         TASK_TYPE_LOADED
102 } task_type_t;
103
104 typedef struct task
105 {
106         addr_t entry;
107
108         addr_t start_code;
109         addr_t end_code;
110         addr_t start_data;
111         addr_t end_data;
112         addr_t end_bss;
113         addr_t start_brk;
114         addr_t curr_brk;
115         addr_t end_brk;
116
117         /* field offset hard coded */
118         u_int context_id;
119
120         /* field offset hard coded */
121         paddr_t page_table;
122
123         struct list_node map_list;
124
125         task_map_t *stack_map;
126         vaddr_t sp;
127
128         struct list_node thread_node;
129         task_props_t props;
130         u_int te_instances;
131
132         struct list_node *valloc_list;
133         u_int valloc_start;
134         u_int valloc_end;
135
136         Elf32_Ehdr *elf_hdr;
137
138         task_state_t task_state;
139         task_type_t task_type;
140         u_int task_index;
141 } task_t;
142
143 void task_init();
144 void task_early_init();
145
146 addr_t task_find_address_space(task_t *taskp, u_int size, u_int align);
147 void task_add_mapping(task_t *taskp, task_map_t *mptr);
148 void task_delete_mapping(task_t *taskp, task_map_t *mptr);
149 task_map_t *task_find_mapping(task_t *taskp, addr_t vaddr, u_int size);
150 task_map_t *task_find_mapping_by_id(task_t *taskp, u_int id);
151 status_t task_get_physaddr(task_t *taskp, addr_t vaddr, paddr_t *paddr);
152 bool task_valid_address(vaddr_t addr, u_int size);
153 task_t *task_find_task_by_uuid(te_service_id_t *uuid);
154
155 /*! Log the uuid of TASKP at dprintf LEVEL with optional PREFIX string.
156  *
157  * \param LEVEL defines dprintf() level to conditionally print at.
158  * \param PREFIX is an optional string prefix (or NULL).
159  * \param TASKP is the task which uuid is to be printed in "hex-dash" format
160  */
161 void task_print_uuid(uint32_t level, const char *prefix, const task_t *taskp);
162
163 status_t task_prepare(char *task_addr, u_int task_size, task_t *taskp,
164                       Elf32_Shdr **bss_pad_shdr_p);
165
166 status_t task_init_one_task(task_t *task, u_int task_type);
167
168 #endif
169 #endif