feat(kernel): block device (WIP)
This commit is contained in:
parent
b43672d268
commit
75aac14a44
|
@ -9,7 +9,9 @@
|
|||
;; .refcount - refcount
|
||||
;; .data - block data
|
||||
struc Buffer {
|
||||
.dev dd ?
|
||||
.dev dw ?
|
||||
.flags db ?
|
||||
.bcount db ?
|
||||
.block dd ?
|
||||
.ulock dd ?
|
||||
.refcount dd ?
|
||||
|
@ -17,6 +19,19 @@ struc Buffer {
|
|||
}
|
||||
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
|
||||
|
@ -25,6 +40,11 @@ bio_init:
|
|||
rep stosb
|
||||
ret
|
||||
|
||||
;; Function: bio_getblk
|
||||
;;
|
||||
bio_getblk:
|
||||
ret
|
||||
|
||||
;; Function: bio_read
|
||||
;;
|
||||
;; In:
|
||||
|
@ -46,6 +66,8 @@ bio_bread:
|
|||
call klog
|
||||
jmp .end
|
||||
@@:
|
||||
xchg bx, bx
|
||||
mov eax, aBuffers
|
||||
mov ecx, [ecx]
|
||||
mov ecx, [ecx + BlkDev.strategy]
|
||||
|
||||
|
|
|
@ -23,6 +23,108 @@ TOTAL_SECTORS = 2880
|
|||
|
||||
FLOPPY_MAX = 2
|
||||
|
||||
;; Constants: Registers
|
||||
;;
|
||||
;; FLOPPY_STATUS_REGA - Read-only register
|
||||
;; FLOPPY_STATUS_REGB - Read-only register
|
||||
;; FLOPPY_DIGITAL_OUTPUT_REG - XXX
|
||||
;; FLOPPY_TAPE_DRIVE_REG - XXX
|
||||
;; FLOPPY_MAIN_STATUS_REG - Read-only register
|
||||
;; FLOPPY_DATARATE_SELECT_REG - Write-only register
|
||||
;; FLOPPY_DATA_FIFO - XXX
|
||||
;; FLOPPY_DIGITAL_INPUT_REG - Read-only register
|
||||
;; FLOPPY_CONF_CONTROL_REG - Write-only register
|
||||
FLOPPY_STATUS_REGA = 0x3F0
|
||||
FLOPPY_STATUS_REGB = 0x3F1
|
||||
FLOPPY_DIGITAL_OUTPUT_REG = 0x3F2
|
||||
FLOPPY_TAPE_DRIVE_REG = 0x3F3
|
||||
FLOPPY_MAIN_STATUS_REG = 0x3F4
|
||||
FLOPPY_DATARATE_SELECT_REG = 0x3F4
|
||||
FLOPPY_DATA_FIFO = 0x3F5
|
||||
FLOPPY_DIGITAL_INPUT_REG = 0x3F7
|
||||
FLOPPY_CONF_CONTROL_REG = 0x3F7
|
||||
|
||||
;; Constants: Floppy commands
|
||||
;;
|
||||
;; FLOPPY_READ_TRACK - XXX
|
||||
;; FLOPPY_SPECIFY - XXX
|
||||
;; FLOPPY_SENSE_DRIVE_STATUS - XXX
|
||||
;; FLOPPY_WRITE_DATA - XXX
|
||||
;; FLOPPY_READ_DATA - XXX
|
||||
;; FLOPPY_RECALIBRATE - XXX
|
||||
;; FLOPPY_SENSE_INTERRUPT - XXX
|
||||
;; FLOPPY_WRITE_DELETED_DATA - XXX
|
||||
;; FLOPPY_READ_ID - XXX
|
||||
;; FLOPPY_READ_DELETED_DATA - XXX
|
||||
;; FLOPPY_FORMAT_TRACK - XXX
|
||||
;; FLOPPY_DUMPREG - XXX
|
||||
;; FLOPPY_SEEK - XXX
|
||||
;; FLOPPY_VERSION - XXX
|
||||
;; FLOPPY_SCAN_EQUAL - XXX
|
||||
;; FLOPPY_PERPENDICULAR_MODE - XXX
|
||||
;; FLOPPY_CONFIGURE - XXX
|
||||
;; FLOPPY_LOCK - XXX
|
||||
;; FLOPPY_VERIFY - XXX
|
||||
;; FLOPPY_SCAN_LOW_OR_EQUAL - XXX
|
||||
;; FLOPPY_SCAN_HIGH_OR_EQUAL - XXX
|
||||
FLOPPY_READ_TRACK = 2
|
||||
FLOPPY_SPECIFY = 3
|
||||
FLOPPY_SENSE_DRIVE_STATUS = 4
|
||||
FLOPPY_WRITE_DATA = 5
|
||||
FLOPPY_READ_DATA = 6
|
||||
FLOPPY_RECALIBRATE = 7
|
||||
FLOPPY_SENSE_INTERRUPT = 8
|
||||
FLOPPY_WRITE_DELETED_DATA = 9
|
||||
FLOPPY_READ_ID = 10
|
||||
FLOPPY_READ_DELETED_DATA = 12
|
||||
FLOPPY_FORMAT_TRACK = 13
|
||||
FLOPPY_DUMPREG = 14
|
||||
FLOPPY_SEEK = 15
|
||||
FLOPPY_VERSION = 16
|
||||
FLOPPY_SCAN_EQUAL = 17
|
||||
FLOPPY_PERPENDICULAR_MODE = 18
|
||||
FLOPPY_CONFIGURE = 19
|
||||
FLOPPY_LOCK = 20
|
||||
FLOPPY_VERIFY = 22
|
||||
FLOPPY_SCAN_LOW_OR_EQUAL = 25
|
||||
FLOPPY_SCAN_HIGH_OR_EQUAL = 29
|
||||
|
||||
;; Constants: DOR bitflag
|
||||
;;
|
||||
;; FLOPPY_DOR_MOTD - Set to turn drive 3's motor ON
|
||||
;; FLOPPY_DOR_MOTC - Set to turn drive 2's motor ON
|
||||
;; FLOPPY_DOR_MOTB - Set to turn drive 1's motor ON
|
||||
;; FLOPPY_DOR_MOTA - Set to turn drive 0's motor ON
|
||||
;; FLOPPY_DOR_IRQ - Set to enable IRQs and DMA
|
||||
;; FLOPPY_DOR_RESET - Reset on clear
|
||||
;; FLOPPY_DOR_DSEL - Select drive
|
||||
FLOPPY_DOR_MOTD = 0x80
|
||||
FLOPPY_DOR_MOTC = 0x40
|
||||
FLOPPY_DOR_MOTB = 0x20
|
||||
FLOPPY_DOR_MOTA = 0x10
|
||||
FLOPPY_DOR_IRQ = 0x08
|
||||
FLOPPY_DOR_RESET = 0x04
|
||||
FLOPPY_DOR_DSEL = 0x03
|
||||
|
||||
;; Constants: MSR bitflag
|
||||
;;
|
||||
;; FLOPPY_MSR_RQM - XXX
|
||||
;; FLOPPY_MSR_DIO - XXX
|
||||
;; FLOPPY_MSR_NDMA - XXX
|
||||
;; FLOPPY_MSR_CB - XXX
|
||||
;; FLOPPY_MSR_ACTD - XXX
|
||||
;; FLOPPY_MSR_ACTC - XXX
|
||||
;; FLOPPY_MSR_ACTB - XXX
|
||||
;; FLOPPY_MSR_ACTA - XXX
|
||||
FLOPPY_MSR_RQM = 0x80
|
||||
FLOPPY_MSR_DIO = 0x40
|
||||
FLOPPY_MSR_NDMA = 0x20
|
||||
FLOPPY_MSR_CB = 0x10
|
||||
FLOPPY_MSR_ACTD = 0x08
|
||||
FLOPPY_MSR_ACTC = 0x04
|
||||
FLOPPY_MSR_ACTB = 0x02
|
||||
FLOPPY_MSR_ACTA = 0x01
|
||||
|
||||
;; Struct: Floppy
|
||||
;;
|
||||
;; .active - XXX
|
||||
|
@ -100,6 +202,22 @@ floppy_lba_to_chs:
|
|||
;; In:
|
||||
;; EAX - Address of <Buffer>
|
||||
floppy_strategy:
|
||||
push ebp
|
||||
mov esp, ebp
|
||||
sub esp, 4
|
||||
mov [ebp-4], eax
|
||||
|
||||
push esi
|
||||
mov esi, szMsgFdStrat
|
||||
push [eax+Buffer.block]
|
||||
mov ax, [eax+Buffer.dev]
|
||||
movzx ecx, al
|
||||
push ecx
|
||||
call klog
|
||||
pop esi
|
||||
|
||||
|
||||
leave
|
||||
ret
|
||||
|
||||
;; Function: floppy_open
|
||||
|
@ -160,3 +278,4 @@ floppy_bdevsw:
|
|||
|
||||
szMsgFloppy0Found db "floppy: fd0 found", 0
|
||||
szMsgFloppy1Found db "floppy: fd1 found", 0
|
||||
szMsgFdStrat db "fd%u: strategy (blk: %u)", 0
|
||||
|
|
|
@ -72,6 +72,9 @@ DEFN Xv6FS_Inode
|
|||
|
||||
;; Struc: Xv6FS_Dirent
|
||||
;; xv6FS directory entry
|
||||
;;
|
||||
;; .inum - inode number
|
||||
;; .name - see <XV6FS_DIRSIZE>
|
||||
struc Xv6FS_Dirent {
|
||||
.inum dw ?
|
||||
.name db XV6FS_DIRSIZE dup(?)
|
||||
|
|
|
@ -89,11 +89,18 @@ kmain:
|
|||
|
||||
call vfs_init
|
||||
|
||||
; Root inode
|
||||
; rootino = newino(dev(0.0), BLK)
|
||||
; fs_mountroot(rootino);
|
||||
|
||||
mov ah, 2
|
||||
call bio_bread
|
||||
|
||||
mov eax, SYSCALL_EXIT
|
||||
int 0x42
|
||||
xor eax, eax
|
||||
call bio_bread
|
||||
|
||||
;mov eax, SYSCALL_EXIT
|
||||
;int 0x42
|
||||
|
||||
;mov al, 'X'
|
||||
;call cga_putc
|
||||
|
|
|
@ -30,7 +30,16 @@ struc VFSOps {
|
|||
.vget dd ?
|
||||
}
|
||||
|
||||
;; Constants: vnode types
|
||||
;;
|
||||
;; VNODE_TYPE_NON - XXX
|
||||
;; VNODE_TYPE_REG - XXX
|
||||
;; VNODE_TYPE_DIR - XXX
|
||||
;; VNODE_TYPE_BLK - XXX
|
||||
;; VNODE_TYPE_CHR - XXX
|
||||
;; VNODE_TYPE_LNK - XXX
|
||||
;; VNODE_TYPE_SOCK - XXX
|
||||
;; VNODE_TYPE_BAD - XXX
|
||||
VNODE_TYPE_NON = 0x0
|
||||
VNODE_TYPE_REG = 0x1
|
||||
VNODE_TYPE_DIR = 0x2
|
||||
|
|
Loading…
Reference in a new issue