All of lore.kernel.org
 help / color / mirror / Atom feed
From: Mark Jonckheere <marc.jonckheere@easynet.be>
To: qemu-devel@nongnu.org
Subject: [Qemu-devel] Better floppy disk support
Date: Tue, 11 May 2004 16:21:33 +0200	[thread overview]
Message-ID: <40A0E16D.6080400@easynet.be> (raw)

I propose some patches for better floppy disk support:

1. To make "tomsrtbt-2.0.103.ElTorito.288.img" bootable.

The first one is in fdc.c. It removes the test in fd_init(), since it
always forces the disk type to 1.44 MB, It is better to give the first
call to fd_revalidate() a chance to decide if it is a 1.44 or 2.88 drive.

2. To make my standalone chntpw-disk bootable (google for bd000607.zip).

Booting from bd000607.img gives a segmentation error. It seems that the
bootcode on this floppy (syslinux-ldlinux) does a word-length (16-bit)
INW at address 0x80 which was translated by function default_ioport_readw()
in a call to default_ioport_readb(NULL, 0x80) and read_page(NULL, 0x81).
The second function (in dma.c) needs a (dma_cont *) pointer as its first
parameter and segfaults when it tries to dereference the NULL-pointer.

To avoid this problem with word-length io-reads to two adjacent io-ports
from different or undefined devices it is best to translate it into two
readb calls each with its own opaque value. The function default_ioport_readw()
is not the most logical place for doing this, it is better to do this
upstream in the function cpu_inw().

I modified cpu_inw() and cpu_outw(), but the same problem could also
happen with cpu_inl() and cpu_outl().

3. To accept "--nics 0" as a legal argument.

Sometimes it can be usefull to install software without ethernet support.
I made a minor modification to accept 0 as a legal value for the argument
--nics. Since the default value remains 1, nothing changes for current usage.

greetings,
Mark.


diffs from cvs sources downloaded at 2004-05-10 11:41 (UTC) start here
---8<-------------------------------------------------------->8---
diff -wurb qemu/hw/fdc.c qemu-patched/hw/fdc.c
--- qemu/hw/fdc.c       Sat May  8 23:01:23 2004
+++ qemu-patched/hw/fdc.c       Mon May 10 18:18:35 2004
@@ -94,9 +94,9 @@
  {
      /* Drive */
      drv->bs = bs;
-    if (bs)
-        drv->drive = FDRIVE_DRV_144;
-    else
+//    if (bs)
+//        drv->drive = FDRIVE_DRV_144;
+//    else
          drv->drive = FDRIVE_DRV_NONE;
      drv->drflags = 0;
      drv->perpendicular = 0;
diff -wurb qemu/vl.c qemu-patched/vl.c
--- qemu/vl.c   Thu Apr 29 00:26:05 2004
+++ qemu-patched/vl.c   Tue May 11 14:49:07 2004
@@ -133,19 +133,19 @@
  #endif
  }

-/* default is to make two byte accesses */
  uint32_t default_ioport_readw(void *opaque, uint32_t address)
  {
-    uint32_t data;
-    data = ioport_read_table[0][address & (MAX_IOPORTS - 1)](opaque, address);
-    data |= ioport_read_table[0][(address + 1) & (MAX_IOPORTS - 1)](opaque, address + 1) << 8;
-    return data;
+#ifdef DEBUG_UNUSED_IOPORT
+    fprintf(stderr, "inw: port=0x%04x\n", address);
+#endif
+    return 0xffff;
  }

  void default_ioport_writew(void *opaque, uint32_t address, uint32_t data)
  {
-    ioport_write_table[0][address & (MAX_IOPORTS - 1)](opaque, address, data & 0xff);
-    ioport_write_table[0][(address + 1) & (MAX_IOPORTS - 1)](opaque, address + 1, (data >> 8) & 0xff);
+#ifdef DEBUG_UNUSED_IOPORT
+    fprintf(stderr, "outw: port=0x%04x data=0x%04x\n", address, data);
+#endif
  }

  uint32_t default_ioport_readl(void *opaque, uint32_t address)
@@ -159,7 +159,7 @@
  void default_ioport_writel(void *opaque, uint32_t address, uint32_t data)
  {
  #ifdef DEBUG_UNUSED_IOPORT
-    fprintf(stderr, "outl: port=0x%04x data=0x%02x\n", address, data);
+    fprintf(stderr, "outl: port=0x%04x data=0x%08x\n", address, data);
  #endif
  }

@@ -279,8 +279,18 @@

  void cpu_outw(CPUState *env, int addr, int val)
  {
+    IOPortWriteFunc *writefunc;
+
      addr &= (MAX_IOPORTS - 1);
-    ioport_write_table[1][addr](ioport_opaque[addr], addr, val);
+    writefunc = ioport_write_table[1][addr];
+    if ( writefunc != default_ioport_writew &&
+            (ioport_write_table[0][addr] == ioport_write_table[0][addr + 1]))
+        writefunc(ioport_opaque[addr], addr, val);
+    else {
+        ioport_write_table[0][addr](ioport_opaque[addr], addr, val & 0xff);
+        ioport_write_table[0][addr + 1](ioport_opaque[addr + 1],
+                addr + 1, (val >> 8 ) & 0xff);
+    }
  }

  void cpu_outl(CPUState *env, int addr, int val)
@@ -297,8 +307,16 @@

  int cpu_inw(CPUState *env, int addr)
  {
+    IOPortReadFunc *readfunc;
+
      addr &= (MAX_IOPORTS - 1);
-    return ioport_read_table[1][addr](ioport_opaque[addr], addr);
+    readfunc = ioport_read_table[1][addr];
+    if ( readfunc != default_ioport_readw &&
+            (ioport_read_table[0][addr] == ioport_read_table[0][addr + 1]))
+        return readfunc(ioport_opaque[addr], addr);
+    else
+        return ioport_read_table[0][addr](ioport_opaque[addr], addr) |
+            (ioport_read_table[0][addr+1](ioport_opaque[addr+1], addr+1) << 8);
  }

  int cpu_inl(CPUState *env, int addr)
@@ -2008,7 +2026,7 @@
                  break;
              case 16:
                  nb_nics = atoi(optarg);
-                if (nb_nics < 1 || nb_nics > MAX_NICS) {
+                if (nb_nics < 0 || nb_nics > MAX_NICS) {
                      fprintf(stderr, "qemu: invalid number of network interfaces\n");
                      exit(1);
                  }
---8<-------------------------------------------------------->8---

             reply	other threads:[~2004-05-11 13:28 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2004-05-11 14:21 Mark Jonckheere [this message]
2004-05-12 20:33 ` [Qemu-devel] Better floppy disk support Fabrice Bellard

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=40A0E16D.6080400@easynet.be \
    --to=marc.jonckheere@easynet.be \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.