/* * GeekOS C code entry point * Copyright (c) 2001,2003,2004 David H. Hovemeyer * Copyright (c) 2003, Jeffrey K. Hollingsworth * Copyright (c) 2004, Iulian Neamtiu * $Revision: 1.46 $ * * This is free software. You are permitted to use, * redistribute, and modify it as specified in the file "COPYING". */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #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) { volatile int x; int i,j; unsigned char init; init=In_Byte(SPEAKER_PORT); for (i=0;i0x%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(); Init_Interrupts(); Init_Scheduler(); Init_Traps(); Init_Timer(); 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(); // Print("Done; stalling\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); /* SerialPrint("Dumping kernel Code (first 512 bytes @ 0x%x)\n",KERNEL_START); SerialMemDump((unsigned char *)VM_KERNEL_START, 512); */ 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 { RunVMM(bootInfo); } SerialPrint("RunVMM returned, spinning\n"); while (1) {} TODO("Write a Virtual Machine Monitor"); Exit(0); }