From: "Michael S. Tsirkin" <mst@redhat.com>
To: Blue Swirl <blauwirbel@gmail.com>
Cc: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>,
qemu-devel@nongnu.org, Anthony Liguori <anthony@codemonkey.ws>
Subject: Re: [Qemu-devel] [PATCH] pci: fix bridge IO/BASE
Date: Sun, 4 Mar 2012 14:21:00 +0200 [thread overview]
Message-ID: <20120304122100.GA11207@redhat.com> (raw)
In-Reply-To: <CAAu8pHuyD_KmZGV8GF1AJhaurdATcC3s24RTnxWa7iCCszcbDw@mail.gmail.com>
On Sun, Mar 04, 2012 at 10:27:24AM +0000, Blue Swirl wrote:
> On Sun, Mar 4, 2012 at 09:46, Michael S. Tsirkin <mst@redhat.com> wrote:
> > commit 5caef97a16010f818ea8b950e2ee24ba876643ad introduced
> > a regression: we do not make IO base/limit upper 16
> > bit registers writeable, so we should report a 16 bit
> > IO range type, not a 32 bit one.
> > Note that PCI_PREF_RANGE_TYPE_32 is 0x0, but PCI_IO_RANGE_TYPE_32 is 0x1.
> >
> > In particular, this broke sparc64.
> >
> > Note: this just reverts to behaviour prior to the patch.
> > Making PCI_IO_BASE_UPPER16 and PCI_IO_LIMIT_UPPER16
> > registers writeable should, and seems to, work just as well, but
> > as no system seems to actually be interested in 32 bit IO,
> > let's not make unnecessary changes.
> >
> > Reported-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
> > Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
> >
> > Mark, can you confirm that this fixes the bug for you?
>
> No, running
> qemu-system-sparc64 -serial stdio
> still shows black screen and the following on console:
> OpenBIOS for Sparc64
> Unhandled Exception 0x0000000000000032
> PC = 0x00000000ffd19e18 NPC = 0x00000000ffd19e1c
> Stopping execution
The weird thing is the range type does not seem to be accessed
at all. So I guessed there's some memory corruption here.
Running valgrind shows this:
--11114-- WARNING: unhandled syscall: 340
--11114-- You may be able to write your own handler.
--11114-- Read the file README_MISSING_SYSCALL_OR_IOCTL.
--11114-- Nevertheless we consider this a bug. Please report
--11114-- it at http://valgrind.org/support/bug_reports.html.
==11114== Invalid read of size 4
==11114== at 0x2A68C0: pci_apb_init (apb_pci.c:350)
==11114== by 0x2F7A84: sun4uv_init (sun4u.c:779)
==11114== by 0x13D716: main (vl.c:3397)
==11114== Address 0x156c7d30 is 0 bytes after a block of size 64
alloc'd
==11114== at 0x557DD69: malloc (vg_replace_malloc.c:236)
==11114== by 0x225F56: malloc_and_trace (vl.c:2156)
==11114== by 0x584AFEC: ??? (in /lib/libglib-2.0.so.0.2800.8)
==11114== by 0x584B528: g_malloc0 (in /lib/libglib-2.0.so.0.2800.8)
==11114== by 0x19C50C: qemu_allocate_irqs (irq.c:47)
==11114== by 0x2F7A4C: sun4uv_init (sun4u.c:778)
==11114== by 0x13D716: main (vl.c:3397)
==11114==
apb: here
==11114== Warning: client switching stacks? SP change: 0xfec42cbc -->
0x16894008
==11114== to suppress, use: --max-stackframe=398791500 or
greater
==11114== Warning: client switching stacks? SP change: 0x16893fa0 -->
0xfec42cc0
==11114== to suppress, use: --max-stackframe=398791392 or
greater
==11114== Warning: client switching stacks? SP change: 0xfec42fe0 -->
0x16893fd0
==11114== to suppress, use: --max-stackframe=398790640 or
greater
==11114== further instances of this message will not be shown.
QEMU 1.0.50 monitor - type 'help' for more information
(qemu) ==11114== Thread 2:
==11114== Conditional jump or move depends on uninitialised value(s)
==11114== at 0x2A8351: compute_all_sub (cc_helper.c:37)
==11114== by 0x2A8782: helper_compute_psr (cc_helper.c:470)
==11114== by 0x9AD9A19: ???
==11114==
==11114== Conditional jump or move depends on uninitialised value(s)
==11114== at 0x2A827C: compute_all_sub_xcc (cc_helper.c:60)
==11114== by 0x2A8795: helper_compute_psr (cc_helper.c:473)
==11114== by 0x9AD9A19: ???
==11114==
==11114== Conditional jump or move depends on uninitialised value(s)
==11114== at 0x2A8296: compute_all_sub_xcc (cc_helper.c:295)
==11114== by 0x2A8795: helper_compute_psr (cc_helper.c:473)
==11114== by 0x9AD9A19: ???
==11114==
Is the above a problem?
> This unassigned memory exception is triggered because CMD646 IDE I/O
> registers are not accessible:
>
> (qemu) info pci
> Bus 0, device 0, function 0:
> Host bridge: PCI device 108e:a000
> id ""
> Bus 0, device 1, function 0:
> PCI bridge: PCI device 108e:5000
> BUS 0.
> secondary bus 1.
> subordinate bus 1.
> IO range [0x0000, 0x0fff]
> memory range [0x00000000, 0x000fffff]
> prefetchable memory range [0x00000000, 0x000fffff]
> id ""
> Bus 0, device 1, function 1:
> PCI bridge: PCI device 108e:5000
> BUS 0.
> secondary bus 2.
> subordinate bus 2.
> IO range [0x0000, 0x0fff]
> memory range [0x00000000, 0x000fffff]
> prefetchable memory range [0x00000000, 0x000fffff]
> id ""
> Bus 0, device 2, function 0:
> VGA controller: PCI device 1234:1111
> BAR0: 32 bit prefetchable memory at 0x00800000 [0x00ffffff].
> BAR6: 32 bit memory at 0x01000000 [0x0100ffff].
> id ""
> Bus 0, device 3, function 0:
> Bridge: PCI device 108e:1000
> BAR0: 32 bit memory at 0x02000000 [0x02ffffff].
> BAR1: 32 bit memory at 0x03000000 [0x037fffff].
> id ""
> Bus 0, device 4, function 0:
> Ethernet controller: PCI device 10ec:8029
> IRQ 0.
> BAR0: I/O at 0xffffffffffffffff [0x00fe].
> BAR6: 32 bit memory at 0x03800000 [0x0380ffff].
> id ""
> Bus 0, device 5, function 0:
> IDE controller: PCI device 1095:0646
> IRQ 1.
> BAR0: I/O at 0xffffffffffffffff [0x0006].
> BAR1: I/O at 0xffffffffffffffff [0x0002].
> BAR2: I/O at 0xffffffffffffffff [0x0006].
> BAR3: I/O at 0xffffffffffffffff [0x0002].
> BAR4: I/O at 0xffffffffffffffff [0x000e].
> id ""
> (qemu) info mtree
> memory
> 0000000000000000-7ffffffffffffffe (prio 0, RW): system
> 0000000000000000-0000000007ffffff (prio 0, RW): sun4u.ram
> 000001fe00000000-000001fe0000ffff (prio 0, RW): apb-config
> 000001fe01000000-000001fe01ffffff (prio 0, RW): apb-pci-config
> 000001fe02000000-000001fe0200ffff (prio 0, RW): apb-pci-ioport
> 000001ff00000000-000001ffffffffff (prio 0, RW): pci-mmio
> 000001ff00000000-000001ff000fffff (prio 1, RW): alias
> pci_bridge_mem @pci_bridge_pci 0000000000000000-00000000000fffff
> 000001ff00000000-000001ff000fffff (prio 1, RW): alias
> pci_bridge_pref_mem @pci_bridge_pci 0000000000000000-00000000000fffff
> 000001ff00000000-000001ff000fffff (prio 1, RW): alias
> pci_bridge_mem @pci_bridge_pci 0000000000000000-00000000000fffff
> 000001ff00000000-000001ff000fffff (prio 1, RW): alias
> pci_bridge_pref_mem @pci_bridge_pci 0000000000000000-00000000000fffff
> 000001ff000a0000-000001ff000affff (prio 2, RW): alias vga.chain4
> @vga.vram 0000000000000000-000000000000ffff
> 000001ff000a0000-000001ff000bffff (prio 1, RW): vga-lowmem
> 000001ff00800000-000001ff00ffffff (prio 1, RW): vga.vram
> 000001ff01000000-000001ff0100ffff (prio 1, RW): vga.rom
> 000001ff02000000-000001ff02ffffff (prio 1, RW): isa-mmio
> 000001ff03000000-000001ff037fffff (prio 1, RW): isa-mmio
> 000001ff03800000-000001ff0380ffff (prio 1, RW): ne2000.rom
> 000001fff0000000-000001fff03fffff (prio 0, R-): sun4u.prom
> pci_bridge_pci
> 0000000000000000-7ffffffffffffffe (prio 0, RW): pci_bridge_pci
> pci_bridge_pci
> 0000000000000000-7ffffffffffffffe (prio 0, RW): pci_bridge_pci
> vga.vram
> 0000000000800000-0000000000ffffff (prio 1, RW): vga.vram
> I/O
> 0000000000000000-000000000000ffff (prio 0, RW): io
> 0000000000000000-0000000000000fff (prio 1, RW): alias pci_bridge_io
> @pci_bridge_io 0000000000000000-0000000000000fff
> 0000000000000000-0000000000000fff (prio 1, RW): alias pci_bridge_io
> @pci_bridge_io 0000000000000000-0000000000000fff
> 0000000000000060-0000000000000060 (prio 0, RW): i8042-data
> 0000000000000064-0000000000000064 (prio 0, RW): i8042-cmd
> 0000000000000074-0000000000000077 (prio 0, RW): m48t59
> 00000000000001ce-00000000000001ce (prio 0, RW): alias vbe @vbe
> 00000000000001ce-00000000000001ce
> 00000000000001d0-00000000000001d0 (prio 0, RW): alias vbe @vbe
> 00000000000001d0-00000000000001d0
> 0000000000000378-000000000000037f (prio 0, RW): alias parallel
> @parallel 0000000000000378-000000000000037f
> 00000000000003b4-00000000000003b5 (prio 0, RW): alias vga @vga
> 00000000000003b4-00000000000003b5
> 00000000000003ba-00000000000003ba (prio 0, RW): alias vga @vga
> 00000000000003ba-00000000000003ba
> 00000000000003c0-00000000000003cf (prio 0, RW): alias vga @vga
> 00000000000003c0-00000000000003cf
> 00000000000003d4-00000000000003d5 (prio 0, RW): alias vga @vga
> 00000000000003d4-00000000000003d5
> 00000000000003da-00000000000003da (prio 0, RW): alias vga @vga
> 00000000000003da-00000000000003da
> 00000000000003f1-00000000000003f5 (prio 0, RW): alias fdc @fdc
> 00000000000003f1-00000000000003f5
> 00000000000003f7-00000000000003f7 (prio 0, RW): alias fdc @fdc
> 00000000000003f7-00000000000003f7
> 00000000000003f8-00000000000003ff (prio 0, RW): serial
> 0000000000000510-0000000000000511 (prio 0, RW): fwcfg
And with type 32 range it looks like this:
0000000000000000-7ffffffffffffffe (prio 0, RW): system
0000000000000000-0000000007ffffff (prio 0, RW): sun4u.ram
000001fe00000000-000001fe0000ffff (prio 0, RW): apb-config
000001fe01000000-000001fe01ffffff (prio 0, RW): apb-pci-config
000001fe02000000-000001fe0200ffff (prio 0, RW): apb-pci-ioport
000001ff00000000-000001ffffffffff (prio 0, RW): pci-mmio
000001ff00000000-000001ff000fffff (prio 1, RW): alias pci_bridge_mem
@pci_bridge_pci 0000000000000000-00000000000fffff
000001ff00000000-000001ff000fffff (prio 1, RW): alias
pci_bridge_pref_mem @pci_bridge_pci 0000000000000000-00000000000fffff
000001ff00000000-000001ff000fffff (prio 1, RW): alias pci_bridge_mem
@pci_bridge_pci 0000000000000000-00000000000fffff
000001ff00000000-000001ff000fffff (prio 1, RW): alias
pci_bridge_pref_mem @pci_bridge_pci 0000000000000000-00000000000fffff
000001ff000a0000-000001ff000affff (prio 2, RW): alias vga.chain4
@vga.vram 0000000000000000-000000000000ffff
000001ff000a0000-000001ff000bffff (prio 1, RW): vga-lowmem
000001ff00800000-000001ff00ffffff (prio 1, RW): vga.vram
000001ff01000000-000001ff0100ffff (prio 1, RW): vga.rom
000001ff02000000-000001ff02ffffff (prio 1, RW): isa-mmio
000001ff03000000-000001ff037fffff (prio 1, RW): isa-mmio
000001fff0000000-000001fff03fffff (prio 0, R-): sun4u.prom
pci_bridge_pci
0000000000000000-7ffffffffffffffe (prio 0, RW): pci_bridge_pci
pci_bridge_pci
0000000000000000-7ffffffffffffffe (prio 0, RW): pci_bridge_pci
vga.vram
0000000000800000-0000000000ffffff (prio 1, RW): vga.vram
I/O
0000000000000000-000000000000ffff (prio 0, RW): io
0000000000000000-0000000000000fff (prio 1, RW): alias pci_bridge_io
@pci_bridge_io 0000000000000000-0000000000000fff
0000000000000000-0000000000000fff (prio 1, RW): alias pci_bridge_io
@pci_bridge_io 0000000000000000-0000000000000fff
0000000000000060-0000000000000060 (prio 0, RW): i8042-data
0000000000000064-0000000000000064 (prio 0, RW): i8042-cmd
0000000000000074-0000000000000077 (prio 0, RW): m48t59
00000000000001ce-00000000000001ce (prio 0, RW): vbe
00000000000001d0-00000000000001d0 (prio 0, RW): vbe
0000000000000378-000000000000037f (prio 0, RW): parallel
00000000000003b4-00000000000003b5 (prio 0, RW): vga
00000000000003ba-00000000000003ba (prio 0, RW): vga
00000000000003c0-00000000000003cf (prio 0, RW): vga
00000000000003d4-00000000000003d5 (prio 0, RW): vga
00000000000003da-00000000000003da (prio 0, RW): vga
00000000000003f1-00000000000003f5 (prio 0, RW): fdc
00000000000003f7-00000000000003f7 (prio 0, RW): fdc
00000000000003f8-00000000000003ff (prio 0, RW): serial
0000000000000400-00000000000004ff (prio 1, RW): ne2000
0000000000000500-0000000000000507 (prio 1, RW): cmd646-data
0000000000000510-0000000000000511 (prio 0, RW): fwcfg
0000000000000580-0000000000000583 (prio 1, RW): cmd646-cmd
0000000000000600-0000000000000607 (prio 1, RW): cmd646-data
0000000000000680-0000000000000683 (prio 1, RW): cmd646-cmd
0000000000000700-000000000000070f (prio 1, RW): cmd646-bmdma
0000000000000700-0000000000000703 (prio 0, RW): cmd646-bmdma-bus
0000000000000704-0000000000000707 (prio 0, RW): cmd646-bmdma-ioport
0000000000000708-000000000000070b (prio 0, RW): cmd646-bmdma-bus
000000000000070c-000000000000070f (prio 0, RW): cmd646-bmdma-ioport
Sill trying to understand what all this means.
> > hw/pci.c | 4 ++--
> > 1 files changed, 2 insertions(+), 2 deletions(-)
> >
> > diff --git a/hw/pci.c b/hw/pci.c
> > index fee27fc..6d08cef 100644
> > --- a/hw/pci.c
> > +++ b/hw/pci.c
> > @@ -633,8 +633,8 @@ static void pci_init_mask_bridge(PCIDevice *d)
> > memset(d->wmask + PCI_PREF_BASE_UPPER32, 0xff, 8);
> >
> > /* Supported memory and i/o types */
> > - d->config[PCI_IO_BASE] |= PCI_IO_RANGE_TYPE_32;
> > - d->config[PCI_IO_LIMIT] |= PCI_IO_RANGE_TYPE_32;
> > + d->config[PCI_IO_BASE] |= PCI_IO_RANGE_TYPE_16;
> > + d->config[PCI_IO_LIMIT] |= PCI_IO_RANGE_TYPE_16;
> > pci_word_test_and_set_mask(d->config + PCI_PREF_MEMORY_BASE,
> > PCI_PREF_RANGE_TYPE_64);
> > pci_word_test_and_set_mask(d->config + PCI_PREF_MEMORY_LIMIT,
> > --
> > 1.7.9.111.gf3fb0
next prev parent reply other threads:[~2012-03-04 12:21 UTC|newest]
Thread overview: 41+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-03-04 9:46 [Qemu-devel] [PATCH] pci: fix bridge IO/BASE Michael S. Tsirkin
2012-03-04 10:27 ` Blue Swirl
2012-03-04 12:21 ` Michael S. Tsirkin [this message]
2012-03-04 12:37 ` Blue Swirl
2012-03-04 13:28 ` Michael S. Tsirkin
2012-03-04 13:38 ` Blue Swirl
2012-03-04 14:23 ` Michael S. Tsirkin
2012-03-04 14:35 ` Blue Swirl
2012-03-04 15:22 ` Michael S. Tsirkin
2012-03-04 17:07 ` Blue Swirl
2012-03-04 17:35 ` Michael S. Tsirkin
2012-03-04 19:51 ` Blue Swirl
2012-03-04 20:02 ` Michael S. Tsirkin
2012-03-04 20:32 ` Blue Swirl
2012-03-04 21:28 ` Michael S. Tsirkin
2012-03-04 21:54 ` Blue Swirl
2012-03-04 22:29 ` Michael S. Tsirkin
2012-03-05 18:34 ` Blue Swirl
2012-03-06 13:42 ` Michael S. Tsirkin
2012-03-04 21:56 ` Mark Cave-Ayland
2012-03-04 15:41 ` Michael S. Tsirkin
2012-03-04 13:38 ` Michael S. Tsirkin
2012-03-04 12:28 ` Avi Kivity
2012-03-04 12:38 ` Blue Swirl
2012-03-04 12:41 ` Avi Kivity
2012-03-04 12:46 ` Blue Swirl
2012-03-04 13:21 ` Michael S. Tsirkin
2012-03-04 13:22 ` Michael S. Tsirkin
2012-03-04 13:33 ` Blue Swirl
2012-03-04 14:08 ` Michael S. Tsirkin
2012-03-04 14:26 ` Blue Swirl
2012-03-04 16:42 ` Michael S. Tsirkin
2012-03-04 17:49 ` Blue Swirl
2012-03-04 18:11 ` Mark Cave-Ayland
2012-03-04 19:27 ` Michael S. Tsirkin
2012-03-04 19:43 ` Michael S. Tsirkin
2012-03-04 19:27 ` Michael S. Tsirkin
2012-03-04 12:33 ` Michael S. Tsirkin
2012-03-04 12:35 ` Avi Kivity
2012-03-04 12:35 ` Michael S. Tsirkin
2012-03-04 12:42 ` Blue Swirl
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=20120304122100.GA11207@redhat.com \
--to=mst@redhat.com \
--cc=anthony@codemonkey.ws \
--cc=blauwirbel@gmail.com \
--cc=mark.cave-ayland@ilande.co.uk \
--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.