Commit 916a24fe by malcolm

Unified SW/HW interrupts, HW works now

parent 5db61b5c
Showing with 26 additions and 5 deletions
...@@ -45,13 +45,21 @@ void load_error_handlers() ...@@ -45,13 +45,21 @@ void load_error_handlers()
void default_handler(struct reg_state reg, uint32_t interrupt, uint32_t error, struct stack_state stack) void default_handler(struct reg_state reg, uint32_t interrupt, uint32_t error, struct stack_state stack)
{ {
/*for(uint32_t i=stack.eip-16;i<=stack.eip+16;i+=4)
{
serial_hexword(i);
serial_writestring(": ");
serial_hexword(*((uint32_t*)(void*)i));
serial_writestring("\n");
}*/
if(interrupt<32) if(interrupt<32)
stack.eip+=2; stack.eip+=2;
serial_writestring("int caught "); serial_writestring("int caught ");
char f[20]; char f[20];
serial_val(interrupt); serial_val(interrupt);
serial_val(error); serial_hexword(error);serial_writestring(" ");
serial_val(stack.eip); serial_hexword(stack.eip);serial_writestring(" ");
//serial_val(stack.eip);
serial_val(stack.cd); serial_val(stack.cd);
serial_val(stack.eflags); serial_val(stack.eflags);
serial_writestring("\n"); serial_writestring("\n");
...@@ -59,6 +67,7 @@ void default_handler(struct reg_state reg, uint32_t interrupt, uint32_t error, s ...@@ -59,6 +67,7 @@ void default_handler(struct reg_state reg, uint32_t interrupt, uint32_t error, s
{ {
handlers[interrupt](error); handlers[interrupt](error);
} }
//asm("hlt");
return; return;
} }
......
...@@ -31,6 +31,7 @@ void kernel_main(multiboot_info* mbt, uint32_t magic) ...@@ -31,6 +31,7 @@ void kernel_main(multiboot_info* mbt, uint32_t magic)
pit_init(); pit_init();
pit_start_counter(100, PIT_OCW_CONT_0, PIT_OCW_MODE_SQWVGEN); pit_start_counter(100, PIT_OCW_CONT_0, PIT_OCW_MODE_SQWVGEN);
enable_int(); enable_int();
/* Since there is no support for newlines in terminal_putchar /* Since there is no support for newlines in terminal_putchar
* yet, '\n' will produce some VGA specific character instead. * yet, '\n' will produce some VGA specific character instead.
* This is normal. * This is normal.
...@@ -57,6 +58,13 @@ void kernel_main(multiboot_info* mbt, uint32_t magic) ...@@ -57,6 +58,13 @@ void kernel_main(multiboot_info* mbt, uint32_t magic)
int o=0; int o=0;
int j=5/o; int j=5/o;
serial_hexword(j); serial_hexword(j);
<<<<<<< HEAD
test_mem(); test_mem();
test_idt(); test_idt();
=======
serial_writestring("\n");
while(true)
serial_writestring("");
asm ("hlt");
>>>>>>> Unified SW/HW interrupts, HW works now
} }
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
#include "pic.h" #include "pic.h"
#include "idt.h" #include "idt.h"
#include "asm.h" #include "asm.h"
#include "serial.h"
#pragma GCC push_options #pragma GCC push_options
#pragma GCC optimize ("0") #pragma GCC optimize ("0")
...@@ -11,10 +12,12 @@ static bool _pit_is_init = false; ...@@ -11,10 +12,12 @@ static bool _pit_is_init = false;
void pit_irq() void pit_irq()
{ {
asm volatile ("add %esp, 12; pusha"); //asm volatile ("pusha");
_pit_ticks++; _pit_ticks++;
//serial_writestring("PIT tick\n");
pic_command(0, PIC_OCW2_EOI); pic_command(0, PIC_OCW2_EOI);
asm volatile("popa; iret"); //serial_writestring("PIT tickn\n");
//asm volatile("nop;nop;nop;popa; iret;");
} }
void pit_command(uint8_t cmd) void pit_command(uint8_t cmd)
...@@ -71,7 +74,8 @@ void pit_start_counter(uint32_t freq, uint8_t counter, uint8_t mode) ...@@ -71,7 +74,8 @@ void pit_start_counter(uint32_t freq, uint8_t counter, uint8_t mode)
void pit_init() void pit_init()
{ {
install_ir(32, IDT_PR|IDT_32, 0x8, pit_irq); //install_ir(32, IDT_PR|IDT_32, 0x8, pit_irq);
install_c_ir(32, pit_irq);
_pit_is_init = true; _pit_is_init = true;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment