StupidOS/kernel/mm/pmm.inc

86 lines
1.2 KiB
PHP

;; File: pmm.inc
;; Function: pmm_init
;;
;; In:
;; EAX - Start
;; EBX - End
pmm_init:
push eax
mov esi, szMsgPmmInit
call klog
pop eax
call pmm_free_range
ret
;; Function: pmm_alloc_page
;;
;; Out:
;; EAX - page address (return zero on error)
pmm_alloc_page:
cmp [pFreeList], 0
je .error
mov eax, [pFreeList]
mov edx, [eax]
mov [pFreeList], edx
ret
.error:
mov esi, szErrorNoMemLeft
call klog
xor eax, eax
ret
;; Function: pmm_free_page
;; push page back to free list
;;
;; In:
;; EAX - page to be freed
pmm_free_page:
or eax, eax
jz @f
mov edx, [pFreeList]
mov [eax], edx
mov [pFreeList], eax
@@:
ret
;; Function: pmm_free_range
;; TODO: allignment
;;
;; In:
;; EAX - Start
;; EBX - End
pmm_free_range:
push ebp
mov ebp, esp
sub esp, 0x10
mov [ebp-4], eax
mov [ebp-8], ebx
push ebx
push eax
mov esi, szMsgPmmFreeRange
call klog
xchg bx, bx
mov esi, [ebp-4]
.loop:
mov eax, [pFreeList]
mov [esi], eax
mov [pFreeList], esi
add esi, 4096
cmp esi, [ebp-8]
jb .loop
leave
ret
pFreeList dd 0
szMsgPmmInit db "PMM: initialize", 0
szMsgPmmFreeRange db "PMM: add free memory range %x - %x", 0
szErrorNoMemLeft db "Error: no free memory left", 0