diff --git a/kernel/Makefile b/kernel/Makefile index 76431c5..51d909e 100644 --- a/kernel/Makefile +++ b/kernel/Makefile @@ -37,6 +37,7 @@ SRCS = kernel.asm \ fs/xv6fs.inc \ vfs.inc \ proc.inc \ + bio.inc \ $(ASMINCS) .PHONY: all diff --git a/kernel/bio.inc b/kernel/bio.inc new file mode 100644 index 0000000..d9c56e2 --- /dev/null +++ b/kernel/bio.inc @@ -0,0 +1,33 @@ + ;; File: bio.inc + ;; Buffer cache + + ;; Struc: Buffer +struc Buffer { + .dev dd ? + .block dd ? + .ulock dd ? + .refcount dd ? + .data db 512 dup(?) +} +DEFN Buffer + + ;; Function: bio_init +bio_init: + mov ecx, sizeof.Buffer * 30 + xor ax, ax + mov edi, aBuffers + rep stosb + ret + +bio_get: + mov eax, uBIOLock + call lock_acquire + + mov eax, uBIOLock + call lock_release + ret + +bio_brelse: + ret + +uBIOLock dd 0 diff --git a/kernel/dev/at/ata.inc b/kernel/dev/at/ata.inc index 7bf4505..266fc47 100644 --- a/kernel/dev/at/ata.inc +++ b/kernel/dev/at/ata.inc @@ -1,7 +1,8 @@ ;; File: ata.inc ;; - ;; - ;; + ;; Usefull links: + ;; - + ;; - ATA_PRIMARY_IO = 0x1F0 ATA_PRIMARY_IO_CTRL = 0x3F6 @@ -76,10 +77,21 @@ ATA_CMD_IDENTIFY = 0xA0 ata_wait: mov dx, ax add dx, ATA_STATUS + xor ecx, ecx @@: + inc ecx + cmp ecx, 5000 + jg @f in al, dx and al, ATA_STATUS_BSY jnz @b +@@: + ret + +ata_select: + ret + +ata_cmd: ret ;; Function: ata_probe @@ -102,7 +114,9 @@ ata_probe: out dx, al mov ax, bx + push ecx call ata_wait + pop ecx mov dx, bx add dx, ATA_COMMAND @@ -110,16 +124,20 @@ ata_probe: out dx, al mov ax, bx + push ecx call ata_wait + pop ecx mov dx, bx add dx, ATA_STATUS in al, dx and al, ATA_STATUS_ERR or ATA_STATUS_DRQ - jnz @f + jnz .skip mov ax, bx + push ecx call ata_wait + pop ecx mov dx, bx add dx, ATA_COMMAND @@ -127,20 +145,39 @@ ata_probe: out dx, al mov ax, bx + push ecx call ata_wait + pop ecx mov dx, bx add dx, ATA_STATUS in al, dx and al, ATA_STATUS_ERR or ATA_STATUS_DRQ - jnz @f + jnz .skip push ecx + cmp ecx, ATA_CHAN1_IO + jne @f + add ecx, 2 + jmp .drive_found +@@: + cmp ecx, ATA_CHAN2_IO + jne @f + add ecx, 4 + jmp .drive_found +@@: + cmp ecx, ATA_CHAN3_IO + jne @f + add ecx, 8 + jmp .drive_found +@@: +.drive_found: + push ecx mov esi, szMsgAtaFound call klog pop ecx -@@: +.skip: inc cl cmp cl, 2 jb .loop @@ -172,9 +209,9 @@ ata_device: aAtaChans: dw ATA_CHAN0_IO -; dw ATA_CHAN1_IO -; dw ATA_CHAN2_IO -; dw ATA_CHAN3_IO + dw ATA_CHAN1_IO + dw ATA_CHAN2_IO + dw ATA_CHAN3_IO .end: szMsgAtaFound db "ATA: hd%u found", 0 diff --git a/kernel/kernel.asm b/kernel/kernel.asm index 984f141..562d74d 100644 --- a/kernel/kernel.asm +++ b/kernel/kernel.asm @@ -79,6 +79,8 @@ kmain: call pit_init + call bio_init + call proc_init call dev_init @@ -116,6 +118,7 @@ kmain: include 'fs/stpdfs.inc' include 'fs/xv6fs.inc' include 'proc.inc' + include 'bio.inc' szMsgKernelAlive db "Kernel (", VERSION_FULL , ") is alive", 0 @@ -126,7 +129,10 @@ boot_structure BootInfo kTSS TSS + align 4096 aProcs rb 64*sizeof.Process + align 4096 +aBuffers rb 30*sizeof.Buffer align 4096 stack_bottom: