summaryrefslogtreecommitdiff
path: root/kernel/kernel.c
blob: 79acf1828fccf2ab62aacbd6a73a51501d77f2a8 (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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
#define FOOLOS_MODULE_NAME "kernel"

#include <stdint.h>
#include <stddef.h> 

#include "syscalls.h"
#include "kernel.h"
#include "types.h"
#include "lib/logger/log.h"
#include "fifo.h"
#include "timer.h"
#include "mem.h"
#include "vmem.h"
#include "mp.h"
#include "interrupts.h"
#include "multiboot.h"
#include "ringbuffer.h"
#include "task.h"
#include "multiboot.h"
#include "terminal/terminal.h"
#include "driver/screen.h"


/* F00L 0S Entry point (called directly from asm/multiboot.asm */
void kernel_main(uint32_t eax,uint32_t ebx)
{

    // 
    // STDIN & STDOUT
    //
    uint32_t sstdin  = syscall_open("stdin",0,0);   // stdin  0
    uint32_t sstdout = syscall_open("term",0,0);    // stdout 1
    uint32_t sstderr = syscall_open("stderr",0,0);  // stderr 2

    //
    // PR
    //
    log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"%s - compiled on %s at %s",KERNEL_VERSION,__DATE__,__TIME__);

    // 
    // Setup Keyboard Driver
    //
    keyboard_init(sstdin);

    //
    // Configuring the PIT timer.
    //
    timer_init();

    //
    // GDT
    //
    gdt_setup();

    //
    // Setup Interrupts (code segment: 0x08)
    //
    int_init(0x08);

    // 
    // Process Multiboot Header
    //
    multiboot_information *info=get_multiboot(eax, ebx);

    //
    // Gather Info about other processors. (APs = application processors)
    // 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!");

    //
    //	Memory Init
    //
    //  after this is set up we will be able to allocate and deallocate 
    //  blocks of physical memory :)
    //
    uint32_t kernel_blocks=mem_init(info);

    //
    // Mount Root EXT2 ramimage (needs to be done before other processors started, because of /boot/mp.bin)
    // 
    fs_mount(info);

    // 
    // Start the other Processors (before paging because apic addr etc..?)
    //
    //TODO: !!! Check commented out sleep ()!!!
    smp_log_procdata(&procdata);
    smp_start_aps(&procdata,"/boot/mp.bin"); //will be copied over mbr

    //
    // Activate Virtual Memory (paging)
    //
    pdirectory *dir=vmem_init(kernel_blocks);

    //
    // 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();
    //
    
    //
    // Initialize Multitasking
    //
    task_init(dir); 

    //
    // Abvoe should never returon
    //
    panic(FOOLOS_MODULE_NAME,"reached end of kernel.c !!");
}