summaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
Diffstat (limited to 'kernel')
-rw-r--r--kernel/interrupts.c43
-rw-r--r--kernel/kernel.c4
-rw-r--r--kernel/smp.c7
3 files changed, 25 insertions, 29 deletions
diff --git a/kernel/interrupts.c b/kernel/interrupts.c
index 51682b4..74377ad 100644
--- a/kernel/interrupts.c
+++ b/kernel/interrupts.c
@@ -1,4 +1,5 @@
#include "kernel/kernel.h"
+#include "asm/int.h"
#include "asm/asm.h"
#include "asm/pit.h"
#include "driver/mouse.h"
@@ -7,6 +8,13 @@
#define INT_MAX 255 // size of our interrupts table
+
+uint32_t interrupt_handler(uint32_t num, uint32_t esp)
+{
+ if(num!=990)klog("int: %d %d",num,esp);
+ return esp;
+}
+
void errlog(uint32_t error_code)
{
klog("error_code: 0x%08X",error_code);
@@ -129,16 +137,16 @@ void interrupts_init(uint16_t sel)
}
// exceptions
- int_install_ir(0, 0b10001110, 0x08,&int_irq0);
- int_install_ir(1, 0b10001110, 0x08,&int_irq1);
- int_install_ir(2, 0b10001110, 0x08,&int_irq2);
- int_install_ir(3, 0b10001110, 0x08,&int_irq3);
- int_install_ir(4, 0b10001110, 0x08,&int_irq4);
- int_install_ir(5, 0b10001110, 0x08,&int_irq5);
- int_install_ir(6, 0b10001110, 0x08,&int_irq6);
- int_install_ir(7, 0b10001110, 0x08,&int_irq7);
- int_install_ir(8, 0b10001110, 0x08,&int_irq8);
- int_install_ir(9, 0b10001110, 0x08,&int_irq9);
+ int_install_ir(0, 0b10001110, 0x08,&int_irq0);
+ int_install_ir(1, 0b10001110, 0x08,&int_irq1);
+ int_install_ir(2, 0b10001110, 0x08,&int_irq2);
+ int_install_ir(3, 0b10001110, 0x08,&int_irq3);
+ int_install_ir(4, 0b10001110, 0x08,&int_irq4);
+ int_install_ir(5, 0b10001110, 0x08,&int_irq5);
+ int_install_ir(6, 0b10001110, 0x08,&int_irq6);
+ int_install_ir(7, 0b10001110, 0x08,&int_irq7);
+ int_install_ir(8, 0b10001110, 0x08,&int_irq8);
+ int_install_ir(9, 0b10001110, 0x08,&int_irq9);
int_install_ir(10, 0b10001110, 0x08,&int_irq10);
int_install_ir(11, 0b10001110, 0x08,&int_irq11);
int_install_ir(12, 0b10001110, 0x08,&int_irq12);
@@ -153,27 +161,22 @@ void interrupts_init(uint16_t sel)
// remember that we shifted all interrupts with the pic by 32
// install PIT interrupt handler (irq 0 => 32)
- int_install_ir(32, 0b10001110, 0x08,&pit_interrupt_handler);
+ int_install_ir(32, 0b10001110, 0x08,&int0);
// install keyboard interrupt handler (irq 1 => 33)
- int_install_ir(33, 0b10001110, 0x08,&int_kb_handler);
+ int_install_ir(33, 0b10001110, 0x08,&int1);
//mouse interrupt handler (irq 12 => 34)
- int_install_ir(44, 0b10001110, 0x08,&int_mouse_handler);
+ int_install_ir(44, 0b10001110, 0x08,&int12);
- //system calls
- int_install_ir(0x80, 0b11101110, 0x08,&int_syscall_handler);
+ //system calls (can be called from ring3 (0b11))
+ int_install_ir(0x80, 0b11101110, 0x08,&int128);
int_install();
-
- // now we can enable interrupts back again
- // x86_sti();
- //x86_cli();
}
void int_install()
{
-
idtd.size=sizeof(struct int_desc)*INT_MAX;
uint32_t addr=(uint32_t)&idt[0];
diff --git a/kernel/kernel.c b/kernel/kernel.c
index 97aef77..9392a1e 100644
--- a/kernel/kernel.c
+++ b/kernel/kernel.c
@@ -56,11 +56,11 @@ void kernel_main(uint32_t eax,uint32_t ebx)
fs_mount(info);
// Start the other Processors (before paging because apic addr etc..?)
- //TODO: !!! Check commented out sleep ()!!!
+ //TODO: remap apic !!! Check commented out sleep ()!!!
// https://wiki.osdev.org/Symmetric_Multiprocessing
klog("Symmetric Multi Processing (SMP) start ... ");
smp_log_procdata(&procdata);
- //smp_start_aps(&procdata,"/boot/mp.bin"); //will be copied over mbr
+ smp_start_aps(&procdata);
klog("Vritual Memory / Paging init ... ");
pdirectory *dir=vmem_init(kernel_blocks,(uint32_t)info->framebuffer_addr);
diff --git a/kernel/smp.c b/kernel/smp.c
index 4fe0705..e2de6fe 100644
--- a/kernel/smp.c
+++ b/kernel/smp.c
@@ -86,13 +86,6 @@ void smp_start_aps(smp_processors *pros,char *path)
{
local_apic_addr=pros->local_apic_address;
- //lets copy the binary into mbr
- fs_content(path,0x7000,0x100); // copy 0x100 bytes to 0x7000
-
- // tell them where to enter (agreed adress at 0x8010)
- uint32_t *entry=0x8010;
- *entry=smp_main;
-
//bsp (boot processor) enables its local apic
// uint32_t *reg=local_apic_addr+FOOLOS_APIC_SPUR_INT;
// *reg=0xffffffff; // all bits 1 and interrupt 255 (is this not set anyway?)