Re: panic during boot of 5.7 in de(4) running in Hyper-V
On Tue, Jun 23, 2015 at 09:08:25PM -0600, Theo de Raadt wrote: > > I looked into this last year but lost interest. It seems like the DMA buffer > > is being placed past the UVM constraint for DMA ( eg > 4GB). > > A configuration buffer is in the softc. It should be allocated to be > dma-reachable. > > This driver is quite ugly. Maybe the following diff works? > It fixes the issue for me, with two changes below, otherwise OK. But I still don't get any traffic with de(4) on Hyper-V here ... or just once in a while with dhclient but this seems to be a different issue. Reyk > Index: if_de.c > === > RCS file: /cvs/src/sys/dev/pci/if_de.c,v > retrieving revision 1.120 > diff -u -p -u -r1.120 if_de.c > --- if_de.c 15 May 2015 11:36:30 - 1.120 > +++ if_de.c 24 Jun 2015 00:05:05 - > @@ -49,6 +49,7 @@ > #include > #include > #include > +#include > > #include > #include > @@ -2907,7 +2908,7 @@ tulip_addr_filter(tulip_softc_t * const >* go into hash perfect mode (512 bit multicast >* hash and one perfect hardware). >*/ > - bzero(sc->tulip_setupdata, sizeof(sc->tulip_setupdata)); > + bzero(sc->tulip_setupdata, TULIP_SETUP); > if (ac->ac_multirangecnt > 0) { > sc->tulip_flags |= TULIP_ALLMULTI; > sc->tulip_flags &= ~(TULIP_WANTHASHONLY|TULIP_WANTHASHPERFECT); > @@ -4085,8 +4086,7 @@ tulip_txput_setup(tulip_softc_t * const > sc->tulip_if.if_start = tulip_ifstart; > return; > } > -bcopy(sc->tulip_setupdata, sc->tulip_setupbuf, > - sizeof(sc->tulip_setupbuf)); > +bcopy(sc->tulip_setupdata, sc->tulip_setupbuf, TULIP_SETUP); > /* > * Clear WANTSETUP and set DOINGSETUP. Set know that WANTSETUP is > * set and DOINGSETUP is clear doing an XOR of the two will DTRT. > @@ -4357,16 +4357,17 @@ tulip_busdma_init(tulip_softc_t * const > { > int error = 0; > > +sc->tulip_setupbuf = dma_alloc(TULIP_SETUP, PR_WAITOK); > +sc->tulip_setupdata = malloc(TULIP_SETUP, M_DEVBUF, M_WAITOK); > + > /* > * Allocate dmamap for setup descriptor > */ > error = bus_dmamap_create(sc->tulip_dmatag, sizeof(sc->tulip_setupbuf), > 2, Here is a missing TULIP_SETUP, it should be: error = bus_dmamap_create(sc->tulip_dmatag, TULIP_SETUP, 2, TULIP_SETUP, 0, BUS_DMA_NOWAIT, &sc->tulip_setupmap); > - sizeof(sc->tulip_setupbuf), 0, BUS_DMA_NOWAIT, > - &sc->tulip_setupmap); > + TULIP_SETUP, 0, BUS_DMA_NOWAIT, &sc->tulip_setupmap); > if (error == 0) { > error = bus_dmamap_load(sc->tulip_dmatag, sc->tulip_setupmap, > - sc->tulip_setupbuf, sizeof(sc->tulip_setupbuf), > - NULL, BUS_DMA_NOWAIT); > + sc->tulip_setupbuf, TULIP_SETUP, NULL, BUS_DMA_NOWAIT); > if (error) > bus_dmamap_destroy(sc->tulip_dmatag, sc->tulip_setupmap); > } > Index: if_devar.h > === > RCS file: /cvs/src/sys/dev/pci/if_devar.h,v > retrieving revision 1.33 > diff -u -p -u -r1.33 if_devar.h > --- if_devar.h10 Feb 2015 03:51:58 - 1.33 > +++ if_devar.h24 Jun 2015 00:04:36 - > @@ -600,8 +600,10 @@ struct _tulip_softc_t { > * one is the one being sent while the other is the one being > * filled. > */ > -u_int32_t tulip_setupbuf[192/sizeof(u_int32_t)]; > -u_int32_t tulip_setupdata[192/sizeof(u_int32_t)]; > +#define TULIP_SETUP (192 / sizeof(u_int32_t)) As mentioned in another mail, this should be changed to #define TULIP_SETUP 192 > +u_int32_t *tulip_setupbuf; > +u_int32_t *tulip_setupdata; > + > char tulip_boardid[16]; /* buffer for board ID */ > u_int8_t tulip_rombuf[128]; > struct device *tulip_pci_busno; /* needed for multiport boards */
Re: panic during boot of 5.7 in de(4) running in Hyper-V
On Tue, Jun 23, 2015 at 09:08:25PM -0600, Theo de Raadt wrote: > -bcopy(sc->tulip_setupdata, sc->tulip_setupbuf, > - sizeof(sc->tulip_setupbuf)); > +bcopy(sc->tulip_setupdata, sc->tulip_setupbuf, TULIP_SETUP); > +sc->tulip_setupbuf = dma_alloc(TULIP_SETUP, PR_WAITOK); > +sc->tulip_setupdata = malloc(TULIP_SETUP, M_DEVBUF, M_WAITOK); > -u_int32_t tulip_setupbuf[192/sizeof(u_int32_t)]; > -u_int32_t tulip_setupdata[192/sizeof(u_int32_t)]; > +#define TULIP_SETUP (192 / sizeof(u_int32_t)) FWIW, change that to: +#define TULIP_SETUP192 > +u_int32_t *tulip_setupbuf; > +u_int32_t *tulip_setupdata;
Re: panic during boot of 5.7 in de(4) running in Hyper-V
> I looked into this last year but lost interest. It seems like the DMA buffer > is being placed past the UVM constraint for DMA ( eg > 4GB). A configuration buffer is in the softc. It should be allocated to be dma-reachable. This driver is quite ugly. Maybe the following diff works? Index: if_de.c === RCS file: /cvs/src/sys/dev/pci/if_de.c,v retrieving revision 1.120 diff -u -p -u -r1.120 if_de.c --- if_de.c 15 May 2015 11:36:30 - 1.120 +++ if_de.c 24 Jun 2015 00:05:05 - @@ -49,6 +49,7 @@ #include #include #include +#include #include #include @@ -2907,7 +2908,7 @@ tulip_addr_filter(tulip_softc_t * const * go into hash perfect mode (512 bit multicast * hash and one perfect hardware). */ - bzero(sc->tulip_setupdata, sizeof(sc->tulip_setupdata)); + bzero(sc->tulip_setupdata, TULIP_SETUP); if (ac->ac_multirangecnt > 0) { sc->tulip_flags |= TULIP_ALLMULTI; sc->tulip_flags &= ~(TULIP_WANTHASHONLY|TULIP_WANTHASHPERFECT); @@ -4085,8 +4086,7 @@ tulip_txput_setup(tulip_softc_t * const sc->tulip_if.if_start = tulip_ifstart; return; } -bcopy(sc->tulip_setupdata, sc->tulip_setupbuf, - sizeof(sc->tulip_setupbuf)); +bcopy(sc->tulip_setupdata, sc->tulip_setupbuf, TULIP_SETUP); /* * Clear WANTSETUP and set DOINGSETUP. Set know that WANTSETUP is * set and DOINGSETUP is clear doing an XOR of the two will DTRT. @@ -4357,16 +4357,17 @@ tulip_busdma_init(tulip_softc_t * const { int error = 0; +sc->tulip_setupbuf = dma_alloc(TULIP_SETUP, PR_WAITOK); +sc->tulip_setupdata = malloc(TULIP_SETUP, M_DEVBUF, M_WAITOK); + /* * Allocate dmamap for setup descriptor */ error = bus_dmamap_create(sc->tulip_dmatag, sizeof(sc->tulip_setupbuf), 2, - sizeof(sc->tulip_setupbuf), 0, BUS_DMA_NOWAIT, - &sc->tulip_setupmap); + TULIP_SETUP, 0, BUS_DMA_NOWAIT, &sc->tulip_setupmap); if (error == 0) { error = bus_dmamap_load(sc->tulip_dmatag, sc->tulip_setupmap, - sc->tulip_setupbuf, sizeof(sc->tulip_setupbuf), - NULL, BUS_DMA_NOWAIT); + sc->tulip_setupbuf, TULIP_SETUP, NULL, BUS_DMA_NOWAIT); if (error) bus_dmamap_destroy(sc->tulip_dmatag, sc->tulip_setupmap); } Index: if_devar.h === RCS file: /cvs/src/sys/dev/pci/if_devar.h,v retrieving revision 1.33 diff -u -p -u -r1.33 if_devar.h --- if_devar.h 10 Feb 2015 03:51:58 - 1.33 +++ if_devar.h 24 Jun 2015 00:04:36 - @@ -600,8 +600,10 @@ struct _tulip_softc_t { * one is the one being sent while the other is the one being * filled. */ -u_int32_t tulip_setupbuf[192/sizeof(u_int32_t)]; -u_int32_t tulip_setupdata[192/sizeof(u_int32_t)]; +#define TULIP_SETUP(192 / sizeof(u_int32_t)) +u_int32_t *tulip_setupbuf; +u_int32_t *tulip_setupdata; + char tulip_boardid[16];/* buffer for board ID */ u_int8_t tulip_rombuf[128]; struct device *tulip_pci_busno;/* needed for multiport boards */
Re: panic during boot of 5.7 in de(4) running in Hyper-V
On Tue, Jun 23, 2015 at 02:57:51PM -0600, Tom Schutter wrote: > I installed 5.7 from > http://ftp3.usa.openbsd.org/pub/OpenBSD/5.7/amd64/install57.iso > in a Windows Server 2012 R2 Hyper-V VM using the "Legacy Network > Adapter". I always get a kernel panic in the de(4) driver during boot. > If I remove the legacy NIC from the VM config, then I successfully > boot, but obviously with no network access. I looked into this last year but lost interest. It seems like the DMA buffer is being placed past the UVM constraint for DMA ( eg > 4GB). I'm not sure why that's happening, I only spent a day or so looking at it before I got bored and moved on to something else. A side note - the same config on hyperV seems to work on i386, but I noticed some strange clock skewing using that config so I gave up on that also. Another side note - disabling de(4) in config and letting the kernel fall back to dc(4) gets past this particular panic but doesn't allow any traffic to pass. -ml > > What additional information can I provide to help with diagnosis and > create a proper bug report? > > >> OpenBSD/amd64 BOOT 3.28 > ... > wsdisplay0 at vga1 mux 1: console (80x25, vt100 emulation) > wsdisplay0: screen 1-5 added (80x25, vt100 emulation) > de0 at pci0 dev 10 function 0 "DEC 21140" rev 0x20panic: Non dma-reachable > buffer at curaddr 0x107762b70(raw) > Stopped at Debugger+0x9: leave > Debugger() at Debugger+0x9 > panic() at panic+0xfe > _bus_dmamap_load_buffer() at _bus_dmamap_load_buffer+0x1b6 > _bus_dmamap_load() at _bus_dmamap_load+0x7f > tulip_busdma_init() at tulip_busdma_init+0xa0 > tulip_attach() at tulip_attach+0x2a4 > config_attach() at config_attach+0x1bc > pci_probe_device() at pci_probe_device+0x467 > pci_enumerate_bus() at pci_enumerate_bus+0xe9 > config_attach() at config_attach+0x1bc > end trace frame: 0x81a28e60, count: 0 > RUN AT LEAST 'trace' AND 'ps' AND INCLUDE OUTPUT WHEN REPORTING THIS PANIC! > DO NOT EVEN BOTHER REPORTING THIS WITHOUT INCLUDING THAT INFORMATION! > ddb> trace > Debugger() at Debugger+0x9 > panic() at panic+0xfe > _bus_dmamap_load_buffer() at _bus_dmamap_load_buffer+0x1b6 > _bus_dmamap_load() at _bus_dmamap_load+0x7f > tulip_busdma_init() at tulip_busdma_init+0xa0 > tulip_attach() at tulip_attach+0x2a4 > config_attach() at config_attach+0x1bc > pci_probe_device() at pci_probe_device+0x467 > pci_enumerate_bus() at pci_enumerate_bus+0xe9 > config_attach() at config_attach+0x1bc > cpu_configure() at cpu_configure+0x1b > main() at main+0x3df > end trace frame: 0x0, count: -14 > ddb> ps >PID PPID PGRPUID S FLAGS WAIT COMMAND > *0 -1 0 0 7 0x10200 swapper > > -- > Tom Schutter
panic during boot of 5.7 in de(4) running in Hyper-V
I installed 5.7 from http://ftp3.usa.openbsd.org/pub/OpenBSD/5.7/amd64/install57.iso in a Windows Server 2012 R2 Hyper-V VM using the "Legacy Network Adapter". I always get a kernel panic in the de(4) driver during boot. If I remove the legacy NIC from the VM config, then I successfully boot, but obviously with no network access. What additional information can I provide to help with diagnosis and create a proper bug report? >> OpenBSD/amd64 BOOT 3.28 ... wsdisplay0 at vga1 mux 1: console (80x25, vt100 emulation) wsdisplay0: screen 1-5 added (80x25, vt100 emulation) de0 at pci0 dev 10 function 0 "DEC 21140" rev 0x20panic: Non dma-reachable buffer at curaddr 0x107762b70(raw) Stopped at Debugger+0x9: leave Debugger() at Debugger+0x9 panic() at panic+0xfe _bus_dmamap_load_buffer() at _bus_dmamap_load_buffer+0x1b6 _bus_dmamap_load() at _bus_dmamap_load+0x7f tulip_busdma_init() at tulip_busdma_init+0xa0 tulip_attach() at tulip_attach+0x2a4 config_attach() at config_attach+0x1bc pci_probe_device() at pci_probe_device+0x467 pci_enumerate_bus() at pci_enumerate_bus+0xe9 config_attach() at config_attach+0x1bc end trace frame: 0x81a28e60, count: 0 RUN AT LEAST 'trace' AND 'ps' AND INCLUDE OUTPUT WHEN REPORTING THIS PANIC! DO NOT EVEN BOTHER REPORTING THIS WITHOUT INCLUDING THAT INFORMATION! ddb> trace Debugger() at Debugger+0x9 panic() at panic+0xfe _bus_dmamap_load_buffer() at _bus_dmamap_load_buffer+0x1b6 _bus_dmamap_load() at _bus_dmamap_load+0x7f tulip_busdma_init() at tulip_busdma_init+0xa0 tulip_attach() at tulip_attach+0x2a4 config_attach() at config_attach+0x1bc pci_probe_device() at pci_probe_device+0x467 pci_enumerate_bus() at pci_enumerate_bus+0xe9 config_attach() at config_attach+0x1bc cpu_configure() at cpu_configure+0x1b main() at main+0x3df end trace frame: 0x0, count: -14 ddb> ps PID PPID PGRPUID S FLAGS WAIT COMMAND *0 -1 0 0 7 0x10200 swapper -- Tom Schutter