This adds a second binary target to compile in the rump USB stack instead of SATA/IDE using conditional ifdefs to mostly share the code between the two translators.
This can be tested by running qemu with a USB3 controller as follows: -drive if=none,id=usbstick,format=raw,file=/path/to/disk.img \ -device qemu-xhci \ -device usb-storage,drive=usbstick \ NB: /path/to/disk.img can be a block device on the host. Then call grub module rumpusbdisk.static instead of rumpdisk.static and pass ' root=part:X:device:sd0 noide' as gnumach parameters, where X is the partition number of / within the disk/image. Caveats: netdde seems to exhibit a bug when running 'ifdown /dev/eth0' simultaneously to running the rumpusbdisk translator, due to the two devices sharing the same IRQ. --- rumpdisk/Makefile | 25 +++++++++++++++++++------ rumpdisk/block-rump.c | 14 ++++++++++++-- rumpdisk/main.c | 8 +++++++- 3 files changed, 38 insertions(+), 9 deletions(-) diff --git a/rumpdisk/Makefile b/rumpdisk/Makefile index b59aaf9a..0b496963 100644 --- a/rumpdisk/Makefile +++ b/rumpdisk/Makefile @@ -15,7 +15,9 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -RUMPLIBS=rump rumpuser rumpdev rumpdev_disk rumpdev_pci rumpvfs rumpdev_ahcisata rumpdev_piixide rumpdev_ata +RUMPLIBS=rump rumpuser rumpdev rumpdev_disk rumpdev_pci rumpvfs +RUMPSATA=rumpdev_ahcisata rumpdev_piixide rumpdev_ata +RUMPUSB=rumpdev_usb rumpdev_pci_usbhc rumpdev_umass RUMPEXTRA=rumpdev_scsipi # If we have a configured tree, include the configuration so that we @@ -29,14 +31,25 @@ RUMPLIBS += rumpvfs_nofifofs endif dir := rumpdisk -makemode := server +makemode := servers SRCS = main.c block-rump.c LCLHDRS = block-rump.h ioccom-rump.h -target = rumpdisk -OBJS = $(SRCS:.c=.o) +targets = rumpdisk rumpusbdisk HURDLIBS = machdev ports trivfs shouldbeinlibc iohelp ihash fshelp -LDLIBS += -lpthread -lpciaccess -ldl -LDLIBS += -Wl,--whole-archive $(RUMPLIBS:%=-l%_pic) -Wl,--no-whole-archive $(RUMPEXTRA:%=-l%_pic) +LDLIBS += -lpthread -lpciaccess -ldl $(RUMPEXTRA:%=-l%_pic) \ + -Wl,--whole-archive $(RUMPLIBS:%=-l%_pic) -Wl,--no-whole-archive + +%.disk.o: %.c + $(CC) $(CFLAGS) $(CPPFLAGS) -D_RUMP_SATA -c $< -o $@ +rumpdisk-OBJS = $(SRCS:.c=.disk.o) +rumpdisk-LDLIBS += -Wl,--whole-archive $(RUMPSATA:%=-l%_pic) -Wl,--no-whole-archive +rumpdisk rumpdisk.static: $(rumpdisk-OBJS) $(HURDLIBS:%=-l%) + +%.usb.o: %.c + $(CC) $(CFLAGS) $(CPPFLAGS) -c $< -o $@ +rumpusbdisk-OBJS = $(SRCS:.c=.usb.o) +rumpusbdisk-LDLIBS += -Wl,--whole-archive $(RUMPUSB:%=-l%_pic) -Wl,--no-whole-archive +rumpusbdisk rumpusbdisk.static: $(rumpusbdisk-OBJS) $(HURDLIBS:%=-l%) include ../Makeconf diff --git a/rumpdisk/block-rump.c b/rumpdisk/block-rump.c index 5ceb14ae..a29ebe73 100644 --- a/rumpdisk/block-rump.c +++ b/rumpdisk/block-rump.c @@ -48,6 +48,12 @@ #define DISK_NAME_LEN 32 #define MAX_DISK_DEV 2 +#ifdef _RUMP_SATA +#define RUMP_TYPE_STRING "rump SATA/IDE" +#else +#define RUMP_TYPE_STRING "rump USB" +#endif + static bool disabled; static mach_port_t master_host; @@ -107,7 +113,11 @@ is_disk_device (const char *name) { const char *dev; const char *allowed_devs[MAX_DISK_DEV] = { +#ifdef _RUMP_SATA "wd", +#else + "sd", +#endif "cd" }; uint8_t i; @@ -158,7 +168,7 @@ rumpdisk_device_init (void) { device_close (device); mach_port_deallocate (mach_task_self (), device); - fprintf(stderr, "Kernel is already driving an IDE device, skipping probing disks\n"); + fprintf(stderr, "Kernel is already driving an IDE device, skipping probing " RUMP_TYPE_STRING " disks\n"); fflush(stderr); disabled = 1; return; @@ -172,7 +182,7 @@ rumpdisk_device_init (void) { device_close (device); mach_port_deallocate (mach_task_self (), device); - fprintf(stderr, "Kernel is already driving a SATA device, skipping probing disks\n"); + fprintf(stderr, "Kernel is already driving a SATA device, skipping probing " RUMP_TYPE_STRING " disks\n"); fflush(stderr); disabled = 1; return; diff --git a/rumpdisk/main.c b/rumpdisk/main.c index 64065c6c..ca166274 100644 --- a/rumpdisk/main.c +++ b/rumpdisk/main.c @@ -32,6 +32,12 @@ #include <pthread.h> #include <mach.h> +#ifdef _RUMP_SATA +#define RUMPNAME "rumpdisk" +#else +#define RUMPNAME "rumpusbdisk" +#endif + mach_port_t bootstrap_resume_task = MACH_PORT_NULL; static const struct argp_option options[] = { @@ -128,7 +134,7 @@ main (int argc, char **argv) } rump_register_block (); - machdev_trivfs_init (argc, argv, bootstrap_resume_task, "rumpdisk", "/dev/rumpdisk", &bootstrap); + machdev_trivfs_init (argc, argv, bootstrap_resume_task, RUMPNAME, "/dev/" RUMPNAME, &bootstrap); /* Make sure we will not swap out, in case we drive the disk used for swapping. */ -- 2.40.1