Merge branch 'fat32_sys_rewrite' of github.com:Nivirx/stevia into fat32_sys_rewrite

This commit is contained in:
2025-01-12 20:00:51 -05:00
6 changed files with 101 additions and 112 deletions

3
.gitignore vendored
View File

@@ -6,4 +6,5 @@ build/*
bx_enh_dbg.ini bx_enh_dbg.ini
stevia-log stevia-log
.vscode/ .vscode/
*.map *.map
compose-dev.yaml

View File

@@ -1,20 +1,18 @@
# configuration file generated by Bochs # configuration file generated by Bochs
plugin_ctrl: voodoo=false, unmapped=true, biosdev=true, speaker=true, extfpuirq=true, parallel=true, serial=true, busmouse=false, e1000=false, es1370=false, gameport=true, ne2k=false, sb16=false, usb_uhci=false, usb_ohci=false, usb_ehci=false, usb_xhci=false plugin_ctrl: voodoo=false, unmapped=true, biosdev=true, speaker=true, extfpuirq=true, parallel=true, serial=true, busmouse=false, e1000=false, es1370=false, gameport=true, iodebug=true, ne2k=false, sb16=false, usb_uhci=false, usb_ohci=false, usb_ehci=false, usb_xhci=false
config_interface: win32config config_interface: win32config
display_library: win32 display_library: win32
memory: guest=64, host=64, block_size=128 memory: guest=64, host=64, block_size=128
romimage: file="C:\Program Files\Bochs-2.8\BIOS-bochs-latest", address=0x00000000, options=none, flash_data=none romimage: file="C:\Program Files\Bochs-2.8\BIOS-bochs-legacy", address=0x00000000, options=none, flash_data=none
vgaromimage: file="C:\Program Files\Bochs-2.8\VGABIOS-lgpl-latest" vgaromimage: file="C:\Program Files\Bochs-2.8\VGABIOS-lgpl-latest"
boot: disk boot: disk
floppy_bootsig_check: disabled=0 floppy_bootsig_check: disabled=1
floppya: type=1_44 floppya: type=1_44
# no floppyb # no floppyb
ata0: enabled=true, ioaddr1=0x1f0, ioaddr2=0x3f0, irq=14 ata0: enabled=true, ioaddr1=0x1f0, ioaddr2=0x3f0, irq=14
ata0-master: type=disk, path=".\disk.img", mode=flat, cylinders=0, heads=0, spt=0, sect_size=512, model="Stevia Disk", biosdetect=auto, translation=lba ata0-master: type=disk, path=".\disk.img", mode=flat, cylinders=0, heads=16, spt=63, sect_size=512, model="Stevia Disk", biosdetect=auto, translation=auto
ata0-slave: type=none ata0-slave: type=none
ata1: type=none ata1: enabled=false
ata1-master: type=none
ata1-slave: type=none
ata2: enabled=false ata2: enabled=false
ata3: enabled=false ata3: enabled=false
optromimage1: file=none optromimage1: file=none
@@ -29,7 +27,10 @@ pci: enabled=1, chipset=i440fx, slot1=none, slot2=none, slot3=none, slot4=none,
vga: extension=vbe, update_freq=10, realtime=1, ddc=builtin vga: extension=vbe, update_freq=10, realtime=1, ddc=builtin
cpu: count=1, ips=1000000, model=p3_katmai, reset_on_triple_fault=1, cpuid_limit_winnt=0, ignore_bad_msrs=1, mwait_is_nop=0 cpu: count=1, ips=1000000, model=p3_katmai, reset_on_triple_fault=1, cpuid_limit_winnt=0, ignore_bad_msrs=1, mwait_is_nop=0
print_timestamps: enabled=0 print_timestamps: enabled=0
port_e9_hack: enabled=false, all_rings=false debugger_log: -
magic_break: enabled=1
port_e9_hack: enabled=true, all_rings=false
iodebug: all_rings=0
private_colormap: enabled=0 private_colormap: enabled=0
clock: sync=none, time0=local, rtc_sync=0 clock: sync=none, time0=local, rtc_sync=0
# no cmosimage # no cmosimage
@@ -43,9 +44,9 @@ keyboard: type=mf, serial_delay=150, paste_delay=100000, user_shortcut=none
mouse: type=none, enabled=false, toggle=ctrl+mbutton mouse: type=none, enabled=false, toggle=ctrl+mbutton
sound: waveoutdrv=dummy, waveout=none, waveindrv=dummy, wavein=none, midioutdrv=dummy, midiout=none sound: waveoutdrv=dummy, waveout=none, waveindrv=dummy, wavein=none, midioutdrv=dummy, midiout=none
speaker: enabled=true, mode=sound, volume=15 speaker: enabled=true, mode=sound, volume=15
parport1: enabled=true, file=none parport1: enabled=false
parport2: enabled=false parport2: enabled=false
com1: enabled=true, mode=null com1: enabled=false
com2: enabled=false com2: enabled=false
com3: enabled=false com3: enabled=false
com4: enabled=false com4: enabled=false

View File

@@ -40,22 +40,18 @@ InitFATDriver:
sub sp, 0x6 sub sp, 0x6
.calc_active_part: .calc_active_part:
mov bx, [partition_offset] mov ax, word [partition_offset]
mov ax, partition_table mov di, fat32_state
add ax, cx
mov si, ax ; si = offset to active partition
mov ax, fat32_state
mov di, ax
mov eax, dword [si + PartEntry_t.lba_start] mov dx, partition_table
add dx, ax ; dx points to the partition that was booted from
mov bx, dx ; set bx, should point at our partition
mov eax, dword [bx + PartEntry_t.lba_start]
mov dword [di + FAT32_State_t.curr_drive_lba_32], eax mov dword [di + FAT32_State_t.curr_drive_lba_32], eax
mov ax, fat32_bpb mov si, fat32_bpb
mov si, ax mov bx, fat32_ebpb
mov ax, fat32_ebpb
mov bx, ax
.calc_first_fat: .calc_first_fat:
movzx eax, word [si + FAT32_bpb_t.reserved_sectors_word] ; first fat from start of partition movzx eax, word [si + FAT32_bpb_t.reserved_sectors_word] ; first fat from start of partition
add eax, dword [di + FAT32_State_t.curr_drive_lba_32] ; calculate offset from start of drive add eax, dword [di + FAT32_State_t.curr_drive_lba_32] ; calculate offset from start of drive
@@ -140,7 +136,7 @@ SearchFATDIR:
add sp, 0x4 add sp, 0x4
cmp eax, 0x0fff_fff7 cmp eax, 0x0fff_fff7
;je SearchFATDIR.bad_cluster ;je SearchFATDIR.bad_cluster ; TODO: Implement Bad cluster checks
jb SearchFATDIR.load_next_dir_next_OK jb SearchFATDIR.load_next_dir_next_OK
ERROR STAGE2_FAT32_END_OF_CHAIN ERROR STAGE2_FAT32_END_OF_CHAIN
@@ -197,7 +193,7 @@ SearchFATDIR:
mov cx, 0xA ; max of 11 filename length of 11 characters mov cx, 0xA ; max of 11 filename length of 11 characters
; si points to the start of the current directory entry ; si points to the start of the current directory entry
mov di, BootTarget_str ; current memory location (8.3 name is at offset 0) mov di, BootTarget ; current memory location (8.3 name is at offset 0)
repe cmpsb ; compare the strings repe cmpsb ; compare the strings
pop di pop di
@@ -257,7 +253,8 @@ NextCluster:
add eax, ecx ; fat_sector + first_fat_sector add eax, ecx ; fat_sector + first_fat_sector
mov dword [si + FAT32_NextClusterData_t.fat_sector], eax mov dword [si + FAT32_NextClusterData_t.fat_sector], eax
.load_fat_table: .load_fat_table:
movzx ax, byte [boot_drive] xor ax, ax
mov al, byte [boot_drive]
push ax push ax
mov ax, 0x1 mov ax, 0x1
@@ -272,20 +269,6 @@ NextCluster:
xor ax, ax xor ax, ax
push ax push ax
; BUG: something about this function causes this BIOS call to come back wrong
; somehow the drive number is being read in wrong, but I can't find evidence of it being modified or writen
; to memory incorrectly.
; 00007109574i[BIOS ] Booting from 0000:7c00
; 00007123227i[CPU0 ] [7123227] Stopped on MAGIC BREAKPOINT
; (0) Magic breakpoint
; Next at t=7123227
; (0) [0x000000000502] 0000:0502 (unk. ctxt): cli ; fa
; <bochs:2> c
; 00007252963i[BIOS ] int13_diskette: unsupported AH=42
; 00007253071i[CPU0 ] [7253071] Stopped on MAGIC BREAKPOINT
; (0) Magic breakpoint
; Next at t=7253071
; (0) [0x00000000095c] 0000:095c (unk. ctxt): mov al, 0x47 ; b047
call read_disk_raw call read_disk_raw
add sp, 0xC add sp, 0xC
; uint8_t read_stage2_raw(uint16_t buf_segment, uint16_t buf_offset, ; uint8_t read_stage2_raw(uint16_t buf_segment, uint16_t buf_offset,
@@ -302,26 +285,6 @@ NextCluster:
.error_cfdivz: .error_cfdivz:
ERROR STAGE2_FAT32_NCLUS_CFDIVZ ERROR STAGE2_FAT32_NCLUS_CFDIVZ
; clobbers eax, edx
; __fastcall16 uint32_t ClusterToLBA(uint32_t cluster)
; input = dword cluster in eax
ALIGN 4, db 0x90
ClusterToLBA:
__FASTCALL16_ENTRY
.func:
sub eax, 2
movzx edx, byte [fat32_bpb + FAT32_bpb_t.sectors_per_cluster_byte]
mul edx ; result in eax, error on carry
jc ClusterToLBA.error
add eax, dword [fat32_state + FAT32_State_t.first_data_sector_32]
jc ClusterToLBA.error
; eax contains the LBA now
.endp:
__FASTCALL16_EXIT
ret
.error:
ERROR STAGE2_FAT32_CLS2LBA_CF
; uint8_t ReadFATCluster(uint16_t seg, uint16_t offset, uint32_t cluster) ; uint8_t ReadFATCluster(uint16_t seg, uint16_t offset, uint32_t cluster)
ALIGN 4, db 0x90 ALIGN 4, db 0x90
ReadFATCluster: ReadFATCluster:
@@ -329,14 +292,24 @@ ReadFATCluster:
.func: .func:
print_string ReadFATCluster_info print_string ReadFATCluster_info
movzx ax, byte [boot_drive] mov bx, fat32_bpb
mov si, fat32_ebpb
xor ax, ax
mov al, byte [boot_drive]
push ax push ax
mov ax, 0x1 ; count = 1 mov ax, 0x1 ; count = 1
push ax push ax
mov eax, dword [bp + 8] mov eax, dword [bp + 8] ; cluster
call ClusterToLBA ; __fastcall16 uint32_t ClusterToLBA(uint32_t cluster) sub eax, 2
movzx edx, byte [bx + FAT32_bpb_t.sectors_per_cluster_byte]
mul edx ; result in eax, error on carry
jc ReadFATCluster.error
add eax, dword [si + FAT32_State_t.first_data_sector_32]
jc ReadFATCluster.error
; eax contains the LBA now
push dword eax ; lba = ClusterToLBA(..) push dword eax ; lba = ClusterToLBA(..)
mov ax, word [bp + 6] ; offset mov ax, word [bp + 6] ; offset
@@ -352,6 +325,8 @@ ReadFATCluster:
.endp: .endp:
__CDECL16_EXIT __CDECL16_EXIT
ret ret
.error:
ERROR STAGE2_FAT32_CLS2LBA_CF
%endif %endif
%define __INC_FAT32_SYS %define __INC_FAT32_SYS

View File

@@ -170,7 +170,7 @@ elif [[ "$OSTYPE" == "darwin"* ]]; then
sfdisk_path="/usr/local/opt/util-linux/sbin/sfdisk" sfdisk_path="/usr/local/opt/util-linux/sbin/sfdisk"
if [ -e $mbr_file ] && [ -e $vbr_file ]; then if [ -e $mbr_file ] && [ -e $vbr_file ]; then
# use hdiutil to attach our empty disk image # use hdiutil to attach our empty disk image
ld_path_raw=$(hdiutil attach -readwrite -imagekey diskimage-class=CRawDiskImage -nomount -blocksize 512 -noverify disk.img) ld_path_raw=$(hdiutil attach -readwrite -imagekey diskimage-class=CRawDiskImage -nomount -blocksize 512 -noverify /tmp/disk.img)
ld=$(echo $ld_path_raw | sed s:/dev/::) ld=$(echo $ld_path_raw | sed s:/dev/::)
ld_path="/dev/$ld" ld_path="/dev/$ld"
@@ -193,7 +193,7 @@ elif [[ "$OSTYPE" == "darwin"* ]]; then
unset ld unset ld
unset ld_path_raw unset ld_path_raw
ld_path_raw=$(hdiutil attach -readwrite -imagekey diskimage-class=CRawDiskImage -nomount -blocksize 512 -noverify disk.img) ld_path_raw=$(hdiutil attach -readwrite -imagekey diskimage-class=CRawDiskImage -nomount -blocksize 512 -noverify /tmp/disk.img)
ld=$(echo $ld_path_raw | grep "FDisk_partition_scheme" | awk '{print $1}' | sed s:/dev/::) ld=$(echo $ld_path_raw | grep "FDisk_partition_scheme" | awk '{print $1}' | sed s:/dev/::)
ld_path="/dev/$ld" ld_path="/dev/$ld"

View File

@@ -49,15 +49,20 @@
section .text section .text
begin_text: begin_text:
; dl = byte boot_drive ; dl = byte boot_drive
; si = word part_offset (active partition offset) ; ax = word part_offset (active partition offset)
; bx = ptr PartTable_t partition_table ; si = ptr PartTable_t partition_table
; dx = ptr FAT32_bpb_t fat32_bpb ; di = ptr FAT32_bpb_t fat32_bpb
ALIGN 4, db 0x90 ALIGN 4, db 0x90
init: init:
__BOCHS_MAGIC_DEBUG
cli ; We do not want to be interrupted cli ; We do not want to be interrupted
mov ax, __STAGE2_SEGMENT ; set all our segments to the configured segment, excep es ; these 4 are stored in the .data section and are effectivly const types
mov [vbr_part_table_ptr], si ; pointer to partition_table
mov [vbr_fat32_bpb_ptr], di ; pointer to fat32_bpb
mov [boot_drive], dl ; copy boot_drive to globals
mov [partition_offset], ax ; copy partition_offset to globals
mov ax, __STAGE2_SEGMENT ; set all our segments to the configured segment, except es
mov ds, ax ; * mov ds, ax ; *
mov fs, ax ; * mov fs, ax ; *
mov gs, ax ; * mov gs, ax ; *
@@ -81,7 +86,7 @@ init:
mov sp, stack_top mov sp, stack_top
mov bp, sp mov bp, sp
sub sp, 0x20 sub sp, 0x10
push bp ; setup a somewhat normal stack frame, minus a ret ptr push bp ; setup a somewhat normal stack frame, minus a ret ptr
sti sti
@@ -121,14 +126,9 @@ struc EarlyBootStruct_t
.fat32_ebpb resb FAT32_ebpb_t_size .fat32_ebpb resb FAT32_ebpb_t_size
endstruc endstruc
; bp - 4 : ptr PartTable_t partition_table
; bp - 8 : ptr FAT32_bpb_t fat32_bpb
ALIGN 4, db 0x90 ALIGN 4, db 0x90
main: main:
mov byte [boot_drive], dl ; boot_drive (probably 0x80) __BOCHS_MAGIC_DEBUG
mov word [partition_offset], si ; partition_offset
mov word [bp - 4], bx ; partition_table_vbr
mov word [bp - 8], dx ; fat32_bpb_vbr
.check_sig: .check_sig:
mov eax, dword [STAGE2_SIG] mov eax, dword [STAGE2_SIG]
cmp eax, 0xDEADBEEF cmp eax, 0xDEADBEEF
@@ -136,21 +136,21 @@ main:
ERROR STAGE2_SIGNATURE_MISSING ERROR STAGE2_SIGNATURE_MISSING
.stage2_main: .stage2_main:
mov ax, PartTable_t_size mov ax, PartTable_t_size
push ax ; len = PartTable_t_size
mov ax, word [vbr_part_table_ptr] ; src = ptr to vbr partition_table
push ax push ax
mov ax, [bp - 4] ; ptr partition_table mov ax, partition_table ; dst
push ax push ax
mov ax, partition_table call kmemcpy ; copy partition table data to .data section in stage2
push ax
call kmemcpy ; copy partition table data
add sp, 0x6 add sp, 0x6
mov ax, (FAT32_bpb_t_size + FAT32_ebpb_t_size) ; size in byte mov ax, (FAT32_bpb_t_size + FAT32_ebpb_t_size) ; len
push ax push ax
mov ax, [bp - 8] mov ax, word [vbr_fat32_bpb_ptr] ; src
push ax push ax
mov ax, fat32_bpb ; defined in memory.inc, destination mov ax, fat32_bpb ; dst
push ax push ax
call kmemcpy ; copy bpb & ebpb to memory call kmemcpy ; copy bpb & ebpb to memory
add sp, 0x6 add sp, 0x6
call SetTextMode call SetTextMode
@@ -161,14 +161,14 @@ main:
call EnableA20 call EnableA20
print_string A20_Enabled_OK_info print_string A20_Enabled_OK_info
; enter unreal mode
call EnterUnrealMode
print_string UnrealMode_OK_info
; get system memory map ; get system memory map
call GetMemoryMap call GetMemoryMap
print_string MemoryMap_OK_info print_string MemoryMap_OK_info
; enter unreal mode
call EnterUnrealMode
print_string UnrealMode_OK_info
; FAT Driver setup ; FAT Driver setup
call InitFATDriver call InitFATDriver
print_string InitFATSYS_OK_info print_string InitFATSYS_OK_info
@@ -389,12 +389,32 @@ define_info NextFATCluster, "Attempting to find next FAT cluster..."
define_info ReadFATCluster, "Attempting to load next FAT" define_info ReadFATCluster, "Attempting to load next FAT"
define_info MaybeFound_Boot, "Maybe found a file...checking..." define_info MaybeFound_Boot, "Maybe found a file...checking..."
define_cstr BootTarget, "BOOT BIN" define_cstr BootTarget_cstr, "BOOT BIN"
ALIGN 16, db 0 ALIGN 16, db 0
BootTarget_str: BootTarget:
db 'BOOT BIN' db 'BOOT BIN'
;
; pre-bss init globals (generally const...but there are exceptions)
;
align 8, db 0x00
boot_drive:
db 0x00
align 8, db 0x00
partition_offset:
dw 0x0000
align 8, db 0x00
vbr_fat32_bpb_ptr:
dw 0x0000
align 8, db 0x00
vbr_part_table_ptr:
dw 0x0000
ALIGN 16 ALIGN 16
IntToHex_table: IntToHex_table:
db '0123456789ABCDEF' db '0123456789ABCDEF'
@@ -489,37 +509,29 @@ section .bss follows=.sign
begin_bss: begin_bss:
; structures ; structures
align 16, resb 1 align 8, resb 1
partition_table resb PartTable_t_size partition_table resb PartTable_t_size
align 16, resb 1 align 8, resb 1
fat32_bpb resb FAT32_bpb_t_size fat32_bpb resb FAT32_bpb_t_size
fat32_ebpb resb FAT32_ebpb_t_size fat32_ebpb resb FAT32_ebpb_t_size
align 16, resb 1 align 8, resb 1
fat32_nc_data resb 16 fat32_nc_data resb 16
align 16, resb 1 align 8, resb 1
lba_packet resb LBAPkt_t_size lba_packet resb LBAPkt_t_size
align 16, resb 1 align 8, resb 1
fat32_state: fat32_state:
resb FAT32_State_t_size resb FAT32_State_t_size
align 16, resb 1 align 8, resb 1
SteviaInfo: SteviaInfo:
resd 4 resd 4
; ;
; locals ; post-bss init globals
; ;
ALIGN 4,resb 1
boot_drive:
resb 1
ALIGN 4,resb 1
partition_offset:
resw 1
; ;
; large continuous allocations ; large continuous allocations

View File

@@ -152,10 +152,10 @@ main:
call read_disk_raw call read_disk_raw
add sp, 0xC add sp, 0xC
.enter_stage2: .enter_stage2:
mov dl, byte [bp - 2] ; boot_drive mov dl, byte [bp - 2] ; byte boot_drive
mov si, word [bp - 4] ; part_offset mov ax, word [bp - 4] ; word part_offset
mov bx, partition_table mov si, partition_table ; ptr partition_table
mov dx, fat32_bpb mov di, fat32_bpb ; ptr fat32_bpb
jmp word 0x0000:STAGE2_ENTRY jmp word 0x0000:STAGE2_ENTRY
; ############### ; ###############