Work on interrupts (non-working state)

This commit is contained in:
Baptiste Wicht 2013-11-03 18:36:18 +01:00
parent 87efbea27c
commit 1e181830be
3 changed files with 42 additions and 20 deletions

View File

@ -29,7 +29,7 @@ bochs: thor.flp
debug: thor.flp debug: thor.flp
echo "c" > commands echo "c" > commands
bochs -qf bochsrc.txt -rc commands bochs -qf debug_bochsrc.txt -rc commands
rm commands rm commands
force_look: force_look:

View File

@ -266,9 +266,9 @@ void memory_command(const char*){
k_print_line("Read failed"); k_print_line("Read failed");
} else { } else {
for(int i = 0; i < 80; i += 8){ for(int i = 0; i < 80; i += 8){
k_printf("%h %h %h %h %h %h %h %h\n", k_printf("%.4h %.4h %.4h %.4h %.4h %.4h %.4h %.4h\n",
buffer[i+0], buffer[i+1], buffer[i+2], buffer[i+3], (std::size_t) buffer[i+0], (std::size_t) buffer[i+1], (std::size_t) buffer[i+2], (std::size_t) buffer[i+3],
buffer[i+4], buffer[i+5], buffer[i+6], buffer[i+7]); (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<std::size_t*>(buffer)); k_free(reinterpret_cast<std::size_t*>(buffer));

View File

@ -46,28 +46,22 @@ _isr%1:
; Disable interruptions to avoid being interrupted ; Disable interruptions to avoid being interrupted
cli cli
mov r10, [rsp] mov r10, [rsp] ; error code
mov r11, [rsp+8] mov r11, [rsp+8] ; saved rip
lea rdi, [12 * 8 * 0x14 + 30 * 2 + TRAM] lea rdi, [12 * 8 * 0x14 + 30 * 2 + TRAM]
mov dl, STYLE(RED_F, WHITE_B) mov dl, STYLE(RED_F, WHITE_B)
mov rbx, isr%1_msg mov rbx, isr%1_msg
call print_string call print_string
mov rax, %1 ; print rip
cmp rax, 14
jne .end
.page_fault_exception:
; print cr2
lea rdi, [13 * 8 * 0x14 + 30 * 2 + TRAM] lea rdi, [13 * 8 * 0x14 + 30 * 2 + TRAM]
mov rbx, cr2_str mov rbx, rip_str
call print_string call print_string
lea rdi, [13 * 8 * 0x14 + 35 * 2 + TRAM] lea rdi, [13* 8 * 0x14 + 35 * 2 + TRAM]
mov r8, cr2 mov r8, r11
call print_int call print_int
; print rsp ; print rsp
@ -80,14 +74,22 @@ _isr%1:
mov r8, rsp mov r8, rsp
call print_int 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] lea rdi, [15 * 8 * 0x14 + 30 * 2 + TRAM]
mov rbx, rip_str mov rbx, cr2_str
call print_string call print_string
lea rdi, [15* 8 * 0x14 + 35 * 2 + TRAM] lea rdi, [15 * 8 * 0x14 + 35 * 2 + TRAM]
mov r8, r11 mov r8, cr2
call print_int call print_int
; print error code ; print error code
@ -112,15 +114,33 @@ _irq%1:
; Disable interruptions to avoid being interrupted ; Disable interruptions to avoid being interrupted
cli cli
push rax
mov rax, [irq_handlers + 8 *%1] mov rax, [irq_handlers + 8 *%1]
; If there are no handler, just send EOI ; If there are no handler, just send EOI
test rax, rax test rax, rax
je .eoi je .eoi
push rbx
push rcx
push rdx
push rsi
push rdi
push r8
push r9
; Call the handler ; Call the handler
call rax call rax
push r9
push r8
pop rdi
pop rsi
pop rdx
pop rcx
pop rbx
.eoi: .eoi:
mov rax, %1 ; IRQ number mov rax, %1 ; IRQ number
@ -138,6 +158,8 @@ _irq%1:
mov al, 0x20 mov al, 0x20
out 0x20, al out 0x20, al
pop rax
iretq iretq
%endmacro %endmacro