* Copyright (c) 2001,2003,2004 David H. Hovemeyer <daveho@cs.umd.edu>
* Copyright (c) 2003, Jeffrey K. Hollingsworth <hollings@cs.umd.edu>
* Copyright (c) 2004, Iulian Neamtiu <neamtiu@cs.umd.edu>
- * $Revision: 1.31 $
+ * $Revision: 1.42 $
*
* This is free software. You are permitted to use,
* redistribute, and modify it as specified in the file "COPYING".
#include <geekos/vm.h>
#include <geekos/gdt.h>
+#include <geekos/vmm_stubs.h>
+#include <geekos/pci.h>
+#include <geekos/ne2k.h>
+#include <uip/uip.h>
#define SPEAKER_PORT 0x61
+#define TEST_NE2K 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);
+ uip_input();
+ return 0;
+}
+#endif
+void Spin()
+{
+ // hack - competing thread
+ while (1) {};
+
+}
void Buzz(unsigned delay, unsigned num)
*/
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();
Init_Keyboard();
Init_VM(bootInfo);
Init_Paging();
+
+ //Init_PCI();
+
+ Init_Stubs();
+
+#if TEST_NE2K
+ Init_Ne2k(&Packet_Received);
+ uip_init();
+
+ /* Local IP address */
+ uip_ipaddr_t ipaddr;
+ uip_ipaddr(ipaddr, 10,0,2,21);
+ uip_sethostaddr(ipaddr);
+
+ /* Remote IP address */
+ uip_ipaddr_t ripaddr;
+ uip_ipaddr(ripaddr, 10,0,2,20);
+ struct uip_conn *conn;
+ conn = uip_connect(&ripaddr, HTONS(8080));
+
+ while(uip_len <= 0) {
+ uip_periodic_conn(conn);
+ }
+/* Sending...*/
+ int size;
+ uchar_t *data;
+
+ /* Based on example code from the uIP documentation */
+ if(uip_len <= UIP_LLH_LEN + UIP_TCPIP_HLEN) {
+ size = uip_len + UIP_LLH_LEN;
+ data = Malloc(size);
+ memcpy(data, &uip_buf[0], UIP_LLH_LEN);
+ memcpy(data + UIP_LLH_LEN, &uip_buf[UIP_LLH_LEN], uip_len - UIP_LLH_LEN);
+ } else {
+ size = uip_len + UIP_LLH_LEN + UIP_TCPIP_HLEN;
+ data = Malloc(size);
+ memcpy(data, &uip_buf[0], UIP_LLH_LEN);
+ memcpy(data + UIP_LLH_LEN, &uip_buf[UIP_LLH_LEN], UIP_TCPIP_HLEN);
+ memcpy(data + UIP_LLH_LEN + UIP_TCPIP_HLEN, uip_appdata, uip_len - UIP_TCPIP_HLEN - UIP_LLH_LEN);
+ }
+/* Finished */
+#endif /* TEST_NE2K */
// Init_IDE();
-#if 1
+#if 0
SerialPrint("Dumping VM kernel Code (first 128 bytes @ 0x%x)\n", 0x100000);
SerialMemDump((unsigned char *)0x100000, 256);
/*
*/
#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
+#if TEST_NE2K
+ uchar_t src_addr[6] = { 0x52, 0x54, 0x00, 0x12, 0x34, 0x58 };
+ uchar_t dest_addr[6] = { 0x52, 0x54, 0x00, 0x12, 0x34, 0x56 };
+
+ /* manually copy over the src and dest mac addresses for now */
+ memcpy(data, dest_addr, 6);
+ memcpy(data + 6, src_addr, 6);
+ *(data+12) = size+2;
+ *(data+13) = 0x00;
+
+ uint_t i;
+ for(i = 0; i < 3; i++) {
+ NE2K_Send(data, size);
+ }
#endif
+#if !TEST_NE2K
{
- RunVMM();
+ RunVMM(bootInfo);
}
+#endif
-
+ SerialPrint("RunVMM returned, spinning\n");
+ while (1) {}
TODO("Write a Virtual Machine Monitor");