summaryrefslogtreecommitdiff
path: root/kernel/kernel.c
blob: 3bae34dffa54108428e67fd38d40b29dc931ff1e (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
#define FOOLOS_MODULE_NAME "dupa"
#include "kernel/kernel.h"

#include <stdint.h>

#include "driver/serial.h"
#include "driver/timer.h"
#include "driver/keyboard.h"
#include "driver/mouse.h"

#include "kernel/gdt.h"
#include "kernel/scheduler.h"

#include "syscalls.h"
#include "types.h"
#include "fifo.h"
#include "mem.h"
#include "vmem.h"
#include "mp.h"
#include "interrupts.h"
#include "multiboot.h"
#include "ringbuffer.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)
{
    serial_init();

    klog ("%s - BUILD: git-%s (%s %s)",KERNEL_NAME,GIT_REVISION,__DATE__,__TIME__);

    log(FOOLOS_MODULE_NAME,5,"COM 1 - initialized");

    uint64_t epoch_time=timer_init();
    log(FOOLOS_MODULE_NAME,5,"PIT - initialized. %u seconds passed since 1970.",epoch_time);

    keyboard_init(0); //sstdin
    log(FOOLOS_MODULE_NAME,5,"Keyboard Initialized");

    mouse_init();
    log(FOOLOS_MODULE_NAME,5,"Mouse Initialized");

    gdt_init();
    log(FOOLOS_MODULE_NAME,5,"GDT Initialized");

    // 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 (allows allocating and deaclloating 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 ()!!!
    // https://wiki.osdev.org/Symmetric_Multiprocessing
    // smp_log_procdata(&procdata);
    // smp_start_aps(&procdata,"/boot/mp.bin"); //will be copied over mbr
    
    // VIRTUAL MEMORY (paging)
    pdirectory *dir=vmem_init(kernel_blocks,(uint32_t)info->framebuffer_addr);

    // PCI Bus
    //pci_init();
    
    // INIT VESA: TODO: stop and say if not 32bit colormode!
    uint32_t addr=kballoc(1);
    fs_content("/binfont.bin",addr,0x100); // copy 0x100 bytes to 0x7000     

    vesa_init(info->vbe_control_info,info->vbe_mode_info,addr);

    // STREAMS
    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

    interrupts_init(0x08);

    scheduler_init(dir); 

}