feat(kernel): block device (WIP)
This commit is contained in:
		
							parent
							
								
									b43672d268
								
							
						
					
					
						commit
						75aac14a44
					
				
					 5 changed files with 164 additions and 4 deletions
				
			
		|  | @ -9,7 +9,9 @@ | ||||||
| 	;; .refcount - refcount | 	;; .refcount - refcount | ||||||
| 	;; .data     - block data | 	;; .data     - block data | ||||||
| struc Buffer { | struc Buffer { | ||||||
| 	.dev      dd ? | 	.dev      dw ? | ||||||
|  | 	.flags    db ? | ||||||
|  | 	.bcount   db ? | ||||||
| 	.block    dd ? | 	.block    dd ? | ||||||
| 	.ulock    dd ? | 	.ulock    dd ? | ||||||
| 	.refcount dd ? | 	.refcount dd ? | ||||||
|  | @ -17,6 +19,19 @@ struc Buffer { | ||||||
| } | } | ||||||
| DEFN 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 | 	;; Function: bio_init | ||||||
| bio_init: | bio_init: | ||||||
| 	mov ecx, sizeof.Buffer * 30 | 	mov ecx, sizeof.Buffer * 30 | ||||||
|  | @ -25,6 +40,11 @@ bio_init: | ||||||
| 	rep stosb | 	rep stosb | ||||||
| 	ret | 	ret | ||||||
| 
 | 
 | ||||||
|  | 	;; Function: bio_getblk | ||||||
|  | 	;; | ||||||
|  | bio_getblk: | ||||||
|  | 	ret | ||||||
|  | 
 | ||||||
| 	;; Function: bio_read | 	;; Function: bio_read | ||||||
| 	;; | 	;; | ||||||
| 	;; In: | 	;; In: | ||||||
|  | @ -46,6 +66,8 @@ bio_bread: | ||||||
| 	call klog | 	call klog | ||||||
| 	jmp .end | 	jmp .end | ||||||
| @@: | @@: | ||||||
|  | 	xchg bx, bx | ||||||
|  | 	mov eax, aBuffers | ||||||
| 	mov ecx, [ecx] | 	mov ecx, [ecx] | ||||||
| 	mov ecx, [ecx + BlkDev.strategy] | 	mov ecx, [ecx + BlkDev.strategy] | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -23,6 +23,108 @@ TOTAL_SECTORS       = 2880 | ||||||
| 
 | 
 | ||||||
| FLOPPY_MAX = 2 | 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 | 	;; Struct: Floppy | ||||||
| 	;; | 	;; | ||||||
| 	;; .active - XXX | 	;; .active - XXX | ||||||
|  | @ -100,6 +202,22 @@ floppy_lba_to_chs: | ||||||
| 	;; In: | 	;; In: | ||||||
| 	;;    EAX - Address of <Buffer> | 	;;    EAX - Address of <Buffer> | ||||||
| floppy_strategy: | 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 | 	ret | ||||||
| 
 | 
 | ||||||
| 	;; Function: floppy_open | 	;; Function: floppy_open | ||||||
|  | @ -160,3 +278,4 @@ floppy_bdevsw: | ||||||
| 
 | 
 | ||||||
| szMsgFloppy0Found db "floppy: fd0 found", 0 | szMsgFloppy0Found db "floppy: fd0 found", 0 | ||||||
| szMsgFloppy1Found db "floppy: fd1 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 | 	;; Struc: Xv6FS_Dirent | ||||||
| 	;; xv6FS directory entry | 	;; xv6FS directory entry | ||||||
|  | 	;; | ||||||
|  | 	;; .inum - inode number | ||||||
|  | 	;; .name - see <XV6FS_DIRSIZE> | ||||||
| struc Xv6FS_Dirent { | struc Xv6FS_Dirent { | ||||||
| 	.inum dw ? | 	.inum dw ? | ||||||
| 	.name db XV6FS_DIRSIZE dup(?) | 	.name db XV6FS_DIRSIZE dup(?) | ||||||
|  |  | ||||||
|  | @ -89,11 +89,18 @@ kmain: | ||||||
| 
 | 
 | ||||||
| 	call vfs_init | 	call vfs_init | ||||||
| 
 | 
 | ||||||
|  | 	; Root inode | ||||||
|  | 	; rootino = newino(dev(0.0), BLK) | ||||||
|  | 	; fs_mountroot(rootino); | ||||||
|  | 
 | ||||||
| 	mov ah, 2 | 	mov ah, 2 | ||||||
| 	call bio_bread | 	call bio_bread | ||||||
| 
 | 
 | ||||||
| 	mov eax, SYSCALL_EXIT | 	xor eax, eax | ||||||
| 	int 0x42 | 	call bio_bread | ||||||
|  | 
 | ||||||
|  | 	;mov eax, SYSCALL_EXIT | ||||||
|  | 	;int 0x42 | ||||||
| 
 | 
 | ||||||
| 	;mov al, 'X' | 	;mov al, 'X' | ||||||
| 	;call cga_putc | 	;call cga_putc | ||||||
|  |  | ||||||
|  | @ -30,7 +30,16 @@ struc VFSOps { | ||||||
| 	.vget   dd ? | 	.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_NON  = 0x0 | ||||||
| VNODE_TYPE_REG  = 0x1 | VNODE_TYPE_REG  = 0x1 | ||||||
| VNODE_TYPE_DIR  = 0x2 | VNODE_TYPE_DIR  = 0x2 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		
		Reference in a new issue