Palacios Public Git Repository

To checkout Palacios execute

  git clone http://v3vee.org/palacios/palacios.web/palacios.git
This will give you the master branch. You probably want the devel branch or one of the release branches. To switch to the devel branch, simply execute
  cd palacios
  git checkout --track -b devel origin/devel
The other branches are similar.


*** empty log message ***
[palacios.git] / palacios / src / geekos / main.c
1 /*
2  * GeekOS C code entry point
3  * Copyright (c) 2001,2003,2004 David H. Hovemeyer <daveho@cs.umd.edu>
4  * Copyright (c) 2003, Jeffrey K. Hollingsworth <hollings@cs.umd.edu>
5  * Copyright (c) 2004, Iulian Neamtiu <neamtiu@cs.umd.edu>
6  * $Revision: 1.35 $
7  * 
8  * This is free software.  You are permitted to use,
9  * redistribute, and modify it as specified in the file "COPYING".
10  */
11
12 #include <geekos/bootinfo.h>
13 #include <geekos/string.h>
14 #include <geekos/screen.h>
15 #include <geekos/mem.h>
16 #include <geekos/crc32.h>
17 #include <geekos/tss.h>
18 #include <geekos/int.h>
19 #include <geekos/kthread.h>
20 #include <geekos/trap.h>
21 #include <geekos/timer.h>
22 #include <geekos/keyboard.h>
23 #include <geekos/io.h>
24 #include <geekos/serial.h>
25 #include <geekos/reboot.h>
26 #include <geekos/mem.h>
27 #include <geekos/paging.h>
28 #include <geekos/ide.h>
29 #include <geekos/malloc.h>
30
31 #include <geekos/debug.h>
32
33
34 #include <geekos/vm.h>
35 #include <geekos/gdt.h>
36
37 #include <geekos/vmm_stubs.h>
38
39
40
41
42 #define SPEAKER_PORT 0x61
43
44
45
46 void Buzz(unsigned delay, unsigned num)
47 {
48   volatile int x;
49   int i,j;
50   unsigned char init;
51   
52   init=In_Byte(SPEAKER_PORT);
53
54   for (i=0;i<num;i++) { 
55     Out_Byte(SPEAKER_PORT, init|0x2);
56     for (j=0;j<delay;j++) { 
57       x+=j;
58     }
59     Out_Byte(SPEAKER_PORT, init);
60     for (j=0;j<delay;j++) { 
61       x+=j;
62     }
63   }
64 }
65
66 inline void MyOut_Byte(ushort_t port, uchar_t value)
67 {
68     __asm__ __volatile__ (
69         "outb %b0, %w1"
70         :
71         : "a" (value), "Nd" (port)
72     );
73 }
74
75 /*
76  * Read a byte from an I/O port.
77  */
78 inline uchar_t MyIn_Byte(ushort_t port)
79 {
80     uchar_t value;
81
82     __asm__ __volatile__ (
83         "inb %w1, %b0"
84         : "=a" (value)
85         : "Nd" (port)
86     );
87
88     return value;
89 }
90
91
92
93
94
95
96
97 void Buzzer(ulong_t arg) {
98   ulong_t *doIBuzz = (ulong_t*)arg;
99   while (1) {
100     // Quick and dirty hack to save my hearing...
101     // I'm not too worried about timing, so I'll deal with concurrency later...
102     if (*doIBuzz == 1) {
103       Buzz(1000000, 10);
104     }
105   }
106
107 }
108
109
110
111
112
113 void Keyboard_Listener(ulong_t arg) {
114   ulong_t * doIBuzz = (ulong_t*)arg;
115   Keycode key_press;
116
117   Print("Press F4 to turn on/off the speaker\n");
118
119   while ((key_press = Wait_For_Key())) {    
120     if (key_press == KEY_F4) {
121       Print("\nToggling Speaker Port\n");
122       SerialPrintLevel(100,"\nToggling Speaker Port\n");
123       *doIBuzz = (*doIBuzz + 1) % 2;
124     } else if (key_press == KEY_F5) {
125       Print("\nMachine Restart\n");
126       SerialPrintLevel(100,"\nMachine Restart\n");
127       machine_real_restart();
128     }
129   }
130   return;
131 }
132
133
134
135 extern char BSS_START, BSS_END;
136
137 extern char end;
138
139
140 /* This is an ugly hack to get at the VM  memory */
141 ulong_t vm_range_start;
142 ulong_t vm_range_end;
143 ulong_t guest_kernel_start;
144 ulong_t guest_kernel_end;
145 /* ** */
146
147
148 int AllocateAndMapPagesForRange(uint_t start, uint_t length, pte_t template_pte)
149 {
150   uint_t address;
151
152   for (address=start;address<start+length;address+=PAGE_SIZE) { 
153     void *page;
154     pte_t pte = template_pte;
155     
156     page=Alloc_Page();
157     KASSERT(page);
158     
159     pte.pageBaseAddr=PAGE_ALLIGNED_ADDR(page);
160
161     KASSERT(MapPage((void*)address,&pte,1));
162   }
163   
164   return 0;
165 }
166     
167
168
169 /*
170  * Kernel C code entry point.
171  * Initializes kernel subsystems, mounts filesystems,
172  * and spawns init process.
173  */
174 void Main(struct Boot_Info* bootInfo)
175 {
176   struct Kernel_Thread * key_thread;
177   struct Kernel_Thread * spkr_thread;
178
179   ulong_t doIBuzz = 0;
180
181   Out_Byte(0x1234,5);
182   Out_Byte(0x1234,5);
183
184   Init_BSS();
185   Init_Screen();
186
187   Init_Serial();
188   Init_Mem(bootInfo);
189   Init_CRC32();
190   Init_TSS();
191   Init_Interrupts();
192   Init_Scheduler();
193   Init_Traps();
194   Init_Timer();
195   Init_Keyboard();
196   Init_VM(bootInfo);
197   Init_Paging();
198   Init_Stubs();
199
200   //  Init_IDE();
201
202   // Print("Done; stalling\n");
203
204
205   
206 #if 0
207   SerialPrint("Dumping VM kernel Code (first 128 bytes @ 0x%x)\n", 0x100000);
208   SerialMemDump((unsigned char *)0x100000, 256);
209   /*
210     SerialPrint("Dumping kernel Code (first 512 bytes @ 0x%x)\n",KERNEL_START);
211     SerialMemDump((unsigned char *)VM_KERNEL_START, 512);
212   */
213 #endif
214
215 #if 1
216   SerialPrint("Dumping BIOS code ffff0-fffff\n\n");
217   SerialMemDump((unsigned char *)0x10fff0, 16);
218   /*
219     SerialPrint("Dumping kernel Code (first 512 bytes @ 0x%x)\n",KERNEL_START);
220     SerialMemDump((unsigned char *)VM_KERNEL_START, 512);
221   */
222
223   SerialPrint("Noisemaker and keyboard listener threads\n");
224   key_thread = Start_Kernel_Thread(Keyboard_Listener, (ulong_t)&doIBuzz, PRIORITY_NORMAL, false);
225   spkr_thread = Start_Kernel_Thread(Buzzer, (ulong_t)&doIBuzz, PRIORITY_NORMAL, false);
226
227 #endif
228
229   {
230     RunVMM(bootInfo);
231   }
232
233
234   
235
236
237   TODO("Write a Virtual Machine Monitor");
238   
239
240   Exit(0);
241 }