On Thu, Dec 06, 2018 at 07:12:19PM +0300, Mike Banon wrote:
Hi Kevin, thank you very much for the suggestions! This is a second version of my "more_than_one_floppy" patch : now it will search for the max size of floppy stored inside CBFS, then allocate this size of RAM and use it later for any floppy selected by user. sha256 = 2f8bb18c1606d437de49e585769f100c085234de29d8520e2dc74d25b7f7645a
Thanks, see my comments below.
[...]
diff --git a/src/block.h b/src/block.h index f64e880..aaa236f 100644 --- a/src/block.h +++ b/src/block.h @@ -2,7 +2,7 @@ #define __BLOCK_H
#include "types.h" // u32
+#include "romfile.h" // struct romfile_s
/****************************************************************
- Disk command request
@@ -48,6 +48,7 @@ struct drive_s { struct drive_s { u8 type; // Driver type (DTYPE_*) u8 floppy_type; // Type of floppy (only for floppy drives).
- struct romfile_s *floppy_file; // Floppy file (only for virtual floppies). struct chs_s lchs; // Logical CHS u64 sectors; // Total sectors count u32 cntl_id; // Unique id for a given driver type.
Driver specific fields should not be added to drive_s - the code should use the container_of() trick to allocate driver specific fields. (Create and allocate a custom driver struct that contains a 'struct drive_s' and when called with a drive_s use container_of() to get a pointer back to that main struct - for an example, take a look at what src/hw/usb-msc.c does.)
diff --git a/src/boot.c b/src/boot.c index 9f82f3c..79f1e7d 100644 --- a/src/boot.c +++ b/src/boot.c @@ -584,7 +584,7 @@ bcv_prepboot(void) break; case IPL_TYPE_FLOPPY: map_floppy_drive(pos->drive);
add_bev(IPL_TYPE_FLOPPY, 0);
add_bev(IPL_TYPE_FLOPPY, (u32)pos->drive); break; case IPL_TYPE_HARDDISK: map_hd_drive(pos->drive);
@@ -733,6 +733,12 @@ do_boot(int seq_nr) static void do_boot(int seq_nr) {
- int ret;
- void *pos;
- struct romfile_s *file;
- struct drive_s *drive;
- if (! CONFIG_BOOT) panic("Boot support not compiled in.\n");
@@ -744,6 +750,16 @@ do_boot(int seq_nr) switch (ie->type) { case IPL_TYPE_FLOPPY: printf("Booting from Floppy...\n");
drive = (struct drive_s *)ie->vector;
file = drive->floppy_file;
// File is NULL if a floppy is physical.
if (file) {
// Copy virtual floppy image into ram.
pos = (void *)drive->cntl_id;
ret = file->copy(file, pos, file->size);
if (ret < 0)
break;
}
Similarly, we shouldn't add driver specific code into the boot phase. A better place to do this would be during the BCV mapping phase (eg, bcv_prepboot() ). The idea is to do the work after the boot menu, but before the boot phase. Ideally the code would detect the driver wants a callback and then call driver specific code that resides in src/hw/ramdisk.c.
-Kevin