X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=linux_module%2Fiface-graphics-console.c;h=d47819c2dcf901d345f97a0f67bda30efe9e2be5;hb=a1e79c2d8ac8ae6ee326c207a83562e7de025ef8;hp=07d979b08cda357f32d72f54a11ea026837b22d1;hpb=791ea2f3e21cfbc9c47341efbb98995c33d86fcb;p=palacios.git diff --git a/linux_module/iface-graphics-console.c b/linux_module/iface-graphics-console.c index 07d979b..d47819c 100644 --- a/linux_module/iface-graphics-console.c +++ b/linux_module/iface-graphics-console.c @@ -41,6 +41,7 @@ */ +static struct list_head global_gcons; struct palacios_graphics_console { // descriptor for the data in the shared frame buffer @@ -62,10 +63,12 @@ struct palacios_graphics_console { void *priv_data); void *render_data; - int (*update_inquire)(v3_graphics_console_t cons, - void *priv_data); - - void *update_data; + int (*update_inquire)(v3_graphics_console_t cons, + void *priv_data); + + void *update_data; + + struct list_head gcons_node; }; @@ -146,7 +149,7 @@ static void g_close(v3_graphics_console_t cons) return; } if (gc->data) { - kfree(gc->data); + vfree(gc->data); gc->data=0; } } @@ -251,7 +254,7 @@ static int palacios_graphics_console_key(struct v3_guest * guest, struct palacios_graphics_console *cons, uint8_t scancode) { - struct v3_keyboard_event e; + struct v3_keyboard_event e; e.status = 0; e.scan_code = scancode; @@ -268,11 +271,12 @@ static int palacios_graphics_console_mouse(struct v3_guest * guest, struct palacios_graphics_console *cons, uint8_t x, uint8_t y, uint8_t buttons) { + /* struct v3_mouse_event e; e.data[0]=x; e.data[1]=y; e.data[2]=buttons; // These three are completely wrong, of course - ignoring mouse for now - + */ // mouse delivery is broken, so don't do it. // v3_deliver_mouse_event(guest->v3_ctx,&e); @@ -297,12 +301,30 @@ static struct v3_graphics_console_hooks palacios_graphics_console_hooks = static int graphics_console_init( void ) { + INIT_LIST_HEAD(&(global_gcons)); + V3_Init_Graphics_Console(&palacios_graphics_console_hooks); return 0; } +static int graphics_console_deinit( void ) { + struct palacios_graphics_console * gc = NULL; + struct palacios_graphics_console * tmp = NULL; + + list_for_each_entry_safe(gc, tmp, &(global_gcons), gcons_node) { + list_del(&(gc->gcons_node)); + + if (gc->data) + vfree(gc->data); + + palacios_free(gc); + } + + return 0; +} + static int fb_query(struct v3_guest * guest, unsigned int cmd, unsigned long arg, void * priv_data) { @@ -425,7 +447,7 @@ static int fb_input(struct v3_guest * guest, static int graphics_console_guest_init(struct v3_guest * guest, void ** vm_data) { - struct palacios_graphics_console * graphics_cons = kmalloc(sizeof(struct palacios_graphics_console), GFP_KERNEL); + struct palacios_graphics_console * graphics_cons = palacios_alloc(sizeof(struct palacios_graphics_console)); if (!graphics_cons) { ERROR("palacios: filed to do guest_init for graphics console\n"); @@ -439,17 +461,34 @@ static int graphics_console_guest_init(struct v3_guest * guest, void ** vm_data) add_guest_ctrl(guest, V3_VM_FB_INPUT, fb_input, graphics_cons); add_guest_ctrl(guest, V3_VM_FB_QUERY, fb_query, graphics_cons); + list_add(&(graphics_cons->gcons_node),&global_gcons); + return 0; } +static int graphics_console_guest_deinit(struct v3_guest * guest, void * vm_data) { + struct palacios_graphics_console * graphics_cons = (struct palacios_graphics_console *)vm_data; + + list_del(&(graphics_cons->gcons_node)); + + if (graphics_cons->data) { + vfree(graphics_cons->data); + } + + palacios_free(graphics_cons); + + return 0; +} + + static struct linux_ext graphics_cons_ext = { .name = "GRAPHICS_CONSOLE_INTERFACE", .init = graphics_console_init, - .deinit = NULL, + .deinit = graphics_console_deinit, .guest_init = graphics_console_guest_init, - .guest_deinit = NULL + .guest_deinit = graphics_console_guest_deinit, };