aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/lguest/lguest_user.c
diff options
context:
space:
mode:
authorGlauber de Oliveira Costa <gcosta@redhat.com>2008-01-07 08:05:24 -0500
committerRusty Russell <rusty@rustcorp.com.au>2008-01-30 06:50:06 -0500
commit4dcc53da49c2387078fe8ceb7a420d125e027fc6 (patch)
treee7c7a270c5e63962c51da0d07f3be9930e7dc3ac /drivers/lguest/lguest_user.c
parente3283fa0cc5c4f9bde52339a40da89297e51b481 (diff)
lguest: initialize vcpu
this patch initializes the first vcpu in the initialize() routing, which is responsible for starting the process of putting the guest up. right now, as much of the fields are still not per-vcpu, it does not do much. Signed-off-by: Glauber de Oliveira Costa <gcosta@redhat.com> Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Diffstat (limited to 'drivers/lguest/lguest_user.c')
-rw-r--r--drivers/lguest/lguest_user.c17
1 files changed, 17 insertions, 0 deletions
diff --git a/drivers/lguest/lguest_user.c b/drivers/lguest/lguest_user.c
index 3b92a61ba8d2..c4bfe5a2b6b7 100644
--- a/drivers/lguest/lguest_user.c
+++ b/drivers/lguest/lguest_user.c
@@ -88,6 +88,18 @@ static ssize_t read(struct file *file, char __user *user, size_t size,loff_t*o)
88 return run_guest(lg, (unsigned long __user *)user); 88 return run_guest(lg, (unsigned long __user *)user);
89} 89}
90 90
91static int lg_cpu_start(struct lg_cpu *cpu, unsigned id, unsigned long start_ip)
92{
93 if (id >= NR_CPUS)
94 return -EINVAL;
95
96 cpu->id = id;
97 cpu->lg = container_of((cpu - id), struct lguest, cpus[0]);
98 cpu->lg->nr_cpus++;
99
100 return 0;
101}
102
91/*L:020 The initialization write supplies 4 pointer sized (32 or 64 bit) 103/*L:020 The initialization write supplies 4 pointer sized (32 or 64 bit)
92 * values (in addition to the LHREQ_INITIALIZE value). These are: 104 * values (in addition to the LHREQ_INITIALIZE value). These are:
93 * 105 *
@@ -134,6 +146,11 @@ static int initialize(struct file *file, const unsigned long __user *input)
134 lg->mem_base = (void __user *)(long)args[0]; 146 lg->mem_base = (void __user *)(long)args[0];
135 lg->pfn_limit = args[1]; 147 lg->pfn_limit = args[1];
136 148
149 /* This is the first cpu */
150 err = cpu_start(&lg->cpus[0], 0, args[3]);
151 if (err)
152 goto release_guest;
153
137 /* We need a complete page for the Guest registers: they are accessible 154 /* 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. */ 155 * to the Guest and we can only grant it access to whole pages. */
139 lg->regs_page = get_zeroed_page(GFP_KERNEL); 156 lg->regs_page = get_zeroed_page(GFP_KERNEL);