Merge upstream changes from branch 'trunk' into fat32_sys_rewrite
This commit is contained in:
21
bochsrc.bxrc
21
bochsrc.bxrc
@@ -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
|
||||||
@@ -40,16 +40,14 @@ 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
|
|
||||||
add ax, cx
|
|
||||||
mov si, ax ; si = offset to active partition
|
|
||||||
|
|
||||||
mov ax, fat32_state
|
mov dx, partition_table
|
||||||
mov di, ax
|
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 [si + PartEntry_t.lba_start]
|
mov eax, dword [bx + PartEntry_t.lba_start]
|
||||||
mov dword [di + FAT32_State_t.curr_drive_lba_32], eax
|
mov dword [fat32_state + FAT32_State_t.active_drive_lba_32], eax
|
||||||
|
|
||||||
mov ax, fat32_bpb
|
mov ax, fat32_bpb
|
||||||
mov si, ax
|
mov si, ax
|
||||||
@@ -138,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
|
||||||
|
|
||||||
@@ -245,7 +243,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:
|
||||||
mov ax, word [boot_drive]
|
xor ax, ax
|
||||||
|
mov al, byte [boot_drive]
|
||||||
push ax
|
push ax
|
||||||
|
|
||||||
mov ax, 0x1
|
mov ax, 0x1
|
||||||
@@ -260,20 +259,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,
|
||||||
@@ -317,7 +302,8 @@ ReadFATCluster:
|
|||||||
.func:
|
.func:
|
||||||
print_string ReadFATCluster_info
|
print_string ReadFATCluster_info
|
||||||
|
|
||||||
mov ax, word [boot_drive]
|
xor ax, ax
|
||||||
|
mov al, byte [boot_drive]
|
||||||
push ax
|
push ax
|
||||||
|
|
||||||
mov ax, 0x1 ; count = 1
|
mov ax, 0x1 ; count = 1
|
||||||
|
|||||||
@@ -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,19 +136,19 @@ 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
|
||||||
@@ -161,13 +161,15 @@ main:
|
|||||||
call EnableA20
|
call EnableA20
|
||||||
print_string A20_Enabled_OK_info
|
print_string A20_Enabled_OK_info
|
||||||
|
|
||||||
|
; get system memory map
|
||||||
|
call GetMemoryMap
|
||||||
|
print_string MemoryMap_OK_info
|
||||||
|
|
||||||
; enter unreal mode
|
; enter unreal mode
|
||||||
call EnterUnrealMode
|
call EnterUnrealMode
|
||||||
print_string UnrealMode_OK_info
|
print_string UnrealMode_OK_info
|
||||||
|
|
||||||
; get system memory map
|
|
||||||
call GetMemoryMap
|
|
||||||
print_string MemoryMap_OK_info
|
|
||||||
|
|
||||||
; FAT Driver setup
|
; FAT Driver setup
|
||||||
call InitFATDriver
|
call InitFATDriver
|
||||||
@@ -389,12 +391,52 @@ 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
|
||||||
|
|
||||||
|
;
|
||||||
|
; 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 +531,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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
; ###############
|
; ###############
|
||||||
|
|||||||
Reference in New Issue
Block a user