diff options
| author | Michal Idziorek <m.i@gmx.at> | 2014-09-03 14:04:12 +0200 |
|---|---|---|
| committer | Michal Idziorek <m.i@gmx.at> | 2014-09-03 14:04:12 +0200 |
| commit | a6efba7a22b85c0556c8c262f3bbcaf7bda7ddfa (patch) | |
| tree | e060237fe895995ad1fd6eee0f7f3b19beed8088 /kernel | |
| parent | 0ce7674a27043cfdf4115d09d65493ac8af13563 (diff) | |
Moved kernel to 0x10000 !
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/config.h | 2 | ||||
| -rw-r--r-- | kernel/floppy.c | 1 | ||||
| -rw-r--r-- | kernel/interrupts.c | 24 | ||||
| -rw-r--r-- | kernel/kernel.c | 26 | ||||
| -rw-r--r-- | kernel/mem.c | 5 | ||||
| -rw-r--r-- | kernel/smp.c | 2 | ||||
| -rw-r--r-- | kernel/task.c | 46 | ||||
| -rw-r--r-- | kernel/x86.c | 12 |
8 files changed, 69 insertions, 49 deletions
diff --git a/kernel/config.h b/kernel/config.h new file mode 100644 index 0000000..15d2121 --- /dev/null +++ b/kernel/config.h @@ -0,0 +1,2 @@ +#define FOOLOS_COMPILE_FLOPPY + diff --git a/kernel/floppy.c b/kernel/floppy.c index e00e96b..355801c 100644 --- a/kernel/floppy.c +++ b/kernel/floppy.c @@ -17,6 +17,7 @@ */ #define FOOLOS_MODULE_NAME "floppy" +#include "config.h" #ifdef FOOLOS_COMPILE_FLOPPY diff --git a/kernel/interrupts.c b/kernel/interrupts.c index 0852812..198fe11 100644 --- a/kernel/interrupts.c +++ b/kernel/interrupts.c @@ -27,19 +27,6 @@ static struct idt_desc } idtd; -// disable interrupts -void int_disable() -{ - __asm__("cli"); -} - -// enable interrupts -void int_enable() -{ - __asm__("sti"); - log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"up and running"); -} - void int_generate88() { @@ -102,11 +89,10 @@ void int_irq18(){ X86_IRQ_BEGIN panic(FOOLOS_MODULE_NAME,"Machine Check"); X8 void int_install_ir(int irq, uint16_t flags, uint16_t sel, void *addr) { - uint64_t base=(uint64_t)&(*addr); // TODO! + uint64_t base=(uint64_t)&(*addr); idt[irq].addrLo = base & 0xffff; idt[irq].addrHi = (base >> 16) & 0xffff; - idt[irq].addrHi = 0x0; idt[irq].zeros=0; idt[irq].flags=flags; idt[irq].sel=sel; @@ -150,13 +136,13 @@ void int_init(uint16_t sel) void int_install() { + idtd.size=sizeof(struct int_desc)*INT_MAX; - idtd.size=sizeof(struct int_desc)*INT_MAX; //TODO - idtd.baseHi=0x0000; - idtd.baseLo=&idt[0]; + uint32_t addr=&idt[0]; + idtd.baseHi=addr>>16; + idtd.baseLo=0xffff&addr; __asm__("lidt %0"::"m" (idtd)); - } /* //print interrupt table; //TODO! diff --git a/kernel/kernel.c b/kernel/kernel.c index e85b298..b2af08d 100644 --- a/kernel/kernel.c +++ b/kernel/kernel.c @@ -47,7 +47,20 @@ void kernel_main(uint32_t initial_stack, int mp) proc=0; + // move the foolfont and aps code before it gets overwritten! + uint8_t *source=0x16600; + uint8_t *dest=0x80000; + for(int i=0;i<2*512;i++) + { + dest[i]=source[i]; + } + source=0x16400; + dest=0x9000; + for(int i=0;i<1*512;i++) + { + dest[i]=source[i]; + } // // We want to get output to the screen as fast as possible! @@ -69,7 +82,8 @@ void kernel_main(uint32_t initial_stack, int mp) // our video memory // - uint32_t vesa_physbase=vesa_init(0x8300,0x8400,0x7600); + //uint32_t vesa_physbase=vesa_init(0x8300,0x8400,0x7600); + uint32_t vesa_physbase=vesa_init(0x8300,0x8400,0x80000); // @@ -103,8 +117,6 @@ void kernel_main(uint32_t initial_stack, int mp) // we know that here, the bootloader placed the mamory map! mem_init(0x7c00+0x400,*((uint16_t *)(0x7c00+0x600))); - - // // Initialize other processors (run this before entering paged mode) // @@ -165,8 +177,9 @@ void kernel_main(uint32_t initial_stack, int mp) //int_install_ir(38, 0b10001110, 0x08,&int_floppy_handler); // now we can enable interrupts back again - int_enable(); + x86_int_enable(); + ////////////////////// // // Scan the PCI Bus @@ -200,14 +213,13 @@ void kernel_main(uint32_t initial_stack, int mp) // round robin style. // -// smp_log_procdata(&procdata1); - task_init(); + task_init(); - while(1) asm("hlt"); // // Just hang here. // + while(1)asm("hlt"); diff --git a/kernel/mem.c b/kernel/mem.c index 0f52873..9899822 100644 --- a/kernel/mem.c +++ b/kernel/mem.c @@ -19,7 +19,7 @@ // memory map bit array. Each bit represents a memory block //uint32_t _mmngr_memory_map[MEM_BITMAP_SIZE]; -uint32_t *_mmngr_memory_map; +uint32_t _mmngr_memory_map[MEM_BITMAP_SIZE]; static uint32_t mem_free_blocks; @@ -246,11 +246,12 @@ void mem_test(int start, int end, int steps) void mem_init(uint16_t *memmap,uint16_t entries) { + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"Initializing bitmap at: %08X",_mmngr_memory_map); log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"the memory map contains %d entries.",entries); // hardcoded memory bitmap!!??! // todo: fix! - _mmngr_memory_map=0x9000; + //_mmngr_memory_map=0x80000; mem_free_blocks=0; pmmngr_init (); diff --git a/kernel/smp.c b/kernel/smp.c index 58e37a5..2002385 100644 --- a/kernel/smp.c +++ b/kernel/smp.c @@ -45,7 +45,7 @@ void smp_start_aps(smp_processors *pros) sleep(10); // start proc at 0x7000; - *reg=(6<<8)|(1<<14)|0x7; // 110 SIPI + *reg=(6<<8)|(1<<14)|0x9; // 110 SIPI } } diff --git a/kernel/task.c b/kernel/task.c index b94d5e4..ebfd4a7 100644 --- a/kernel/task.c +++ b/kernel/task.c @@ -15,7 +15,7 @@ void task_test1() while(1) { c++; - while(1)PutString("task0: %d", 00,500,0b1111100000000000, (c++)); + while(1)PutString("t1: %d", 00,500,0b1111100000000000, (c++)); } } @@ -27,7 +27,20 @@ void task_test2() while(1) { c++; - while(1)PutString("task1: %d", 200,500,0b1111100000000000, (c++)); + while(1)PutString("t2: %d", 100,500,0b1111100000000000, (c++)); + + } + +} + +void task_test3() +{ + uint32_t c; + + while(1) + { + c++; + while(1)PutString("t3: %d",200,500,0b1111100000000000, (c++)); } @@ -41,8 +54,8 @@ typedef struct{ //Simple structure for a thread } Thread; -Thread Threads[2]; //Space for our simple threads. Just 2! -int CurrentTask = -1; //The thread currenlty running (-1 == none) +Thread Threads[3]; //Space for our simple threads. Just 2! +volatile int CurrentTask; //The thread currenlty running (-1 == none) void task_create(int pid,void(*thread)()) @@ -50,7 +63,7 @@ void task_create(int pid,void(*thread)()) unsigned int *stack; Threads[pid].esp0 = pmmngr_alloc_block(); - stack = (unsigned int*)Threads[pid].esp0+4000; //This makes a pointer to the stack for us + stack = (unsigned int*)Threads[pid].esp0+4095; //This makes a pointer to the stack for us log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"new task : stack: 0x%08X ", stack); //First, this stuff is pushed by the processor @@ -86,24 +99,15 @@ void task_create(int pid,void(*thread)()) uint32_t task_switch_next(uint32_t oldesp) { - if(started!=0xabcde) return oldesp; + if(CurrentTask!=-1)Threads[CurrentTask].esp0=oldesp; + CurrentTask++; + if(CurrentTask>2)CurrentTask=0; - if(CurrentTask != -1){ //Were we even running a task? - Threads[CurrentTask].esp0 =oldesp; //Save the new esp for the thread - - //Now switch what task we're on - if(CurrentTask == 0)CurrentTask = 1; - else CurrentTask = 0; - } else{ - CurrentTask = 0; //We just started multi-tasking, start with task 0 - } - - uint32_t esp=0; - log(FOOLOS_MODULE_NAME,FOOLOS_LOG_FINE,"oldesp: 0x%08X saved / next task: %d (esp: 0x%08X) ",oldesp, CurrentTask,Threads[CurrentTask].esp0); + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_FINE,"oldesp: 0x%08X saved / next task: %d (esp: 0x%08X) ",oldesp, CurrentTask,Threads[CurrentTask].esp0); - return Threads[CurrentTask].esp0; //Return new stack pointer to ASM + return Threads[CurrentTask].esp0; //Return new stack pointer to ASM } void stack_trace(uint32_t *stack,int size) @@ -122,7 +126,9 @@ void task_init() log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"init multitasking."); task_create(0,task_test1); task_create(1,task_test2); - started=0xabcde; + task_create(2,task_test3); + started=0xabcde; + CurrentTask=-1; } diff --git a/kernel/x86.c b/kernel/x86.c index 8473bcc..0b6a448 100644 --- a/kernel/x86.c +++ b/kernel/x86.c @@ -9,6 +9,18 @@ void sleep(int i) } } +// disable interrupts +void x86_int_disable() +{ + __asm__("cli"); +} + +// enable interrupts +void x86_int_enable() +{ + __asm__("sti"); +} + // get control registers (cr0-cr4) uint32_t x86_get_cr0() |
