root / xseg / drivers / kernel / xseg_posix.c @ 7ce25cf6
History | View | Annotate | Download (2.5 kB)
1 | 6e0a3771 | Georgios D. Tsoukalas | /* xseg_posix.c
|
---|---|---|---|
2 | 6e0a3771 | Georgios D. Tsoukalas | * kernel driver for posix peers
|
3 | 6e0a3771 | Georgios D. Tsoukalas | */
|
4 | 6e0a3771 | Georgios D. Tsoukalas | |
5 | 6e0a3771 | Georgios D. Tsoukalas | #include <linux/module.h> |
6 | 6e0a3771 | Georgios D. Tsoukalas | #include <linux/moduleparam.h> |
7 | 6e0a3771 | Georgios D. Tsoukalas | #include <linux/init.h> |
8 | 6e0a3771 | Georgios D. Tsoukalas | #include <linux/sched.h> |
9 | 6e0a3771 | Georgios D. Tsoukalas | #include <linux/kernel.h> |
10 | 6e0a3771 | Georgios D. Tsoukalas | #include <linux/slab.h> |
11 | 6e0a3771 | Georgios D. Tsoukalas | #include <linux/fs.h> |
12 | 6e0a3771 | Georgios D. Tsoukalas | #include <linux/errno.h> |
13 | 6e0a3771 | Georgios D. Tsoukalas | #include <linux/timer.h> |
14 | 6e0a3771 | Georgios D. Tsoukalas | #include <linux/types.h> |
15 | 6e0a3771 | Georgios D. Tsoukalas | #include <linux/vmalloc.h> |
16 | 6e0a3771 | Georgios D. Tsoukalas | #include <linux/genhd.h> |
17 | 6e0a3771 | Georgios D. Tsoukalas | #include <linux/blkdev.h> |
18 | 6e0a3771 | Georgios D. Tsoukalas | #include <linux/bio.h> |
19 | 6e0a3771 | Georgios D. Tsoukalas | #include <linux/device.h> |
20 | 6e0a3771 | Georgios D. Tsoukalas | #include <linux/completion.h> |
21 | 6e0a3771 | Georgios D. Tsoukalas | |
22 | 6e0a3771 | Georgios D. Tsoukalas | MODULE_DESCRIPTION("xseg_posix");
|
23 | 6e0a3771 | Georgios D. Tsoukalas | MODULE_AUTHOR("XSEG");
|
24 | 6e0a3771 | Georgios D. Tsoukalas | MODULE_LICENSE("GPL");
|
25 | 6e0a3771 | Georgios D. Tsoukalas | |
26 | 6e0a3771 | Georgios D. Tsoukalas | static int posix_signal_init(void) |
27 | 6e0a3771 | Georgios D. Tsoukalas | { |
28 | 6e0a3771 | Georgios D. Tsoukalas | return 0; |
29 | 6e0a3771 | Georgios D. Tsoukalas | } |
30 | 6e0a3771 | Georgios D. Tsoukalas | |
31 | 6e0a3771 | Georgios D. Tsoukalas | static void posix_signal_quit(void) |
32 | 6e0a3771 | Georgios D. Tsoukalas | { |
33 | 6e0a3771 | Georgios D. Tsoukalas | return;
|
34 | 6e0a3771 | Georgios D. Tsoukalas | } |
35 | 6e0a3771 | Georgios D. Tsoukalas | |
36 | 6e0a3771 | Georgios D. Tsoukalas | static int posix_prepare_wait(struct xseg *xseg, uint32_t portno) |
37 | 6e0a3771 | Georgios D. Tsoukalas | { |
38 | 6e0a3771 | Georgios D. Tsoukalas | return -1; |
39 | 6e0a3771 | Georgios D. Tsoukalas | } |
40 | 6e0a3771 | Georgios D. Tsoukalas | |
41 | 6e0a3771 | Georgios D. Tsoukalas | static int posix_cancel_wait(struct xseg *xseg, uint32_t portno) |
42 | 6e0a3771 | Georgios D. Tsoukalas | { |
43 | 6e0a3771 | Georgios D. Tsoukalas | return -1; |
44 | 6e0a3771 | Georgios D. Tsoukalas | } |
45 | 6e0a3771 | Georgios D. Tsoukalas | |
46 | 6e0a3771 | Georgios D. Tsoukalas | static int posix_wait_signal(struct xseg *xseg, uint32_t timeout) |
47 | 6e0a3771 | Georgios D. Tsoukalas | { |
48 | 6e0a3771 | Georgios D. Tsoukalas | return -1; |
49 | 6e0a3771 | Georgios D. Tsoukalas | } |
50 | 6e0a3771 | Georgios D. Tsoukalas | |
51 | 6e0a3771 | Georgios D. Tsoukalas | static int posix_signal(struct xseg *xseg, uint32_t portno) |
52 | 6e0a3771 | Georgios D. Tsoukalas | { |
53 | 6e0a3771 | Georgios D. Tsoukalas | struct pid *pid;
|
54 | 6e0a3771 | Georgios D. Tsoukalas | struct xseg_port *port = &xseg->ports[portno];
|
55 | 6e0a3771 | Georgios D. Tsoukalas | struct task_struct *task;
|
56 | 6e0a3771 | Georgios D. Tsoukalas | int ret = -ENOENT;
|
57 | 6e0a3771 | Georgios D. Tsoukalas | |
58 | 6e0a3771 | Georgios D. Tsoukalas | rcu_read_lock(); |
59 | 6e0a3771 | Georgios D. Tsoukalas | /* XXX Security: xseg peers can kill anyone */
|
60 | 6e0a3771 | Georgios D. Tsoukalas | pid = find_vpid((pid_t)port->waitcue); |
61 | 6e0a3771 | Georgios D. Tsoukalas | if (!pid)
|
62 | 6e0a3771 | Georgios D. Tsoukalas | goto out;
|
63 | 6e0a3771 | Georgios D. Tsoukalas | task = pid_task(pid, PIDTYPE_PID); |
64 | 6e0a3771 | Georgios D. Tsoukalas | if (!task)
|
65 | 6e0a3771 | Georgios D. Tsoukalas | goto out;
|
66 | 6e0a3771 | Georgios D. Tsoukalas | |
67 | 6e0a3771 | Georgios D. Tsoukalas | ret = send_sig(SIGIO, task, 1);
|
68 | 6e0a3771 | Georgios D. Tsoukalas | out:
|
69 | 6e0a3771 | Georgios D. Tsoukalas | rcu_read_unlock(); |
70 | 6e0a3771 | Georgios D. Tsoukalas | return ret;
|
71 | 6e0a3771 | Georgios D. Tsoukalas | } |
72 | 6e0a3771 | Georgios D. Tsoukalas | |
73 | 6e0a3771 | Georgios D. Tsoukalas | static void *posix_malloc(uint64_t size) |
74 | 6e0a3771 | Georgios D. Tsoukalas | { |
75 | 6e0a3771 | Georgios D. Tsoukalas | return NULL; |
76 | 6e0a3771 | Georgios D. Tsoukalas | } |
77 | 6e0a3771 | Georgios D. Tsoukalas | |
78 | 6e0a3771 | Georgios D. Tsoukalas | static void *posix_realloc(void *mem, uint64_t size) |
79 | 6e0a3771 | Georgios D. Tsoukalas | { |
80 | 6e0a3771 | Georgios D. Tsoukalas | return NULL; |
81 | 6e0a3771 | Georgios D. Tsoukalas | } |
82 | 6e0a3771 | Georgios D. Tsoukalas | |
83 | 6e0a3771 | Georgios D. Tsoukalas | static void posix_mfree(void *mem) { } |
84 | 6e0a3771 | Georgios D. Tsoukalas | |
85 | 6e0a3771 | Georgios D. Tsoukalas | static struct xseg_peer xseg_peer_posix = { |
86 | 6e0a3771 | Georgios D. Tsoukalas | /* xseg signal operations */
|
87 | 6e0a3771 | Georgios D. Tsoukalas | { |
88 | 6e0a3771 | Georgios D. Tsoukalas | .signal_init = posix_signal_init, |
89 | 6e0a3771 | Georgios D. Tsoukalas | .signal_quit = posix_signal_quit, |
90 | 6e0a3771 | Georgios D. Tsoukalas | .cancel_wait = posix_cancel_wait, |
91 | 6e0a3771 | Georgios D. Tsoukalas | .prepare_wait = posix_prepare_wait, |
92 | 6e0a3771 | Georgios D. Tsoukalas | .wait_signal = posix_wait_signal, |
93 | 6e0a3771 | Georgios D. Tsoukalas | .signal = posix_signal, |
94 | 6e0a3771 | Georgios D. Tsoukalas | .malloc = posix_malloc, |
95 | 6e0a3771 | Georgios D. Tsoukalas | .realloc = posix_realloc, |
96 | 6e0a3771 | Georgios D. Tsoukalas | .mfree = posix_mfree |
97 | 6e0a3771 | Georgios D. Tsoukalas | }, |
98 | 6e0a3771 | Georgios D. Tsoukalas | /* name */
|
99 | 6e0a3771 | Georgios D. Tsoukalas | "posix"
|
100 | 6e0a3771 | Georgios D. Tsoukalas | }; |
101 | 6e0a3771 | Georgios D. Tsoukalas | |
102 | 6e0a3771 | Georgios D. Tsoukalas | static int posix_init(void) |
103 | 6e0a3771 | Georgios D. Tsoukalas | { |
104 | 6e0a3771 | Georgios D. Tsoukalas | int r;
|
105 | 6e0a3771 | Georgios D. Tsoukalas | |
106 | 6e0a3771 | Georgios D. Tsoukalas | XSEGLOG("registering xseg types");
|
107 | 6e0a3771 | Georgios D. Tsoukalas | |
108 | 6e0a3771 | Georgios D. Tsoukalas | r = xseg_register_peer(&xseg_peer_posix); |
109 | 6e0a3771 | Georgios D. Tsoukalas | |
110 | 6e0a3771 | Georgios D. Tsoukalas | return r;
|
111 | 6e0a3771 | Georgios D. Tsoukalas | } |
112 | 6e0a3771 | Georgios D. Tsoukalas | |
113 | 6e0a3771 | Georgios D. Tsoukalas | static int posix_quit(void) |
114 | 6e0a3771 | Georgios D. Tsoukalas | { |
115 | 6e0a3771 | Georgios D. Tsoukalas | xseg_unregister_peer(xseg_peer_posix.name); |
116 | 6e0a3771 | Georgios D. Tsoukalas | return 0; |
117 | 6e0a3771 | Georgios D. Tsoukalas | } |
118 | 6e0a3771 | Georgios D. Tsoukalas | |
119 | 6e0a3771 | Georgios D. Tsoukalas | /* *************************** */
|
120 | 6e0a3771 | Georgios D. Tsoukalas | /* ** Module Initialization ** */
|
121 | 6e0a3771 | Georgios D. Tsoukalas | /* *************************** */
|
122 | 6e0a3771 | Georgios D. Tsoukalas | |
123 | 6e0a3771 | Georgios D. Tsoukalas | static int __init xseg_posix_init(void) |
124 | 6e0a3771 | Georgios D. Tsoukalas | { |
125 | 6e0a3771 | Georgios D. Tsoukalas | int ret = -ENOSYS;
|
126 | 6e0a3771 | Georgios D. Tsoukalas | |
127 | 6e0a3771 | Georgios D. Tsoukalas | ret = posix_init(); |
128 | 6e0a3771 | Georgios D. Tsoukalas | if (ret)
|
129 | 6e0a3771 | Georgios D. Tsoukalas | goto out;
|
130 | 6e0a3771 | Georgios D. Tsoukalas | |
131 | 6e0a3771 | Georgios D. Tsoukalas | XSEGLOG("initialization complete");
|
132 | 6e0a3771 | Georgios D. Tsoukalas | out:
|
133 | 6e0a3771 | Georgios D. Tsoukalas | return ret;
|
134 | 6e0a3771 | Georgios D. Tsoukalas | } |
135 | 6e0a3771 | Georgios D. Tsoukalas | |
136 | 6e0a3771 | Georgios D. Tsoukalas | static void __exit xseg_posix_exit(void) |
137 | 6e0a3771 | Georgios D. Tsoukalas | { |
138 | 6e0a3771 | Georgios D. Tsoukalas | posix_quit(); |
139 | 6e0a3771 | Georgios D. Tsoukalas | } |
140 | 6e0a3771 | Georgios D. Tsoukalas | |
141 | 6e0a3771 | Georgios D. Tsoukalas | module_init(xseg_posix_init); |
142 | 6e0a3771 | Georgios D. Tsoukalas | module_exit(xseg_posix_exit); |