X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fgeekos%2Fmain.c;h=f6595e8ef9d64f83e381f03fd465536d4e082b15;hb=f84bd0ca67af7c0a1143d5e279e0af408729128e;hp=87bea697c760257709da6ce51ef28366dd65d646;hpb=04fc4c8fbac29e04f0d0817a2906687c2c972559;p=palacios.git diff --git a/palacios/src/geekos/main.c b/palacios/src/geekos/main.c index 87bea69..f6595e8 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.18 $ + * $Revision: 1.43 $ * * This is free software. You are permitted to use, * redistribute, and modify it as specified in the file "COPYING". @@ -29,26 +29,53 @@ #include #include -#include -#include +#include +#include #include +#include +#include +#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 -extern void Get_MSR(ulong_t msr, unsigned int *val1, unsigned int *val2); -extern void Set_MSR(ulong_t msr, ulong_t val1, ulong_t val2); -extern uint_t Get_EIP(); -extern uint_t Get_ESP(); -extern uint_t Get_EBP(); - - -int foo=42; +void Spin() +{ + // hack - competing thread + while (1) {}; -#define SPEAKER_PORT 0x61 +} void Buzz(unsigned delay, unsigned num) @@ -97,44 +124,6 @@ inline uchar_t MyIn_Byte(ushort_t port) } -extern void MyBuzzVM(); - -#define MYBUZZVM_START MyBuzzVM -#define MYBUZZVM_LEN 0x3d - -void BuzzVM() -{ - int x; - int j; - unsigned char init; - - - SerialPrint("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; - } - } -} - -extern void RunVM(); - -int vmRunning = 0; - -void RunVM() { - vmRunning = 1; - - while(1); -} - @@ -219,18 +208,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; - // struct Kernel_Thread * vm_thread; - // struct VMDescriptor vm; - 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(); @@ -241,116 +239,100 @@ void Main(struct Boot_Info* bootInfo) Init_Keyboard(); Init_VM(bootInfo); Init_Paging(); - - // Init_IDE(); - - Print("Done; stalling\n"); - - -#if 0 - SerialPrint("Dumping VM kernel Code (first 512 bytes @ 0x%x)\n",VM_KERNEL_START); - SerialMemDump((unsigned char *)VM_KERNEL_START, 512); - /* - SerialPrint("Dumping kernel Code (first 512 bytes @ 0x%x)\n",KERNEL_START); - SerialMemDump((unsigned char *)VM_KERNEL_START, 512); - */ -#endif + //Init_PCI(); -#if 0 - SerialPrint("Dumping GUEST KERNEL CODE (first 512*2 bytes @ 0x100000)\n"); - SerialMemDump((unsigned char *)0x100000, 512*2); -#endif + Init_Stubs(); - 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); +#if TEST_NE2K + 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); - { - 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; - - - Init_VMM(&os_hooks, &vmm_ops); + 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)); - init_mem_layout(&(vm_info.mem_layout)); - init_mem_list(&(vm_info.mem_list)); - + while(uip_len <= 0) { + uip_periodic_conn(conn); + } + NE2K_Transmit(uip_len+UIP_LLH_LEN); /* This will transmit an ARP packet */ - add_mem_list_pages(&(vm_info.mem_list), vm_range_start, (vm_range_end - vm_range_start) / PAGE_SIZE); - // add_unmapped_mem_range(&(vm_info.mem_layout), 0, 256); - //add_shared_mem_range(&(vm_info.mem_layout), guest_kernel_start, (guest_kernel_end - guest_kernel_start) / PAGE_SIZE, guest_kernel_start); - //add_guest_mem_range(&(vm_info.mem_layout), guest_kernel_end, 20); + 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)); - add_shared_mem_range(&(vm_info.mem_layout), 0, 0x1000000, 0); + while(uip_len <= 0) { + uip_periodic_conn(conn); + } + NE2K_Transmit(uip_len+UIP_LLH_LEN); /* This *should* transmit a SYN packet */ - rip = (ulong_t)(void*)&BuzzVM; - vm_info.rip = rip; - rsp = (ulong_t)Alloc_Page(); - vm_info.rsp = rsp; +#endif /* TEST_NE2K */ + // Init_IDE(); - SerialPrint("Initializing Guest (eip=0x%.8x) (esp=0x%.8x)\n", rip, rsp); - (vmm_ops).init_guest(&vm_info); - SerialPrint("Starting Guest\n"); - (vmm_ops).start_guest(&vm_info); - - } + // Print("Done; stalling\n"); - SerialPrintLevel(1000,"Launching Noisemaker and keyboard listener threads\n"); +#if 0 + SerialPrint("Dumping VM kernel Code (first 128 bytes @ 0x%x)\n", 0x100000); + 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 + { + 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); /* - // jump into vmxassist - vm.entry_ip=(uint_t)0x00107fd0; - vm.exit_eip=0; - // Put the stack at 512K - vm.guest_esp=(uint_t)4096 + 8192 - 4; - *(unsigned int *)(vm.guest_esp) = 1024 * 1024; - vm.guest_esp -= 4; - *(unsigned int *)(vm.guest_esp) = 8; - vm.guest_esp -= 4; - *(unsigned int *)(vm.guest_esp) = vm.guest_esp + 4;; - vm.guest_esp -= 4; - *(unsigned int *)(vm.guest_esp) = vm.entry_ip; - // vm.guest_esp -= 4; - - - SerialMemDump((unsigned char *)vm.entry_ip, 512); + SerialPrint("Dumping kernel Code (first 512 bytes @ 0x%x)\n",KERNEL_START); + SerialMemDump((unsigned char *)VM_KERNEL_START, 512); */ - - // vm_thread = Start_Kernel_Thread(VM_Thread, (ulong_t)&vm,PRIORITY_NORMAL,false); - - SerialPrintLevel(1000,"Next: setup GDT\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 +#if !TEST_NE2K + { + RunVMM(bootInfo); + } +#endif + + + SerialPrint("RunVMM returned, spinning\n"); + while (1) {} TODO("Write a Virtual Machine Monitor"); - - /* Now this thread is done. */ + Exit(0); }