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