From: beeanyew Date: Thu, 10 Jun 2021 18:20:05 +0000 (+0200) Subject: Some non-working loading of file systems from disk for PiSCSI X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=8ebbc29a791075e3d9635c3c4d70f30d03c6313f;p=pistorm Some non-working loading of file systems from disk for PiSCSI --- diff --git a/platforms/amiga/hunk-reloc.c b/platforms/amiga/hunk-reloc.c index 3b92e33..b1c2e32 100644 --- a/platforms/amiga/hunk-reloc.c +++ b/platforms/amiga/hunk-reloc.c @@ -8,6 +8,7 @@ #include #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; +} diff --git a/platforms/amiga/piscsi/device_driver_amiga/bootrom b/platforms/amiga/piscsi/device_driver_amiga/bootrom index c83fa55..5ec9567 100644 Binary files a/platforms/amiga/piscsi/device_driver_amiga/bootrom and b/platforms/amiga/piscsi/device_driver_amiga/bootrom differ diff --git a/platforms/amiga/piscsi/device_driver_amiga/bootrom.s b/platforms/amiga/piscsi/device_driver_amiga/bootrom.s index 2572125..18826aa 100644 --- a/platforms/amiga/piscsi/device_driver_amiga/bootrom.s +++ b/platforms/amiga/piscsi/device_driver_amiga/bootrom.s @@ -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 diff --git a/platforms/amiga/piscsi/piscsi-enums.h b/platforms/amiga/piscsi/piscsi-enums.h index 8dadf02..1040822 100644 --- a/platforms/amiga/piscsi/piscsi-enums.h +++ b/platforms/amiga/piscsi/piscsi-enums.h @@ -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, diff --git a/platforms/amiga/piscsi/piscsi.c b/platforms/amiga/piscsi/piscsi.c index c6251c7..433929e 100644 --- a/platforms/amiga/piscsi/piscsi.c +++ b/platforms/amiga/piscsi/piscsi.c @@ -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; diff --git a/platforms/amiga/piscsi/piscsi.h b/platforms/amiga/piscsi/piscsi.h index a9fd353..b938411 100644 --- a/platforms/amiga/piscsi/piscsi.h +++ b/platforms/amiga/piscsi/piscsi.h @@ -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); diff --git a/platforms/amiga/piscsi/piscsi.rom b/platforms/amiga/piscsi/piscsi.rom index c677e97..7d6ffab 100644 Binary files a/platforms/amiga/piscsi/piscsi.rom and b/platforms/amiga/piscsi/piscsi.rom differ