OpenCores
URL https://opencores.org/ocsvn/test_project/test_project/trunk

Subversion Repositories test_project

[/] [test_project/] [trunk/] [linux_sd_driver/] [drivers/] [lguest/] [lguest_user.c] - Blame information for rev 65

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 62 marcus.erl
/*P:200 This contains all the /dev/lguest code, whereby the userspace launcher
2
 * controls and communicates with the Guest.  For example, the first write will
3
 * tell us the Guest's memory layout, pagetable, entry point and kernel address
4
 * offset.  A read will run the Guest until something happens, such as a signal
5
 * or the Guest doing a NOTIFY out to the Launcher. :*/
6
#include <linux/uaccess.h>
7
#include <linux/miscdevice.h>
8
#include <linux/fs.h>
9
#include "lg.h"
10
 
11
/*L:055 When something happens, the Waker process needs a way to stop the
12
 * kernel running the Guest and return to the Launcher.  So the Waker writes
13
 * LHREQ_BREAK and the value "1" to /dev/lguest to do this.  Once the Launcher
14
 * has done whatever needs attention, it writes LHREQ_BREAK and "0" to release
15
 * the Waker. */
16
static int break_guest_out(struct lguest *lg, const unsigned long __user *input)
17
{
18
        unsigned long on;
19
 
20
        /* Fetch whether they're turning break on or off. */
21
        if (get_user(on, input) != 0)
22
                return -EFAULT;
23
 
24
        if (on) {
25
                lg->break_out = 1;
26
                /* Pop it out of the Guest (may be running on different CPU) */
27
                wake_up_process(lg->tsk);
28
                /* Wait for them to reset it */
29
                return wait_event_interruptible(lg->break_wq, !lg->break_out);
30
        } else {
31
                lg->break_out = 0;
32
                wake_up(&lg->break_wq);
33
                return 0;
34
        }
35
}
36
 
37
/*L:050 Sending an interrupt is done by writing LHREQ_IRQ and an interrupt
38
 * number to /dev/lguest. */
39
static int user_send_irq(struct lguest *lg, const unsigned long __user *input)
40
{
41
        unsigned long irq;
42
 
43
        if (get_user(irq, input) != 0)
44
                return -EFAULT;
45
        if (irq >= LGUEST_IRQS)
46
                return -EINVAL;
47
        /* Next time the Guest runs, the core code will see if it can deliver
48
         * this interrupt. */
49
        set_bit(irq, lg->irqs_pending);
50
        return 0;
51
}
52
 
53
/*L:040 Once our Guest is initialized, the Launcher makes it run by reading
54
 * from /dev/lguest. */
55
static ssize_t read(struct file *file, char __user *user, size_t size,loff_t*o)
56
{
57
        struct lguest *lg = file->private_data;
58
 
59
        /* You must write LHREQ_INITIALIZE first! */
60
        if (!lg)
61
                return -EINVAL;
62
 
63
        /* If you're not the task which owns the Guest, go away. */
64
        if (current != lg->tsk)
65
                return -EPERM;
66
 
67
        /* If the guest is already dead, we indicate why */
68
        if (lg->dead) {
69
                size_t len;
70
 
71
                /* lg->dead either contains an error code, or a string. */
72
                if (IS_ERR(lg->dead))
73
                        return PTR_ERR(lg->dead);
74
 
75
                /* We can only return as much as the buffer they read with. */
76
                len = min(size, strlen(lg->dead)+1);
77
                if (copy_to_user(user, lg->dead, len) != 0)
78
                        return -EFAULT;
79
                return len;
80
        }
81
 
82
        /* If we returned from read() last time because the Guest notified,
83
         * clear the flag. */
84
        if (lg->pending_notify)
85
                lg->pending_notify = 0;
86
 
87
        /* Run the Guest until something interesting happens. */
88
        return run_guest(lg, (unsigned long __user *)user);
89
}
90
 
91
/*L:020 The initialization write supplies 4 pointer sized (32 or 64 bit)
92
 * values (in addition to the LHREQ_INITIALIZE value).  These are:
93
 *
94
 * base: The start of the Guest-physical memory inside the Launcher memory.
95
 *
96
 * pfnlimit: The highest (Guest-physical) page number the Guest should be
97
 * allowed to access.  The Guest memory lives inside the Launcher, so it sets
98
 * this to ensure the Guest can only reach its own memory.
99
 *
100
 * pgdir: The (Guest-physical) address of the top of the initial Guest
101
 * pagetables (which are set up by the Launcher).
102
 *
103
 * start: The first instruction to execute ("eip" in x86-speak).
104
 */
105
static int initialize(struct file *file, const unsigned long __user *input)
106
{
107
        /* "struct lguest" contains everything we (the Host) know about a
108
         * Guest. */
109
        struct lguest *lg;
110
        int err;
111
        unsigned long args[4];
112
 
113
        /* We grab the Big Lguest lock, which protects against multiple
114
         * simultaneous initializations. */
115
        mutex_lock(&lguest_lock);
116
        /* You can't initialize twice!  Close the device and start again... */
117
        if (file->private_data) {
118
                err = -EBUSY;
119
                goto unlock;
120
        }
121
 
122
        if (copy_from_user(args, input, sizeof(args)) != 0) {
123
                err = -EFAULT;
124
                goto unlock;
125
        }
126
 
127
        lg = kzalloc(sizeof(*lg), GFP_KERNEL);
128
        if (!lg) {
129
                err = -ENOMEM;
130
                goto unlock;
131
        }
132
 
133
        /* Populate the easy fields of our "struct lguest" */
134
        lg->mem_base = (void __user *)(long)args[0];
135
        lg->pfn_limit = args[1];
136
 
137
        /* We need a complete page for the Guest registers: they are accessible
138
         * to the Guest and we can only grant it access to whole pages. */
139
        lg->regs_page = get_zeroed_page(GFP_KERNEL);
140
        if (!lg->regs_page) {
141
                err = -ENOMEM;
142
                goto release_guest;
143
        }
144
        /* We actually put the registers at the bottom of the page. */
145
        lg->regs = (void *)lg->regs_page + PAGE_SIZE - sizeof(*lg->regs);
146
 
147
        /* Initialize the Guest's shadow page tables, using the toplevel
148
         * address the Launcher gave us.  This allocates memory, so can
149
         * fail. */
150
        err = init_guest_pagetable(lg, args[2]);
151
        if (err)
152
                goto free_regs;
153
 
154
        /* Now we initialize the Guest's registers, handing it the start
155
         * address. */
156
        lguest_arch_setup_regs(lg, args[3]);
157
 
158
        /* The timer for lguest's clock needs initialization. */
159
        init_clockdev(lg);
160
 
161
        /* We keep a pointer to the Launcher task (ie. current task) for when
162
         * other Guests want to wake this one (inter-Guest I/O). */
163
        lg->tsk = current;
164
        /* We need to keep a pointer to the Launcher's memory map, because if
165
         * the Launcher dies we need to clean it up.  If we don't keep a
166
         * reference, it is destroyed before close() is called. */
167
        lg->mm = get_task_mm(lg->tsk);
168
 
169
        /* Initialize the queue for the waker to wait on */
170
        init_waitqueue_head(&lg->break_wq);
171
 
172
        /* We remember which CPU's pages this Guest used last, for optimization
173
         * when the same Guest runs on the same CPU twice. */
174
        lg->last_pages = NULL;
175
 
176
        /* We keep our "struct lguest" in the file's private_data. */
177
        file->private_data = lg;
178
 
179
        mutex_unlock(&lguest_lock);
180
 
181
        /* And because this is a write() call, we return the length used. */
182
        return sizeof(args);
183
 
184
free_regs:
185
        free_page(lg->regs_page);
186
release_guest:
187
        kfree(lg);
188
unlock:
189
        mutex_unlock(&lguest_lock);
190
        return err;
191
}
192
 
193
/*L:010 The first operation the Launcher does must be a write.  All writes
194
 * start with an unsigned long number: for the first write this must be
195
 * LHREQ_INITIALIZE to set up the Guest.  After that the Launcher can use
196
 * writes of other values to send interrupts. */
197
static ssize_t write(struct file *file, const char __user *in,
198
                     size_t size, loff_t *off)
199
{
200
        /* Once the guest is initialized, we hold the "struct lguest" in the
201
         * file private data. */
202
        struct lguest *lg = file->private_data;
203
        const unsigned long __user *input = (const unsigned long __user *)in;
204
        unsigned long req;
205
 
206
        if (get_user(req, input) != 0)
207
                return -EFAULT;
208
        input++;
209
 
210
        /* If you haven't initialized, you must do that first. */
211
        if (req != LHREQ_INITIALIZE && !lg)
212
                return -EINVAL;
213
 
214
        /* Once the Guest is dead, all you can do is read() why it died. */
215
        if (lg && lg->dead)
216
                return -ENOENT;
217
 
218
        /* If you're not the task which owns the Guest, you can only break */
219
        if (lg && current != lg->tsk && req != LHREQ_BREAK)
220
                return -EPERM;
221
 
222
        switch (req) {
223
        case LHREQ_INITIALIZE:
224
                return initialize(file, input);
225
        case LHREQ_IRQ:
226
                return user_send_irq(lg, input);
227
        case LHREQ_BREAK:
228
                return break_guest_out(lg, input);
229
        default:
230
                return -EINVAL;
231
        }
232
}
233
 
234
/*L:060 The final piece of interface code is the close() routine.  It reverses
235
 * everything done in initialize().  This is usually called because the
236
 * Launcher exited.
237
 *
238
 * Note that the close routine returns 0 or a negative error number: it can't
239
 * really fail, but it can whine.  I blame Sun for this wart, and K&R C for
240
 * letting them do it. :*/
241
static int close(struct inode *inode, struct file *file)
242
{
243
        struct lguest *lg = file->private_data;
244
 
245
        /* If we never successfully initialized, there's nothing to clean up */
246
        if (!lg)
247
                return 0;
248
 
249
        /* We need the big lock, to protect from inter-guest I/O and other
250
         * Launchers initializing guests. */
251
        mutex_lock(&lguest_lock);
252
        /* Cancels the hrtimer set via LHCALL_SET_CLOCKEVENT. */
253
        hrtimer_cancel(&lg->hrt);
254
        /* Free up the shadow page tables for the Guest. */
255
        free_guest_pagetable(lg);
256
        /* Now all the memory cleanups are done, it's safe to release the
257
         * Launcher's memory management structure. */
258
        mmput(lg->mm);
259
        /* If lg->dead doesn't contain an error code it will be NULL or a
260
         * kmalloc()ed string, either of which is ok to hand to kfree(). */
261
        if (!IS_ERR(lg->dead))
262
                kfree(lg->dead);
263
        /* We can free up the register page we allocated. */
264
        free_page(lg->regs_page);
265
        /* We clear the entire structure, which also marks it as free for the
266
         * next user. */
267
        memset(lg, 0, sizeof(*lg));
268
        /* Release lock and exit. */
269
        mutex_unlock(&lguest_lock);
270
 
271
        return 0;
272
}
273
 
274
/*L:000
275
 * Welcome to our journey through the Launcher!
276
 *
277
 * The Launcher is the Host userspace program which sets up, runs and services
278
 * the Guest.  In fact, many comments in the Drivers which refer to "the Host"
279
 * doing things are inaccurate: the Launcher does all the device handling for
280
 * the Guest, but the Guest can't know that.
281
 *
282
 * Just to confuse you: to the Host kernel, the Launcher *is* the Guest and we
283
 * shall see more of that later.
284
 *
285
 * We begin our understanding with the Host kernel interface which the Launcher
286
 * uses: reading and writing a character device called /dev/lguest.  All the
287
 * work happens in the read(), write() and close() routines: */
288
static struct file_operations lguest_fops = {
289
        .owner   = THIS_MODULE,
290
        .release = close,
291
        .write   = write,
292
        .read    = read,
293
};
294
 
295
/* This is a textbook example of a "misc" character device.  Populate a "struct
296
 * miscdevice" and register it with misc_register(). */
297
static struct miscdevice lguest_dev = {
298
        .minor  = MISC_DYNAMIC_MINOR,
299
        .name   = "lguest",
300
        .fops   = &lguest_fops,
301
};
302
 
303
int __init lguest_device_init(void)
304
{
305
        return misc_register(&lguest_dev);
306
}
307
 
308
void __exit lguest_device_remove(void)
309
{
310
        misc_deregister(&lguest_dev);
311
}

powered by: WebSVN 2.1.0

© copyright 1999-2025 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.