Introduce reference-counted kobjects
[helenos.git] / kernel / generic / include / cap / cap.h
blob360ce7f2d8706126dbf6b6f0859cbb669eab2559
1 /*
2 * Copyright (c) 2017 Jakub Jermar
3 * All rights reserved.
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
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.
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.
29 /** @addtogroup generic
30 * @{
32 /** @file
35 #ifndef KERN_CAP_H_
36 #define KERN_CAP_H_
38 #include <typedefs.h>
39 #include <adt/list.h>
40 #include <synch/mutex.h>
41 #include <atomic.h>
43 #define MAX_CAPS 64
45 typedef int cap_handle_t;
47 typedef enum {
48 CAP_STATE_FREE,
49 CAP_STATE_ALLOCATED,
50 CAP_STATE_PUBLISHED
51 } cap_state_t;
53 typedef enum {
54 KOBJECT_TYPE_PHONE,
55 KOBJECT_TYPE_IRQ,
56 KOBJECT_TYPE_MAX
57 } kobject_type_t;
59 struct task;
60 struct phone;
61 struct irq;
63 struct kobject;
64 typedef struct kobject_ops {
65 bool (*reclaim)(struct kobject *);
66 void (*destroy)(void *);
67 } kobject_ops_t;
69 typedef struct kobject {
70 kobject_type_t type;
71 atomic_t refcnt;
73 kobject_ops_t *ops;
75 union {
76 void *raw;
77 struct phone *phone;
78 struct irq *irq;
80 } kobject_t;
82 typedef struct cap {
83 cap_state_t state;
85 cap_handle_t handle;
87 /* Link to the task's capabilities of the same kobject type. */
88 link_t link;
90 /* The underlying kernel object. */
91 kobject_t *kobject;
92 } cap_t;
94 typedef struct cap_info {
95 mutex_t lock;
97 list_t type_list[KOBJECT_TYPE_MAX];
99 cap_t *caps;
100 } cap_info_t;
102 extern void caps_task_alloc(struct task *);
103 extern void caps_task_free(struct task *);
104 extern void caps_task_init(struct task *);
105 extern bool caps_apply_to_kobject_type(struct task *, kobject_type_t,
106 bool (*)(cap_t *, void *), void *);
108 extern void cap_initialize(cap_t *, cap_handle_t);
109 extern cap_handle_t cap_alloc(struct task *);
110 extern void cap_publish(struct task *, cap_handle_t, kobject_t *);
111 extern kobject_t *cap_unpublish(struct task *, cap_handle_t, kobject_type_t);
112 extern void cap_free(struct task *, cap_handle_t);
114 extern void kobject_initialize(kobject_t *, kobject_type_t, void *,
115 kobject_ops_t *);
116 extern kobject_t *kobject_get(struct task *, cap_handle_t, kobject_type_t);
117 extern void kobject_put(kobject_t *);
119 #endif
121 /** @}