Diff markup
001 001
002 002
003 003
004 004
005 005
006 006
007 007
008 008
009 009
010 010
011 011
012 012
013 013
014 014
015 015
016 016
017 017
018 018
019 019
020 020
021 #include <bootstrap/multiboot.h> 021 #include <bootstrap/multiboot.h>
022 #include <hwcore/idt.h> 022 #include <hwcore/idt.h>
023 #include <hwcore/gdt.h> 023 #include <hwcore/gdt.h>
024 #include <hwcore/irq.h> 024 #include <hwcore/irq.h>
025 #include <hwcore/exception.h> 025 #include <hwcore/exception.h>
026 #include <hwcore/i8254.h> 026 #include <hwcore/i8254.h>
027 #include <sos/list.h> <<
028 #include <sos/physmem.h> <<
029 #include <sos/klibc.h> 027 #include <sos/klibc.h>
030 #include <sos/assert.h> 028 #include <sos/assert.h>
031 #include <drivers/x86_videomem.h> 029 #include <drivers/x86_videomem.h>
032 #include <drivers/bochs.h> 030 #include <drivers/bochs.h>
033 031
034 032
035 033
036 034
037 static void display_bits(unsigned char row, un 035 static void display_bits(unsigned char row, unsigned char col,
038 unsigned char attribu 036 unsigned char attribute,
039 sos_ui32_t integer) 037 sos_ui32_t integer)
040 { 038 {
041 int i; 039 int i;
042 040
043 for (i = 31 ; i >= 0 ; i--) 041 for (i = 31 ; i >= 0 ; i--)
044 { 042 {
045 043
046 int bit_i = (integer & (1 << i)); 044 int bit_i = (integer & (1 << i));
047 045
048 unsigned char ascii_code = bit_i?219:177 046 unsigned char ascii_code = bit_i?219:177;
049 sos_x86_videomem_putchar(row, col++, 047 sos_x86_videomem_putchar(row, col++,
050 attribute, 048 attribute,
051 ascii_code); 049 ascii_code);
052 } 050 }
053 } 051 }
054 052
055 053
056 054
057 static void clk_it(int intid) 055 static void clk_it(int intid)
058 { 056 {
059 static sos_ui32_t clock_count = 0; 057 static sos_ui32_t clock_count = 0;
060 058
061 display_bits(0, 48, 059 display_bits(0, 48,
062 SOS_X86_VIDEO_FG_LTGREEN | SOS_ 060 SOS_X86_VIDEO_FG_LTGREEN | SOS_X86_VIDEO_BG_BLUE,
063 clock_count); 061 clock_count);
064 clock_count++; 062 clock_count++;
065 063
066 } 064 }
067 065
068 #define MY_PPAGE_NUM_INT 511 !! 066
069 struct my_ppage !! 067 static void divide_ex(int exid)
070 { 068 {
071 sos_ui32_t before[MY_PPAGE_NUM_INT]; !! 069 static sos_ui32_t div_count = 0;
072 struct my_ppage *prev, *next; !! 070 display_bits(0, 0,
073 sos_ui32_t after[MY_PPAGE_NUM_INT]; !! 071 SOS_X86_VIDEO_FG_LTRED | SOS_X86_VIDEO_BG_BLUE,
074 }; !! 072 div_count);
075 !! 073 div_count++;
076 static void test_physmem() <<
077 { <<
078 <<
079 struct my_ppage *ppage_list, *my_ppage; <<
080 sos_count_t num_alloc_ppages = 0, num_free_p <<
081 <<
082 ppage_list = NULL; <<
083 while ((my_ppage = (struct my_ppage*)sos_phy <<
084 != NULL) <<
085 { <<
086 int i; <<
087 num_alloc_ppages++; <<
088 <<
089 <<
090 sos_x86_videomem_printf(2, 0, <<
091 SOS_X86_VIDEO_FG <<
092 | SOS_X86_VIDEO_ <<
093 "Could allocate <<
094 num_alloc_ppages <<
095 <<
096 <<
097 for (i = 0 ; i < MY_PPAGE_NUM_INT ; i++) <<
098 my_ppage->before[i] = my_ppage->after[ <<
099 <<
100 <<
101 list_add_tail(ppage_list, my_ppage); <<
102 } <<
103 <<
104 <<
105 while ((my_ppage = list_pop_head(ppage_list) <<
106 { <<
107 <<
108 <<
109 int i; <<
110 for (i = 0 ; i < MY_PPAGE_NUM_INT ; i++) <<
111 { <<
112 <<
113 if ((my_ppage->before[i] != (sos_ui <<
114 || (my_ppage->after[i] != (sos_ <<
115 { <<
116 <<
117 sos_x86_videomem_putstring(20, 0 <<
118 SOS_X <<
119 | S <<
120 "Page <<
121 return; <<
122 } <<
123 } <<
124 <<
125 <<
126 if (sos_physmem_unref_physpage((sos_padd <<
127 { <<
128 <<
129 sos_x86_videomem_putstring(20, 0, <<
130 SOS_X86_V <<
131 | SOS_X <<
132 "Cannot r <<
133 return; <<
134 } <<
135 <<
136 <<
137 num_free_ppages ++; <<
138 sos_x86_videomem_printf(2, 0, <<
139 SOS_X86_VIDEO_FG <<
140 | SOS_X86_VIDEO_ <<
141 "Could free %d p <<
142 num_free_ppages) <<
143 } <<
144 <<
145 <<
146 sos_x86_videomem_printf(2, 0, <<
147 SOS_X86_VIDEO_FG_LTG <<
148 | SOS_X86_VIDEO_BG_B <<
149 "Could allocate %d b <<
150 num_alloc_ppages << <<
151 num_free_ppages << S <<
152 <<
153 SOS_ASSERT_FATAL(num_alloc_ppages == num_fre <<
154 } 074 }
155 075
156 <<
157 076
158 void sos_main(unsigned long magic, unsigned lo 077 void sos_main(unsigned long magic, unsigned long addr)
159 { 078 {
160 unsigned i; 079 unsigned i;
161 sos_paddr_t sos_kernel_core_base_paddr, sos_ <<
162 080
163 081
164 082
165 083
166 multiboot_info_t *mbi; 084 multiboot_info_t *mbi;
167 mbi = (multiboot_info_t *) addr; 085 mbi = (multiboot_info_t *) addr;
168 086
169 087
170 sos_bochs_setup(); 088 sos_bochs_setup();
171 089
172 sos_x86_videomem_setup(); 090 sos_x86_videomem_setup();
173 sos_x86_videomem_cls(SOS_X86_VIDEO_BG_BLUE); 091 sos_x86_videomem_cls(SOS_X86_VIDEO_BG_BLUE);
174 092
175 093
176 if (magic == MULTIBOOT_BOOTLOADER_MAGIC) 094 if (magic == MULTIBOOT_BOOTLOADER_MAGIC)
177 095
178 sos_x86_videomem_printf(1, 0, 096 sos_x86_videomem_printf(1, 0,
179 SOS_X86_VIDEO_FG_Y 097 SOS_X86_VIDEO_FG_YELLOW | SOS_X86_VIDEO_BG_BLUE,
180 "Welcome From GRUB 098 "Welcome From GRUB to %s%c RAM is %dMB (upper mem = 0x%x kB)",
181 "SOS", ',', 099 "SOS", ',',
182 (unsigned)(mbi->me 100 (unsigned)(mbi->mem_upper >> 10) + 1,
183 (unsigned)mbi->mem 101 (unsigned)mbi->mem_upper);
184 else 102 else
185 103
186 sos_x86_videomem_printf(1, 0, 104 sos_x86_videomem_printf(1, 0,
187 SOS_X86_VIDEO_FG_Y 105 SOS_X86_VIDEO_FG_YELLOW | SOS_X86_VIDEO_BG_BLUE,
188 "Welcome to SOS"); 106 "Welcome to SOS");
189 107
190 sos_bochs_putstring("Message in a bochs\n"); 108 sos_bochs_putstring("Message in a bochs\n");
191 109
192 110
193 sos_gdt_setup(); 111 sos_gdt_setup();
194 sos_idt_setup(); 112 sos_idt_setup();
195 113
196 114
197 sos_exceptions_setup(); 115 sos_exceptions_setup();
198 sos_irq_setup(); 116 sos_irq_setup();
199 117
200 118
201 sos_i8254_set_frequency(100); 119 sos_i8254_set_frequency(100);
202 120
203 <<
204 <<
205 if (magic != MULTIBOOT_BOOTLOADER_MAGIC) <<
206 { <<
207 sos_x86_videomem_putstring(20, 0, <<
208 SOS_X86_VIDEO <<
209 | SOS_X86_V <<
210 | SOS_X86_V <<
211 "I'm not load <<
212 <<
213 for (;;) <<
214 continue; <<
215 } <<
216 <<
217 121
218 sos_irq_set_routine(SOS_IRQ_TIMER, 122 sos_irq_set_routine(SOS_IRQ_TIMER,
219 clk_it); 123 clk_it);
>> 124 sos_exception_set_routine(SOS_EXCEPT_DIVIDE_ERROR,
>> 125 divide_ex);
220 126
221 127
222 asm volatile ("sti\n"); 128 asm volatile ("sti\n");
223 !! 129
224 !! 130
225 !! 131
226 sos_physmem_setup((mbi->mem_upper<<10) + (1< !! 132
227 & sos_kernel_core_base_pad !! 133
228 & sos_kernel_core_top_padd !! 134 i = 10;
229 test_physmem(); !! 135 while (1)
230 !! 136 {
231 !! 137
232 for (;;) !! 138 sos_bochs_printf("i = 1 / %d...\n", i);
233 continue; !! 139 i = 1 / i;
>> 140 }
>> 141
>> 142
>> 143
>> 144
>> 145
>> 146 sos_x86_videomem_putstring(2, 0,
>> 147 SOS_X86_VIDEO_FG_LTRED | SOS_X86_VIDEO_BG_BLUE,
>> 148 "Invisible");
234 149
235 return; 150 return;
236 } 151 }