source: mainline/kernel/generic/include/proc/task.h@ 549bef1

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since 549bef1 was 9e87562, checked in by Jakub Jermar <jakub@…>, 8 years ago

Make all accesses to capabilites exclusive

This commit makes sure that all accesses to the capabilities array and other
metadata are protected by a mutex. This is necessary for future resizing of the
capabilities array.

Group task's capabilities by type so that it is possible to visit all
capabilities of the given type effectively.

Provide cap_publish() and cap_unpublish() to automate steps that make the
capability visible/invisible to userspace and insert/remove the capability from
the respective type list.

  • Property mode set to 100644
File size: 4.8 KB
Line 
1/*
2 * Copyright (c) 2010 Jakub Jermar
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * - Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * - Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * - The name of the author may not be used to endorse or promote products
15 * derived from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29/** @addtogroup genericproc
30 * @{
31 */
32/** @file
33 */
34
35#ifndef KERN_TASK_H_
36#define KERN_TASK_H_
37
38#include <cpu.h>
39#include <ipc/ipc.h>
40#include <ipc/event.h>
41#include <ipc/kbox.h>
42#include <synch/spinlock.h>
43#include <synch/mutex.h>
44#include <synch/futex.h>
45#include <synch/workqueue.h>
46#include <adt/avl.h>
47#include <adt/btree.h>
48#include <adt/cht.h>
49#include <adt/list.h>
50#include <security/perm.h>
51#include <arch/proc/task.h>
52#include <arch/proc/thread.h>
53#include <arch/context.h>
54#include <arch/fpu_context.h>
55#include <arch/cpu.h>
56#include <mm/tlb.h>
57#include <proc/scheduler.h>
58#include <udebug/udebug.h>
59#include <mm/as.h>
60#include <abi/sysinfo.h>
61#include <arch.h>
62#include <cap/cap.h>
63
64#define TASK THE->task
65
66
67struct thread;
68struct cap;
69
70/** Task structure. */
71typedef struct task {
72 /** Task's linkage for the tasks_tree AVL tree. */
73 avltree_node_t tasks_tree_node;
74
75 /** Task lock.
76 *
77 * Must be acquired before threads_lock and thread lock of any of its
78 * threads.
79 */
80 IRQ_SPINLOCK_DECLARE(lock);
81
82 char name[TASK_NAME_BUFLEN];
83 /** List of threads contained in this task. */
84 list_t threads;
85 /** Address space. */
86 as_t *as;
87 /** Unique identity of task. */
88 task_id_t taskid;
89 /** Task security container. */
90 container_id_t container;
91
92 /** Number of references (i.e. threads). */
93 atomic_t refcount;
94 /** Number of threads that haven't exited yet. */
95 atomic_t lifecount;
96
97 /** Task permissions. */
98 perm_t perms;
99
100 /** Capabilities */
101 cap_info_t *cap_info;
102
103 /* IPC stuff */
104
105 /** Receiving communication endpoint */
106 answerbox_t answerbox;
107
108 /** Spinlock protecting the active_calls list. */
109 SPINLOCK_DECLARE(active_calls_lock);
110
111 /**
112 * List of all calls sent by this task that have not yet been
113 * answered.
114 */
115 list_t active_calls;
116
117 event_t events[EVENT_TASK_END - EVENT_END];
118
119 /** IPC statistics */
120 stats_ipc_t ipc_info;
121
122#ifdef CONFIG_UDEBUG
123 /** Debugging stuff. */
124 udebug_task_t udebug;
125
126 /** Kernel answerbox. */
127 kbox_t kb;
128#endif /* CONFIG_UDEBUG */
129
130 /** Architecture specific task data. */
131 task_arch_t arch;
132
133 struct futex_cache {
134 /** CHT mapping virtual addresses of futex variables to futex objects.*/
135 cht_t ht;
136 /** Serializes access to futex_list.*/
137 SPINLOCK_DECLARE(list_lock);
138 /** List of all futexes accesses by this task. */
139 list_t list;
140 work_t destroy_work;
141 } *futexes;
142
143 /** Accumulated accounting. */
144 uint64_t ucycles;
145 uint64_t kcycles;
146} task_t;
147
148IRQ_SPINLOCK_EXTERN(tasks_lock);
149extern avltree_t tasks_tree;
150
151extern void task_init(void);
152extern void task_done(void);
153extern task_t *task_create(as_t *, const char *);
154extern void task_destroy(task_t *);
155extern void task_hold(task_t *);
156extern void task_release(task_t *);
157extern task_t *task_find_by_id(task_id_t);
158extern int task_kill(task_id_t);
159extern void task_kill_self(bool) __attribute__((noreturn));
160extern void task_get_accounting(task_t *, uint64_t *, uint64_t *);
161extern void task_print_list(bool);
162
163extern void perm_set(task_t *, perm_t);
164extern perm_t perm_get(task_t *);
165
166#ifndef task_create_arch
167extern void task_create_arch(task_t *);
168#endif
169
170#ifndef task_destroy_arch
171extern void task_destroy_arch(task_t *);
172#endif
173
174#ifdef __32_BITS__
175extern sysarg_t sys_task_get_id(sysarg64_t *);
176#endif
177
178#ifdef __64_BITS__
179extern sysarg_t sys_task_get_id(void);
180#endif
181
182extern sysarg_t sys_task_set_name(const char *, size_t);
183extern sysarg_t sys_task_kill(task_id_t *);
184extern sysarg_t sys_task_exit(sysarg_t);
185
186#endif
187
188/** @}
189 */
Note: See TracBrowser for help on using the repository browser.