1 #include <geekos/vmm_stubs.h>
3 #include <geekos/debug.h>
4 #include <geekos/serial.h>
6 #include <geekos/screen.h>
8 #include <palacios/vmm.h>
9 #include <palacios/vmm_io.h>
15 //#include <palacios/vmm_decoder.h>
19 #define SPEAKER_PORT 0x61
21 static inline void VM_Out_Byte(ushort_t port, uchar_t value)
23 __asm__ __volatile__ (
26 : "a" (value), "Nd" (port)
31 * Read a byte from an I/O port.
33 static inline uchar_t VM_In_Byte(ushort_t port)
37 __asm__ __volatile__ (
49 int IO_Read(ushort_t port, void * dst, uint_t length, void * priv_data) {
55 *(uchar_t*)dst = VM_In_Byte(port);
61 int IO_Write(ushort_t port, void * src, uint_t length, void * priv_data) {
67 VM_Out_Byte(port, *(uchar_t *)src);
73 int IO_Read_to_Serial(ushort_t port, void * dst, uint_t length, void * priv_data) {
74 PrintBoth("Input from Guest on port %d (0x%x) Length=%d\n", port, port, length);
80 char * bochs_debug_buf = NULL;
81 int bochs_debug_offset = 0;
83 char * bochs_info_buf = NULL;
84 int bochs_info_offset = 0;
87 int IO_BOCHS_debug(ushort_t port, void * src, uint_t length, void * priv_data) {
88 if (!bochs_debug_buf) {
89 bochs_debug_buf = (char*)Malloc(1024);
92 bochs_debug_buf[bochs_debug_offset++] = *(char*)src;
94 if ((*(char*)src == 0xa) || (bochs_debug_offset == 1023)) {
95 SerialPrint("BOCHSDEBUG>%s", bochs_debug_buf);
96 memset(bochs_debug_buf, 0, 1024);
97 bochs_debug_offset = 0;
103 int IO_BOCHS_info(ushort_t port, void * src, uint_t length, void * priv_data) {
104 if (!bochs_info_buf) {
105 bochs_info_buf = (char*)Malloc(1024);
108 bochs_info_buf[bochs_info_offset++] = *(char*)src;
110 if ((*(char*)src == 0xa) || (bochs_info_offset == 1023)) {
111 SerialPrint("BOCHSINFO>%s", bochs_info_buf);
112 memset(bochs_info_buf, 0, 1024);
113 bochs_info_offset = 0;
120 int IO_Write_to_Serial(ushort_t port, void * src, uint_t length, void * priv_data) {
121 SerialPrint("Output from Guest on port %d (0x%x) Length=%d\n", port, port, length);
125 SerialPrint(">0x%.2x\n", *(char*)src);
128 SerialPrint(">0x%.4x\n", *(ushort_t*)src);
131 SerialPrint(">0x%.8x\n", *(uint_t*)src);
137 // SerialMemDump(src, length);
150 __asm__ __volatile__ (
156 PrintBoth("Starting To Buzz\n");
158 init=VM_In_Byte(SPEAKER_PORT);
161 VM_Out_Byte(SPEAKER_PORT, init|0x2);
162 for (j=0;j<1000000;j++) {
165 VM_Out_Byte(SPEAKER_PORT, init);
166 for (j=0;j<1000000;j++) {
174 int passthrough_mem_read(void * guest_addr, void * dst, uint_t length, void * priv_data) {
175 memcpy(dst, (void*)guest_addr, length);
179 int passthrough_mem_write(void * guest_addr, void * src, uint_t length, void * priv_data) {
180 memcpy((void*)guest_addr, src, length);
186 /* We need a configuration mechanism, so we can wrap this completely inside the VMM code,
187 * with no pollution into the HOST OS
190 int RunVMM(struct Boot_Info * bootInfo) {
193 struct vmm_os_hooks os_hooks;
194 struct vmm_ctrl_ops vmm_ops;
195 v3_guest_t* vm_info = 0;
200 memset(&os_hooks, 0, sizeof(struct vmm_os_hooks));
201 memset(&vmm_ops, 0, sizeof(struct vmm_ctrl_ops));
204 os_hooks.print_debug = &SerialPrint;
205 os_hooks.print_info = &Print;
206 os_hooks.print_trace = &SerialPrint;
207 os_hooks.allocate_pages = &Allocate_VMM_Pages;
208 os_hooks.free_page = &Free_VMM_Page;
209 os_hooks.malloc = &VMM_Malloc;
210 os_hooks.free = &VMM_Free;
211 os_hooks.vaddr_to_paddr = &Identity;
212 os_hooks.paddr_to_vaddr = &Identity;
213 os_hooks.hook_interrupt = &geekos_hook_interrupt_new;
214 os_hooks.ack_irq = &ack_irq;
215 os_hooks.get_cpu_khz = &get_cpu_khz;
219 Init_V3(&os_hooks, &vmm_ops);
222 PrintBoth("testing decoder\n");
224 PrintBoth("testing decoder done\n");
227 extern char _binary_vm_kernel_start;
228 PrintBoth(" Guest Load Addr: 0x%x\n", &_binary_vm_kernel_start);
230 config_data = &_binary_vm_kernel_start;
232 vm_info = (vmm_ops).allocate_guest();
234 PrintBoth("Allocated Guest\n");
236 (vmm_ops).config_guest(vm_info, config_data);
238 PrintBoth("Configured guest\n");
240 v3_hook_io_port(vm_info, 0x61, &IO_Read, &IO_Write, NULL);
241 //v3_hook_io_port(&vm_info, 0x05, &IO_Read, &IO_Write_to_Serial, NULL);
244 v3_hook_io_port(vm_info, 0x400, &IO_Read, &IO_Write_to_Serial, NULL);
245 v3_hook_io_port(vm_info, 0x401, &IO_Read, &IO_Write_to_Serial, NULL);
246 v3_hook_io_port(vm_info, 0x402, &IO_Read, &IO_BOCHS_info, NULL);
247 v3_hook_io_port(vm_info, 0x403, &IO_Read, &IO_BOCHS_debug, NULL);
250 (vmm_ops).init_guest(vm_info);
251 PrintBoth("Starting Guest\n");
253 (vmm_ops).start_guest(vm_info);