annotate libdha/kernelhelper/dhahelper.c @ 4470:2d28c737ed13

initial
author alex
date Sat, 02 Feb 2002 06:28:49 +0000
parents
children 423ce4451ca8
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
4470
2d28c737ed13 initial
alex
parents:
diff changeset
1 /*
2d28c737ed13 initial
alex
parents:
diff changeset
2 Direct Hardware Access kernel helper
2d28c737ed13 initial
alex
parents:
diff changeset
3
2d28c737ed13 initial
alex
parents:
diff changeset
4 (C) 2002 Alex Beregszaszi <alex@naxine.org>
2d28c737ed13 initial
alex
parents:
diff changeset
5
2d28c737ed13 initial
alex
parents:
diff changeset
6 Accessing hardware from userspace as USER (no root needed!)
2d28c737ed13 initial
alex
parents:
diff changeset
7
2d28c737ed13 initial
alex
parents:
diff changeset
8 WARNING!
2d28c737ed13 initial
alex
parents:
diff changeset
9 Don't use this on a production system! Use only at home, on a
2d28c737ed13 initial
alex
parents:
diff changeset
10 "single-user" Unix system.
2d28c737ed13 initial
alex
parents:
diff changeset
11
2d28c737ed13 initial
alex
parents:
diff changeset
12 Tech:
2d28c737ed13 initial
alex
parents:
diff changeset
13 Communication between userspace and kernelspace is going trought
2d28c737ed13 initial
alex
parents:
diff changeset
14 character device using ioctl.
2d28c737ed13 initial
alex
parents:
diff changeset
15
2d28c737ed13 initial
alex
parents:
diff changeset
16 Usage:
2d28c737ed13 initial
alex
parents:
diff changeset
17 mknod -m 666 /dev/dhahelper c 180 0
2d28c737ed13 initial
alex
parents:
diff changeset
18
2d28c737ed13 initial
alex
parents:
diff changeset
19 Also you can change the major number, setting the "dhahelper_major"
2d28c737ed13 initial
alex
parents:
diff changeset
20 module parameter, the default is 180, specified in dhahelper.h.
2d28c737ed13 initial
alex
parents:
diff changeset
21
2d28c737ed13 initial
alex
parents:
diff changeset
22 Note: do not use other than minor==0, the module forbids it.
2d28c737ed13 initial
alex
parents:
diff changeset
23
2d28c737ed13 initial
alex
parents:
diff changeset
24 TODO:
2d28c737ed13 initial
alex
parents:
diff changeset
25 * do memory mappin without fops:mmap
2d28c737ed13 initial
alex
parents:
diff changeset
26 * implement unmap memory
2d28c737ed13 initial
alex
parents:
diff changeset
27 * select (request?) a "valid" major number
2d28c737ed13 initial
alex
parents:
diff changeset
28 * make security
2d28c737ed13 initial
alex
parents:
diff changeset
29 * is pci handling needed? (libdha does this with lowlevel port funcs)
2d28c737ed13 initial
alex
parents:
diff changeset
30 * test on older kernels (2.0.x (?) and 2.2.x)
2d28c737ed13 initial
alex
parents:
diff changeset
31 */
2d28c737ed13 initial
alex
parents:
diff changeset
32
2d28c737ed13 initial
alex
parents:
diff changeset
33 #ifndef MODULE
2d28c737ed13 initial
alex
parents:
diff changeset
34 #define MODULE
2d28c737ed13 initial
alex
parents:
diff changeset
35 #endif
2d28c737ed13 initial
alex
parents:
diff changeset
36
2d28c737ed13 initial
alex
parents:
diff changeset
37 #ifndef __KERNEL__
2d28c737ed13 initial
alex
parents:
diff changeset
38 #define __KERNEL__
2d28c737ed13 initial
alex
parents:
diff changeset
39 #endif
2d28c737ed13 initial
alex
parents:
diff changeset
40
2d28c737ed13 initial
alex
parents:
diff changeset
41 #include <linux/config.h>
2d28c737ed13 initial
alex
parents:
diff changeset
42 #include <linux/version.h>
2d28c737ed13 initial
alex
parents:
diff changeset
43 #include <linux/module.h>
2d28c737ed13 initial
alex
parents:
diff changeset
44 #include <linux/types.h>
2d28c737ed13 initial
alex
parents:
diff changeset
45 #include <linux/kernel.h>
2d28c737ed13 initial
alex
parents:
diff changeset
46 #include <linux/sched.h>
2d28c737ed13 initial
alex
parents:
diff changeset
47 #include <linux/mm.h>
2d28c737ed13 initial
alex
parents:
diff changeset
48 #include <linux/string.h>
2d28c737ed13 initial
alex
parents:
diff changeset
49 #include <linux/errno.h>
2d28c737ed13 initial
alex
parents:
diff changeset
50
2d28c737ed13 initial
alex
parents:
diff changeset
51 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,10)
2d28c737ed13 initial
alex
parents:
diff changeset
52 #include <linux/malloc.h>
2d28c737ed13 initial
alex
parents:
diff changeset
53 #else
2d28c737ed13 initial
alex
parents:
diff changeset
54 #include <linux/slab.h>
2d28c737ed13 initial
alex
parents:
diff changeset
55 #endif
2d28c737ed13 initial
alex
parents:
diff changeset
56
2d28c737ed13 initial
alex
parents:
diff changeset
57 #include <linux/pci.h>
2d28c737ed13 initial
alex
parents:
diff changeset
58 #include <linux/ioport.h>
2d28c737ed13 initial
alex
parents:
diff changeset
59 #include <linux/init.h>
2d28c737ed13 initial
alex
parents:
diff changeset
60
2d28c737ed13 initial
alex
parents:
diff changeset
61 #include <asm/uaccess.h>
2d28c737ed13 initial
alex
parents:
diff changeset
62 #include <asm/system.h>
2d28c737ed13 initial
alex
parents:
diff changeset
63 #include <asm/io.h>
2d28c737ed13 initial
alex
parents:
diff changeset
64
2d28c737ed13 initial
alex
parents:
diff changeset
65 #include <linux/mman.h>
2d28c737ed13 initial
alex
parents:
diff changeset
66
2d28c737ed13 initial
alex
parents:
diff changeset
67 #include <linux/fs.h>
2d28c737ed13 initial
alex
parents:
diff changeset
68 #include <linux/unistd.h>
2d28c737ed13 initial
alex
parents:
diff changeset
69
2d28c737ed13 initial
alex
parents:
diff changeset
70 #include "dhahelper.h"
2d28c737ed13 initial
alex
parents:
diff changeset
71
2d28c737ed13 initial
alex
parents:
diff changeset
72 MODULE_AUTHOR("Alex Beregszaszi <alex@naxine.org>");
2d28c737ed13 initial
alex
parents:
diff changeset
73 #ifdef MODULE_LICENSE
2d28c737ed13 initial
alex
parents:
diff changeset
74 MODULE_LICENSE("GPL"); /* modulelicensesh*t */
2d28c737ed13 initial
alex
parents:
diff changeset
75 #endif
2d28c737ed13 initial
alex
parents:
diff changeset
76
2d28c737ed13 initial
alex
parents:
diff changeset
77 static int dhahelper_major = DEFAULT_MAJOR;
2d28c737ed13 initial
alex
parents:
diff changeset
78 MODULE_PARM(dhahelper_major, "i");
2d28c737ed13 initial
alex
parents:
diff changeset
79
2d28c737ed13 initial
alex
parents:
diff changeset
80 /* 0 = silent */
2d28c737ed13 initial
alex
parents:
diff changeset
81 /* 1 = report errors (default) */
2d28c737ed13 initial
alex
parents:
diff changeset
82 /* 2 = debug */
2d28c737ed13 initial
alex
parents:
diff changeset
83 static int dhahelper_verbosity = 1;
2d28c737ed13 initial
alex
parents:
diff changeset
84 MODULE_PARM(dhahelper_verbosity, "i");
2d28c737ed13 initial
alex
parents:
diff changeset
85
2d28c737ed13 initial
alex
parents:
diff changeset
86 static dhahelper_memory_t last_mem_request;
2d28c737ed13 initial
alex
parents:
diff changeset
87
2d28c737ed13 initial
alex
parents:
diff changeset
88
2d28c737ed13 initial
alex
parents:
diff changeset
89 static int dhahelper_open(struct inode *inode, struct file *file)
2d28c737ed13 initial
alex
parents:
diff changeset
90 {
2d28c737ed13 initial
alex
parents:
diff changeset
91 if (dhahelper_verbosity > 1)
2d28c737ed13 initial
alex
parents:
diff changeset
92 printk(KERN_DEBUG "dhahelper: device opened\n");
2d28c737ed13 initial
alex
parents:
diff changeset
93
2d28c737ed13 initial
alex
parents:
diff changeset
94 if (MINOR(inode->i_rdev) != 0)
2d28c737ed13 initial
alex
parents:
diff changeset
95 return(-ENXIO);
2d28c737ed13 initial
alex
parents:
diff changeset
96
2d28c737ed13 initial
alex
parents:
diff changeset
97 MOD_INC_USE_COUNT;
2d28c737ed13 initial
alex
parents:
diff changeset
98
2d28c737ed13 initial
alex
parents:
diff changeset
99 return(0);
2d28c737ed13 initial
alex
parents:
diff changeset
100 }
2d28c737ed13 initial
alex
parents:
diff changeset
101
2d28c737ed13 initial
alex
parents:
diff changeset
102 static int dhahelper_release(struct inode *inode, struct file *file)
2d28c737ed13 initial
alex
parents:
diff changeset
103 {
2d28c737ed13 initial
alex
parents:
diff changeset
104 if (dhahelper_verbosity > 1)
2d28c737ed13 initial
alex
parents:
diff changeset
105 printk(KERN_DEBUG "dhahelper: device released\n");
2d28c737ed13 initial
alex
parents:
diff changeset
106
2d28c737ed13 initial
alex
parents:
diff changeset
107 if (MINOR(inode->i_rdev) != 0)
2d28c737ed13 initial
alex
parents:
diff changeset
108 return(-ENXIO);
2d28c737ed13 initial
alex
parents:
diff changeset
109
2d28c737ed13 initial
alex
parents:
diff changeset
110 MOD_DEC_USE_COUNT;
2d28c737ed13 initial
alex
parents:
diff changeset
111
2d28c737ed13 initial
alex
parents:
diff changeset
112 return(0);
2d28c737ed13 initial
alex
parents:
diff changeset
113 }
2d28c737ed13 initial
alex
parents:
diff changeset
114
2d28c737ed13 initial
alex
parents:
diff changeset
115 static int dhahelper_ioctl(struct inode *inode, struct file *file,
2d28c737ed13 initial
alex
parents:
diff changeset
116 unsigned int cmd, unsigned long arg)
2d28c737ed13 initial
alex
parents:
diff changeset
117 {
2d28c737ed13 initial
alex
parents:
diff changeset
118 if (dhahelper_verbosity > 1)
2d28c737ed13 initial
alex
parents:
diff changeset
119 printk(KERN_DEBUG "dhahelper: ioctl(cmd=%x, arg=%lx)\n",
2d28c737ed13 initial
alex
parents:
diff changeset
120 cmd, arg);
2d28c737ed13 initial
alex
parents:
diff changeset
121
2d28c737ed13 initial
alex
parents:
diff changeset
122 if (MINOR(inode->i_rdev) != 0)
2d28c737ed13 initial
alex
parents:
diff changeset
123 return(-ENXIO);
2d28c737ed13 initial
alex
parents:
diff changeset
124
2d28c737ed13 initial
alex
parents:
diff changeset
125 switch(cmd)
2d28c737ed13 initial
alex
parents:
diff changeset
126 {
2d28c737ed13 initial
alex
parents:
diff changeset
127 case DHAHELPER_GET_VERSION:
2d28c737ed13 initial
alex
parents:
diff changeset
128 {
2d28c737ed13 initial
alex
parents:
diff changeset
129 int version = API_VERSION;
2d28c737ed13 initial
alex
parents:
diff changeset
130
2d28c737ed13 initial
alex
parents:
diff changeset
131 if (copy_to_user((int *)arg, &version, sizeof(int)))
2d28c737ed13 initial
alex
parents:
diff changeset
132 {
2d28c737ed13 initial
alex
parents:
diff changeset
133 if (dhahelper_verbosity > 0)
2d28c737ed13 initial
alex
parents:
diff changeset
134 printk(KERN_ERR "dhahelper: failed copy to userspace\n");
2d28c737ed13 initial
alex
parents:
diff changeset
135 return(-EFAULT);
2d28c737ed13 initial
alex
parents:
diff changeset
136 }
2d28c737ed13 initial
alex
parents:
diff changeset
137
2d28c737ed13 initial
alex
parents:
diff changeset
138 break;
2d28c737ed13 initial
alex
parents:
diff changeset
139 }
2d28c737ed13 initial
alex
parents:
diff changeset
140 case DHAHELPER_PORT:
2d28c737ed13 initial
alex
parents:
diff changeset
141 {
2d28c737ed13 initial
alex
parents:
diff changeset
142 dhahelper_port_t port;
2d28c737ed13 initial
alex
parents:
diff changeset
143
2d28c737ed13 initial
alex
parents:
diff changeset
144 if (copy_from_user(&port, (dhahelper_port_t *)arg, sizeof(dhahelper_port_t)))
2d28c737ed13 initial
alex
parents:
diff changeset
145 {
2d28c737ed13 initial
alex
parents:
diff changeset
146 if (dhahelper_verbosity > 0)
2d28c737ed13 initial
alex
parents:
diff changeset
147 printk(KERN_ERR "dhahelper: failed copy from userspace\n");
2d28c737ed13 initial
alex
parents:
diff changeset
148 return(-EFAULT);
2d28c737ed13 initial
alex
parents:
diff changeset
149 }
2d28c737ed13 initial
alex
parents:
diff changeset
150
2d28c737ed13 initial
alex
parents:
diff changeset
151 switch(port.operation)
2d28c737ed13 initial
alex
parents:
diff changeset
152 {
2d28c737ed13 initial
alex
parents:
diff changeset
153 case PORT_OP_READ:
2d28c737ed13 initial
alex
parents:
diff changeset
154 {
2d28c737ed13 initial
alex
parents:
diff changeset
155 switch(port.size)
2d28c737ed13 initial
alex
parents:
diff changeset
156 {
2d28c737ed13 initial
alex
parents:
diff changeset
157 case 1:
2d28c737ed13 initial
alex
parents:
diff changeset
158 port.value = inb(port.addr);
2d28c737ed13 initial
alex
parents:
diff changeset
159 break;
2d28c737ed13 initial
alex
parents:
diff changeset
160 case 2:
2d28c737ed13 initial
alex
parents:
diff changeset
161 port.value = inw(port.addr);
2d28c737ed13 initial
alex
parents:
diff changeset
162 break;
2d28c737ed13 initial
alex
parents:
diff changeset
163 case 4:
2d28c737ed13 initial
alex
parents:
diff changeset
164 port.value = inl(port.addr);
2d28c737ed13 initial
alex
parents:
diff changeset
165 break;
2d28c737ed13 initial
alex
parents:
diff changeset
166 default:
2d28c737ed13 initial
alex
parents:
diff changeset
167 if (dhahelper_verbosity > 0)
2d28c737ed13 initial
alex
parents:
diff changeset
168 printk(KERN_ERR "dhahelper: invalid port read size (%d)\n",
2d28c737ed13 initial
alex
parents:
diff changeset
169 port.size);
2d28c737ed13 initial
alex
parents:
diff changeset
170 return(-EINVAL);
2d28c737ed13 initial
alex
parents:
diff changeset
171 }
2d28c737ed13 initial
alex
parents:
diff changeset
172 break;
2d28c737ed13 initial
alex
parents:
diff changeset
173 }
2d28c737ed13 initial
alex
parents:
diff changeset
174 case PORT_OP_WRITE:
2d28c737ed13 initial
alex
parents:
diff changeset
175 {
2d28c737ed13 initial
alex
parents:
diff changeset
176 switch(port.size)
2d28c737ed13 initial
alex
parents:
diff changeset
177 {
2d28c737ed13 initial
alex
parents:
diff changeset
178 case 1:
2d28c737ed13 initial
alex
parents:
diff changeset
179 outb(port.value, port.addr);
2d28c737ed13 initial
alex
parents:
diff changeset
180 break;
2d28c737ed13 initial
alex
parents:
diff changeset
181 case 2:
2d28c737ed13 initial
alex
parents:
diff changeset
182 outw(port.value, port.addr);
2d28c737ed13 initial
alex
parents:
diff changeset
183 break;
2d28c737ed13 initial
alex
parents:
diff changeset
184 case 4:
2d28c737ed13 initial
alex
parents:
diff changeset
185 outl(port.value, port.addr);
2d28c737ed13 initial
alex
parents:
diff changeset
186 break;
2d28c737ed13 initial
alex
parents:
diff changeset
187 default:
2d28c737ed13 initial
alex
parents:
diff changeset
188 if (dhahelper_verbosity > 0)
2d28c737ed13 initial
alex
parents:
diff changeset
189 printk(KERN_ERR "dhahelper: invalid port write size (%d)\n",
2d28c737ed13 initial
alex
parents:
diff changeset
190 port.size);
2d28c737ed13 initial
alex
parents:
diff changeset
191 return(-EINVAL);
2d28c737ed13 initial
alex
parents:
diff changeset
192 }
2d28c737ed13 initial
alex
parents:
diff changeset
193 break;
2d28c737ed13 initial
alex
parents:
diff changeset
194 }
2d28c737ed13 initial
alex
parents:
diff changeset
195 default:
2d28c737ed13 initial
alex
parents:
diff changeset
196 if (dhahelper_verbosity > 0)
2d28c737ed13 initial
alex
parents:
diff changeset
197 printk(KERN_ERR "dhahelper: invalid port operation (%d)\n",
2d28c737ed13 initial
alex
parents:
diff changeset
198 port.operation);
2d28c737ed13 initial
alex
parents:
diff changeset
199 return(-EINVAL);
2d28c737ed13 initial
alex
parents:
diff changeset
200 }
2d28c737ed13 initial
alex
parents:
diff changeset
201
2d28c737ed13 initial
alex
parents:
diff changeset
202 /* copy back only if read was performed */
2d28c737ed13 initial
alex
parents:
diff changeset
203 if (port.operation == PORT_OP_READ)
2d28c737ed13 initial
alex
parents:
diff changeset
204 if (copy_to_user((dhahelper_port_t *)arg, &port, sizeof(dhahelper_port_t)))
2d28c737ed13 initial
alex
parents:
diff changeset
205 {
2d28c737ed13 initial
alex
parents:
diff changeset
206 if (dhahelper_verbosity > 0)
2d28c737ed13 initial
alex
parents:
diff changeset
207 printk(KERN_ERR "dhahelper: failed copy to userspace\n");
2d28c737ed13 initial
alex
parents:
diff changeset
208 return(-EFAULT);
2d28c737ed13 initial
alex
parents:
diff changeset
209 }
2d28c737ed13 initial
alex
parents:
diff changeset
210
2d28c737ed13 initial
alex
parents:
diff changeset
211 break;
2d28c737ed13 initial
alex
parents:
diff changeset
212 }
2d28c737ed13 initial
alex
parents:
diff changeset
213 case DHAHELPER_MEMORY:
2d28c737ed13 initial
alex
parents:
diff changeset
214 {
2d28c737ed13 initial
alex
parents:
diff changeset
215 dhahelper_memory_t mem;
2d28c737ed13 initial
alex
parents:
diff changeset
216
2d28c737ed13 initial
alex
parents:
diff changeset
217 if (copy_from_user(&mem, (dhahelper_memory_t *)arg, sizeof(dhahelper_memory_t)))
2d28c737ed13 initial
alex
parents:
diff changeset
218 {
2d28c737ed13 initial
alex
parents:
diff changeset
219 if (dhahelper_verbosity > 0)
2d28c737ed13 initial
alex
parents:
diff changeset
220 printk(KERN_ERR "dhahelper: failed copy from userspace\n");
2d28c737ed13 initial
alex
parents:
diff changeset
221 return(-EFAULT);
2d28c737ed13 initial
alex
parents:
diff changeset
222 }
2d28c737ed13 initial
alex
parents:
diff changeset
223
2d28c737ed13 initial
alex
parents:
diff changeset
224 switch(mem.operation)
2d28c737ed13 initial
alex
parents:
diff changeset
225 {
2d28c737ed13 initial
alex
parents:
diff changeset
226 case MEMORY_OP_MAP:
2d28c737ed13 initial
alex
parents:
diff changeset
227 {
2d28c737ed13 initial
alex
parents:
diff changeset
228 memcpy(&last_mem_request, &mem, sizeof(dhahelper_memory_t));
2d28c737ed13 initial
alex
parents:
diff changeset
229
2d28c737ed13 initial
alex
parents:
diff changeset
230 break;
2d28c737ed13 initial
alex
parents:
diff changeset
231 }
2d28c737ed13 initial
alex
parents:
diff changeset
232 case MEMORY_OP_UNMAP:
2d28c737ed13 initial
alex
parents:
diff changeset
233 break;
2d28c737ed13 initial
alex
parents:
diff changeset
234 default:
2d28c737ed13 initial
alex
parents:
diff changeset
235 if (dhahelper_verbosity > 0)
2d28c737ed13 initial
alex
parents:
diff changeset
236 printk(KERN_ERR "dhahelper: invalid memory operation (%d)\n",
2d28c737ed13 initial
alex
parents:
diff changeset
237 mem.operation);
2d28c737ed13 initial
alex
parents:
diff changeset
238 return(-EINVAL);
2d28c737ed13 initial
alex
parents:
diff changeset
239 }
2d28c737ed13 initial
alex
parents:
diff changeset
240
2d28c737ed13 initial
alex
parents:
diff changeset
241 if (copy_to_user((dhahelper_memory_t *)arg, &mem, sizeof(dhahelper_memory_t)))
2d28c737ed13 initial
alex
parents:
diff changeset
242 {
2d28c737ed13 initial
alex
parents:
diff changeset
243 if (dhahelper_verbosity > 0)
2d28c737ed13 initial
alex
parents:
diff changeset
244 printk(KERN_ERR "dhahelper: failed copy to userspace\n");
2d28c737ed13 initial
alex
parents:
diff changeset
245 return(-EFAULT);
2d28c737ed13 initial
alex
parents:
diff changeset
246 }
2d28c737ed13 initial
alex
parents:
diff changeset
247
2d28c737ed13 initial
alex
parents:
diff changeset
248 break;
2d28c737ed13 initial
alex
parents:
diff changeset
249 }
2d28c737ed13 initial
alex
parents:
diff changeset
250 default:
2d28c737ed13 initial
alex
parents:
diff changeset
251 if (dhahelper_verbosity > 0)
2d28c737ed13 initial
alex
parents:
diff changeset
252 printk(KERN_ERR "dhahelper: invalid ioctl (%x)\n", cmd);
2d28c737ed13 initial
alex
parents:
diff changeset
253 return(-EINVAL);
2d28c737ed13 initial
alex
parents:
diff changeset
254 }
2d28c737ed13 initial
alex
parents:
diff changeset
255
2d28c737ed13 initial
alex
parents:
diff changeset
256 return(0);
2d28c737ed13 initial
alex
parents:
diff changeset
257 }
2d28c737ed13 initial
alex
parents:
diff changeset
258
2d28c737ed13 initial
alex
parents:
diff changeset
259 static int dhahelper_mmap(struct file *file, struct vm_area_struct *vma)
2d28c737ed13 initial
alex
parents:
diff changeset
260 {
2d28c737ed13 initial
alex
parents:
diff changeset
261 if (last_mem_request.operation != MEMORY_OP_MAP)
2d28c737ed13 initial
alex
parents:
diff changeset
262 {
2d28c737ed13 initial
alex
parents:
diff changeset
263 if (dhahelper_verbosity > 0)
2d28c737ed13 initial
alex
parents:
diff changeset
264 printk(KERN_ERR "dhahelper: mapping not requested before mmap\n");
2d28c737ed13 initial
alex
parents:
diff changeset
265 return(-EFAULT);
2d28c737ed13 initial
alex
parents:
diff changeset
266 }
2d28c737ed13 initial
alex
parents:
diff changeset
267
2d28c737ed13 initial
alex
parents:
diff changeset
268 if (dhahelper_verbosity > 1)
2d28c737ed13 initial
alex
parents:
diff changeset
269 printk(KERN_INFO "dhahelper: mapping %x (size: %x)\n",
2d28c737ed13 initial
alex
parents:
diff changeset
270 last_mem_request.start+last_mem_request.offset, last_mem_request.size);
2d28c737ed13 initial
alex
parents:
diff changeset
271
2d28c737ed13 initial
alex
parents:
diff changeset
272 if (remap_page_range(0, last_mem_request.start + last_mem_request.offset,
2d28c737ed13 initial
alex
parents:
diff changeset
273 last_mem_request.size, vma->vm_page_prot))
2d28c737ed13 initial
alex
parents:
diff changeset
274 {
2d28c737ed13 initial
alex
parents:
diff changeset
275 if (dhahelper_verbosity > 0)
2d28c737ed13 initial
alex
parents:
diff changeset
276 printk(KERN_ERR "dhahelper: error mapping memory\n");
2d28c737ed13 initial
alex
parents:
diff changeset
277 return(-EFAULT);
2d28c737ed13 initial
alex
parents:
diff changeset
278 }
2d28c737ed13 initial
alex
parents:
diff changeset
279
2d28c737ed13 initial
alex
parents:
diff changeset
280 return(0);
2d28c737ed13 initial
alex
parents:
diff changeset
281 }
2d28c737ed13 initial
alex
parents:
diff changeset
282
2d28c737ed13 initial
alex
parents:
diff changeset
283 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0)
2d28c737ed13 initial
alex
parents:
diff changeset
284 static struct file_operations dhahelper_fops =
2d28c737ed13 initial
alex
parents:
diff changeset
285 {
2d28c737ed13 initial
alex
parents:
diff changeset
286 /*llseek*/ NULL,
2d28c737ed13 initial
alex
parents:
diff changeset
287 /*read*/ NULL,
2d28c737ed13 initial
alex
parents:
diff changeset
288 /*write*/ NULL,
2d28c737ed13 initial
alex
parents:
diff changeset
289 /*readdir*/ NULL,
2d28c737ed13 initial
alex
parents:
diff changeset
290 /*poll*/ NULL,
2d28c737ed13 initial
alex
parents:
diff changeset
291 /*ioctl*/ dhahelper_ioctl,
2d28c737ed13 initial
alex
parents:
diff changeset
292 /*mmap*/ dhahelper_mmap,
2d28c737ed13 initial
alex
parents:
diff changeset
293 /*open*/ dhahelper_open,
2d28c737ed13 initial
alex
parents:
diff changeset
294 /*flush*/ NULL,
2d28c737ed13 initial
alex
parents:
diff changeset
295 /*release*/ dhahelper_release,
2d28c737ed13 initial
alex
parents:
diff changeset
296 /* zero out the last 5 entries too ? */
2d28c737ed13 initial
alex
parents:
diff changeset
297 };
2d28c737ed13 initial
alex
parents:
diff changeset
298 #else
2d28c737ed13 initial
alex
parents:
diff changeset
299 static struct file_operations dhahelper_fops =
2d28c737ed13 initial
alex
parents:
diff changeset
300 {
2d28c737ed13 initial
alex
parents:
diff changeset
301 owner: THIS_MODULE,
2d28c737ed13 initial
alex
parents:
diff changeset
302 ioctl: dhahelper_ioctl,
2d28c737ed13 initial
alex
parents:
diff changeset
303 mmap: dhahelper_mmap,
2d28c737ed13 initial
alex
parents:
diff changeset
304 open: dhahelper_open,
2d28c737ed13 initial
alex
parents:
diff changeset
305 release: dhahelper_release
2d28c737ed13 initial
alex
parents:
diff changeset
306 };
2d28c737ed13 initial
alex
parents:
diff changeset
307 #endif
2d28c737ed13 initial
alex
parents:
diff changeset
308
2d28c737ed13 initial
alex
parents:
diff changeset
309 static int __init init_dhahelper(void)
2d28c737ed13 initial
alex
parents:
diff changeset
310 {
2d28c737ed13 initial
alex
parents:
diff changeset
311 printk(KERN_INFO "Direct Hardware Access kernel helper (C) Alex Beregszaszi\n");
2d28c737ed13 initial
alex
parents:
diff changeset
312
2d28c737ed13 initial
alex
parents:
diff changeset
313 if(register_chrdev(dhahelper_major, "dhahelper", &dhahelper_fops))
2d28c737ed13 initial
alex
parents:
diff changeset
314 {
2d28c737ed13 initial
alex
parents:
diff changeset
315 if (dhahelper_verbosity > 0)
2d28c737ed13 initial
alex
parents:
diff changeset
316 printk(KERN_ERR "dhahelper: unable to register character device (major: %d)\n",
2d28c737ed13 initial
alex
parents:
diff changeset
317 dhahelper_major);
2d28c737ed13 initial
alex
parents:
diff changeset
318 return(-EIO);
2d28c737ed13 initial
alex
parents:
diff changeset
319 }
2d28c737ed13 initial
alex
parents:
diff changeset
320
2d28c737ed13 initial
alex
parents:
diff changeset
321 return(0);
2d28c737ed13 initial
alex
parents:
diff changeset
322 }
2d28c737ed13 initial
alex
parents:
diff changeset
323
2d28c737ed13 initial
alex
parents:
diff changeset
324 static void __exit exit_dhahelper(void)
2d28c737ed13 initial
alex
parents:
diff changeset
325 {
2d28c737ed13 initial
alex
parents:
diff changeset
326 unregister_chrdev(dhahelper_major, "dhahelper");
2d28c737ed13 initial
alex
parents:
diff changeset
327 }
2d28c737ed13 initial
alex
parents:
diff changeset
328
2d28c737ed13 initial
alex
parents:
diff changeset
329 EXPORT_NO_SYMBOLS;
2d28c737ed13 initial
alex
parents:
diff changeset
330
2d28c737ed13 initial
alex
parents:
diff changeset
331 module_init(init_dhahelper);
2d28c737ed13 initial
alex
parents:
diff changeset
332 module_exit(exit_dhahelper);