-#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; \
}) \
+#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; \
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; \
})
-#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
+
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);
unsigned int (*get_cpu_khz)(void);
- void (*start_kernel_thread)(int (*fn)(void * arg), void * arg, char * thread_name);
void (*yield_cpu)(void);
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
};
#include <palacios/vmcs.h>
#include <palacios/vmcb.h>
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);
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) {
}
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;
/*
V3_init_vnet();
#endif
+
+#ifdef CONFIG_MULTITHREAD_OS
if ((hooks) && (hooks->call_on_cpu)) {
for (i = 0; i < num_cpus; i++) {
hooks->call_on_cpu(i, &init_cpu, (void *)(addr_t)i);
}
}
+#else
+ init_cpu(0);
+#endif
+
}
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;
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) {
}
-
+#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;
(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