On Sat, 17 Nov 2007, Thomas Gleixner wrote:

> Linus,
> 
> please pull x86 updates for 2.6.24 from:
> 
>   ssh://master.kernel.org/pub/scm/linux/kernel/git/x86/linux-2.6-x86.git 
> master
> 
> Thanks,
> 
>       tglx

FYI,

Just added Sam's latest fix for the x86 build mechanism on top of the patches 
below.

Thanks,
        tglx

> Andreas Herrmann (2):
>       x86: fix cpu-hotplug regression
>       x86: show cpuinfo only for online CPUs
> 
> David P. Reed (3):
>       ntp: fix typo that makes sync_cmos_clock erratic
>       x86: fix freeze in x86_64 RTC update code in time_64.c
>       x86: on x86_64, correct reading of PC RTC when update in progress in 
> time_64.c
> 
> Denys (1):
>       x86: reboot fixup for wrap2c board
> 
> Ingo Molnar (1):
>       x86: ignore the sys_getcpu() tcache parameter
> 
> Randy Dunlap (3):
>       x86: fix voyager_cat_init section
>       x86: fix smp init sections
>       x86: voyager use correct header file name
> 
> Thomas Gleixner (4):
>       x86: fix bogus memcpy in es7000_check_dsdt()
>       x86: fixup cpu_info array conversion
>       Remove x86 merge artifact from top Makefile
>       x86: add hpet sanity checks
> 
> Truxton Fulton (1):
>       x86: fix reboot with no keyboard attached
> 
> Yinghai Lu (1):
>       x86: check boundary in count setup resource
> 
>  Makefile                                   |    7 +----
>  arch/x86/kernel/acpi/boot.c                |   32 +++++++++++++++++++++
>  arch/x86/kernel/cpu/mcheck/mce_64.c        |    2 +-
>  arch/x86/kernel/cpu/proc.c                 |    8 ++---
>  arch/x86/kernel/reboot_fixups_32.c         |    1 +
>  arch/x86/kernel/setup_64.c                 |    9 ++----
>  arch/x86/kernel/time_64.c                  |   41 
> +++++++++++++++-------------
>  arch/x86/mach-voyager/voyager_cat.c        |    2 +-
>  arch/x86/mach-voyager/voyager_smp.c        |    4 +-
>  arch/x86/pci/acpi.c                        |    6 ++++
>  arch/x86/vdso/vgetcpu.c                    |   19 +-----------
>  include/asm-x86/mach-default/mach_reboot.h |    2 +-
>  include/asm-x86/mach-es7000/mach_mpparse.h |    6 ++--
>  include/asm-x86/mach-voyager/setup_arch.h  |    2 +-
>  kernel/sys.c                               |   20 +-------------
>  kernel/time/ntp.c                          |    2 +-
>  16 files changed, 81 insertions(+), 82 deletions(-)
> diff --git a/Makefile b/Makefile
> index 7f96930..11961a2 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -1334,12 +1334,7 @@ else
>  ALLINCLUDE_ARCHS := $(ALLSOURCE_ARCHS)
>  endif
>  
> -# Take care of arch/x86
> -ifeq ($(ARCH), $(SRCARCH))
> -ALLSOURCE_ARCHS := $(ARCH)
> -else
> -ALLSOURCE_ARCHS := $(ARCH) $(SRCARCH)
> -endif
> +ALLSOURCE_ARCHS := $(SRCARCH)
>  
>  define find-sources
>          ( for arch in $(ALLSOURCE_ARCHS) ; do \
> diff --git a/arch/x86/kernel/acpi/boot.c b/arch/x86/kernel/acpi/boot.c
> index 289247d..0ca27c7 100644
> --- a/arch/x86/kernel/acpi/boot.c
> +++ b/arch/x86/kernel/acpi/boot.c
> @@ -637,6 +637,38 @@ static int __init acpi_parse_hpet(struct 
> acpi_table_header *table)
>       }
>  
>       hpet_address = hpet_tbl->address.address;
> +
> +     /*
> +      * Some broken BIOSes advertise HPET at 0x0. We really do not
> +      * want to allocate a resource there.
> +      */
> +     if (!hpet_address) {
> +             printk(KERN_WARNING PREFIX
> +                    "HPET id: %#x base: %#lx is invalid\n",
> +                    hpet_tbl->id, hpet_address);
> +             return 0;
> +     }
> +#ifdef CONFIG_X86_64
> +     /*
> +      * Some even more broken BIOSes advertise HPET at
> +      * 0xfed0000000000000 instead of 0xfed00000. Fix it up and add
> +      * some noise:
> +      */
> +     if (hpet_address == 0xfed0000000000000UL) {
> +             if (!hpet_force_user) {
> +                     printk(KERN_WARNING PREFIX "HPET id: %#x "
> +                            "base: 0xfed0000000000000 is bogus\n "
> +                            "try hpet=force on the kernel command line to "
> +                            "fix it up to 0xfed00000.\n", hpet_tbl->id);
> +                     hpet_address = 0;
> +                     return 0;
> +             }
> +             printk(KERN_WARNING PREFIX
> +                    "HPET id: %#x base: 0xfed0000000000000 fixed up "
> +                    "to 0xfed00000.\n", hpet_tbl->id);
> +             hpet_address >>= 32;
> +     }
> +#endif
>       printk(KERN_INFO PREFIX "HPET id: %#x base: %#lx\n",
>              hpet_tbl->id, hpet_address);
>  
> diff --git a/arch/x86/kernel/cpu/mcheck/mce_64.c 
> b/arch/x86/kernel/cpu/mcheck/mce_64.c
> index 447b351..4b21d29 100644
> --- a/arch/x86/kernel/cpu/mcheck/mce_64.c
> +++ b/arch/x86/kernel/cpu/mcheck/mce_64.c
> @@ -810,7 +810,7 @@ static __cpuinit int mce_create_device(unsigned int cpu)
>       int err;
>       int i;
>  
> -     if (!mce_available(&cpu_data(cpu)))
> +     if (!mce_available(&boot_cpu_data))
>               return -EIO;
>  
>       memset(&per_cpu(device_mce, cpu).kobj, 0, sizeof(struct kobject));
> diff --git a/arch/x86/kernel/cpu/proc.c b/arch/x86/kernel/cpu/proc.c
> index 066f8c6..3900e46 100644
> --- a/arch/x86/kernel/cpu/proc.c
> +++ b/arch/x86/kernel/cpu/proc.c
> @@ -89,8 +89,6 @@ static int show_cpuinfo(struct seq_file *m, void *v)
>       int fpu_exception;
>  
>  #ifdef CONFIG_SMP
> -     if (!cpu_online(n))
> -             return 0;
>       n = c->cpu_index;
>  #endif
>       seq_printf(m, "processor\t: %d\n"
> @@ -177,14 +175,14 @@ static int show_cpuinfo(struct seq_file *m, void *v)
>  static void *c_start(struct seq_file *m, loff_t *pos)
>  {
>       if (*pos == 0)  /* just in case, cpu 0 is not the first */
> -             *pos = first_cpu(cpu_possible_map);
> -     if ((*pos) < NR_CPUS && cpu_possible(*pos))
> +             *pos = first_cpu(cpu_online_map);
> +     if ((*pos) < NR_CPUS && cpu_online(*pos))
>               return &cpu_data(*pos);
>       return NULL;
>  }
>  static void *c_next(struct seq_file *m, void *v, loff_t *pos)
>  {
> -     *pos = next_cpu(*pos, cpu_possible_map);
> +     *pos = next_cpu(*pos, cpu_online_map);
>       return c_start(m, pos);
>  }
>  static void c_stop(struct seq_file *m, void *v)
> diff --git a/arch/x86/kernel/reboot_fixups_32.c 
> b/arch/x86/kernel/reboot_fixups_32.c
> index 1a07bbe..f452726 100644
> --- a/arch/x86/kernel/reboot_fixups_32.c
> +++ b/arch/x86/kernel/reboot_fixups_32.c
> @@ -39,6 +39,7 @@ struct device_fixup {
>  static struct device_fixup fixups_table[] = {
>  { PCI_VENDOR_ID_CYRIX, PCI_DEVICE_ID_CYRIX_5530_LEGACY, cs5530a_warm_reset },
>  { PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_CS5536_ISA, cs5536_warm_reset },
> +{ PCI_VENDOR_ID_NS, PCI_DEVICE_ID_NS_SC1100_BRIDGE, cs5530a_warm_reset },
>  };
>  
>  /*
> diff --git a/arch/x86/kernel/setup_64.c b/arch/x86/kernel/setup_64.c
> index 238633d..30d94d1 100644
> --- a/arch/x86/kernel/setup_64.c
> +++ b/arch/x86/kernel/setup_64.c
> @@ -892,7 +892,6 @@ void __cpuinit early_identify_cpu(struct cpuinfo_x86 *c)
>  
>  #ifdef CONFIG_SMP
>       c->phys_proc_id = (cpuid_ebx(1) >> 24) & 0xff;
> -     c->cpu_index = 0;
>  #endif
>  }
>  
> @@ -1078,8 +1077,6 @@ static int show_cpuinfo(struct seq_file *m, void *v)
>  
>  
>  #ifdef CONFIG_SMP
> -     if (!cpu_online(c->cpu_index))
> -             return 0;
>       cpu = c->cpu_index;
>  #endif
>  
> @@ -1171,15 +1168,15 @@ static int show_cpuinfo(struct seq_file *m, void *v)
>  static void *c_start(struct seq_file *m, loff_t *pos)
>  {
>       if (*pos == 0)  /* just in case, cpu 0 is not the first */
> -             *pos = first_cpu(cpu_possible_map);
> -     if ((*pos) < NR_CPUS && cpu_possible(*pos))
> +             *pos = first_cpu(cpu_online_map);
> +     if ((*pos) < NR_CPUS && cpu_online(*pos))
>               return &cpu_data(*pos);
>       return NULL;
>  }
>  
>  static void *c_next(struct seq_file *m, void *v, loff_t *pos)
>  {
> -     *pos = next_cpu(*pos, cpu_possible_map);
> +     *pos = next_cpu(*pos, cpu_online_map);
>       return c_start(m, pos);
>  }
>  
> diff --git a/arch/x86/kernel/time_64.c b/arch/x86/kernel/time_64.c
> index c821edc..368b194 100644
> --- a/arch/x86/kernel/time_64.c
> +++ b/arch/x86/kernel/time_64.c
> @@ -82,18 +82,15 @@ static int set_rtc_mmss(unsigned long nowtime)
>       int retval = 0;
>       int real_seconds, real_minutes, cmos_minutes;
>       unsigned char control, freq_select;
> +     unsigned long flags;
>  
>  /*
> - * IRQs are disabled when we're called from the timer interrupt,
> - * no need for spin_lock_irqsave()
> + * set_rtc_mmss is called when irqs are enabled, so disable irqs here
>   */
> -
> -     spin_lock(&rtc_lock);
> -
> +     spin_lock_irqsave(&rtc_lock, flags);
>  /*
>   * Tell the clock it's being set and stop it.
>   */
> -
>       control = CMOS_READ(RTC_CONTROL);
>       CMOS_WRITE(control | RTC_SET, RTC_CONTROL);
>  
> @@ -138,7 +135,7 @@ static int set_rtc_mmss(unsigned long nowtime)
>       CMOS_WRITE(control, RTC_CONTROL);
>       CMOS_WRITE(freq_select, RTC_FREQ_SELECT);
>  
> -     spin_unlock(&rtc_lock);
> +     spin_unlock_irqrestore(&rtc_lock, flags);
>  
>       return retval;
>  }
> @@ -164,21 +161,27 @@ unsigned long read_persistent_clock(void)
>       unsigned century = 0;
>  
>       spin_lock_irqsave(&rtc_lock, flags);
> +     /*
> +      * if UIP is clear, then we have >= 244 microseconds before RTC
> +      * registers will be updated.  Spec sheet says that this is the
> +      * reliable way to read RTC - registers invalid (off bus) during update
> +      */
> +     while ((CMOS_READ(RTC_FREQ_SELECT) & RTC_UIP))
> +             cpu_relax();
>  
> -     do {
> -             sec = CMOS_READ(RTC_SECONDS);
> -             min = CMOS_READ(RTC_MINUTES);
> -             hour = CMOS_READ(RTC_HOURS);
> -             day = CMOS_READ(RTC_DAY_OF_MONTH);
> -             mon = CMOS_READ(RTC_MONTH);
> -             year = CMOS_READ(RTC_YEAR);
> +
> +     /* now read all RTC registers while stable with interrupts disabled */
> +     sec = CMOS_READ(RTC_SECONDS);
> +     min = CMOS_READ(RTC_MINUTES);
> +     hour = CMOS_READ(RTC_HOURS);
> +     day = CMOS_READ(RTC_DAY_OF_MONTH);
> +     mon = CMOS_READ(RTC_MONTH);
> +     year = CMOS_READ(RTC_YEAR);
>  #ifdef CONFIG_ACPI
> -             if (acpi_gbl_FADT.header.revision >= FADT2_REVISION_ID &&
> -                                     acpi_gbl_FADT.century)
> -                     century = CMOS_READ(acpi_gbl_FADT.century);
> +     if (acpi_gbl_FADT.header.revision >= FADT2_REVISION_ID &&
> +                             acpi_gbl_FADT.century)
> +             century = CMOS_READ(acpi_gbl_FADT.century);
>  #endif
> -     } while (sec != CMOS_READ(RTC_SECONDS));
> -
>       spin_unlock_irqrestore(&rtc_lock, flags);
>  
>       /*
> diff --git a/arch/x86/mach-voyager/voyager_cat.c 
> b/arch/x86/mach-voyager/voyager_cat.c
> index 26a2d4c..2132ca6 100644
> --- a/arch/x86/mach-voyager/voyager_cat.c
> +++ b/arch/x86/mach-voyager/voyager_cat.c
> @@ -568,7 +568,7 @@ static voyager_module_t *voyager_initial_module;
>   * boot cpu *after* all memory initialisation has been done (so we can
>   * use kmalloc) but before smp initialisation, so we can probe the SMP
>   * configuration and pick up necessary information.  */
> -void
> +void __init
>  voyager_cat_init(void)
>  {
>       voyager_module_t **modpp = &voyager_initial_module;
> diff --git a/arch/x86/mach-voyager/voyager_smp.c 
> b/arch/x86/mach-voyager/voyager_smp.c
> index 6937143..88124dd 100644
> --- a/arch/x86/mach-voyager/voyager_smp.c
> +++ b/arch/x86/mach-voyager/voyager_smp.c
> @@ -1900,7 +1900,7 @@ voyager_smp_prepare_cpus(unsigned int max_cpus)
>       smp_boot_cpus();
>  }
>  
> -static void __devinit voyager_smp_prepare_boot_cpu(void)
> +static void __cpuinit voyager_smp_prepare_boot_cpu(void)
>  {
>       init_gdt(smp_processor_id());
>       switch_to_new_gdt();
> @@ -1911,7 +1911,7 @@ static void __devinit voyager_smp_prepare_boot_cpu(void)
>       cpu_set(smp_processor_id(), cpu_present_map);
>  }
>  
> -static int __devinit
> +static int __cpuinit
>  voyager_cpu_up(unsigned int cpu)
>  {
>       /* This only works at boot for x86.  See "rewrite" above. */
> diff --git a/arch/x86/pci/acpi.c b/arch/x86/pci/acpi.c
> index 2d88f7c..7e35078 100644
> --- a/arch/x86/pci/acpi.c
> +++ b/arch/x86/pci/acpi.c
> @@ -77,6 +77,9 @@ count_resource(struct acpi_resource *acpi_res, void *data)
>       struct acpi_resource_address64 addr;
>       acpi_status status;
>  
> +     if (info->res_num >= PCI_BUS_NUM_RESOURCES)
> +             return AE_OK;
> +
>       status = resource_to_addr(acpi_res, &addr);
>       if (ACPI_SUCCESS(status))
>               info->res_num++;
> @@ -93,6 +96,9 @@ setup_resource(struct acpi_resource *acpi_res, void *data)
>       unsigned long flags;
>       struct resource *root;
>  
> +     if (info->res_num >= PCI_BUS_NUM_RESOURCES)
> +             return AE_OK;
> +
>       status = resource_to_addr(acpi_res, &addr);
>       if (!ACPI_SUCCESS(status))
>               return AE_OK;
> diff --git a/arch/x86/vdso/vgetcpu.c b/arch/x86/vdso/vgetcpu.c
> index 91f6e85..3b1ae1a 100644
> --- a/arch/x86/vdso/vgetcpu.c
> +++ b/arch/x86/vdso/vgetcpu.c
> @@ -13,32 +13,17 @@
>  #include <asm/vgtod.h>
>  #include "vextern.h"
>  
> -long __vdso_getcpu(unsigned *cpu, unsigned *node, struct getcpu_cache 
> *tcache)
> +long __vdso_getcpu(unsigned *cpu, unsigned *node, struct getcpu_cache 
> *unused)
>  {
>       unsigned int dummy, p;
> -     unsigned long j = 0;
>  
> -     /* Fast cache - only recompute value once per jiffies and avoid
> -        relatively costly rdtscp/cpuid otherwise.
> -        This works because the scheduler usually keeps the process
> -        on the same CPU and this syscall doesn't guarantee its
> -        results anyways.
> -        We do this here because otherwise user space would do it on
> -        its own in a likely inferior way (no access to jiffies).
> -        If you don't like it pass NULL. */
> -     if (tcache && tcache->blob[0] == (j = *vdso_jiffies)) {
> -             p = tcache->blob[1];
> -     } else if (*vdso_vgetcpu_mode == VGETCPU_RDTSCP) {
> +     if (*vdso_vgetcpu_mode == VGETCPU_RDTSCP) {
>               /* Load per CPU data from RDTSCP */
>               rdtscp(dummy, dummy, p);
>       } else {
>               /* Load per CPU data from GDT */
>               asm("lsl %1,%0" : "=r" (p) : "r" (__PER_CPU_SEG));
>       }
> -     if (tcache) {
> -             tcache->blob[0] = j;
> -             tcache->blob[1] = p;
> -     }
>       if (cpu)
>               *cpu = p & 0xfff;
>       if (node)
> diff --git a/include/asm-x86/mach-default/mach_reboot.h 
> b/include/asm-x86/mach-default/mach_reboot.h
> index e23fd9f..6adee6a 100644
> --- a/include/asm-x86/mach-default/mach_reboot.h
> +++ b/include/asm-x86/mach-default/mach_reboot.h
> @@ -49,7 +49,7 @@ static inline void mach_reboot(void)
>               udelay(50);
>               kb_wait();
>               udelay(50);
> -             outb(cmd | 0x04, 0x60); /* set "System flag" */
> +             outb(cmd | 0x14, 0x60); /* set "System flag" and "Keyboard 
> Disabled" */
>               udelay(50);
>               kb_wait();
>               udelay(50);
> diff --git a/include/asm-x86/mach-es7000/mach_mpparse.h 
> b/include/asm-x86/mach-es7000/mach_mpparse.h
> index 8aa1054..52ee75c 100644
> --- a/include/asm-x86/mach-es7000/mach_mpparse.h
> +++ b/include/asm-x86/mach-es7000/mach_mpparse.h
> @@ -29,9 +29,9 @@ extern int mps_oem_check(struct mp_config_table *mpc, char 
> *oem,
>  static inline int es7000_check_dsdt(void)
>  {
>       struct acpi_table_header header;
> -     memcpy(&header, 0, sizeof(struct acpi_table_header));
> -     acpi_get_table_header(ACPI_SIG_DSDT, 0, &header);
> -     if (!strncmp(header.oem_id, "UNISYS", 6))
> +
> +     if (ACPI_SUCCESS(acpi_get_table_header(ACPI_SIG_DSDT, 0, &header)) &&
> +         !strncmp(header.oem_id, "UNISYS", 6))
>               return 1;
>       return 0;
>  }
> diff --git a/include/asm-x86/mach-voyager/setup_arch.h 
> b/include/asm-x86/mach-voyager/setup_arch.h
> index 1710ae1..71729ca 100644
> --- a/include/asm-x86/mach-voyager/setup_arch.h
> +++ b/include/asm-x86/mach-voyager/setup_arch.h
> @@ -1,5 +1,5 @@
>  #include <asm/voyager.h>
> -#include <asm/setup_32.h>
> +#include <asm/setup.h>
>  #define VOYAGER_BIOS_INFO ((struct voyager_bios_info *) \
>                       (&boot_params.apm_bios_info))
>  
> diff --git a/kernel/sys.c b/kernel/sys.c
> index 304b541..d1fe71e 100644
> --- a/kernel/sys.c
> +++ b/kernel/sys.c
> @@ -1750,7 +1750,7 @@ asmlinkage long sys_prctl(int option, unsigned long 
> arg2, unsigned long arg3,
>  }
>  
>  asmlinkage long sys_getcpu(unsigned __user *cpup, unsigned __user *nodep,
> -                        struct getcpu_cache __user *cache)
> +                        struct getcpu_cache __user *unused)
>  {
>       int err = 0;
>       int cpu = raw_smp_processor_id();
> @@ -1758,24 +1758,6 @@ asmlinkage long sys_getcpu(unsigned __user *cpup, 
> unsigned __user *nodep,
>               err |= put_user(cpu, cpup);
>       if (nodep)
>               err |= put_user(cpu_to_node(cpu), nodep);
> -     if (cache) {
> -             /*
> -              * The cache is not needed for this implementation,
> -              * but make sure user programs pass something
> -              * valid. vsyscall implementations can instead make
> -              * good use of the cache. Only use t0 and t1 because
> -              * these are available in both 32bit and 64bit ABI (no
> -              * need for a compat_getcpu). 32bit has enough
> -              * padding
> -              */
> -             unsigned long t0, t1;
> -             get_user(t0, &cache->blob[0]);
> -             get_user(t1, &cache->blob[1]);
> -             t0++;
> -             t1++;
> -             put_user(t0, &cache->blob[0]);
> -             put_user(t1, &cache->blob[1]);
> -     }
>       return err ? -EFAULT : 0;
>  }
>  
> diff --git a/kernel/time/ntp.c b/kernel/time/ntp.c
> index de6a2d6..14a2ecf 100644
> --- a/kernel/time/ntp.c
> +++ b/kernel/time/ntp.c
> @@ -205,7 +205,7 @@ static void sync_cmos_clock(unsigned long dummy)
>               return;
>  
>       getnstimeofday(&now);
> -     if (abs(xtime.tv_nsec - (NSEC_PER_SEC / 2)) <= tick_nsec / 2)
> +     if (abs(now.tv_nsec - (NSEC_PER_SEC / 2)) <= tick_nsec / 2)
>               fail = update_persistent_clock(now);
>  
>       next.tv_nsec = (NSEC_PER_SEC / 2) - now.tv_nsec;
> -
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to [EMAIL PROTECTED]
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at  http://www.tux.org/lkml/
> 
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to