Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 1 Aug 2005 23:54:10 +0200
From:      Juergen Lock <qemu-l@jelal.kn-bremen.de>
To:        "Mars G. Miro" <marsgmiro@gmail.com>
Cc:        freebsd-emulation@freebsd.org, qemu-devel@nongnu.org, Jung-uk Kim <jkim@freebsd.org>
Subject:   Re: ata devices on emulated amd64 on qemu
Message-ID:  <20050801215410.GA10633@saturn.kn-bremen.de>
In-Reply-To: <28edec3c0508010230226b4ae@mail.gmail.com>
References:  <28edec3c0507290000415a350d@mail.gmail.com> <200507291540.52889.jkim@niksun.com> <200507291647.49230.jkim@niksun.com> <200507292022.38135.jkim@FreeBSD.org> <28edec3c050730045765b5262b@mail.gmail.com> <28edec3c05073119576445ec92@mail.gmail.com> <28edec3c050731203069f7c4a8@mail.gmail.com> <28edec3c0508010230226b4ae@mail.gmail.com>

next in thread | previous in thread | raw e-mail | index | archive | help
On Mon, Aug 01, 2005 at 05:30:47PM +0800, Mars G. Miro wrote:
> On 8/1/05, Mars G. Miro <marsgmiro@gmail.com> wrote:
> > On 8/1/05, Mars G. Miro <marsgmiro@gmail.com> wrote:
> > > On 7/30/05, Mars G. Miro <marsgmiro@gmail.com> wrote:
> > > > On 7/30/05, Jung-uk Kim <jkim@freebsd.org> 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...)

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);
 		}



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20050801215410.GA10633>