2024-07-23 05:50:35 +00:00
|
|
|
;; File: bio.inc
|
|
|
|
;; Buffer cache
|
|
|
|
|
|
|
|
;; Struc: Buffer
|
2024-09-10 08:03:32 +00:00
|
|
|
;;
|
|
|
|
;; .dev - Device id
|
|
|
|
;; .block - Block number
|
|
|
|
;; .ulock - lock
|
|
|
|
;; .refcount - refcount
|
|
|
|
;; .data - block data
|
2024-07-23 05:50:35 +00:00
|
|
|
struc Buffer {
|
|
|
|
.dev dd ?
|
|
|
|
.block dd ?
|
|
|
|
.ulock dd ?
|
|
|
|
.refcount dd ?
|
2024-07-24 13:24:52 +00:00
|
|
|
.data db 1024 dup(?)
|
2024-07-23 05:50:35 +00:00
|
|
|
}
|
|
|
|
DEFN Buffer
|
|
|
|
|
|
|
|
;; Function: bio_init
|
|
|
|
bio_init:
|
|
|
|
mov ecx, sizeof.Buffer * 30
|
|
|
|
xor ax, ax
|
|
|
|
mov edi, aBuffers
|
|
|
|
rep stosb
|
|
|
|
ret
|
|
|
|
|
2024-07-22 15:32:12 +00:00
|
|
|
;; Function: bio_read
|
|
|
|
;;
|
2024-09-10 08:03:32 +00:00
|
|
|
;; In:
|
|
|
|
;; EAX - devid (AH major, AL minor)
|
|
|
|
;; ECX - block
|
2024-07-22 15:32:12 +00:00
|
|
|
bio_bread:
|
2024-09-10 08:03:32 +00:00
|
|
|
push eax
|
2024-07-23 05:50:35 +00:00
|
|
|
mov eax, uBIOLock
|
|
|
|
call lock_acquire
|
2024-09-10 08:03:32 +00:00
|
|
|
pop eax
|
2024-07-23 05:50:35 +00:00
|
|
|
|
2024-09-10 08:03:32 +00:00
|
|
|
movzx ecx, ah
|
|
|
|
shl ecx, 2
|
|
|
|
add ecx, aBlockDevices
|
|
|
|
cmp ecx, aBlockDevices.end
|
|
|
|
jb @f
|
|
|
|
|
|
|
|
mov esi, szErrorInvalidDevid
|
|
|
|
call klog
|
|
|
|
jmp .end
|
|
|
|
@@:
|
|
|
|
mov ecx, [ecx]
|
|
|
|
mov ecx, [ecx + BlkDev.strategy]
|
|
|
|
|
|
|
|
call ecx
|
|
|
|
|
|
|
|
.end:
|
2024-07-23 05:50:35 +00:00
|
|
|
mov eax, uBIOLock
|
|
|
|
call lock_release
|
|
|
|
ret
|
|
|
|
|
2024-09-10 08:03:32 +00:00
|
|
|
;; Function: bio_bwrite
|
|
|
|
bio_bwrite:
|
|
|
|
ret
|
|
|
|
|
2024-07-22 15:32:12 +00:00
|
|
|
;; Function: bio_brelse
|
|
|
|
;; Unbusy a buffer and release it to the free lists.
|
2024-07-23 05:50:35 +00:00
|
|
|
bio_brelse:
|
2024-07-22 15:32:12 +00:00
|
|
|
mov eax, uBIOLock
|
|
|
|
call lock_acquire
|
|
|
|
|
|
|
|
mov eax, uBIOLock
|
|
|
|
call lock_release
|
2024-07-23 05:50:35 +00:00
|
|
|
ret
|
|
|
|
|
|
|
|
uBIOLock dd 0
|
2024-09-10 08:03:32 +00:00
|
|
|
szErrorInvalidDevid db "Error: invalid devid", 0
|