Patchwork [V5,09/29] pci: clean up of pci_default_read_config.

login
register
mail settings
Submitter Isaku Yamahata
Date Oct. 9, 2009, 6:28 a.m.
Message ID <1255069742-15724-10-git-send-email-yamahata@valinux.co.jp>
Download mbox | patch
Permalink /patch/35563/
State Under Review
Headers show

Comments

Isaku Yamahata - Oct. 9, 2009, 6:28 a.m.
This patch cleans up pci_default_read_config() removing
ugly length and range check.

Suggesed by "Michael S. Tsirkin" <mst@redhat.com>
Signed-off-by: Isaku Yamahata <yamahata@valinux.co.jp>
---
 hw/pci.c |   26 +++++---------------------
 1 files changed, 5 insertions(+), 21 deletions(-)
Michael S. Tsirkin - Oct. 9, 2009, 6:50 a.m.
On Fri, Oct 09, 2009 at 03:28:42PM +0900, Isaku Yamahata wrote:
> This patch cleans up pci_default_read_config() removing
> ugly length and range check.
> 
> Suggesed by "Michael S. Tsirkin" <mst@redhat.com>

Nit: suggested.

> Signed-off-by: Isaku Yamahata <yamahata@valinux.co.jp>
> ---
>  hw/pci.c |   26 +++++---------------------
>  1 files changed, 5 insertions(+), 21 deletions(-)
> 
> diff --git a/hw/pci.c b/hw/pci.c
> index 634899a..755ebad 100644
> --- a/hw/pci.c
> +++ b/hw/pci.c
> @@ -558,27 +558,11 @@ static void pci_update_mappings(PCIDevice *d)
>  uint32_t pci_default_read_config(PCIDevice *d,
>                                   uint32_t address, int len)
>  {
> -    uint32_t val;
> -
> -    switch(len) {
> -    default:
> -    case 4:
> -	if (address <= 0xfc) {
> -            val = pci_get_long(d->config + address);
> -	    break;
> -	}
> -	/* fall through */
> -    case 2:
> -        if (address <= 0xfe) {
> -            val = pci_get_word(d->config + address);
> -	    break;
> -	}
> -	/* fall through */
> -    case 1:
> -        val = pci_get_byte(d->config + address);
> -        break;
> -    }
> -    return val;
> +    uint32_t val = 0;
> +    assert(len == 1 || len == 2 || len == 4);
> +    len = MIN(len, PCI_CONFIG_SPACE_SIZE - address);
> +    memcpy(&val, d->config + address, len);
> +    return le32_to_cpu(val);
>  }
>  
>  void pci_default_write_config(PCIDevice *d, uint32_t addr, uint32_t val, int l)
> -- 
> 1.6.0.2
Michael S. Tsirkin - Oct. 9, 2009, 6:58 a.m.
On Fri, Oct 09, 2009 at 03:28:42PM +0900, Isaku Yamahata wrote:
> This patch cleans up pci_default_read_config() removing
> ugly length and range check.
> 
> Suggesed by "Michael S. Tsirkin" <mst@redhat.com>
> Signed-off-by: Isaku Yamahata <yamahata@valinux.co.jp>

Acked-by: Michael S. Tsirkin <mst@redhat.com>

> ---
>  hw/pci.c |   26 +++++---------------------
>  1 files changed, 5 insertions(+), 21 deletions(-)
> 
> diff --git a/hw/pci.c b/hw/pci.c
> index 634899a..755ebad 100644
> --- a/hw/pci.c
> +++ b/hw/pci.c
> @@ -558,27 +558,11 @@ static void pci_update_mappings(PCIDevice *d)
>  uint32_t pci_default_read_config(PCIDevice *d,
>                                   uint32_t address, int len)
>  {
> -    uint32_t val;
> -
> -    switch(len) {
> -    default:
> -    case 4:
> -	if (address <= 0xfc) {
> -            val = pci_get_long(d->config + address);
> -	    break;
> -	}
> -	/* fall through */
> -    case 2:
> -        if (address <= 0xfe) {
> -            val = pci_get_word(d->config + address);
> -	    break;
> -	}
> -	/* fall through */
> -    case 1:
> -        val = pci_get_byte(d->config + address);
> -        break;
> -    }
> -    return val;
> +    uint32_t val = 0;
> +    assert(len == 1 || len == 2 || len == 4);
> +    len = MIN(len, PCI_CONFIG_SPACE_SIZE - address);
> +    memcpy(&val, d->config + address, len);
> +    return le32_to_cpu(val);
>  }
>  
>  void pci_default_write_config(PCIDevice *d, uint32_t addr, uint32_t val, int l)
> -- 
> 1.6.0.2

Patch

diff --git a/hw/pci.c b/hw/pci.c
index 634899a..755ebad 100644
--- a/hw/pci.c
+++ b/hw/pci.c
@@ -558,27 +558,11 @@  static void pci_update_mappings(PCIDevice *d)
 uint32_t pci_default_read_config(PCIDevice *d,
                                  uint32_t address, int len)
 {
-    uint32_t val;
-
-    switch(len) {
-    default:
-    case 4:
-	if (address <= 0xfc) {
-            val = pci_get_long(d->config + address);
-	    break;
-	}
-	/* fall through */
-    case 2:
-        if (address <= 0xfe) {
-            val = pci_get_word(d->config + address);
-	    break;
-	}
-	/* fall through */
-    case 1:
-        val = pci_get_byte(d->config + address);
-        break;
-    }
-    return val;
+    uint32_t val = 0;
+    assert(len == 1 || len == 2 || len == 4);
+    len = MIN(len, PCI_CONFIG_SPACE_SIZE - address);
+    memcpy(&val, d->config + address, len);
+    return le32_to_cpu(val);
 }
 
 void pci_default_write_config(PCIDevice *d, uint32_t addr, uint32_t val, int l)