X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=kitten%2Fpalacios-glue%2Fvmm_stubs.c;h=672ca6c8e209ddf4f8730e0ff5a67c216f0f3a12;hb=c0376861301ad7abd8ded058d3445aa986f827c9;hp=789eee789a85f9053356f16914e74d4a5174dcd1;hpb=3aefb820e651c67fb0654fe1df301c8828dbb35d;p=palacios.git diff --git a/kitten/palacios-glue/vmm_stubs.c b/kitten/palacios-glue/vmm_stubs.c index 789eee7..672ca6c 100644 --- a/kitten/palacios-glue/vmm_stubs.c +++ b/kitten/palacios-glue/vmm_stubs.c @@ -41,151 +41,184 @@ struct guest_info * irq_to_guest_map[256]; -void Init_Stubs(struct guest_info * info) { - memset(irq_to_guest_map, 0, sizeof(struct guest_info *) * 256); - g_vm_guest = info; +void +v3vee_init_stubs( + struct guest_info * info +) +{ + memset(irq_to_guest_map, 0, sizeof(struct guest_info *) * 256); + g_vm_guest = info; } -void * kitten_pa_to_va(void *ptr) +static void * +kitten_pa_to_va(void *ptr) { - return (void*) __va(ptr); + return (void*) __va(ptr); } -void * kitten_va_to_pa(void *ptr) + +static void * +kitten_va_to_pa( + void * ptr +) { - return (void*) __pa(ptr); + return (void*) __pa(ptr); } -void * Allocate_VMM_Pages(int num_pages) + +static void * +Allocate_VMM_Pages( + int num_pages +) { - int rc; - struct pmem_region result; + struct pmem_region result; - rc=pmem_alloc_umem(num_pages*PAGE_SIZE,PAGE_SIZE,&result); - - if (rc) { - return 0; - } else { - return result.start; - } + int rc = pmem_alloc_umem( num_pages*PAGE_SIZE,PAGE_SIZE, &result ); + if( rc ) + return 0; + + return result.start; } -void Free_VMM_Page(void * page) +static void +Free_VMM_Page( + void * page +) { - int rc; - struct pmem_region query; - struct pmem_region result; + struct pmem_region query; + struct pmem_region result; - pmem_region_unset_all(&query); + pmem_region_unset_all(&query); - query.start=page; - query.end=page+PAGE_SIZE; + query.start = page; + query.end = page+PAGE_SIZE; - rc=pmem_query(&query,&result); + int rc = pmem_query(&query,&result); - if (!rc) { - result.allocated=0; - pmem_update(&result); - } else { - // BAD - } -} + if (rc) + panic( "BAD" ); + result.allocated = 0; + pmem_update(&result); +} -void send_key_to_vmm(unsigned char status, unsigned char scancode) { - struct v3_keyboard_event evt; +void +send_key_to_vmm( + unsigned char status, + unsigned char scancode +) +{ + if( !g_vm_guest ) + return; - evt.status = status; - evt.scan_code = scancode; + struct v3_keyboard_event evt = { + .status = status, + .scan_code = scancode, + }; - if (g_vm_guest) { - v3_deliver_keyboard_event(g_vm_guest, &evt); - } + v3_deliver_keyboard_event( g_vm_guest, &evt ); } -void send_mouse_to_vmm(unsigned char packet[3]) { - struct v3_mouse_event evt; - - memcpy(evt.data, packet, 3); - - if (g_vm_guest) { - v3_deliver_mouse_event(g_vm_guest, &evt); - } -} - -void send_tick_to_vmm(unsigned int period_us) { - struct v3_timer_event evt; +void +send_mouse_to_vmm( + unsigned char packet[3] +) +{ + if( !g_vm_guest ) + return; - evt.period_us = period_us; + struct v3_mouse_event evt; + memcpy(evt.data, packet, 3); - if (g_vm_guest) { - v3_deliver_timer_event(g_vm_guest, &evt); - } + v3_deliver_mouse_event(g_vm_guest, &evt); } -void translate_intr_handler(struct pt_regs *regs, unsigned int vector) +void +send_tick_to_vmm( + unsigned int period_us +) { - struct v3_interrupt intr; + if( !g_vm_guest ) + return; - intr.irq = vector-32; - intr.error = regs->orig_rax; - intr.should_ack = 0; + struct v3_timer_event evt = { + .period_us = period_us, + }; - // PrintBoth("translate_intr_handler: opaque=0x%x\n",mystate.opaque); + v3_deliver_timer_event( g_vm_guest, &evt ); +} - v3_deliver_irq(irq_to_guest_map[intr.irq], &intr); +void +translate_intr_handler( + struct pt_regs * regs, + unsigned int vector +) +{ + struct v3_interrupt intr = { + .irq = vector-32, + .error = regs->orig_rax, + .should_ack = 0, + }; + + // PrintBoth("translate_intr_handler: opaque=0x%x\n",mystate.opaque); + v3_deliver_irq( irq_to_guest_map[intr.irq], &intr ); } - -int kitten_hook_interrupt(struct guest_info * vm, unsigned int irq) +int +kitten_hook_interrupt( + struct guest_info * vm, + unsigned int irq +) { - if (irq_to_guest_map[irq]) { - //PrintBoth("Attempt to hook interrupt that is already hooked\n"); - return -1; - } else { - //PrintBoth("Hooked interrupt 0x%x with opaque 0x%x\n", irq, vm); - irq_to_guest_map[irq] = vm; - } - - set_idtvec_handler(irq,translate_intr_handler); - return 0; + if( irq_to_guest_map[irq] ) { + //PrintBoth("Attempt to hook interrupt that is already hooked\n"); + return -1; + } + + //PrintBoth("Hooked interrupt 0x%x with opaque 0x%x\n", irq, vm); + irq_to_guest_map[irq] = vm; + + set_idtvec_handler( irq, translate_intr_handler ); + return 0; } -int ack_irq(int irq) +static int +ack_irq( + int irq +) { - lapic_ack_interrupt(); - return 0; + lapic_ack_interrupt(); + return 0; } - - -unsigned int get_cpu_khz() +static unsigned int +get_cpu_khz( void ) { - return cpu_info[0].arch.cur_cpu_khz; + return cpu_info[0].arch.cur_cpu_khz; } struct v3_os_hooks v3vee_os_hooks = { - .print_debug = &printk, // serial print ideally - .print_info = &printk, // serial print ideally - .print_trace = &printk, // serial print ideally - .allocate_pages = &Allocate_VMM_Pages, // defined in vmm_stubs - .free_page = &Free_VMM_Page, // defined in vmm_stubs - .malloc = &kmem_alloc, - .free = &kmem_free, - .vaddr_to_paddr = &kitten_va_to_pa, - .paddr_to_vaddr = &kitten_pa_to_va, - .hook_interrupt = &kitten_hook_interrupt, - .ack_irq = &ack_irq, - .get_cpu_khz = &get_cpu_khz, + .print_debug = printk, // serial print ideally + .print_info = printk, // serial print ideally + .print_trace = printk, // serial print ideally + .allocate_pages = Allocate_VMM_Pages, // defined in vmm_stubs + .free_page = Free_VMM_Page, // defined in vmm_stubs + .malloc = kmem_alloc, + .free = kmem_free, + .vaddr_to_paddr = kitten_va_to_pa, + .paddr_to_vaddr = kitten_pa_to_va, + .hook_interrupt = kitten_hook_interrupt, + .ack_irq = ack_irq, + .get_cpu_khz = get_cpu_khz, };