From fdf9e6f5f1b35fe2218fb44065bf15a38e2ddd5c Mon Sep 17 00:00:00 2001 From: Mark Kettenis Date: Wed, 29 Apr 2009 18:28:39 +0000 Subject: Extend pciio extents to cover the while 32-bit address space. The processor can only address the first 64K but BARs can contain garbage and addresses beyond the end of the extent would cause a panic. --- sys/arch/amd64/pci/pci_machdep.c | 18 ++++++++++++++---- sys/arch/i386/pci/pci_machdep.c | 18 ++++++++++++++---- 2 files changed, 28 insertions(+), 8 deletions(-) (limited to 'sys/arch') diff --git a/sys/arch/amd64/pci/pci_machdep.c b/sys/arch/amd64/pci/pci_machdep.c index 19137f17676..67fa23b429d 100644 --- a/sys/arch/amd64/pci/pci_machdep.c +++ b/sys/arch/amd64/pci/pci_machdep.c @@ -1,4 +1,4 @@ -/* $OpenBSD: pci_machdep.c,v 1.28 2009/04/21 19:18:09 kettenis Exp $ */ +/* $OpenBSD: pci_machdep.c,v 1.29 2009/04/29 18:28:38 kettenis Exp $ */ /* $NetBSD: pci_machdep.c,v 1.3 2003/05/07 21:33:58 fvdl Exp $ */ /*- @@ -372,9 +372,19 @@ pci_init_extents(void) bios_memmap_t *bmp; u_int64_t size; - if (pciio_ex == NULL) - pciio_ex = extent_create("pciio", 0, 0xffff, M_DEVBUF, - NULL, 0, EX_NOWAIT); + if (pciio_ex == NULL) { + /* + * We only have 64K of addressable I/O space. + * However, since BARs may contain garbage, we cover + * the full 32-bit address space defined by PCI of + * which we only make the first 64K available. + */ + pciio_ex = extent_create("pciio", 0, 0xffffffff, M_DEVBUF, + NULL, 0, EX_NOWAIT | EX_FILLED); + if (pciio_ex == NULL) + return; + extent_free(pciio_ex, 0, 0x10000, M_NOWAIT); + } if (pcimem_ex == NULL) { pcimem_ex = extent_create("pcimem", 0, 0xffffffff, M_DEVBUF, diff --git a/sys/arch/i386/pci/pci_machdep.c b/sys/arch/i386/pci/pci_machdep.c index dd545221c8a..777bd451fdd 100644 --- a/sys/arch/i386/pci/pci_machdep.c +++ b/sys/arch/i386/pci/pci_machdep.c @@ -1,4 +1,4 @@ -/* $OpenBSD: pci_machdep.c,v 1.47 2009/04/13 21:22:38 kettenis Exp $ */ +/* $OpenBSD: pci_machdep.c,v 1.48 2009/04/29 18:28:37 kettenis Exp $ */ /* $NetBSD: pci_machdep.c,v 1.28 1997/06/06 23:29:17 thorpej Exp $ */ /*- @@ -612,9 +612,19 @@ pci_init_extents(void) bios_memmap_t *bmp; u_int64_t size; - if (pciio_ex == NULL) - pciio_ex = extent_create("pciio", 0, 0xffff, M_DEVBUF, - NULL, 0, EX_NOWAIT); + if (pciio_ex == NULL) { + /* + * We only have 64K of addressable I/O space. + * However, since BARs may contain garbage, we cover + * the full 32-bit address space defined by PCI of + * which we only make the first 64K available. + */ + pciio_ex = extent_create("pciio", 0, 0xffffffff, M_DEVBUF, + NULL, 0, EX_NOWAIT | EX_FILLED); + if (pciio_ex == NULL) + return; + extent_free(pciio_ex, 0, 0x10000, M_NOWAIT); + } if (pcimem_ex == NULL) { pcimem_ex = extent_create("pcimem", 0, 0xffffffff, M_DEVBUF, -- cgit v1.2.3