]> git.sesse.net Git - pistorm/commitdiff
Some non-working loading of file systems from disk for PiSCSI
authorbeeanyew <beeanyew@gmail.com>
Thu, 10 Jun 2021 18:20:05 +0000 (20:20 +0200)
committerbeeanyew <beeanyew@gmail.com>
Thu, 10 Jun 2021 18:20:05 +0000 (20:20 +0200)
platforms/amiga/hunk-reloc.c
platforms/amiga/piscsi/device_driver_amiga/bootrom
platforms/amiga/piscsi/device_driver_amiga/bootrom.s
platforms/amiga/piscsi/piscsi-enums.h
platforms/amiga/piscsi/piscsi.c
platforms/amiga/piscsi/piscsi.h
platforms/amiga/piscsi/piscsi.rom

index 3b92e339af17249d5aea002f1ec1c94dbab75e33..b1c2e32c815174503fb0be5a40bc672805069bb4 100644 (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;
+}
index c83fa552948c215a74bc3f0b10a050eebfeef1c0..5ec9567fd0e8b03b3d923e06d5a8947ef40a4da1 100644 (file)
Binary files a/platforms/amiga/piscsi/device_driver_amiga/bootrom and b/platforms/amiga/piscsi/device_driver_amiga/bootrom differ
index 25721255083be884cc49a8aaaeaccca5ced572cb..18826aa07edee6dd74a98a43fbd810f25f398db2 100644 (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
index 8dadf020135c2f5c42d0446461265a2789e65c9f..1040822a8fec507565635828b89c69b5fa721a63 100644 (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,
index c6251c74c8787743111c1035cd908f056a3273f2..433929e83f2bd30a5207bb237661c83cd8647676 100644 (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;
index a9fd3535f843cdeae40900be6bf31ae340e2f02d..b9384118cd504c7b1b35b63a50db21d5b51fcf43 100644 (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);
index c677e97ef4b6eda7dc43a8a61dd2b291793f20f1..7d6ffab8af8ed92328774014cab46e8ff52797f6 100644 (file)
Binary files a/platforms/amiga/piscsi/piscsi.rom and b/platforms/amiga/piscsi/piscsi.rom differ