From: Jack Lange Date: Sun, 7 Nov 2010 18:18:42 +0000 (-0600) Subject: added configurable host OS thread support X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=commitdiff_plain;h=07a12ade201ee7c2fe2358084ca079d2facac500;p=palacios.git added configurable host OS thread support --- diff --git a/palacios/include/palacios/vmm.h b/palacios/include/palacios/vmm.h index 05510c2..0d95821 100644 --- a/palacios/include/palacios/vmm.h +++ b/palacios/include/palacios/vmm.h @@ -151,17 +151,6 @@ struct guest_info; -#define V3_CREATE_THREAD(fn, arg, name) \ - do { \ - extern struct v3_os_hooks * os_hooks; \ - if ((os_hooks) && (os_hooks)->start_kernel_thread) { \ - (os_hooks)->start_kernel_thread(fn, arg, name); \ - } \ - } while (0) - - - - #define V3_Hook_Interrupt(vm, irq) ({ \ int ret = 0; \ @@ -173,6 +162,16 @@ struct guest_info; }) \ +#define V3_ACK_IRQ(irq) \ + do { \ + extern struct v3_os_hooks * os_hooks; \ + if ((os_hooks) && (os_hooks)->ack_irq) { \ + (os_hooks)->ack_irq(irq); \ + } \ + } while (0) + + + #define V3_Get_CPU() ({ \ int ret = 0; \ extern struct v3_os_hooks * os_hooks; \ @@ -182,6 +181,22 @@ struct guest_info; ret; \ }) + +#ifdef CONFIG_MULTITHREAD_OS + +#define V3_CREATE_THREAD(fn, arg, name) \ + do { \ + extern struct v3_os_hooks * os_hooks; \ + if ((os_hooks) && (os_hooks)->start_kernel_thread) { \ + (os_hooks)->start_kernel_thread(fn, arg, name); \ + } \ + } while (0) + + + + + + #define V3_Call_On_CPU(cpu, fn, arg) \ do { \ extern struct v3_os_hooks * os_hooks; \ @@ -202,13 +217,8 @@ struct guest_info; }) -#define V3_ACK_IRQ(irq) \ - do { \ - extern struct v3_os_hooks * os_hooks; \ - if ((os_hooks) && (os_hooks)->ack_irq) { \ - (os_hooks)->ack_irq(irq); \ - } \ - } while (0) +#endif + @@ -246,7 +256,6 @@ void v3_print_cond(const char * fmt, ...); void v3_interrupt_cpu(struct v3_vm_info * vm, int logical_cpu, int vector); -unsigned int v3_get_cpu_id(); v3_cpu_arch_t v3_get_cpu_type(int cpu_id); @@ -279,7 +288,6 @@ struct v3_os_hooks { unsigned int (*get_cpu_khz)(void); - void (*start_kernel_thread)(int (*fn)(void * arg), void * arg, char * thread_name); void (*yield_cpu)(void); @@ -289,10 +297,14 @@ struct v3_os_hooks { void (*mutex_unlock)(void * mutex); unsigned int (*get_cpu)(void); + + +#ifdef CONFIG_MULTITHREAD_OS + void (*start_kernel_thread)(int (*fn)(void * arg), void * arg, char * thread_name); void (*interrupt_cpu)(struct v3_vm_info * vm, int logical_cpu, int vector); void (*call_on_cpu)(int logical_cpu, void (*fn)(void * arg), void * arg); void * (*start_thread_on_cpu)(int cpu_id, int (*fn)(void * arg), void * arg, char * thread_name); - +#endif }; diff --git a/palacios/src/palacios/vm_guest.c b/palacios/src/palacios/vm_guest.c index dcd471a..5d01aa9 100644 --- a/palacios/src/palacios/vm_guest.c +++ b/palacios/src/palacios/vm_guest.c @@ -364,7 +364,7 @@ void v3_print_GPRs(struct guest_info * info) { #include #include static int info_hcall(struct guest_info * core, uint_t hcall_id, void * priv_data) { - v3_cpu_arch_t cpu_type = v3_get_cpu_type(v3_get_cpu_id()); + v3_cpu_arch_t cpu_type = v3_get_cpu_type(V3_Get_CPU()); int cpu_valid = 0; v3_print_guest_state(core); @@ -406,7 +406,7 @@ static int info_hcall(struct guest_info * core, uint_t hcall_id, void * priv_dat int v3_init_vm(struct v3_vm_info * vm) { - v3_cpu_arch_t cpu_type = v3_get_cpu_type(v3_get_cpu_id()); + v3_cpu_arch_t cpu_type = v3_get_cpu_type(V3_Get_CPU()); int cpu_valid = 0; if (v3_get_foreground_vm() == NULL) { @@ -474,7 +474,7 @@ int v3_init_vm(struct v3_vm_info * vm) { } int v3_init_core(struct guest_info * core) { - v3_cpu_arch_t cpu_type = v3_get_cpu_type(v3_get_cpu_id()); + v3_cpu_arch_t cpu_type = v3_get_cpu_type(V3_Get_CPU()); struct v3_vm_info * vm = core->vm_info; /* diff --git a/palacios/src/palacios/vmm.c b/palacios/src/palacios/vmm.c index 4db75f1..938105e 100644 --- a/palacios/src/palacios/vmm.c +++ b/palacios/src/palacios/vmm.c @@ -101,6 +101,8 @@ void Init_V3(struct v3_os_hooks * hooks, int num_cpus) { V3_init_vnet(); #endif + +#ifdef CONFIG_MULTITHREAD_OS if ((hooks) && (hooks->call_on_cpu)) { for (i = 0; i < num_cpus; i++) { @@ -109,6 +111,10 @@ void Init_V3(struct v3_os_hooks * hooks, int num_cpus) { hooks->call_on_cpu(i, &init_cpu, (void *)(addr_t)i); } } +#else + init_cpu(0); +#endif + } @@ -164,11 +170,12 @@ static int start_core(void * p) return 0; } - +#ifdef CONFIG_MULTITHREAD_OS // For the moment very ugly. Eventually we will shift the cpu_mask to an arbitrary sized type... #define MAX_CORES 32 -int v3_start_vm(struct v3_vm_info * vm, unsigned int cpu_mask) { + +static int start_vm_multicore(struct v3_vm_info * vm, unsigned int cpu_mask) { uint32_t i; char tname[16]; int vcore_id = 0; @@ -232,6 +239,16 @@ int v3_start_vm(struct v3_vm_info * vm, unsigned int cpu_mask) { return 0; } +#endif + + +int v3_start_vm(struct v3_vm_info * vm, unsigned int cpu_mask) { +#ifdef CONFIG_MULTITHREAD_OS + return start_vm_multicore(vm, cpu_mask); +#else + return start_core(&(vm->cores[0])); +#endif +} int v3_stop_vm(struct v3_vm_info * vm) { @@ -335,7 +352,7 @@ void v3_print_cond(const char * fmt, ...) { } - +#ifdef CONFIG_MULTITHREAD_OS void v3_interrupt_cpu(struct v3_vm_info * vm, int logical_cpu, int vector) { extern struct v3_os_hooks * os_hooks; @@ -344,19 +361,7 @@ void v3_interrupt_cpu(struct v3_vm_info * vm, int logical_cpu, int vector) { (os_hooks)->interrupt_cpu(vm, logical_cpu, vector); } } - - - -unsigned int v3_get_cpu_id() { - extern struct v3_os_hooks * os_hooks; - unsigned int ret = (unsigned int)-1; - - if ((os_hooks) && (os_hooks)->get_cpu) { - ret = os_hooks->get_cpu(); - } - - return ret; -} +#endif diff --git a/palacios/src/palacios/vmm_config.c b/palacios/src/palacios/vmm_config.c index 2ac99da..6ffa3e4 100644 --- a/palacios/src/palacios/vmm_config.c +++ b/palacios/src/palacios/vmm_config.c @@ -429,7 +429,7 @@ static struct v3_vm_info * allocate_guest(int num_cores) { struct v3_vm_info * v3_config_guest(void * cfg_blob) { - v3_cpu_arch_t cpu_type = v3_get_cpu_type(v3_get_cpu_id()); + v3_cpu_arch_t cpu_type = v3_get_cpu_type(V3_Get_CPU()); struct v3_config * cfg_data = NULL; struct v3_vm_info * vm = NULL; int num_cores = 0;