Palacios Public Git Repository

To checkout Palacios execute

  git clone http://v3vee.org/palacios/palacios.web/palacios.git
This will give you the master branch. You probably want the devel branch or one of the release branches. To switch to the devel branch, simply execute
  cd palacios
  git checkout --track -b devel origin/devel
The other branches are similar.


V3VEE compiles. Segfaults, but the callback structures work.
[palacios.git] / kitten / palacios-glue / vmm_stubs.c
1 /*
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.  
5  *
6  * The V3VEE Project is a joint project between Northwestern University
7  * and the University of New Mexico.  You can find out more at 
8  * http://www.v3vee.org
9  *
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.
13  *
14  * Author: Jack Lange <jarusl@cs.northwestern.edu>
15  *
16  * This is free software.  You are permitted to use,
17  * redistribute, and modify it as specified in the file "V3VEE_LICENSE".
18  */
19
20 #include <lwk/palacios.h>
21 #include <lwk/types.h>
22 #include <lwk/pmem.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>
29
30 struct guest_info * g_vm_guest = NULL;
31
32
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);
36
37
38 struct guest_info * irq_to_guest_map[256];
39
40
41
42
43
44 void Init_Stubs(struct guest_info * info) {
45   memset(irq_to_guest_map, 0, sizeof(struct guest_info *) * 256);
46   g_vm_guest = info;
47 }
48
49
50 void * kitten_pa_to_va(void *ptr)
51 {
52   return (void*) __va(ptr);
53 }
54
55 void * kitten_va_to_pa(void *ptr)
56 {
57   return (void*) __pa(ptr);
58 }
59
60 void * Allocate_VMM_Pages(int num_pages) 
61 {
62   int rc;
63   struct pmem_region result;
64   
65   rc=pmem_alloc_umem(num_pages*PAGE_SIZE,PAGE_SIZE,&result);
66   
67   if (rc) {
68     return 0;
69   } else {
70     return result.start;
71   }
72 }
73
74 void Free_VMM_Page(void * page) 
75 {
76   int rc;
77   struct pmem_region query;
78   struct pmem_region result;
79
80   pmem_region_unset_all(&query);
81
82   query.start=page;
83   query.end=page+PAGE_SIZE;
84
85   rc=pmem_query(&query,&result);
86
87   if (!rc) { 
88     result.allocated=0;
89     pmem_update(&result);
90   } else {
91     // BAD
92   }
93 }
94
95
96
97
98 void send_key_to_vmm(unsigned char status, unsigned char scancode) {
99   struct v3_keyboard_event evt;
100
101   evt.status = status;
102   evt.scan_code = scancode;
103
104   if (g_vm_guest) {
105     v3_deliver_keyboard_event(g_vm_guest, &evt);
106   }
107 }
108
109
110 void send_mouse_to_vmm(unsigned char packet[3]) {
111   struct v3_mouse_event evt;
112
113   memcpy(evt.data, packet, 3);
114
115   if (g_vm_guest) {
116     v3_deliver_mouse_event(g_vm_guest, &evt);
117   }
118 }
119
120 void send_tick_to_vmm(unsigned int period_us) {
121   struct v3_timer_event evt;
122
123   evt.period_us = period_us;
124
125   if (g_vm_guest) {
126     v3_deliver_timer_event(g_vm_guest, &evt);
127   }
128 }
129
130
131 void translate_intr_handler(struct pt_regs *regs, unsigned int vector) 
132 {
133   struct v3_interrupt intr;
134
135   intr.irq = vector-32;
136   intr.error = regs->orig_rax;
137   intr.should_ack = 0;
138
139   //  PrintBoth("translate_intr_handler: opaque=0x%x\n",mystate.opaque);
140
141   v3_deliver_irq(irq_to_guest_map[intr.irq], &intr);
142
143 }
144
145
146
147 int kitten_hook_interrupt(struct guest_info * vm, unsigned int  irq)
148 {
149   if (irq_to_guest_map[irq]) { 
150     //PrintBoth("Attempt to hook interrupt that is already hooked\n");
151     return -1;
152   } else {
153     //PrintBoth("Hooked interrupt 0x%x with opaque 0x%x\n", irq, vm);
154     irq_to_guest_map[irq] = vm;
155   }
156
157   set_idtvec_handler(irq,translate_intr_handler);
158   return 0;
159 }
160
161
162 int ack_irq(int irq) 
163 {
164   lapic_ack_interrupt();
165   return 0;
166 }
167
168   
169
170
171 unsigned int get_cpu_khz() 
172 {
173   return   cpu_info[0].arch.cur_cpu_khz;
174 }
175
176
177 struct v3_os_hooks v3vee_os_hooks = {
178         .print_debug = &printk,  // serial print ideally
179         .print_info = &printk,   // serial print ideally
180         .print_trace = &printk,  // serial print ideally
181         .allocate_pages = &Allocate_VMM_Pages, // defined in vmm_stubs
182         .free_page = &Free_VMM_Page, // defined in vmm_stubs
183         .malloc = &kmem_alloc,
184         .free = &kmem_free,
185         .vaddr_to_paddr = &kitten_va_to_pa,
186         .paddr_to_vaddr = &kitten_pa_to_va,
187         .hook_interrupt = &kitten_hook_interrupt,
188         .ack_irq = &ack_irq,
189         .get_cpu_khz = &get_cpu_khz,
190 };
191