From 1e181830be8f2931b249ca339c9335814a103c59 Mon Sep 17 00:00:00 2001 From: Baptiste Wicht Date: Sun, 3 Nov 2013 18:36:18 +0100 Subject: [PATCH] Work on interrupts (non-working state) --- Makefile | 2 +- kernel/src/shell.cpp | 6 ++--- micro_kernel/interrupts.asm | 54 ++++++++++++++++++++++++++----------- 3 files changed, 42 insertions(+), 20 deletions(-) diff --git a/Makefile b/Makefile index d9a675bd..f09c2417 100644 --- a/Makefile +++ b/Makefile @@ -29,7 +29,7 @@ bochs: thor.flp debug: thor.flp echo "c" > commands - bochs -qf bochsrc.txt -rc commands + bochs -qf debug_bochsrc.txt -rc commands rm commands force_look: diff --git a/kernel/src/shell.cpp b/kernel/src/shell.cpp index cc94bae7..6ad7188a 100644 --- a/kernel/src/shell.cpp +++ b/kernel/src/shell.cpp @@ -266,9 +266,9 @@ void memory_command(const char*){ k_print_line("Read failed"); } else { for(int i = 0; i < 80; i += 8){ - k_printf("%h %h %h %h %h %h %h %h\n", - buffer[i+0], buffer[i+1], buffer[i+2], buffer[i+3], - buffer[i+4], buffer[i+5], buffer[i+6], buffer[i+7]); + k_printf("%.4h %.4h %.4h %.4h %.4h %.4h %.4h %.4h\n", + (std::size_t) buffer[i+0], (std::size_t) buffer[i+1], (std::size_t) buffer[i+2], (std::size_t) buffer[i+3], + (std::size_t) buffer[i+4], (std::size_t) buffer[i+5], (std::size_t) buffer[i+6], (std::size_t) buffer[i+7]); } k_free(reinterpret_cast(buffer)); diff --git a/micro_kernel/interrupts.asm b/micro_kernel/interrupts.asm index 1e644a8a..5964e393 100644 --- a/micro_kernel/interrupts.asm +++ b/micro_kernel/interrupts.asm @@ -46,28 +46,22 @@ _isr%1: ; Disable interruptions to avoid being interrupted cli - mov r10, [rsp] - mov r11, [rsp+8] + mov r10, [rsp] ; error code + mov r11, [rsp+8] ; saved rip lea rdi, [12 * 8 * 0x14 + 30 * 2 + TRAM] mov dl, STYLE(RED_F, WHITE_B) mov rbx, isr%1_msg call print_string - mov rax, %1 - cmp rax, 14 - jne .end - - .page_fault_exception: - - ; print cr2 + ; print rip lea rdi, [13 * 8 * 0x14 + 30 * 2 + TRAM] - mov rbx, cr2_str + mov rbx, rip_str call print_string - lea rdi, [13 * 8 * 0x14 + 35 * 2 + TRAM] - mov r8, cr2 + lea rdi, [13* 8 * 0x14 + 35 * 2 + TRAM] + mov r8, r11 call print_int ; print rsp @@ -80,14 +74,22 @@ _isr%1: mov r8, rsp call print_int - ; print rip + ; More informations for some specific exceptions + + mov rax, %1 + cmp rax, 14 + jne .end + + .page_fault_exception: + + ; print cr2 lea rdi, [15 * 8 * 0x14 + 30 * 2 + TRAM] - mov rbx, rip_str + mov rbx, cr2_str call print_string - lea rdi, [15* 8 * 0x14 + 35 * 2 + TRAM] - mov r8, r11 + lea rdi, [15 * 8 * 0x14 + 35 * 2 + TRAM] + mov r8, cr2 call print_int ; print error code @@ -112,15 +114,33 @@ _irq%1: ; Disable interruptions to avoid being interrupted cli + push rax + mov rax, [irq_handlers + 8 *%1] ; If there are no handler, just send EOI test rax, rax je .eoi + push rbx + push rcx + push rdx + push rsi + push rdi + push r8 + push r9 + ; Call the handler call rax + push r9 + push r8 + pop rdi + pop rsi + pop rdx + pop rcx + pop rbx + .eoi: mov rax, %1 ; IRQ number @@ -138,6 +158,8 @@ _irq%1: mov al, 0x20 out 0x20, al + pop rax + iretq %endmacro