222 lines
		
	
	
	
		
			2.9 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			222 lines
		
	
	
	
		
			2.9 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| 	;; File: stpdfs.inc
 | |
| 
 | |
| STPDFS_BLOCK_SIZE = 512
 | |
| STPDFS_NAME_MAX   = 28
 | |
| 
 | |
| 	;; Struct: Inode
 | |
| struc Inode {
 | |
| 	.inode   dw ?
 | |
| 	.nlink   dw ?
 | |
| 	.uid     dw ?
 | |
| 	.gid     dw ?
 | |
| 	.flags   dw ?
 | |
| 	.size    dd ?
 | |
| 	.zones   dd 10 dup(?)
 | |
| 	.actime  dq ?
 | |
| 	.modtime dq ?
 | |
| }
 | |
| DEFN Inode
 | |
| 
 | |
| STPDFS_INODE_PER_BLOCK equ STPDFS_BLOCK_SIZE / sizeof.Inode
 | |
| 
 | |
| 	;; Struct: DirEntry
 | |
| struc DirEntry {
 | |
| 	.inum dd ?
 | |
| 	.name db STPDFS_NAME_MAX dup(?)
 | |
| }
 | |
| DEFN DirEntry
 | |
| 
 | |
| 	;; Function: stpdfs_load_rootdir
 | |
| 	;;
 | |
| 	;; Out:
 | |
| 	;;    
 | |
| stpdfs_load_rootdir:
 | |
| 	; read first inode
 | |
| 	mov ax, DISK_BUFFER/0x10
 | |
| 	mov es, ax
 | |
| 	mov ax, 2
 | |
| 	mov cx, 1
 | |
| 	xor bx, bx
 | |
| 
 | |
| 	call disk_read_sectors
 | |
| 
 | |
| 	; root dir is inode 1
 | |
| 	xor ax, ax
 | |
| 	mov es, ax
 | |
| 	mov ecx, sizeof.Inode
 | |
| 	mov esi, DISK_BUFFER + sizeof.Inode
 | |
| 	mov edi, inode_cache
 | |
| 	rep movsb
 | |
| 
 | |
| 	mov ax, DISK_BUFFER/0x10
 | |
| 	mov es, ax
 | |
| 	xor bx, bx
 | |
| 	call stpdfs_copy_data
 | |
| 
 | |
| 	ret
 | |
| 
 | |
| 	;; Function: stpdfs_read_inode
 | |
| 	;; 
 | |
| 	;; copy selected inode from file system to `inode_cache` 
 | |
| 	;;
 | |
| 	;; In:
 | |
| 	;;    EAX - inum
 | |
| 	;;
 | |
| stpdfs_read_inode:
 | |
| 	; get block where inode is located
 | |
| 	xor edx, edx
 | |
| 	mov ecx, STPDFS_INODE_PER_BLOCK
 | |
| 	div ecx
 | |
| 	add eax, 2
 | |
| 
 | |
| 	; read block
 | |
| 	push edx
 | |
| 	push eax
 | |
| 	mov ax, DISK_BUFFER/0x10
 | |
| 	mov es, ax
 | |
| 	pop eax
 | |
| 	mov cx, 1
 | |
| 	xor bx, bx
 | |
| 	call disk_read_sectors
 | |
| 	pop edx
 | |
| 
 | |
| 	; copy to inode cache
 | |
| 	mov eax, edx
 | |
| 	mov cl, sizeof.Inode
 | |
| 	mul cl
 | |
| 	movzx esi, ax
 | |
| 	add esi, DISK_BUFFER
 | |
| 
 | |
| 	xor ax, ax
 | |
| 	mov es, ax
 | |
| 	mov ecx, sizeof.Inode
 | |
| 	mov edi, inode_cache
 | |
| 	rep movsb
 | |
| 
 | |
| 	ret
 | |
| 
 | |
| 	;; Function: stpdfs_search
 | |
| 	;;
 | |
| 	;; In:
 | |
| 	;;    SI - filename
 | |
| 	;;
 | |
| 	;; Out:
 | |
| 	;;    EAX - kernel inode
 | |
| stpdfs_search:
 | |
| 	clc	; clear carry flag
 | |
| 	
 | |
| 	xor ax, ax
 | |
| 	mov es, ax
 | |
| 
 | |
| 	xor ecx, ecx
 | |
| .search_loop:
 | |
| 	cmp ecx, dword [inode_cache + Inode.size]
 | |
| 	jge .search_end
 | |
| 
 | |
| 	push ecx
 | |
| 
 | |
| 	; check if inum != 0
 | |
| 	mov eax, DISK_BUFFER
 | |
| 	add eax, ecx
 | |
| 	mov edx, [eax]
 | |
| 
 | |
| 	or edx, edx
 | |
| 	jz .search_next
 | |
| 
 | |
| 	; compare filename
 | |
| 	mov edi, eax
 | |
| 	add edi, 4
 | |
| 
 | |
| 	push si
 | |
| .strcmp:
 | |
| 	mov al, [si]
 | |
| 	cmpsb
 | |
| 	jne .strcmp_not_equal
 | |
| 	or al, al
 | |
| 	jz .kernel_found
 | |
| 	jmp .strcmp
 | |
| .strcmp_not_equal:
 | |
| 	pop si
 | |
| .search_next:
 | |
| 	pop ecx
 | |
| 	add ecx, sizeof.DirEntry
 | |
| 	jmp .search_loop
 | |
| .search_end:
 | |
| 	stc
 | |
| 	ret
 | |
| .kernel_found:
 | |
| 	pop si
 | |
| 	pop ecx
 | |
| 
 | |
| 	mov eax, edx
 | |
| 
 | |
| 	clc
 | |
| 	ret
 | |
| 
 | |
| 	;; Function: stpdfs_copy_data
 | |
| 	;;
 | |
| 	;; In:
 | |
| 	;;	ES:BX - buffer
 | |
| 	;;
 | |
| stpdfs_copy_data:
 | |
| 	xor edx, edx
 | |
| 	movzx ebx, bx
 | |
| 
 | |
| 	;; read direct
 | |
| @@:
 | |
| 	cmp ebx, dword [inode_cache + Inode.size]
 | |
| 	jg .all_read
 | |
| 	mov eax, edx
 | |
| 	shl eax, 2
 | |
| 	add eax, inode_cache + Inode.zones
 | |
| 	mov eax, [eax]
 | |
| 
 | |
| 	push edx
 | |
| 	push ebx
 | |
| 	mov cx, 1
 | |
| 	call disk_read_sectors
 | |
| 	pop ebx
 | |
| 	pop edx
 | |
| 
 | |
| 	add ebx, STPDFS_BLOCK_SIZE
 | |
| 	inc edx
 | |
| 	cmp edx, 7
 | |
| 	jb @b
 | |
| 
 | |
| .indirect_read:
 | |
| 	push ebx
 | |
| 	mov ax, es
 | |
| 	push ax
 | |
| 
 | |
| 	mov ax, DISK_BUFFER/0x10
 | |
| 	mov es, ax
 | |
| 	
 | |
| 	mov eax, dword [inode_cache + Inode.zones + 28]
 | |
| 	mov cx, 1
 | |
| 	xor bx, bx
 | |
| 	call disk_read_sectors
 | |
| 
 | |
| 	pop ax
 | |
| 	mov es, ax
 | |
| 
 | |
| 	pop ebx
 | |
| 	xor edx, edx
 | |
| @@:
 | |
| 	cmp ebx, dword [inode_cache + Inode.size]
 | |
| 	jg .all_read
 | |
| 	mov eax, edx
 | |
| 	shl eax, 2
 | |
| 	add eax, DISK_BUFFER
 | |
| 	mov eax, [eax]
 | |
| 
 | |
| 	mov cx, 1
 | |
| 	push edx
 | |
| 	call disk_read_sectors
 | |
| 	pop edx
 | |
| 
 | |
| 	add ebx, STPDFS_BLOCK_SIZE
 | |
| 	inc edx
 | |
| 	cmp edx, 128
 | |
| 	jbe @b
 | |
| .all_read:
 | |
| 	ret
 |