[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] Re: ata devices on emulated amd64 on qemu
From: |
Mars G. Miro |
Subject: |
[Qemu-devel] Re: ata devices on emulated amd64 on qemu |
Date: |
Tue, 2 Aug 2005 14:53:22 +0800 |
On 8/2/05, Juergen Lock <address@hidden> wrote:
> On Mon, Aug 01, 2005 at 05:30:47PM +0800, Mars G. Miro wrote:
> > On 8/1/05, Mars G. Miro <address@hidden> wrote:
> > > On 8/1/05, Mars G. Miro <address@hidden> wrote:
> > > > On 7/30/05, Mars G. Miro <address@hidden> wrote:
> > > > > On 7/30/05, Jung-uk Kim <address@hidden> wrote:
> > > > > > Okay. I finally found a fix. It was actually quite simple.
> Newer
> > > > > > FreeBSD and Linux ATA drivers check whether the PCI ATA controller
> is
> > >
> > > > > > in legacy ATA mode (aka PATA mode). The test failed and it was
> > > > > > treated like a SATA controller. Of course, IRQ failed to map. ;-)
>
> > > > > > Try the attached patch. Tested with FreeBSD/amd64 6.0-BETA1 guest
> on
> > >
> > > > > > FreeBSD/amd64 host.
> > > > > >
> > > > >
> > > > >
> > > > > You rock dude! This patch fixes it. FreeBSD54/amd64 Guest on
> > > > > FreeBSD54/amd64 Host.
> > > > >
> > > > > Any thoughts of including this patch in the ports?
> > > > >
> > > > >
> > > >
> > > >
> > > > Oops. I noticed only now that this time, it's the emulated NE2000 NIC
> > > > that's not detected. This is for a FreeBSD/amd64 guest on
> > > > FreeBSD/amd64 Host.
> > > >
> > >
> > >
> > > Scratch that.
> > >
> > > This is only because there's no ed in the GENERIC kernel for AMD64.
> > >
> >
> > because we dropped support for it?
> >
> > cc -c -O2 -frename-registers -pipe -fno-strict-aliasing -Wall
> > -Wredundant-decls -Wnested-externs -Wstrict-prototypes
> > -Wmissing-prototypes -Wpointer-
> > arith -Winline -Wcast-qual -fformat-extensions -std=c99 -nostdinc
> > -I- -I. -I/usr/src/sys -I/usr/src/sys/contrib/dev/acpica
> > -I/usr/src/sys/contrib/a
> > ltq -I/usr/src/sys/contrib/ipfilter -I/usr/src/sys/contrib/pf
> > -I/usr/src/sys/contrib/dev/ath -I/usr/src/sys/contrib/dev/ath/freebsd
> > -I/usr/src/sys/con
> > trib/ngatm -D_KERNEL -include opt_global.h -fno-common
> > -finline-limit=8000 --param inline-unit-growth=100 --param
> > large-function-growth=1000 -mcmodel
> > =kernel -mno-red-zone -mfpmath=387 -mno-sse -mno-sse2 -mno-mmx
> > -mno-3dnow -msoft-float -fno-asynchronous-unwind-tables
> > -ffreestanding -Werror /usr/
> > src/sys/dev/ed/if_ed.c
> > /usr/src/sys/dev/ed/if_ed.c: In function `ed_probe_WD80x3_generic':
> > /usr/src/sys/dev/ed/if_ed.c:508: warning: implicit declaration of
> > function `kvtop'
> > /usr/src/sys/dev/ed/if_ed.c:508: warning: nested extern declaration of
> `kvtop'
> > /usr/src/sys/dev/ed/if_ed.c:521: warning: nested extern declaration of
> `kvtop'
> > /usr/src/sys/dev/ed/if_ed.c:508: warning: redundant redeclaration of
> 'kvtop'
> > /usr/src/sys/dev/ed/if_ed.c:508: warning: previous implicit
> > declaration of 'kvtop' was here
> > /usr/src/sys/dev/ed/if_ed.c:532: warning: nested extern declaration of
> `kvtop'
> > /usr/src/sys/dev/ed/if_ed.c:508: warning: redundant redeclaration of
> 'kvtop'
> > /usr/src/sys/dev/ed/if_ed.c:508: warning: previous implicit
> > declaration of 'kvtop' was here
> > /usr/src/sys/dev/ed/if_ed.c:539: warning: nested extern declaration of
> `kvtop'
> > /usr/src/sys/dev/ed/if_ed.c:508: warning: redundant redeclaration of
> 'kvtop'
> > /usr/src/sys/dev/ed/if_ed.c:508: warning: previous implicit
> > declaration of 'kvtop' was here
> > /usr/src/sys/dev/ed/if_ed.c:547: warning: nested extern declaration of
> `kvtop'
> > /usr/src/sys/dev/ed/if_ed.c:508: warning: redundant redeclaration of
> 'kvtop'
> > /usr/src/sys/dev/ed/if_ed.c:508: warning: previous implicit
> > declaration of 'kvtop' was here
> > /usr/src/sys/dev/ed/if_ed.c:570: warning: nested extern declaration of
> `kvtop'
> > /usr/src/sys/dev/ed/if_ed.c:508: warning: redundant redeclaration of
> 'kvtop'
> > /usr/src/sys/dev/ed/if_ed.c:508: warning: previous implicit
> > declaration of 'kvtop' was here
> > /usr/src/sys/dev/ed/if_ed.c: In function `ed_probe_3Com':
> > /usr/src/sys/dev/ed/if_ed.c:905: warning: nested extern declaration of
> `kvtop'
> > /usr/src/sys/dev/ed/if_ed.c:508: warning: redundant redeclaration of
> 'kvtop'
> > /usr/src/sys/dev/ed/if_ed.c:508: warning: previous implicit
> > declaration of 'kvtop' was here
> > /usr/src/sys/dev/ed/if_ed.c: In function `ed_probe_SIC':
> > /usr/src/sys/dev/ed/if_ed.c:998: warning: nested extern declaration of
> `kvtop'
> > /usr/src/sys/dev/ed/if_ed.c:508: warning: redundant redeclaration of
> 'kvtop'
> > /usr/src/sys/dev/ed/if_ed.c:508: warning: previous implicit
> > declaration of 'kvtop' was here
> > *** Error code 1
> >
> > ugh :-(
>
> Aha, amd64 doesnt have kvtop anymore. Try the following patch:
> (compiles on i386, it should fix amd64 if you are lucky - as long as
> kvtop is the only problem...)
>
Tried this patch. It does seem to work.
But there are other problems in emulated amd64 --- such as segfaults
here and there --- they seem to occur at random. This is for
{5.4/6.01-Beta} AMD64.
Thanks.
> Index: if_ed.c
> @@ -205,7 +205,7 @@
> int i;
> u_int memsize, maddr;
> u_char iptr, isa16bit, sum, totalsum;
> - u_long conf_maddr, conf_msize, irq, junk;
> + u_long conf_maddr, conf_msize, irq, junk, mphys;
>
> sc->chip_type = ED_CHIP_TYPE_DP8390;
>
> @@ -474,6 +474,7 @@
> return (error);
> }
> sc->mem_start = (caddr_t) rman_get_virtual(sc->mem_res);
> + mphys = rman_get_start(sc->mem_res);
>
> /*
> * allocate one xmit buffer if < 16k, two buffers otherwise
> @@ -505,7 +506,7 @@
> sc->wd_laar_proto = ed_asic_inb(sc, ED_WD_LAAR);
> } else {
> sc->wd_laar_proto = ED_WD_LAAR_L16EN |
> - ((kvtop(sc->mem_start) >> 19) & ED_WD_LAAR_ADDRHI);
> + ((mphys >> 19) & ED_WD_LAAR_ADDRHI);
> }
> /*
> * Enable 16bit access
> @@ -518,7 +519,7 @@
> (sc->type == ED_TYPE_TOSHIBA4) ||
> (sc->type == ED_TYPE_WD8013EBT)) &&
> (sc->chip_type != ED_CHIP_TYPE_WD790)) {
> - sc->wd_laar_proto = (kvtop(sc->mem_start) >> 19) &
> + sc->wd_laar_proto = (mphys >> 19) &
> ED_WD_LAAR_ADDRHI;
> ed_asic_outb(sc, ED_WD_LAAR, sc->wd_laar_proto);
> }
> @@ -530,22 +531,22 @@
> if (sc->chip_type != ED_CHIP_TYPE_WD790) {
> if (ED_FLAGS_GETTYPE(flags) == ED_FLAGS_TOSH_ETHER) {
> ed_asic_outb(sc, ED_WD_MSR + 1,
> - ((kvtop(sc->mem_start) >> 8) & 0xe0) | 4);
> + ((mphys >> 8) & 0xe0) | 4);
> ed_asic_outb(sc, ED_WD_MSR + 2,
> - ((kvtop(sc->mem_start) >> 16) & 0x0f));
> + ((mphys >> 16) & 0x0f));
> ed_asic_outb(sc, ED_WD_MSR,
> ED_WD_MSR_MENB | ED_WD_MSR_POW);
> } else {
> ed_asic_outb(sc, ED_WD_MSR,
> - ((kvtop(sc->mem_start) >> 13) &
> + ((mphys >> 13) &
> ED_WD_MSR_ADDR) | ED_WD_MSR_MENB);
> }
> sc->cr_proto = ED_CR_RD2;
> } else {
> ed_asic_outb(sc, ED_WD_MSR, ED_WD_MSR_MENB);
> ed_asic_outb(sc, ED_WD790_HWR, (ed_asic_inb(sc, ED_WD790_HWR) |
> ED_WD790_HWR_SWH));
> - ed_asic_outb(sc, ED_WD790_RAR, ((kvtop(sc->mem_start) >> 13) &
> 0x0f) |
> - ((kvtop(sc->mem_start) >> 11) & 0x40) |
> + ed_asic_outb(sc, ED_WD790_RAR, ((mphys >> 13) & 0x0f) |
> + ((mphys >> 11) & 0x40) |
> (ed_asic_inb(sc, ED_WD790_RAR) & 0xb0));
> ed_asic_outb(sc, ED_WD790_HWR, (ed_asic_inb(sc, ED_WD790_HWR) &
> ~ED_WD790_HWR_SWH));
> sc->cr_proto = 0;
> @@ -567,7 +568,7 @@
> for (i = 0; i < memsize; ++i) {
> if (sc->mem_start[i]) {
> device_printf(dev, "failed to clear shared memory at
> %jx - check
> configuration\n",
> - (uintmax_t)kvtop(sc->mem_start + i));
> + (uintmax_t)mphys + i);
>
> /*
> * Disable 16 bit access to shared memory
> @@ -902,7 +903,7 @@
> for (i = 0; i < memsize; ++i)
> if (sc->mem_start[i]) {
> device_printf(dev, "failed to clear shared memory at
> %jx - check
> configuration\n",
> - (uintmax_t)kvtop(sc->mem_start + i));
> + (uintmax_t)rman_get_start(sc->mem_res) +
> i);
> return (ENXIO);
> }
> return (0);
> @@ -995,7 +996,7 @@
> if (sc->mem_start[i]) {
> device_printf(dev, "failed to clear shared memory "
> "at %jx - check configuration\n",
> - (uintmax_t)kvtop(sc->mem_start + i));
> + (uintmax_t)rman_get_start(sc->mem_res) + i);
>
> return (ENXIO);
> }
>