diff --git a/kernel/Makefile b/kernel/Makefile index 7f0a316..0689fc6 100644 --- a/kernel/Makefile +++ b/kernel/Makefile @@ -8,7 +8,8 @@ SRCS = kernel.asm \ klog.inc \ dev/vga_console.inc \ mm/mm.inc \ - mm/pmm.inc + mm/pmm.inc \ + lock.inc .PHONY: all all: $(KERNEL) diff --git a/kernel/isr.inc b/kernel/isr.inc index 82c810e..e444ae5 100644 --- a/kernel/isr.inc +++ b/kernel/isr.inc @@ -1,13 +1,16 @@ -macro ISR_ERROR num { - cli - - jmp isr_common -} - -macro ISR_NOERROR num { - cli - - jmp isr_common +macro ISR [name,error] { +isr_table: +forward + dd isr_#name +forward + isr_#name#: + cli + if error eq 0 + push 0 + end if + push error + jmp isr_common + } isr_common: @@ -32,3 +35,37 @@ isr_common: add esp, 8 sti iret + +ISR \ + division_by_zero, 0, \ + debug, 0, \ + nmi, 0, \ + breakpoint, 0, \ + overflow, 0, \ + bound_range_exceeded, 0, \ + invalid_opcode, 0, \ + device_not_available, 0, \ + double_fault, 1, \ + coproc_seg_overrun, 0, \ + invalid_tss, 1, \ + seg_not_present, 1, \ + stack_seg_fault, 1, \ + general_protection_fault, 1, \ + page_fault, 1, \ + reserved15, 0, \ + x87_exception, 0, \ + alignment_check, 0, \ + machine_check, 0, \ + simd_exception, 0, \ + virt_exception, 0, \ + reserved21, 0, \ + reserved22, 0, \ + reserved23, 0, \ + reserved24, 0, \ + reserved25, 0, \ + reserved26, 0, \ + reserved27, 0, \ + reserved28, 0, \ + reserved29, 0, \ + security_exception, 0, \ + reserved31, 0 diff --git a/kernel/kernel.asm b/kernel/kernel.asm index 7b5d605..99690a9 100644 --- a/kernel/kernel.asm +++ b/kernel/kernel.asm @@ -68,6 +68,7 @@ kmain: include 'klog.inc' include 'dev/vga_console.inc' include 'mm/mm.inc' + include 'lock.inc' szMsgKernelAlive db "Kernel is alive", 0 szErrorBootProtocol db "Error: wrong magic number", 0 diff --git a/kernel/lock.inc b/kernel/lock.inc index 5c632bb..fdd7b30 100644 --- a/kernel/lock.inc +++ b/kernel/lock.inc @@ -1,17 +1,13 @@ ;; lock_acquire: - lock bts [eax], 0 - jnc .end -@@: - pause - test [eax], 1 - jne @b - - lock bts [eax], 0 - jc @b -.end: + mov edx, 1 + xchg edx, [eax] + or edx, edx + jnz lock_acquire ret -release: - mov [eax], 0 +lock_release: + xor edx, edx + xchg [eax], edx + ret diff --git a/kernel/mm/pmm.inc b/kernel/mm/pmm.inc index b11a1fd..5111798 100644 --- a/kernel/mm/pmm.inc +++ b/kernel/mm/pmm.inc @@ -31,6 +31,10 @@ pmm_init: ;; Out: ;; EAX - page address (return zero on error) pmm_alloc_page: + xchg bx, bx + mov eax, uPmmLock + call lock_acquire + cmp [pFreeList], 0 je .error mov eax, [pFreeList] @@ -40,11 +44,21 @@ pmm_alloc_page: inc [cUsedPage] dec [cFreePage] + + push eax + mov eax, uPmmLock + call lock_release + pop eax + ret .error: mov esi, szErrorNoMemLeft call klog + + mov eax, uPmmLock + call lock_release xor eax, eax + ret ;; Function: pmm_free_page @@ -53,6 +67,8 @@ pmm_alloc_page: ;; In: ;; EAX - page to be freed pmm_free_page: + mov eax, uPmmLock + call lock_acquire or eax, eax jz @f mov edx, [pFreeList] @@ -62,6 +78,8 @@ pmm_free_page: inc [cFreePage] dec [cUsedPage] @@: + mov eax, uPmmLock + call lock_release ret ;; Function: pmm_free_range @@ -115,6 +133,7 @@ szMsgPmmInit db "PMM: initialize", 0 szMsgPmmFreeRange db "PMM: add free memory range %x - %x", 0 szErrorNoMemLeft db "Error: no free memory left", 0 szMsgPmmStats db "PMM: Total page: %x | Used page: %x | Free page: %x", 0 +uPmmLock dd 0 ; Some stats cFreePage dd 0