Commit 155b2238 by triazo

Merge branch 'exceptions' into 'master'

Exceptions



See merge request !12
parents e8ba1cb0 80e176fc
#include "exceptions.h"
#include "serial.h"
void int_div_by_zero(uint32_t __attribute__((unused))error)
{
serial_writestring("DIV BY ZERO ERROR\n");
}
void int_debug(uint32_t __attribute__((unused))error)
{
serial_writestring("DEBUG ERROR\n");
}
void int_non_maskable_interrupt(uint32_t __attribute__((unused))error)
{
serial_writestring("NON MASKABLE INTERRUPT ERROR\n");
}
void int_breakpoint(uint32_t __attribute__((unused))error)
{
serial_writestring("BREAKPOINT ERROR\n");
}
void int_overflow(uint32_t __attribute__((unused))error)
{
serial_writestring("OVERFLOW ERROR\n");
}
void int_bound_range_exceeded(uint32_t __attribute__((unused))error)
{
serial_writestring("BOUND RANGE EXCEEDED ERROR\n");
}
void int_invalid_opcode(uint32_t __attribute__((unused))error)
{
serial_writestring("INVALID OPCODE ERROR\n");
}
void int_device_not_available(uint32_t __attribute__((unused))error)
{
serial_writestring("DEVICE NOT AVAILABLE ERROR\n");
}
void int_double_fault(uint32_t __attribute__((unused))error)
{
serial_writestring("DOUBLE FAULT ERROR\n");
}
void int_coprocessor_segment_overrun(uint32_t __attribute__((unused))error)
{
serial_writestring("COPROCESSOR SEGMENT OVERRUN ERROR\n");
}
void int_invalid_tss(uint32_t __attribute__((unused))error)
{
serial_writestring("INVALID TSS ERROR\n");
}
void int_segment_not_present(uint32_t __attribute__((unused))error)
{
serial_writestring("SEGMENT NOT PRESENT ERROR\n");
}
void int_stack_segment_fault(uint32_t __attribute__((unused))error)
{
serial_writestring("STACK SEGMENT ERROR\n");
}
void int_general_protection_fault(uint32_t __attribute__((unused))error)
{
serial_writestring("GENERAL PROTECTION FAULT ERROR\n");
}
void int_page_fault(uint32_t __attribute__((unused))error)
{
serial_writestring("PAGE FAULT ERROR\n");
}
void int_reserved(uint32_t __attribute__((unused))error)
{
serial_writestring("RESERVED ERROR\n");
}
void int_x87_floating_point(uint32_t __attribute__((unused))error)
{
serial_writestring("X87 FLOATING POINT ERROR\n");
}
void int_alignment_check(uint32_t __attribute__((unused))error)
{
serial_writestring("ALIGNMENT ERROR\n");
}
void int_machine_check(uint32_t __attribute__((unused))error)
{
serial_writestring("MACHINE CHECK ERROR\n");
}
void int_simd_floating_point(uint32_t __attribute__((unused))error)
{
serial_writestring("SIMD FLOATING POINT ERROR\n");
}
void int_virtualization(uint32_t __attribute__((unused))error)
{
serial_writestring("VITUALIZATION ERROR\n");
}
void int_security(uint32_t __attribute__((unused))error)
{
serial_writestring("SECURITY ERROR\n");
}
#ifndef _EXCEPTIONS_INC
#define _EXCEPTIONS_INC
#include "idt.h"
void int_div_by_zero(uint32_t error);
void int_debug(uint32_t error);
void int_non_maskable_interrupt(uint32_t error);
void int_breakpoint(uint32_t error);
void int_overflow(uint32_t error);
void int_bound_range_exceeded(uint32_t error);
void int_invalid_opcode(uint32_t error);
void int_device_not_available(uint32_t error);
void int_double_fault(uint32_t error);
void int_coprocessor_segment_overrun(uint32_t error);
void int_invalid_tss(uint32_t error);
void int_segment_not_present(uint32_t error);
void int_stack_segment_fault(uint32_t error);
void int_general_protection_fault(uint32_t error);
void int_page_fault(uint32_t error);
void int_reserved(uint32_t error);
void int_x87_floating_point(uint32_t error);
void int_alignment_check(uint32_t error);
void int_machine_check(uint32_t error);
void int_simd_floating_point(uint32_t error);
void int_virtualization(uint32_t error);
void int_security(uint32_t error);
#endif
#include "idt.h" #include "idt.h"
#include "string.h" #include "string.h"
#include "serial.h" #include "serial.h"
#include "exceptions.h"
#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 (*handlers[256]) (uint32_t error);
void idt_install() void idt_install()
{ {
struct struct
...@@ -22,10 +28,37 @@ void idt_install() ...@@ -22,10 +28,37 @@ void idt_install()
asm volatile ("lidt (%0)": :"r"(&idtr)); asm volatile ("lidt (%0)": :"r"(&idtr));
} }
static void default_handler() void load_error_handlers()
{
void(*errors[])(uint32_t)={int_div_by_zero,int_debug,int_non_maskable_interrupt,int_breakpoint,int_overflow,
int_bound_range_exceeded,int_invalid_opcode,int_device_not_available,int_double_fault,
int_coprocessor_segment_overrun,int_invalid_tss,int_segment_not_present,
int_stack_segment_fault,int_general_protection_fault,int_page_fault,int_reserved,
int_x87_floating_point,int_alignment_check,int_machine_check,int_simd_floating_point,
int_virtualization,int_reserved,int_reserved,int_reserved,int_reserved,int_reserved,
int_reserved,int_reserved,int_reserved,int_reserved,int_security,int_reserved};
for(int i=0;i<32;i++)
{
handlers[i]=errors[i];
}
}
void default_handler(struct reg_state reg, uint32_t interrupt, uint32_t error, struct stack_state stack)
{ {
//DEBUG OUTPUT MAYBE? if(interrupt<32)
serial_writestring("int caught\n"); stack.eip+=2;
serial_writestring("int caught ");
char f[20];
serial_val(interrupt);
serial_val(error);
serial_val(stack.eip);
serial_val(stack.cd);
serial_val(stack.eflags);
serial_writestring("\n");
if(handlers[interrupt]!=NULL)
{
handlers[interrupt](error);
}
return; return;
} }
...@@ -56,6 +89,15 @@ int install_ir(uint32_t i, uint16_t flags, uint16_t code_sel, IRQ_HANDLER irq) ...@@ -56,6 +89,15 @@ int install_ir(uint32_t i, uint16_t flags, uint16_t code_sel, IRQ_HANDLER irq)
_idt[i].code_sel = code_sel; _idt[i].code_sel = code_sel;
return 0; return 0;
} }
void install_c_ir(uint32_t interrupt, void (*handler) (uint32_t))
{
handlers[interrupt]=handler;
}
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)
{ {
...@@ -64,9 +106,13 @@ int idt_init(uint16_t code_sel) ...@@ -64,9 +106,13 @@ int idt_init(uint16_t code_sel)
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);
handlers[i]=NULL;
} }
_code_sel = code_sel;
idtsetup();
idt_install(); idt_install();
load_error_handlers();
return 0; return 0;
} }
#pragma GCC pop_options #pragma GCC pop_options
\ No newline at end of file
...@@ -23,8 +23,32 @@ typedef struct ...@@ -23,8 +23,32 @@ 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 esp;
uint32_t ebp;
uint32_t esi;
uint32_t edi;
}__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 void install_c_ir(uint32_t interrupt, void (*handler) (uint32_t));
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
...@@ -39,5 +39,8 @@ void kernel_main() ...@@ -39,5 +39,8 @@ void kernel_main()
serial_writestring("Finished Initilizing memory\n"); serial_writestring("Finished Initilizing memory\n");
asm ("int $0x80"); asm ("int $0x80");
asm ("int $0x90"); asm ("int $0x90");
int o=0;
int j=5/o;
serial_hexword(j);
asm ("hlt"); asm ("hlt");
} }
...@@ -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