diff --git a/kernel/bio.inc b/kernel/bio.inc index da988bd..8312b6a 100644 --- a/kernel/bio.inc +++ b/kernel/bio.inc @@ -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] diff --git a/kernel/dev/at/floppy.inc b/kernel/dev/at/floppy.inc index 1e50fe2..612cdd3 100644 --- a/kernel/dev/at/floppy.inc +++ b/kernel/dev/at/floppy.inc @@ -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 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 diff --git a/kernel/fs/xv6fs.inc b/kernel/fs/xv6fs.inc index e67c049..e3dda6a 100644 --- a/kernel/fs/xv6fs.inc +++ b/kernel/fs/xv6fs.inc @@ -72,6 +72,9 @@ DEFN Xv6FS_Inode ;; Struc: Xv6FS_Dirent ;; xv6FS directory entry + ;; + ;; .inum - inode number + ;; .name - see struc Xv6FS_Dirent { .inum dw ? .name db XV6FS_DIRSIZE dup(?) diff --git a/kernel/kernel.asm b/kernel/kernel.asm index 196c605..79694cf 100644 --- a/kernel/kernel.asm +++ b/kernel/kernel.asm @@ -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 diff --git a/kernel/vfs.inc b/kernel/vfs.inc index d240dc0..8629d25 100644 --- a/kernel/vfs.inc +++ b/kernel/vfs.inc @@ -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