blob: 401204a7feb30d6e8c1820630e0a4aecbc1926a8 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
|
#define FOOLOS_MODULE_NAME "kernel"
#ifdef __linux__
#error "Watchout! this is not Linux but FoolOS. Use a cross-compiler"
#endif
#include <stdint.h>
#include "config.h"
#include "types.h"
#include "lib/logger/log.h"
#include "timer.h"
#include "mem.h"
#include "vmem.h"
#include "interrupts.h"
#include "console.h"
// for built-in shell
#include "lib/buffer/ringbuffer.h"
#include "task.h"
// mp informs us if this if this is the main processor
void kernel_main(uint32_t initial_stack, int mp)
{
log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"initial_stack: 0x%08X",initial_stack);
//
// Configuring the PIT timer.
//
timer_init();
//
// Memory Init
//
// after this is set up we will be able to allocate and deallocate
// blocks of physical memory :)
//
// we know that here, the bootloader placed the memory map and
// the number of entries.
//
mem_init((physical_address)0xa001,(int)(*((uint16_t *)(0xa000))));
//
// init output to screen
//
uint32_t physbase=console_init();
//
// Activate Virtual Memory (paging)
pdirectory *dir=vmem_init(physbase);
// log buffered messages to console
log_log();
while(1);
//
// Setup Interrupts (code segment: 0x08)
//
int_init(0x08);
//
// Scan the PCI Bus
//
// We are interested in the E1000 Network Adapter in particular
// Its driver will be hopefully implemented one day ;) TODO
//
//pci_init();
//
// Gather Info about other processors. (APs)
// ACPI or MP
//
//
/*
smp_processors procdata;
if(!acpi_find(&procdata))
if(!mp_find(&procdata))
panic(FOOLOS_MODULE_NAME,"ACPI and MP search failed! I do not want to continue!");
*/
//
// Start the other Processors (also before paging for some reason!)
//
//smp_log_procdata(&procdata);
//smp_start_aps(&procdata,0x80000); // starts at 0x80000
// but it will be copied over mbr
//
// Initialize Multitasking
//
task_init(dir); //; this will never return!
}
|