X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=linux_module%2Fpalacios-graphics-console.c;h=2602df96ab14225ebd8fcf35ccf931173ac985ce;hb=cf1a814109e7cb32b3f328ed5fdc79ccd6a34e17;hp=21c945700f7ba114a0ed18803df6282cab3a7435;hpb=9cf7a82c32a23118057172b1071388f19face739;p=palacios.git diff --git a/linux_module/palacios-graphics-console.c b/linux_module/palacios-graphics-console.c index 21c9457..2602df9 100644 --- a/linux_module/palacios-graphics-console.c +++ b/linux_module/palacios-graphics-console.c @@ -15,9 +15,12 @@ #include #include +#include "palacios-graphics-console.h" + #include "palacios.h" -#include "palacios-graphics-console.h" +#include "linux-exts.h" +#include "palacios-vm.h" #include @@ -37,19 +40,54 @@ */ + + +struct palacios_graphics_console { + // descriptor for the data in the shared frame buffer + struct v3_frame_buffer_spec spec; + // the actual shared frame buffer + // Note that "shared" here means shared between palacios and us + // This data could of course also be shared with userland + void *data; + + int cons_refcount; + int data_refcount; + + uint32_t num_updates; + + // Currently keystrokes and mouse movements are ignored + + // currently, we will not worry about locking this + // lock_t ... +}; + + static v3_graphics_console_t g_open(void * priv_data, struct v3_frame_buffer_spec *desired_spec, struct v3_frame_buffer_spec *actual_spec) { struct v3_guest * guest = (struct v3_guest *)priv_data; - struct palacios_graphics_console *gc = (struct palacios_graphics_console *) &(guest->graphics_console); + struct palacios_graphics_console * gc = NULL; uint32_t mem; - if(gc->data) { + if (guest == NULL) { + return 0; + } + + gc = get_vm_ext_data(guest, "GFX_CONSOLE_INTERFACE"); + + if (gc == NULL) { + printk("ERROR: Could not locate gfx console data for extension GFX_CONSOLE_INTERFACE\n"); + return 0; + } + + if (gc->data != NULL) { printk("palacios: framebuffer already allocated - returning it\n"); - *actual_spec=gc->spec; + + *actual_spec = gc->spec; gc->cons_refcount++; gc->data_refcount++; + return gc; } @@ -69,7 +107,6 @@ static v3_graphics_console_t g_open(void * priv_data, *actual_spec = gc->spec; - gc->guest=guest; gc->cons_refcount++; gc->data_refcount++; @@ -167,25 +204,29 @@ static int g_changed(v3_graphics_console_t cons) -static int palacios_graphics_console_key(struct palacios_graphics_console *cons, uint8_t scancode) +static int palacios_graphics_console_key(struct v3_guest * guest, + struct palacios_graphics_console *cons, + uint8_t scancode) { struct v3_keyboard_event e; - e.status=0; - e.scan_code=scancode; + e.status = 0; + e.scan_code = scancode; - v3_deliver_keyboard_event(cons->guest->v3_ctx,&e); + v3_deliver_keyboard_event(guest->v3_ctx, &e); return 0; } -static int palacios_graphics_console_mouse(struct palacios_graphics_console *cons, uint8_t x, uint8_t y, uint8_t buttons) +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 - v3_deliver_mouse_event(cons->guest->v3_ctx,&e); + v3_deliver_mouse_event(guest->v3_ctx,&e); return 0; } @@ -204,7 +245,7 @@ static struct v3_graphics_console_hooks palacios_graphics_console_hooks = }; -int palacios_init_graphics_console( void ) { +static int gfx_console_init( void ) { V3_Init_Graphics_Console(&palacios_graphics_console_hooks); @@ -212,9 +253,11 @@ int palacios_init_graphics_console( void ) { } -int palacios_graphics_console_user_query(struct palacios_graphics_console *cons, - struct v3_fb_query_response __user *u) -{ +static int fb_query(struct v3_guest * guest, unsigned int cmd, unsigned long arg, + void * priv_data) { + + struct v3_fb_query_response __user * u = (struct v3_fb_query_response __user *)arg; + struct palacios_graphics_console * cons = priv_data; struct v3_fb_query_response q; @@ -276,11 +319,15 @@ int palacios_graphics_console_user_query(struct palacios_graphics_console *cons, } -int palacios_graphics_console_user_input(struct palacios_graphics_console *cons, - struct v3_fb_input __user *u) -{ +static int fb_input(struct v3_guest * guest, + unsigned int cmd, + unsigned long arg, + void * priv_data) { + + struct v3_fb_input __user * u = (struct v3_fb_input __user *)arg; + struct palacios_graphics_console * cons = priv_data; struct v3_fb_input inp; - int rc=0; + int rc = 0; if (copy_from_user(&inp,(void __user *) u, sizeof(struct v3_fb_input))) { @@ -288,12 +335,13 @@ int palacios_graphics_console_user_input(struct palacios_graphics_console *cons, return -EFAULT; } - if (inp.data_type==V3_FB_KEY || inp.data_type==V3_FB_BOTH) { - rc = palacios_graphics_console_key(cons,inp.scan_code); + if ((inp.data_type == V3_FB_KEY) || (inp.data_type == V3_FB_BOTH)) { + rc = palacios_graphics_console_key(guest, cons, inp.scan_code); } - if (inp.data_type==V3_FB_MOUSE || inp.data_type==V3_FB_BOTH) { - rc |= palacios_graphics_console_mouse(cons,inp.mouse_data[0],inp.mouse_data[1],inp.mouse_data[2]); + if ((inp.data_type == V3_FB_MOUSE) || (inp.data_type == V3_FB_BOTH)) { + rc |= palacios_graphics_console_mouse(guest, cons, inp.mouse_data[0], + inp.mouse_data[1], inp.mouse_data[2]); } if (rc) { @@ -302,3 +350,29 @@ int palacios_graphics_console_user_input(struct palacios_graphics_console *cons, return 0; } } + + +static int gfx_console_guest_init(struct v3_guest * guest, void ** vm_data) { + struct palacios_graphics_console * gfx_cons = kmalloc(sizeof(struct palacios_graphics_console), GFP_KERNEL); + + memset(gfx_cons, 0, sizeof(struct palacios_graphics_console)); + + + add_guest_ctrl(guest, V3_VM_FB_INPUT, fb_input, gfx_cons); + add_guest_ctrl(guest, V3_VM_FB_QUERY, fb_query, gfx_cons); + + return 0; +} + + + +static struct linux_ext gfx_cons_ext = { + .name = "GFX_CONSOLE_INTERFACE", + .init = gfx_console_init, + .deinit = NULL, + .guest_init = gfx_console_guest_init, + .guest_deinit = NULL +}; + + +register_extension(&gfx_cons_ext);