summaryrefslogtreecommitdiff
path: root/kernel/kernel.c
blob: 91e1c45b2c0df9566dcf3d7a950bb040dedf6d34 (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
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
#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 "multiboot.h"

#include "console.h"

#include <stddef.h> 

// for built-in shell
#include "lib/buffer/ringbuffer.h"
#include "task.h"


void kernel_main(uint32_t eax,uint32_t ebx)
{

    
    log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"kernel_main: eax=0x%08X ebx=0x%08X",eax,ebx);

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

    // 
    // Process Multiboot Header
    //
    
    if(eax!=0x2badb002)panic(FOOLOS_MODULE_NAME,"EAX was not set properly by your bootlaoder!");

    multiboot_information *info;
    info=ebx;
    if(info->flags&&1<<9)
    {
	log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"Loaded by: \"%s\"",info->boot_loader_name);
    }
    log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"multiboot flags: 0x%08X",info->flags);

    if(info->flags&&1<<0)
    {
	log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"mem_lower: %d KB",info->mem_lower);
	log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"mem_upper: %d KB",info->mem_upper);
    }

    if(info->flags&&1<<2)
    {
	log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"cmdline: \"%s\"",info->cmdline);
    }

    if(info->flags&&1<<3)
    {
	log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"%d modules loaded",info->mods_count);

	multiboot_mod *mod=info->mods_addr;

	for(int i=0;i<info->mods_count;i++)
	{
	    log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"mod at 0x%08X-0x%08X : %s", 
		    mod->mod_start,mod->mod_end, mod->string);
		    
	    mod++;
	}
    }

    if(info->flags&&1<<6)
    {
	log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"memory map of length %d provided by bootloader",info->mmap_length);

	uint32_t mmap_addr=info->mmap_addr;

	while(mmap_addr<info->mmap_addr+info->mmap_length)
	{
	    multiboot_mmap *mmap=mmap_addr;
	    uint32_t mem_start=mmap->base_addr;
	    uint32_t mem_end=mmap->base_addr+mmap->length;

	    log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"%08X - %08X / type: %d, size: %d",
		    mem_start, mem_end, mmap->type, mmap->size);

	    mmap_addr+=mmap->size+4;
	}

	
    }
    else panic(FOOLOS_MODULE_NAME,"Unable to continue without memory map, sorry!");

    //
    //	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!
 
}