if (!print_buffer[i]) {
ERROR("Cannot allocate print buffer for cpu %d\n",i);
deinit_print_buffers();
- return -1;
+ return -1;
}
memset(print_buffer[i],0,V3_PRINTK_BUF_SIZE);
}
* Creates a kernel thread.
*/
void *
-palacios_start_kernel_thread(
+palacios_create_and_start_kernel_thread(
int (*fn) (void * arg),
void * arg,
char * thread_name) {
wake_up_process(thread);
}
+
+/*
+ Convenience wrapper
+*/
+void *
+palacios_create_and_start_thread_on_cpu(int cpu_id,
+ int (*fn)(void * arg),
+ void * arg,
+ char * thread_name ) {
+
+ void *t = palacios_create_thread_on_cpu(cpu_id, fn, arg, thread_name);
+
+ if (t) {
+ palacios_start_thread(t);
+ }
+
+ return t;
+}
+
+
+
/**
* Rebind a kernel thread to the specified CPU
* The thread will be running on target CPU on return
.hook_interrupt = palacios_hook_interrupt,
.ack_irq = palacios_ack_interrupt,
.get_cpu_khz = palacios_get_cpu_khz,
- .start_kernel_thread = palacios_start_kernel_thread,
+ .start_kernel_thread = palacios_create_and_start_kernel_thread,
.yield_cpu = palacios_yield_cpu,
.sleep_cpu = palacios_sleep_cpu,
.wakeup_cpu = palacios_wakeup_cpu,
.get_cpu = palacios_get_cpu,
.interrupt_cpu = palacios_interrupt_cpu,
.call_on_cpu = palacios_xcall,
- .create_thread_on_cpu = palacios_start_thread_on_cpu,
+ .create_thread_on_cpu = palacios_create_thread_on_cpu,
.start_thread = palacios_start_thread,
.move_thread_to_cpu = palacios_move_thread_to_cpu,
};
.timer_stop = host_stop_timer,
.timer_reset = host_reset_timer,
- .thread_start = palacios_start_kernel_thread,
+ .thread_start = palacios_create_and_start_kernel_thread,
.thread_sleep = host_kthread_sleep,
.thread_wakeup = host_kthread_wakeup,
.thread_stop = host_kthread_stop,
void palacios_vfree(void *); // use instead of vfree
void *palacios_vaddr_to_paddr(void *vaddr);
void *palacios_paddr_to_vaddr(void *paddr);
-void *palacios_start_kernel_thread(int (*fn)(void * arg), void *arg, char *thread_name);
-void *palacios_start_thread_on_cpu(int cpu_id, int (*fn)(void * arg), void *arg, char *thread_name);
+void *palacios_create_and_start_kernel_thread(int (*fn)(void * arg), void *arg, char *thread_name);
+void *palacios_create_thread_on_cpu(int cpu_id, int (*fn)(void * arg), void *arg, char *thread_name);
+void palacios_start_thread(void *thread_ptr);
+void *palacios_creeate_and_start_thread_on_cpu(int cpu_id, int (*fn)(void * arg), void *arg, char *thread_name);
int palacios_move_thread_to_cpu(int new_cpu_id, void *thread_ptr);
void palacios_yield_cpu(void);
void palacios_sleep_cpu(unsigned int us);
-#define V3_CREATE_THREAD(fn, arg, name) ({ \
+#define V3_CREATE_AND_START_THREAD(fn, arg, name) ({ \
void * thread = NULL; \
extern struct v3_os_hooks * os_hooks; \
if ((os_hooks) && (os_hooks)->start_kernel_thread) { \
} \
})
+#define V3_CREATE_AND_START_THREAD_ON_CPU(cpu, fn, arg, name) ({ \
+ void *thread = V3_CREATE_THREAD_ON_CPU(cpu,fn,arg,name); \
+ if (thread) { \
+ V3_START_THREAD(thread); \
+ } \
+ thread; \
+ })
+
#define V3_MOVE_THREAD_TO_CPU(pcpu, thread) ({ \
int ret = -1; \
extern struct v3_os_hooks * os_hooks; \
struct v3_mem_region;
-typedef struct v3_xml v3_cfg_tree_t;
+struct v3_xml;
int v3_init_swapping();
int v3_deinit_swapping();
-int v3_init_swapping_vm(struct v3_vm_info *vm, v3_cfg_tree_t *config);
+int v3_init_swapping_vm(struct v3_vm_info *vm, struct v3_xml *config);
int v3_deinit_swapping_vm(struct v3_vm_info *vm);
// not needed yet
v3_console_register_cga(frontend, &cons_ops, state);
- V3_CREATE_THREAD(cons_server, state, "Telnet Console Network Server");
+ V3_CREATE_AND_START_THREAD(cons_server, state, "Telnet Console Network Server");
return 0;
}
#define CEIL_DIV(x,y) (((x)/(y)) + !!((x)%(y)))
-int v3_init_swapping_vm(struct v3_vm_info *vm, v3_cfg_tree_t *config)
+int v3_init_swapping_vm(struct v3_vm_info *vm, struct v3_xml *config)
{
v3_cfg_tree_t *swap_config;
char *enable;