X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fgeekos%2Fmain.c;h=5e1d714484d7ffbff631fc0cc5bbf9b8f5b714eb;hb=eb7dda8d4a92a2e8d0c8f867c65317d756ca6c11;hp=dce6c85b4c6c4cbc503422480827389056f05337;hpb=7acd54f8c3b30d118d56186a9c6506f21f85096d;p=palacios.git diff --git a/palacios/src/geekos/main.c b/palacios/src/geekos/main.c index dce6c85..5e1d714 100644 --- a/palacios/src/geekos/main.c +++ b/palacios/src/geekos/main.c @@ -3,7 +3,7 @@ * Copyright (c) 2001,2003,2004 David H. Hovemeyer * Copyright (c) 2003, Jeffrey K. Hollingsworth * Copyright (c) 2004, Iulian Neamtiu - * $Revision: 1.24 $ + * $Revision: 1.46 $ * * This is free software. You are permitted to use, * redistribute, and modify it as specified in the file "COPYING". @@ -29,16 +29,58 @@ #include #include -#include +#include #include - #include +#include + +#if 0 +#include +#include +#include +#endif + +#include +//#include #define SPEAKER_PORT 0x61 +#define TEST_NE2K 0 +#define BUF ((struct uip_eth_hdr *)&uip_buf[0]) + +#if TEST_NE2K +u8_t uip_buf[UIP_BUFSIZE+2]; +u16_t uip_len; + +int Packet_Received(struct NE2K_Packet_Info* info, uchar_t *pkt) { + uip_len = info->size; + int i; + for(i = 0; i < info->size; i++) { + PrintBoth("%x ", *(pkt+i)); + uip_buf[i] = *(pkt+i); + if(i % 10 == 0) + PrintBoth("\n"); + } + Free(pkt); + if(BUF->type == htons(UIP_ETHTYPE_ARP)) { + uip_arp_arpin(); + } else { + uip_arp_ipin(); + uip_input(); + } + return 0; +} +#endif + +void Spin() +{ + // hack - competing thread + while (1) {}; + +} void Buzz(unsigned delay, unsigned num) @@ -88,66 +130,6 @@ inline uchar_t MyIn_Byte(ushort_t port) -int IO_Read(ushort_t port, void * dst, uint_t length) { - uchar_t * iter = dst; - uint_t i; - - for (i = 0; i < length; i++) { - *iter = MyIn_Byte(port); - iter++; - } - - return 0; -} - - - -int IO_Write(ushort_t port, void * src, uint_t length) { - uchar_t * iter = src; - uint_t i; - - - for (i = 0; i < length; i++) { - MyOut_Byte(port, *iter); - iter++; - } - - return 0; -} - - -void BuzzVM() -{ - int x; - int j; - unsigned char init; - -#if 0 - __asm__ __volatile__ ( - "popf" - ); - -#endif - - PrintBoth("Starting To Buzz\n"); - - init=MyIn_Byte(SPEAKER_PORT); - - while (1) { - MyOut_Byte(SPEAKER_PORT, init|0x2); - for (j=0;j<1000000;j++) { - x+=j; - } - MyOut_Byte(SPEAKER_PORT, init); - for (j=0;j<1000000;j++) { - x+=j; - } - } -} - - - - @@ -231,16 +213,27 @@ int AllocateAndMapPagesForRange(uint_t start, uint_t length, pte_t template_pte) */ void Main(struct Boot_Info* bootInfo) { - struct Kernel_Thread * key_thread; - struct Kernel_Thread * spkr_thread; - ulong_t doIBuzz = 0; + + //Out_Byte(0x1234,5); + //Out_Byte(0x1234,5); Init_BSS(); Init_Screen(); - Init_Serial(); + + /* { + extern char BSS_START, BSS_END; + + SerialPrint("BSS 0x%x->0x%x\n", &BSS_START, &BSS_END); + + }*/ + + + // SerialPrint("Guest Mem Dump at 0x%x\n", 0x100000); + //SerialMemDump((unsigned char *)(0x100000), 261 * 1024); + Init_Mem(bootInfo); Init_CRC32(); Init_TSS(); @@ -251,6 +244,63 @@ void Main(struct Boot_Info* bootInfo) Init_Keyboard(); Init_VM(bootInfo); Init_Paging(); + + //Init_PCI(); + + Init_Stubs(); + +#if 0 + { + init_network(); + uchar_t local_addr[4]; + uchar_t remote_addr[4]; + + local_addr[0] = 10; + local_addr[1] = 0; + local_addr[2] = 2; + local_addr[3] = 21; + + set_ip_addr(local_addr); + + remote_addr[0] = 10; + remote_addr[1] = 0; + remote_addr[2] = 2; + remote_addr[3] = 20; + + + connect(remote_addr, 4301); + } +#elif 0 + Init_Ne2k(&Packet_Received); + uip_init(); + uip_arp_init(); + + uip_ipaddr_t ipaddr; + uip_ipaddr(ipaddr, 10,0,2,21); /* Local IP address */ + uip_sethostaddr(ipaddr); + + uip_ipaddr_t ripaddr; + uip_ipaddr(ripaddr, 10,0,2,20); /* Remote IP address */ + + /* Attempt a connection to port 8080 at address 10.0.2.20 */ + struct uip_conn *conn; + conn = uip_connect(&ripaddr, HTONS(8080)); + + while(uip_len <= 0) { + uip_periodic_conn(conn); + } + NE2K_Transmit(uip_len+UIP_LLH_LEN); /* This will transmit an ARP packet */ + + int l = 0; + while(l++ < 5000); /* When this is done, a response to the ARP should have been received. */ + conn = uip_connect(&ripaddr, HTONS(8080)); + + while(uip_len <= 0) { + uip_periodic_conn(conn); + } + NE2K_Transmit(uip_len+UIP_LLH_LEN); /* This *should* transmit a SYN packet */ + +#endif /* TEST_NE2K */ // Init_IDE(); @@ -260,105 +310,50 @@ void Main(struct Boot_Info* bootInfo) #if 0 SerialPrint("Dumping VM kernel Code (first 128 bytes @ 0x%x)\n", 0x100000); - SerialMemDump((unsigned char *)0xfe000, 4096); + SerialMemDump((unsigned char *)0x100000, 256); /* SerialPrint("Dumping kernel Code (first 512 bytes @ 0x%x)\n",KERNEL_START); SerialMemDump((unsigned char *)VM_KERNEL_START, 512); */ #endif + +#if 1 + struct Kernel_Thread *spin_thread; + + spin_thread=Start_Kernel_Thread(Spin,0,PRIORITY_NORMAL,false); + +#endif + #if 0 - SerialPrint("Dumping BIOS code f0000-fffff\n\n"); - SerialMemDump((unsigned char *)0xf0000, 65536); + { + + struct Kernel_Thread * key_thread; + struct Kernel_Thread * spkr_thread; + + ulong_t doIBuzz = 0; + + SerialPrint("Dumping BIOS code ffff0-fffff\n\n"); + SerialMemDump((unsigned char *)0x10fff0, 16); /* SerialPrint("Dumping kernel Code (first 512 bytes @ 0x%x)\n",KERNEL_START); SerialMemDump((unsigned char *)VM_KERNEL_START, 512); */ -#endif -#if 1 - SerialPrintLevel(1000,"Launching Noisemaker and keyboard listener threads\n"); + SerialPrint("Noisemaker and keyboard listener threads\n"); key_thread = Start_Kernel_Thread(Keyboard_Listener, (ulong_t)&doIBuzz, PRIORITY_NORMAL, false); spkr_thread = Start_Kernel_Thread(Buzzer, (ulong_t)&doIBuzz, PRIORITY_NORMAL, false); - + } #endif - { - struct vmm_os_hooks os_hooks; - struct vmm_ctrl_ops vmm_ops; - guest_info_t vm_info; - addr_t rsp; - addr_t rip; - - memset(&os_hooks, 0, sizeof(struct vmm_os_hooks)); - memset(&vmm_ops, 0, sizeof(struct vmm_ctrl_ops)); - memset(&vm_info, 0, sizeof(guest_info_t)); - - os_hooks.print_debug = &PrintBoth; - os_hooks.print_info = &Print; - os_hooks.print_trace = &SerialPrint; - os_hooks.allocate_pages = &Allocate_VMM_Pages; - os_hooks.free_page = &Free_VMM_Page; - os_hooks.malloc = &VMM_Malloc; - os_hooks.free = &VMM_Free; - os_hooks.vaddr_to_paddr = &Identity; - os_hooks.paddr_to_vaddr = &Identity; - - - // DumpGDT(); - Init_VMM(&os_hooks, &vmm_ops); - - init_shadow_map(&(vm_info.mem_map)); - init_shadow_page_state(&(vm_info.shadow_page_state)); - vm_info.page_mode = SHADOW_PAGING; - - vm_info.cpu_mode = REAL; - init_vmm_io_map(&(vm_info.io_map)); - - - if (0) { - - // add_shared_mem_range(&(vm_info.mem_layout), 0, 0x800000, 0x10000); - // add_shared_mem_range(&(vm_info.mem_layout), 0, 0x1000000, 0); - - rip = (ulong_t)(void*)&BuzzVM; - // rip -= 0x10000; - // rip = (addr_t)(void*)&exit_test; - // rip -= 0x2000; - vm_info.rip = rip; - rsp = (addr_t)Alloc_Page(); - - vm_info.rsp = (rsp +4092 );// - 0x2000; - - - } else { - //add_shared_mem_range(&(vm_info.mem_layout), 0x0, 0x1000, 0x100000); - // add_shared_mem_range(&(vm_info.mem_layout), 0x0, 0x100000, 0x0); - - shadow_region_t *ent = Malloc(sizeof(shadow_region_t));; - init_shadow_region_physical(ent,0,0x100000,GUEST_REGION_PHYSICAL_MEMORY, - 0x100000, HOST_REGION_PHYSICAL_MEMORY); - add_shadow_region(&(vm_info.mem_map),ent); - - hook_io_port(&(vm_info.io_map), 0x61, &IO_Read, &IO_Write); - /* - vm_info.cr0 = 0; - vm_info.cs.base=0xf000; - vm_info.cs.limit=0xffff; - */ - vm_info.rip = 0xfff0; - vm_info.rsp = 0x0; - } - - PrintBoth("Initializing Guest (eip=0x%.8x) (esp=0x%.8x)\n", (uint_t)vm_info.rip,(uint_t)vm_info.rsp); - (vmm_ops).init_guest(&vm_info); - PrintBoth("Starting Guest\n"); - (vmm_ops).start_guest(&vm_info); + { + RunVMM(bootInfo); } - + SerialPrint("RunVMM returned, spinning\n"); + while (1) {} TODO("Write a Virtual Machine Monitor");