[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH] xen: ioapic: avoid gcc 4.6 warnings about uninitialised variables



>>> On 09.05.11 at 12:43, Ian Campbell <ian.campbell@xxxxxxxxxx> wrote:
> # HG changeset patch
> # User Ian Campbell <ian.campbell@xxxxxxxxxx>
> # Date 1304937815 -3600
> # Node ID 35abcbcdf8bcabab6e0bbd929f69b613e167edfd
> # Parent  4b0692880dfa557d4e1537c7a58c412c1286a416
> xen: ioapic: avoid gcc 4.6 warnings about uninitialised variables

Seems like this got lost, but it really doesn't only fix a compiler
warning, because (not mentioned in the description) ...

> gcc 4.6 complains:
>       io_apic.c: In function 'restore_IO_APIC_setup':
>         
> /build/user-xen_4.1.0-3-amd64-zSon7K/xen-4.1.0/debian/build/build-hyperviso
> r_amd64_amd64/xen/include/asm/io_apic.h:150:26: error: '*((void *)&entry+4)' 
> may be used uninitialized in this function [-Werror=uninitialized]
>         io_apic.c:221:32: note: '*((void *)&entry+4)' was declared here
>         
> /build/user-xen_4.1.0-3-amd64-zSon7K/xen-4.1.0/debian/build/build-hyperviso
> r_amd64_amd64/xen/include/asm/io_apic.h:150:26: error: 'entry' may be used 
> uninitialized in this function [-Werror=uninitialized]
>         io_apic.c:221:32: note: 'entry' was declared here
>         cc1: all warnings being treated as errors
> 
> Add functions to read/write an entire IO APIC entry using an explicit
> union to allow gcc to spot the initialisation.
> 
> Reported as Debian bug #625438, thanks to Matthias Klose.
> 
> Signed-off-by: Ian Campbell <ian.campbell@xxxxxxxxxx>

Acked-by: Jan Beulich <jbeulich@xxxxxxxxxx>

> diff -r 4b0692880dfa -r 35abcbcdf8bc xen/arch/x86/io_apic.c
> --- a/xen/arch/x86/io_apic.c  Thu May 05 17:40:34 2011 +0100
> +++ b/xen/arch/x86/io_apic.c  Mon May 09 11:43:35 2011 +0100
> @@ -156,6 +156,52 @@ nomem:
>      return 0;
>  }
>  
> +union entry_union {
> +    struct { u32 w1, w2; };
> +    struct IO_APIC_route_entry entry;
> +};
> +
> +static struct IO_APIC_route_entry __ioapic_read_entry(int apic, int pin, 
> int raw)
> +{
> +    unsigned int (*read)(unsigned int, unsigned int)
> +        = raw ? __io_apic_read : io_apic_read;
> +    union entry_union eu;
> +    eu.w1 = (*read)(apic, 0x10 + 2 * pin);
> +    eu.w2 = (*read)(apic, 0x11 + 2 * pin);
> +    return eu.entry;
> +}
> +
> +static struct IO_APIC_route_entry ioapic_read_entry(int apic, int pin, int 
> raw)
> +{
> +    struct IO_APIC_route_entry entry;
> +    unsigned long flags;
> +
> +    spin_lock_irqsave(&ioapic_lock, flags);
> +    entry = __ioapic_read_entry(apic, pin, raw);
> +    spin_unlock_irqrestore(&ioapic_lock, flags);
> +    return entry;
> +}
> +
> +static void
> +__ioapic_write_entry(int apic, int pin, int raw, struct IO_APIC_route_entry 
> e)
> +{
> +    void (*write)(unsigned int, unsigned int, unsigned int)
> +        = raw ? __io_apic_write : io_apic_write;
> +    union entry_union eu = {{0, 0}};
> +
> +    eu.entry = e;
> +    (*write)(apic, 0x11 + 2*pin, eu.w2);
> +    (*write)(apic, 0x10 + 2*pin, eu.w1);
> +}
> +
> +static void ioapic_write_entry(int apic, int pin, int raw, struct 
> IO_APIC_route_entry e)
> +{
> +    unsigned long flags;
> +    spin_lock_irqsave(&ioapic_lock, flags);
> +    __ioapic_write_entry(apic, pin, raw, e);
> +    spin_unlock_irqrestore(&ioapic_lock, flags);
> +}
> +
>  /*
>   * Saves all the IO-APIC RTE's
>   */
> @@ -170,12 +216,8 @@ int save_IO_APIC_setup(struct IO_APIC_ro
>          if (!ioapic_entries[apic])
>              return -ENOMEM;
>  
> -        for (pin = 0; pin < nr_ioapic_registers[apic]; pin++) {
> -            *(((int *)&ioapic_entries[apic][pin])+0) =
> -                __io_apic_read(apic, 0x10+pin*2);
> -            *(((int *)&ioapic_entries[apic][pin])+1) =
> -                __io_apic_read(apic, 0x11+pin*2);
> -        }
> +        for (pin = 0; pin < nr_ioapic_registers[apic]; pin++)
> +         ioapic_entries[apic][pin] = __ioapic_read_entry(apic, pin, 1);
>      }
>  
>      return 0;
> @@ -197,16 +239,12 @@ void mask_IO_APIC_setup(struct IO_APIC_r
>  
>          for (pin = 0; pin < nr_ioapic_registers[apic]; pin++) {
>              struct IO_APIC_route_entry entry;
> -            unsigned long flags;
>  
>              entry = ioapic_entries[apic][pin];
>              if (!entry.mask) {
>                  entry.mask = 1;
>  
> -                spin_lock_irqsave(&ioapic_lock, flags);
> -                __io_apic_write(apic, 0x11+2*pin, *(((int *)&entry)+1));
> -                __io_apic_write(apic, 0x10+2*pin, *(((int *)&entry)+0));
> -                spin_unlock_irqrestore(&ioapic_lock, flags);
> +                ioapic_write_entry(apic, pin, 1, entry);
>              }
>          }
>      }
> @@ -218,8 +256,6 @@ void mask_IO_APIC_setup(struct IO_APIC_r
>  int restore_IO_APIC_setup(struct IO_APIC_route_entry **ioapic_entries)
>  {
>      int apic, pin;
> -    unsigned long flags;
> -    struct IO_APIC_route_entry entry;
>  
>      if (!ioapic_entries)
>          return -ENOMEM;
> @@ -229,11 +265,7 @@ int restore_IO_APIC_setup(struct IO_APIC
>              return -ENOMEM;
>  
>          for (pin = 0; pin < nr_ioapic_registers[apic]; pin++)
> -            entry = ioapic_entries[apic][pin];
> -            spin_lock_irqsave(&ioapic_lock, flags);
> -            __io_apic_write(apic, 0x11+2*pin, *(((int *)&entry)+1));
> -            __io_apic_write(apic, 0x10+2*pin, *(((int *)&entry)+0));
> -            spin_unlock_irqrestore(&ioapic_lock, flags);
> +         ioapic_write_entry(apic, pin, 1, ioapic_entries[apic][pin]);

... this for's (intended) body was lacking braces. Hence this
definitely is also a 4.1/4.0 back-porting candidate.

Jan

>      }
>  
>      return 0;
> @@ -338,18 +370,10 @@ static void eoi_IO_APIC_irq(unsigned int
>  #define clear_IO_APIC_pin_raw(a,p) __clear_IO_APIC_pin(a,p,1)
>  static void __clear_IO_APIC_pin(unsigned int apic, unsigned int pin, int 
> raw)
>  {
> -    unsigned int (*read)(unsigned int, unsigned int)
> -        = raw ? __io_apic_read : io_apic_read;
> -    void (*write)(unsigned int, unsigned int, unsigned int)
> -        = raw ? __io_apic_write : io_apic_write;
>      struct IO_APIC_route_entry entry;
> -    unsigned long flags;
> -    
> +
>      /* Check delivery_mode to be sure we're not clearing an SMI pin */
> -    spin_lock_irqsave(&ioapic_lock, flags);
> -    *(((int*)&entry) + 0) = (*read)(apic, 0x10 + 2 * pin);
> -    *(((int*)&entry) + 1) = (*read)(apic, 0x11 + 2 * pin);
> -    spin_unlock_irqrestore(&ioapic_lock, flags);
> +    entry = ioapic_read_entry(apic, pin, raw);
>      if (entry.delivery_mode == dest_SMI)
>          return;
>  
> @@ -358,10 +382,7 @@ static void __clear_IO_APIC_pin(unsigned
>       */
>      memset(&entry, 0, sizeof(entry));
>      entry.mask = 1;
> -    spin_lock_irqsave(&ioapic_lock, flags);
> -    (*write)(apic, 0x10 + 2 * pin, *(((int *)&entry) + 0));
> -    (*write)(apic, 0x11 + 2 * pin, *(((int *)&entry) + 1));
> -    spin_unlock_irqrestore(&ioapic_lock, flags);
> +    ioapic_write_entry(apic, pin, raw, entry);
>  }
>  
>  static void clear_IO_APIC (void)
> @@ -990,11 +1011,10 @@ static void __init setup_IO_APIC_irqs(vo
>              SET_DEST(entry.dest.dest32, entry.dest.logical.logical_dest,
>                       cpu_mask_to_apicid(&cfg->cpu_mask));
>              spin_lock_irqsave(&ioapic_lock, flags);
> -            io_apic_write(apic, 0x11+2*pin, *(((int *)&entry)+1));
> -            io_apic_write(apic, 0x10+2*pin, *(((int *)&entry)+0));
> +            __ioapic_write_entry(apic, pin, 0, entry);
>              set_native_irq_info(irq, TARGET_CPUS);
>              spin_unlock_irqrestore(&ioapic_lock, flags);
> -     }
> +        }
>      }
>  
>      if (!first_notcon)
> @@ -1007,7 +1027,6 @@ static void __init setup_IO_APIC_irqs(vo
>  static void __init setup_ExtINT_IRQ0_pin(unsigned int apic, unsigned int 
> pin, int vector)
>  {
>      struct IO_APIC_route_entry entry;
> -    unsigned long flags;
>  
>      memset(&entry,0,sizeof(entry));
>  
> @@ -1038,10 +1057,7 @@ static void __init setup_ExtINT_IRQ0_pin
>      /*
>       * Add it to the IO-APIC irq-routing table:
>       */
> -    spin_lock_irqsave(&ioapic_lock, flags);
> -    io_apic_write(apic, 0x11+2*pin, *(((int *)&entry)+1));
> -    io_apic_write(apic, 0x10+2*pin, *(((int *)&entry)+0));
> -    spin_unlock_irqrestore(&ioapic_lock, flags);
> +    ioapic_write_entry(apic, pin, 0, entry);
>  
>      enable_8259A_irq(0);
>  }
> @@ -1148,10 +1164,7 @@ static void /*__init*/ __print_IO_APIC(v
>       for (i = 0; i <= reg_01.bits.entries; i++) {
>              struct IO_APIC_route_entry entry;
>  
> -            spin_lock_irqsave(&ioapic_lock, flags);
> -            *(((int *)&entry)+0) = io_apic_read(apic, 0x10+i*2);
> -            *(((int *)&entry)+1) = io_apic_read(apic, 0x11+i*2);
> -            spin_unlock_irqrestore(&ioapic_lock, flags);
> +            entry = ioapic_read_entry(apic, i, 0);
>  
>              printk(KERN_DEBUG " %02x %03X %02X  ",
>                     i,
> @@ -1212,7 +1225,6 @@ static void __init enable_IO_APIC(void)
>  {
>      int i8259_apic, i8259_pin;
>      int i, apic;
> -    unsigned long flags;
>  
>      /* Initialise dynamic irq_2_pin free list. */
>      irq_2_pin = xmalloc_array(struct irq_pin_list, PIN_MAP_SIZE);
> @@ -1227,12 +1239,7 @@ static void __init enable_IO_APIC(void)
>          int pin;
>          /* See if any of the pins is in ExtINT mode */
>          for (pin = 0; pin < nr_ioapic_registers[apic]; pin++) {
> -            struct IO_APIC_route_entry entry;
> -            spin_lock_irqsave(&ioapic_lock, flags);
> -            *(((int *)&entry) + 0) = io_apic_read(apic, 0x10 + 2 * pin);
> -            *(((int *)&entry) + 1) = io_apic_read(apic, 0x11 + 2 * pin);
> -            spin_unlock_irqrestore(&ioapic_lock, flags);
> -
> +            struct IO_APIC_route_entry entry = ioapic_read_entry(apic, pin, 
> 0);
>  
>              /* If the interrupt line is enabled and in ExtInt mode
>               * I have found the pin where the i8259 is connected.
> @@ -1288,7 +1295,6 @@ void disable_IO_APIC(void)
>       */
>      if (ioapic_i8259.pin != -1) {
>          struct IO_APIC_route_entry entry;
> -        unsigned long flags;
>  
>          memset(&entry, 0, sizeof(entry));
>          entry.mask            = 0; /* Enabled */
> @@ -1305,12 +1311,7 @@ void disable_IO_APIC(void)
>          /*
>           * Add it to the IO-APIC irq-routing table:
>           */
> -        spin_lock_irqsave(&ioapic_lock, flags);
> -        io_apic_write(ioapic_i8259.apic, 0x11+2*ioapic_i8259.pin,
> -                      *(((int *)&entry)+1));
> -        io_apic_write(ioapic_i8259.apic, 0x10+2*ioapic_i8259.pin,
> -                      *(((int *)&entry)+0));
> -        spin_unlock_irqrestore(&ioapic_lock, flags);
> +        ioapic_write_entry(ioapic_i8259.apic, ioapic_i8259.pin, 0, entry);
>      }
>      disconnect_bsp_APIC(ioapic_i8259.pin != -1);
>  }
> @@ -1838,17 +1839,13 @@ static void __init unlock_ExtINT_logic(v
>      int apic, pin, i;
>      struct IO_APIC_route_entry entry0, entry1;
>      unsigned char save_control, save_freq_select;
> -    unsigned long flags;
>  
>      pin = find_isa_irq_pin(8, mp_INT);
>      apic = find_isa_irq_apic(8, mp_INT);
>      if (pin == -1)
>          return;
>  
> -    spin_lock_irqsave(&ioapic_lock, flags);
> -    *(((int *)&entry0) + 1) = io_apic_read(apic, 0x11 + 2 * pin);
> -    *(((int *)&entry0) + 0) = io_apic_read(apic, 0x10 + 2 * pin);
> -    spin_unlock_irqrestore(&ioapic_lock, flags);
> +    entry0 = ioapic_read_entry(apic, pin, 0);
>      clear_IO_APIC_pin(apic, pin);
>  
>      memset(&entry1, 0, sizeof(entry1));
> @@ -1862,10 +1859,7 @@ static void __init unlock_ExtINT_logic(v
>      entry1.trigger = 0;
>      entry1.vector = 0;
>  
> -    spin_lock_irqsave(&ioapic_lock, flags);
> -    io_apic_write(apic, 0x11 + 2 * pin, *(((int *)&entry1) + 1));
> -    io_apic_write(apic, 0x10 + 2 * pin, *(((int *)&entry1) + 0));
> -    spin_unlock_irqrestore(&ioapic_lock, flags);
> +    ioapic_write_entry(apic, pin, 0, entry1);
>  
>      save_control = CMOS_READ(RTC_CONTROL);
>      save_freq_select = CMOS_READ(RTC_FREQ_SELECT);
> @@ -1884,10 +1878,7 @@ static void __init unlock_ExtINT_logic(v
>      CMOS_WRITE(save_freq_select, RTC_FREQ_SELECT);
>      clear_IO_APIC_pin(apic, pin);
>  
> -    spin_lock_irqsave(&ioapic_lock, flags);
> -    io_apic_write(apic, 0x11 + 2 * pin, *(((int *)&entry0) + 1));
> -    io_apic_write(apic, 0x10 + 2 * pin, *(((int *)&entry0) + 0));
> -    spin_unlock_irqrestore(&ioapic_lock, flags);
> +    ioapic_write_entry(apic, pin, 0, entry0);
>  }
>  
>  /*
> @@ -2262,8 +2253,7 @@ int io_apic_set_pci_routing (int ioapic,
>          disable_8259A_irq(irq);
>  
>      spin_lock_irqsave(&ioapic_lock, flags);
> -    io_apic_write(ioapic, 0x11+2*pin, *(((int *)&entry)+1));
> -    io_apic_write(ioapic, 0x10+2*pin, *(((int *)&entry)+0));
> +    __ioapic_write_entry(ioapic, pin, 0, entry);
>      set_native_irq_info(irq, TARGET_CPUS);
>      spin_unlock(&ioapic_lock);
>  
> 
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@xxxxxxxxxxxxxxxxxxx 
> http://lists.xensource.com/xen-devel 



_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.