Commit 88806bb4 by malcolm

Overhaul of interrupts, now actually captures useful info.

parent beb05e9f
...@@ -5,11 +5,14 @@ ...@@ -5,11 +5,14 @@
#pragma GCC push_options #pragma GCC push_options
#pragma GCC optimize ("0") #pragma GCC optimize ("0")
#define serial_val(i) itoa(i,f);serial_writestring(f);serial_writestring(" ");
uint16_t idt_limit; uint16_t idt_limit;
uint32_t idt_base; uint32_t idt_base;
idt_desc _idt [MAX_IDT_INT]; idt_desc _idt [MAX_IDT_INT];
uint16_t _code_sel;
void idt_install() void idt_install()
{ {
struct struct
...@@ -22,10 +25,16 @@ void idt_install() ...@@ -22,10 +25,16 @@ void idt_install()
asm volatile ("lidt (%0)": :"r"(&idtr)); asm volatile ("lidt (%0)": :"r"(&idtr));
} }
static void default_handler() void default_handler(struct reg_state reg, uint32_t interrupt, uint32_t error, struct stack_state stack)
{ {
//DEBUG OUTPUT MAYBE? serial_writestring("int caught ");
serial_writestring("int caught\n"); char f[20];
serial_val(interrupt);
serial_val(error);
serial_val(stack.eip);
serial_val(stack.cd);
serial_val(stack.eflags);
serial_writestring("\n");
return; return;
} }
...@@ -57,15 +66,22 @@ int install_ir(uint32_t i, uint16_t flags, uint16_t code_sel, IRQ_HANDLER irq) ...@@ -57,15 +66,22 @@ int install_ir(uint32_t i, uint16_t flags, uint16_t code_sel, IRQ_HANDLER irq)
return 0; return 0;
} }
void idt_ftoi(int a, IRQ_HANDLER irq)
{
install_ir(a, IDT_PR|IDT_32, _code_sel, irq);
}
int idt_init(uint16_t code_sel) int idt_init(uint16_t code_sel)
{ {
idt_limit = sizeof(idt_desc) * MAX_IDT_INT -1; idt_limit = sizeof(idt_desc) * MAX_IDT_INT -1;
idt_base = (uint32_t)&_idt[0]; idt_base = (uint32_t)&_idt[0];
memset ((void*)&_idt[0], 0, sizeof (idt_desc) * MAX_IDT_INT-1); memset ((void*)&_idt[0], 0, sizeof (idt_desc) * MAX_IDT_INT-1);
for (int i=0; i<MAX_IDT_INT; i++) //for (int i=0; i<MAX_IDT_INT; i++)
{ //{
install_ir (i, IDT_PR|IDT_32, code_sel, (IRQ_HANDLER)default_handler); // install_ir (i, IDT_PR|IDT_32, code_sel, (IRQ_HANDLER)default_handler);
} //}
_code_sel = code_sel;
idtsetup();
idt_install(); idt_install();
return 0; return 0;
} }
......
...@@ -23,8 +23,31 @@ typedef struct ...@@ -23,8 +23,31 @@ typedef struct
uint16_t high_base; uint16_t high_base;
}__attribute__((packed)) idt_desc; }__attribute__((packed)) idt_desc;
struct reg_state
{
uint32_t eax;
uint32_t ecx;
uint32_t edx;
uint32_t ebx;
uint32_t ebp;
uint32_t esi;
uint32_t edi;
uint32_t esp;
}__attribute__((packed));
struct stack_state
{
uint32_t eip;
uint32_t cd;
uint32_t eflags;
}__attribute__((packed));
extern void default_handler(struct reg_state reg,uint32_t interrupt, uint32_t error, struct stack_state stack);
extern idt_desc* get_ir(uint32_t i); extern idt_desc* get_ir(uint32_t i);
extern int install_ir(uint32_t i, uint16_t flags, uint16_t code_sel, IRQ_HANDLER); extern int install_ir(uint32_t i, uint16_t flags, uint16_t code_sel, IRQ_HANDLER);
extern int idt_init(uint16_t code_sel); extern int idt_init(uint16_t code_sel);
extern void idt_ftoi(int a, IRQ_HANDLER irq);
extern void idtsetup();
#endif #endif
extern default_handler
extern idt_ftoi
%macro error_interrupt 1
global interrupt_handler_%1
interrupt_handler_%1:
push dword %1
jmp common_handler
%endmacro
%macro regular_interrupt 1
global interrupt_handler_%1
interrupt_handler_%1:
push dword 0
push dword %1
jmp common_handler
%endmacro
common_handler:
pusha
call default_handler
popa
add esp, 8
iret
regular_interrupt 0
regular_interrupt 1
regular_interrupt 2
regular_interrupt 3
regular_interrupt 4
regular_interrupt 5
regular_interrupt 6
regular_interrupt 7
error_interrupt 8
regular_interrupt 9
error_interrupt 10
error_interrupt 11
error_interrupt 12
error_interrupt 13
error_interrupt 14
regular_interrupt 15
regular_interrupt 16
error_interrupt 17
%assign i 18
%rep 12
regular_interrupt i
%assign i i+1
%endrep
error_interrupt 30
%assign i 31
%rep 225
regular_interrupt i
%assign i i+1
%endrep
global idtsetup
idtsetup:
%assign i 0
%rep 256
push interrupt_handler_%[i]
push i
call idt_ftoi
add esp, 8
%assign i i+1
%endrep
ret
...@@ -3,6 +3,7 @@ C=i686-elf-gcc ...@@ -3,6 +3,7 @@ C=i686-elf-gcc
all: all:
/usr/bin/nasm -felf32 head.asm -o boot.o /usr/bin/nasm -felf32 head.asm -o boot.o
/usr/bin/nasm -felf32 paging.asm /usr/bin/nasm -felf32 paging.asm
/usr/bin/nasm -felf32 idta.asm
$C *.c -std=gnu99 -ffreestanding -O2 -Wall -Wextra -c $C *.c -std=gnu99 -ffreestanding -O2 -Wall -Wextra -c
$C -T linker.ld -o myos.bin -ffreestanding -O2 -nostdlib *.o -lgcc $C -T linker.ld -o myos.bin -ffreestanding -O2 -nostdlib *.o -lgcc
......
...@@ -7,6 +7,18 @@ void *memset(void *s, int c, size_t n){ ...@@ -7,6 +7,18 @@ void *memset(void *s, int c, size_t n){
return s; return s;
} }
void reverse ( char s[] )
{
int c, i, j;
for (i=0, j= strlen(s)-1;i<j;i++,j--)
{
c = s[i];
s[i] = s[j];
s[j] = c;
}
}
void itoa(int n, char s[]) void itoa(int n, char s[])
{ {
int i, sign; int i, sign;
...@@ -25,9 +37,10 @@ void itoa(int n, char s[]) ...@@ -25,9 +37,10 @@ void itoa(int n, char s[])
s[i++] = '-'; s[i++] = '-';
} }
s[i] = '\0'; s[i] = '\0';
//reverse(s); reverse(s);
} }
size_t strlen(const char* str) size_t strlen(const char* str)
{ {
size_t ret = 0; size_t ret = 0;
......
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