summaryrefslogtreecommitdiff
path: root/kernel/kernel.c
blob: 88df43efc86d613186cf104033c8031bba40639e (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
//
// http://www.jamesmolloy.co.uk/tutorial_html/9.-Multitasking.html
//

#include "kernel.h"	// general kernel config & includes
#include "console.h"	// this will allow us to write to screen
#include "x86.h"

#include "../lib/logger/log.h"	// logger facilities
#define FOOLOS_MODULE_NAME "kernel"

// TODO: cleanup . WHHYY can i compile it without the includes!??

///////
// interrupt handler prototypes
// todo: move somewhere else!?
void int_def_handler();
void int_clock_handler();
void int_kb_handler();
void int_floppy_handler();

////////// KERNEL MAIN///// /////
//

uint32_t read_eip();

// just a test handler for software interrupt 88, todo: remove and 
// implement some syscalls!
//
void int_test_handler_worker()
{
    // this can not be called directly from interrupt handler
    // due to optional parameters (...)  probably!
   panic(FOOLOS_MODULE_NAME,"unhandled EXCEPTION!");
}
void int_test_handler()
{
    X86_IRQ_BEGIN
    int_test_handler_worker();
    sleep(30);
    while(1); // hang!
    X86_IRQ_END
}

// heart of our operating system.
void kernel_main(uint32_t initial_stack)
{

    // 
    // We want to get output to the screen as fast as possible!
    //
    // Our Fool-Boot-Loader did set up VESA already for us.
    // The desired VESA mode is hardcoded in [boot/mbr.asm].
    //
    // The [vesa_init(...)] function requires:
    //
    //	* the addresses of the vbeinfo struct
    //	* the address of the vbemodeinfo struct (for selected mode).
    //	* the address of our Fool-Font binary data.
    //
    //	The first two paramters are hardcoded in [boot/mbr.asm],
    //	while the last one is set in the Makefile. The font binary
    //	is integrated in the kernel image.
    //
    //  this function returns the physical base address of 
    //  our video memory 
    //
    uint32_t vesa_physbase=vesa_init(0x8300,0x8400,0x7200);

    log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"initial esp: 0x%08X",initial_stack);

    //
    // PIT config (timer)
    timer_init();
  

    // we know that here, the bootloader placed the mamory map!
    mem_init(0x7c00+0x400,*((uint16_t *)(0x7c00+0x600)));
    
    // paging  (pass the vesa physbase address for identity mapping)
    vmem_init(vesa_physbase);

    //

    // init and interrupt decriptor table 
    int_init(0x08);

    int_install();

    // setup custom interrupts
    // remember that we shifted all interrupts with the pic by 32
    // so clock = 32 (irq 0)
    // keyboard = 33 (irq 1)
    // floppy = 38 (irq 6)
    // etc..

    // install PIT interrupt handler
    int_install_ir(32, 0b10001110, 0x08,&int_clock_handler);

    // install keyboard interrupt handler
    int_install_ir(33, 0b10001110, 0x08,&int_kb_handler);

    // install floppy interrupt handler
    int_install_ir(38, 0b10001110, 0x08,&int_floppy_handler);

    // install test software interrupt handler
    int_install_ir(88, 0b10001110, 0x08,&int_test_handler);
    
    for(int i=0;i<19;i++)
	int_install_ir(i, 0b10001110, 0x08,&int_test_handler);

    // now we can enable interrupts back again
    int_enable();

//    int x=10/0;

    // pci
    pci_init();

    // floppy
    floppy_init();

    //init shell
    shell_init();
    /*

   log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"test mem");

   // test a20 disabled / wrap
   uint8_t *memtest=0x0;
   uint8_t *memtest2=0b10000000000000000000;

   *memtest=0xaf;
   log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"test mem %x",*(memtest2-1));
   log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"test mem %x",*memtest2);
   log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"test mem %x",*(memtest2+1));
   */

    /* stack pointer test?
   uint32_t *esp=0x90000;
   for(int i=0;i<10;i++)
   {
    log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"esp: %x",*esp);
    esp--;
   }
   */
    while(1)
    {
	
    }

 
}