StupidOS/kernel/bio.inc

97 lines
1.4 KiB
PHP

;; File: bio.inc
;; Buffer cache
;; Struc: Buffer
;;
;; .dev - Device id
;; .block - Block number
;; .ulock - lock
;; .refcount - refcount
;; .data - block data
struc Buffer {
.dev dw ?
.flags db ?
.bcount db ?
.block dd ?
.ulock dd ?
.refcount dd ?
.data db 1024 dup(?)
}
DEFN Buffer
;; Constants: Buffer flags
;;
;; BUFFER_WRITE - XXX
;; BUFFER_READ - XXX
;; BUFFER_ERROR - XXX
;; BUFFER_DIRTY - XXX
;; BUFFER_INVAL - mark buffer as invalid
BUFFER_WRITE = 0x0
BUFFER_READ = 0x1
BUFFER_ERROR = 0x2
BUFFER_DIRTY = 0x4
BUFFER_INVAL = 0x8
;; Function: bio_init
bio_init:
mov ecx, sizeof.Buffer * 30
xor ax, ax
mov edi, aBuffers
rep stosb
ret
;; Function: bio_getblk
;;
bio_getblk:
ret
;; Function: bio_read
;;
;; In:
;; EAX - devid (AH major, AL minor)
;; ECX - block
bio_bread:
push eax
mov eax, uBIOLock
call lock_acquire
pop eax
movzx ecx, ah
shl ecx, 2
add ecx, aBlockDevices
cmp ecx, aBlockDevices.end
jb @f
mov esi, szErrorInvalidDevid
call klog
jmp .end
@@:
xchg bx, bx
mov eax, aBuffers
mov ecx, [ecx]
mov ecx, [ecx + BlkDev.strategy]
call ecx
.end:
mov eax, uBIOLock
call lock_release
ret
;; Function: bio_bwrite
bio_bwrite:
ret
;; Function: bio_brelse
;; Unbusy a buffer and release it to the free lists.
bio_brelse:
mov eax, uBIOLock
call lock_acquire
mov eax, uBIOLock
call lock_release
ret
uBIOLock dd 0
szErrorInvalidDevid db "Error: invalid devid", 0