summaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
authorMichal Idziorek <m.i@gmx.at>2014-09-03 14:04:12 +0200
committerMichal Idziorek <m.i@gmx.at>2014-09-03 14:04:12 +0200
commita6efba7a22b85c0556c8c262f3bbcaf7bda7ddfa (patch)
treee060237fe895995ad1fd6eee0f7f3b19beed8088 /kernel
parent0ce7674a27043cfdf4115d09d65493ac8af13563 (diff)
Moved kernel to 0x10000 !
Diffstat (limited to 'kernel')
-rw-r--r--kernel/config.h2
-rw-r--r--kernel/floppy.c1
-rw-r--r--kernel/interrupts.c24
-rw-r--r--kernel/kernel.c26
-rw-r--r--kernel/mem.c5
-rw-r--r--kernel/smp.c2
-rw-r--r--kernel/task.c46
-rw-r--r--kernel/x86.c12
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()