Some non-working loading of file systems from disk for PiSCSI

This commit is contained in:
beeanyew
2021-06-10 20:20:05 +02:00
parent 862836b767
commit 8ebbc29a79
7 changed files with 130 additions and 21 deletions

View File

@@ -8,6 +8,7 @@
#include <endian.h>
#include "hunk-reloc.h"
#include "piscsi/piscsi-enums.h"
#include "piscsi/piscsi.h"
#ifdef FAKESTORM
#define lseek64 lseek
@@ -247,3 +248,27 @@ fail:;
return -1;
}
int load_fs(struct piscsi_fs *fs, char *dosID) {
char filename[256];
memset(filename, 0x00, 256);
sprintf(filename, "./data/fs/%c%c%c.%d", dosID[0], dosID[1], dosID[2], dosID[3]);
FILE *in = fopen(filename, "rb");
if (in == NULL)
return -1;
fseek(in, 0, SEEK_END);
uint32_t file_size = ftell(in);
fseek(in, 0, SEEK_SET);
fs->binary_data = malloc(file_size);
fread(fs->binary_data, file_size, 1, in);
process_hunks(in, &fs->h_info, fs->relocs, 0x0);
fs->h_info.byte_size = file_size;
fs->h_info.alloc_size = file_size + add_size;
fclose(in);
return 0;
}

View File

@@ -88,6 +88,8 @@ PiSCSINextFS EQU $80000064
PiSCSICopyFS EQU $80000068
PiSCSIFSSize EQU $8000006C
PiSCSISetFSH EQU $80000070
PiSCSILoadFS EQU $80000084
PiSCSIGetFSInfo EQU $80000088
PiSCSIDbg1 EQU $80001010
PiSCSIDbg2 EQU $80001014
PiSCSIDbg3 EQU $80001018
@@ -303,7 +305,7 @@ NoZ3:
SkipDriverLoad:
move.l #9,PiSCSIDebugMe
bra.w LoadFileSystems
jsr LoadFileSystems(pc)
FSLoadExit:
lea ExpansionName(pc),a1
@@ -318,6 +320,16 @@ PartitionLoop:
beq.w EndPartitions ; If the next partition returns 0, there's no additional partitions
move.l d0,a0
jsr MakeDosNode(a6)
;cmp.l #0,PiSCSIGetFSInfo ; This does not work for some reason... not massively surprising...
;beq.s SkipLoadFS
;move.l d0,PiSCSILoadFS ; Attempt to load the file system driver from data/fs
;cmp.l #$FFFFFFFF,PiSCSIAddr4
;beq SkipLoadFS
;jsr LoadFileSystems(pc)
SkipLoadFS:
move.l d0,PiSCSISetFSH
move.l d0,PiSCSIAddr2 ; Put DeviceNode address in PiSCSIAddr2, because I'm useless
move.l d0,a0
@@ -340,14 +352,14 @@ PartitionLoop:
EnqueueNode:
exg a6,a4
move.l #35,PiSCSIDebugMe
move.l #BootNode_SIZEOF,PiSCSIDebugMe
move.l #NT_BOOTNODE,PiSCSIDebugMe
move.l #LN_TYPE,PiSCSIDebugMe
move.l #LN_PRI,PiSCSIDebugMe
move.l #LN_NAME,PiSCSIDebugMe
move.l #eb_MountList,PiSCSIDebugMe
move.l #35,PiSCSIDebugMe
;move.l #35,PiSCSIDebugMe
;move.l #BootNode_SIZEOF,PiSCSIDebugMe
;move.l #NT_BOOTNODE,PiSCSIDebugMe
;move.l #LN_TYPE,PiSCSIDebugMe
;move.l #LN_PRI,PiSCSIDebugMe
;move.l #LN_NAME,PiSCSIDebugMe
;move.l #eb_MountList,PiSCSIDebugMe
;move.l #35,PiSCSIDebugMe
move.l #BootNode_SIZEOF,d0
move.l #$10001,d1
@@ -406,6 +418,7 @@ FSResource: dc.l $0
LoadFileSystems:
movem.l d0-d7/a0-a6,-(sp) ; Push registers to stack
move.l #30,PiSCSIDebugMe
movea.l 4,a6
ReloadResource:
lea FileSysName(pc),a1
jsr OpenResource(a6)
@@ -432,7 +445,7 @@ ReloadResource:
move.l a2,a1
jsr -$f6(a6) ; AddTail
move.l a2,a0
bra.s ReloadResource
move.l a0,d0
FSRExists:
move.l d0,PiSCSIAddr2 ; PiSCSIAddr2 is now FileSystem.resource
@@ -441,7 +454,6 @@ FSRExists:
move.l PiSCSIGetFS,d0
cmp.l #0,d0
beq.w FSDone
move.l d0,d7
FSNext:
move.l #45,PiSCSIDebugMe
@@ -468,18 +480,19 @@ NoEntries:
move.l #39,PiSCSIDebugMe
move.l PiSCSIFSSize,d0
move.l #40,PiSCSIDebugMe
move.l #0,d1
move.l #$10001,d1
move.l #41,PiSCSIDebugMe
jsr AllocMem(a6)
move.l d0,PiSCSIAddr3
move.l d0,a0
move.l #1,PiSCSICopyFS
move.b #NT_RESOURCE,LN_TYPE(a0)
AlreadyLoaded:
move.l #480,PiSCSIDebugMe
move.l PiSCSIAddr2,a0
move.l #1,PiSCSINextFS
move.l PiSCSIGetFS,d0
move.l d0,d7
cmp.l #0,d0
bne.w FSNext
@@ -487,7 +500,7 @@ FSDone: move.l #37,PiSCSIDebugMe
move.l #32,PiSCSIDebugMe ; Couldn't open FileSystem.resource, Kick 1.2/1.3?
movem.l (sp)+,d0-d7/a0-a6 ; Pop registers from stack
bra.w FSLoadExit
rts
FSRes
dc.l 0

View File

@@ -49,6 +49,8 @@ enum piscsi_cmds {
PISCSI_CMD_READBYTES = 0x78,
PISCSI_CMD_WRITEBYTES = 0x7C,
PISCSI_CMD_DRVNUMX = 0x80,
PISCSI_CMD_LOADFS = 0x84,
PISCSI_CMD_GET_FS_INFO = 0x88,
PISCSI_DBG_MSG = 0x1000,
PISCSI_DBG_VAL1 = 0x1010,
PISCSI_DBG_VAL2 = 0x1014,

View File

@@ -273,7 +273,7 @@ void piscsi_find_filesystems(struct piscsi_dev *d) {
DEBUG("[FSHD] Patchflags: %d Type: %d\n", BE(fhb->fhb_PatchFlags), BE(fhb->fhb_Type));
DEBUG("[FSHD] Task: %d Lock: %d\n", BE(fhb->fhb_Task), BE(fhb->fhb_Lock));
DEBUG("[FSHD] Handler: %d StackSize: %d\n", BE(fhb->fhb_Handler), BE(fhb->fhb_StackSize));
DEBUG("[FSHD] Prio: %d Startup: %d\n", BE(fhb->fhb_Priority), BE(fhb->fhb_Startup));
DEBUG("[FSHD] Prio: %d Startup: %d (%.8X)\n", BE(fhb->fhb_Priority), BE(fhb->fhb_Startup), BE(fhb->fhb_Startup));
DEBUG("[FSHD] SegListBlocks: %d GlobalVec: %d\n", BE(fhb->fhb_Priority), BE(fhb->fhb_Startup));
DEBUG("[FSHD] FileSysName: %s\n", fhb->fhb_FileSysName + 1);
#endif
@@ -292,6 +292,24 @@ void piscsi_find_filesystems(struct piscsi_dev *d) {
filesystems[piscsi_num_fs].FS_ID = fhb->fhb_DosType;
filesystems[piscsi_num_fs].fhb = fhb;
printf("[FSHD] Loaded and set up file system %d: %c%c%c/%d\n", piscsi_num_fs + 1, dosID[0], dosID[1], dosID[2], dosID[3]);
{
char fs_save_filename[256];
memset(fs_save_filename, 0x00, 256);
sprintf(fs_save_filename, "./data/fs/%c%c%c.%d", dosID[0], dosID[1], dosID[2], dosID[3]);
FILE *save_fs = fopen(fs_save_filename, "rb");
if (save_fs == NULL) {
save_fs = fopen(fs_save_filename, "wb+");
if (save_fs != NULL) {
fwrite(filesystems[piscsi_num_fs].binary_data, filesystems[piscsi_num_fs].h_info.byte_size, 1, save_fs);
fclose(save_fs);
printf("[FSHD] File system %c%c%c/%d saved to fs storage.\n", dosID[0], dosID[1], dosID[2], dosID[3]);
} else {
printf("[FSHD] Failed to save file system to fs storage. (Permission issues?)\n");
}
} else {
fclose(save_fs);
}
}
piscsi_num_fs++;
}
@@ -522,6 +540,7 @@ void print_piscsi_debug_message(int index) {
void piscsi_debugme(uint32_t index) {
switch (index) {
DEBUGME_SIMPLE(1, "[PISCSI-DEBUGME] Arrived at DiagEntry.\n");
DEBUGME_SIMPLE(2, "[PISCSI-DEBUGME] Arrived at BootEntry, for some reason.\n");
DEBUGME_SIMPLE(3, "[PISCSI-DEBUGME] Init: Interrupt disable.\n");
DEBUGME_SIMPLE(4, "[PISCSI-DEBUGME] Init: Copy/reloc driver.\n");
DEBUGME_SIMPLE(5, "[PISCSI-DEBUGME] Init: InitResident.\n");
@@ -531,7 +550,10 @@ void piscsi_debugme(uint32_t index) {
DEBUGME_SIMPLE(10, "[PISCSI-DEBUGME] Init: AllocMem for resident.\n");
DEBUGME_SIMPLE(11, "[PISCSI-DEBUGME] Init: Checking if resident is loaded.\n");
DEBUGME_SIMPLE(22, "[PISCSI-DEBUGME] Arrived at BootEntry.\n");
DEBUGME_SIMPLE(30, "[PISCSI-DEBUGME] LoadFileSystems: Opening FileSystem.resource.\n");
case 30:
DEBUG("[PISCSI-DEBUGME] LoadFileSystems: Opening FileSystem.resource.\n");
rom_cur_fs = 0;
break;
DEBUGME_SIMPLE(33, "[PISCSI-DEBUGME] FileSystem.resource not available, creating.\n");
case 31:
DEBUG("[PISCSI-DEBUGME] OpenResource result: %d\n", piscsi_u32[0]);
@@ -539,6 +561,12 @@ void piscsi_debugme(uint32_t index) {
case 32:
DEBUG("AAAAHH!\n");
break;
case 35:
DEBUG("[PISCSI-DEBUGME] stuff output\n");
break;
case 36:
DEBUG("[PISCSI-DEBUGME] Debug pointers: %.8X %.8X %.8X %.8X\n", piscsi_u32[0], piscsi_u32[1], piscsi_u32[2], piscsi_u32[3]);
break;
default:
DEBUG("[!!!PISCSI-DEBUGME] No debugme message for index %d!\n", index);
break;
@@ -765,7 +793,6 @@ skip_disk:;
r = get_mapped_item_by_address(cfg, piscsi_u32[2]);
if (r != -1) {
uint32_t addr = piscsi_u32[2] - cfg->map_offset[r];
memset(cfg->map_data[r] + addr, 0x00, filesystems[rom_cur_fs].h_info.alloc_size);
memcpy(cfg->map_data[r] + addr, filesystems[rom_cur_fs].binary_data, filesystems[rom_cur_fs].h_info.byte_size);
filesystems[rom_cur_fs].h_info.base_offset = piscsi_u32[2];
reloc_hunks(filesystems[rom_cur_fs].relocs, cfg->map_data[r] + addr, &filesystems[rom_cur_fs].h_info);
@@ -780,27 +807,49 @@ skip_disk:;
uint32_t addr = val - cfg->map_offset[r];
struct DeviceNode *node = (struct DeviceNode *)(cfg->map_data[r] + addr);
char *dosID = (char *)&rom_partition_dostype[rom_cur_partition];
#ifdef PISCSI_DEBUG
#endif
DEBUG("[PISCSI] Partition DOSType is %c%c%c/%d\n", dosID[0], dosID[1], dosID[2], dosID[3]);
for (i = 0; i < piscsi_num_fs; i++) {
if (rom_partition_dostype[rom_cur_partition] == filesystems[i].FS_ID) {
node->dn_SegList = htobe32((filesystems[i].handler >> 2));
node->dn_SegList = htobe32(((filesystems[i].handler) >> 2));
node->dn_GlobalVec = 0xFFFFFFFF;
goto fs_found;
}
}
node->dn_GlobalVec = 0xFFFFFFFF;
node->dn_SegList = 0;
printf("[!!!PISCSI] Found no handler for file system %c%c%c/%d\n", dosID[0], dosID[1], dosID[2], dosID[3]);
fs_found:;
DEBUG("[FS-HANDLER] Next: %d Type: %.8X\n", BE(node->dn_Next), BE(node->dn_Type));
DEBUG("[FS-HANDLER] Task: %d Lock: %d\n", BE(node->dn_Task), BE(node->dn_Lock));
DEBUG("[FS-HANDLER] Handler: %d Stacksize: %d\n", BE((uint32_t)node->dn_Handler), BE(node->dn_StackSize));
DEBUG("[FS-HANDLER] Priority: %d Startup: %d\n", BE((uint32_t)node->dn_Priority), BE(node->dn_Startup));
DEBUG("[FS-HANDLER] Priority: %d Startup: %d (%.8X)\n", BE((uint32_t)node->dn_Priority), BE(node->dn_Startup), BE(node->dn_Startup));
DEBUG("[FS-HANDLER] SegList: %.8X GlobalVec: %d\n", BE((uint32_t)node->dn_SegList), BE(node->dn_GlobalVec));
DEBUG("[PISCSI] Handler for partition %.8X set to %.8X (%.8X).\n", BE((uint32_t)node->dn_Name), filesystems[i].FS_ID, filesystems[i].handler);
}
break;
}
case PISCSI_CMD_LOADFS: {
DEBUG("[PISCSI] Attempt to load file system for partition %d from disk.\n", rom_cur_partition);
r = get_mapped_item_by_address(cfg, val);
if (r != -1) {
char *dosID = (char *)&rom_partition_dostype[rom_cur_partition];
filesystems[piscsi_num_fs].binary_data = NULL;
filesystems[piscsi_num_fs].fhb = NULL;
filesystems[piscsi_num_fs].FS_ID = rom_partition_dostype[rom_cur_partition];
filesystems[piscsi_num_fs].handler = 0;
if (load_fs(&filesystems[piscsi_num_fs], dosID) != -1) {
printf("[FSHD-Late] Loaded file system %c%c%c/%d from fs storage.\n", dosID[0], dosID[1], dosID[2], dosID[3]);
piscsi_u32[3] = piscsi_num_fs;
rom_cur_fs = piscsi_num_fs;
piscsi_num_fs++;
} else {
printf("[FSHD-Late] Failed to load file system %c%c%c/%d from fs storage.\n", dosID[0], dosID[1], dosID[2], dosID[3]);
piscsi_u32[3] = 0xFFFFFFFF;
}
}
break;
}
case PISCSI_DBG_VAL1: case PISCSI_DBG_VAL2: case PISCSI_DBG_VAL3: case PISCSI_DBG_VAL4:
case PISCSI_DBG_VAL5: case PISCSI_DBG_VAL6: case PISCSI_DBG_VAL7: case PISCSI_DBG_VAL8: {
int i = ((addr & 0xFFFF) - PISCSI_DBG_VAL1) / 4;
@@ -899,6 +948,24 @@ uint32_t handle_piscsi_read(uint32_t addr, uint8_t type) {
case PISCSI_CMD_BLOCKSIZE:
DEBUG("[PISCSI] Get block size of drive %d: %d\n", piscsi_cur_drive, devs[piscsi_cur_drive].block_size);
return devs[piscsi_cur_drive].block_size;
case PISCSI_CMD_GET_FS_INFO: {
int i = 0;
uint32_t val = piscsi_u32[1];
int32_t r = get_mapped_item_by_address(cfg, val);
if (r != -1) {
#ifdef DEBUG_PISCSI
uint32_t addr = val - cfg->map_offset[r];
char *dosID = (char *)&rom_partition_dostype[rom_cur_partition];
DEBUG("[PISCSI-GET-FS-INFO] Partition DOSType is %c%c%c/%d\n", dosID[0], dosID[1], dosID[2], dosID[3]);
#endif
for (i = 0; i < piscsi_num_fs; i++) {
if (rom_partition_dostype[rom_cur_partition] == filesystems[i].FS_ID) {
return 0;
}
}
}
return 1;
}
default:
DEBUG("[!!!PISCSI] WARN: Unhandled %s register read from %.8X\n", op_type_names[type], addr);
break;

View File

@@ -265,3 +265,5 @@ uint32_t handle_piscsi_read(uint32_t addr, uint8_t type);
void piscsi_find_filesystems(struct piscsi_dev *d);
void piscsi_refresh_drives();
int load_fs(struct piscsi_fs *fs, char *dosID);

Binary file not shown.