2 * This file is part of the Palacios Virtual Machine Monitor developed
3 * by the V3VEE Project with funding from the United States National
4 * Science Foundation and the Department of Energy.
6 * The V3VEE Project is a joint project between Northwestern University
7 * and the University of New Mexico. You can find out more at
10 * Copyright (c) 2008, Jack Lange <jarusl@cs.northwestern.edu>
11 * Copyright (c) 2008, The V3VEE Project <http://www.v3vee.org>
12 * All rights reserved.
14 * Author: Jack Lange <jarusl@cs.northwestern.edu>
16 * This is free software. You are permitted to use,
17 * redistribute, and modify it as specified in the file "V3VEE_LICENSE".
20 #include <lwk/palacios.h>
21 #include <lwk/types.h>
23 #include <lwk/string.h>
24 #include <lwk/cpuinfo.h>
25 #include <lwk/kernel.h>
26 #include <arch/page.h>
27 #include <arch/ptrace.h>
28 #include <arch/apic.h>
30 struct guest_info * g_vm_guest = NULL;
33 // This is the function the interface code should call to deliver
34 // the interrupt to the vmm for handling
35 //extern int v3_deliver_interrupt(struct guest_info * vm, struct v3_interrupt *intr);
38 struct guest_info * irq_to_guest_map[256];
46 struct guest_info * info
49 memset(irq_to_guest_map, 0, sizeof(struct guest_info *) * 256);
55 kitten_pa_to_va(void *ptr)
57 return (void*) __va(ptr);
66 return (void*) __pa(ptr);
75 struct pmem_region result;
77 int rc = pmem_alloc_umem( num_pages*PAGE_SIZE,PAGE_SIZE, &result );
89 struct pmem_region query;
90 struct pmem_region result;
92 pmem_region_unset_all(&query);
95 query.end = page+PAGE_SIZE;
97 int rc = pmem_query(&query,&result);
102 result.allocated = 0;
103 pmem_update(&result);
110 unsigned char status,
111 unsigned char scancode
117 struct v3_keyboard_event evt = {
119 .scan_code = scancode,
122 v3_deliver_keyboard_event( g_vm_guest, &evt );
128 unsigned char packet[3]
134 struct v3_mouse_event evt;
135 memcpy(evt.data, packet, 3);
137 v3_deliver_mouse_event(g_vm_guest, &evt);
143 unsigned int period_us
149 struct v3_timer_event evt = {
150 .period_us = period_us,
153 v3_deliver_timer_event( g_vm_guest, &evt );
158 translate_intr_handler(
159 struct pt_regs * regs,
163 struct v3_interrupt intr = {
165 .error = regs->orig_rax,
169 // PrintBoth("translate_intr_handler: opaque=0x%x\n",mystate.opaque);
170 v3_deliver_irq( irq_to_guest_map[intr.irq], &intr );
175 kitten_hook_interrupt(
176 struct guest_info * vm,
180 if( irq_to_guest_map[irq] ) {
181 //PrintBoth("Attempt to hook interrupt that is already hooked\n");
185 //PrintBoth("Hooked interrupt 0x%x with opaque 0x%x\n", irq, vm);
186 irq_to_guest_map[irq] = vm;
188 set_idtvec_handler( irq, translate_intr_handler );
198 lapic_ack_interrupt();
206 return cpu_info[0].arch.cur_cpu_khz;
210 struct v3_os_hooks v3vee_os_hooks = {
211 .print_debug = printk, // serial print ideally
212 .print_info = printk, // serial print ideally
213 .print_trace = printk, // serial print ideally
214 .allocate_pages = Allocate_VMM_Pages, // defined in vmm_stubs
215 .free_page = Free_VMM_Page, // defined in vmm_stubs
216 .malloc = kmem_alloc,
218 .vaddr_to_paddr = kitten_va_to_pa,
219 .paddr_to_vaddr = kitten_pa_to_va,
220 .hook_interrupt = kitten_hook_interrupt,
222 .get_cpu_khz = get_cpu_khz,