Commit 0404f87f authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'for-linus' of git://one.firstfloor.org/home/andi/git/linux-2.6

* 'for-linus' of git://one.firstfloor.org/home/andi/git/linux-2.6:
  [PATCH] x86-64: Fix warnings in ia32_aout.c
  [PATCH] i386: Convert some functions to __init to avoid MODPOST warnings
  [PATCH] i386: Fix memory hotplug related MODPOST generated warning
  [PATCH] x86-64: tighten up printks
  [PATCH] x86-64: - Ignore long SMI interrupts in clock calibration
  [PATCH] x86-64: pci quirks MODPOST warning fix
  [PATCH] x86-64: Modpost whitelist reference to more symbols (pattern 3)
  [PATCH] x86-64: modpost add more symbols to whitelist pattern2
  [PATCH] i386: make apic probe function non-init
  [PATCH] i386: cpu hotplug/smpboot misc MODPOST warning fixes
  [PATCH] x86-64: Use different constraint for gcc < 4.1 in bitops.h
  [PATCH] x86-64: Make noirqdebug_setup function non init to fix modpost warning
  [PATCH] i386: Update defconfig
  [PATCH] x86-64: Update defconfig
parents 2d9819e3 74019699
# #
# Automatically generated make config: don't edit # Automatically generated make config: don't edit
# Linux kernel version: 2.6.19-git14 # Linux kernel version: 2.6.20-rc3
# Sat Dec 9 21:23:14 2006 # Fri Jan 5 11:54:46 2007
# #
CONFIG_X86_32=y CONFIG_X86_32=y
CONFIG_GENERIC_TIME=y CONFIG_GENERIC_TIME=y
...@@ -1286,6 +1286,11 @@ CONFIG_USB_MON=y ...@@ -1286,6 +1286,11 @@ CONFIG_USB_MON=y
# DMA Devices # DMA Devices
# #
#
# Virtualization
#
# CONFIG_KVM is not set
# #
# File systems # File systems
# #
...@@ -1471,6 +1476,8 @@ CONFIG_TRACE_IRQFLAGS_SUPPORT=y ...@@ -1471,6 +1476,8 @@ CONFIG_TRACE_IRQFLAGS_SUPPORT=y
# CONFIG_ENABLE_MUST_CHECK is not set # CONFIG_ENABLE_MUST_CHECK is not set
CONFIG_MAGIC_SYSRQ=y CONFIG_MAGIC_SYSRQ=y
CONFIG_UNUSED_SYMBOLS=y CONFIG_UNUSED_SYMBOLS=y
# CONFIG_DEBUG_FS is not set
# CONFIG_HEADERS_CHECK is not set
CONFIG_DEBUG_KERNEL=y CONFIG_DEBUG_KERNEL=y
CONFIG_LOG_BUF_SHIFT=18 CONFIG_LOG_BUF_SHIFT=18
CONFIG_DETECT_SOFTLOCKUP=y CONFIG_DETECT_SOFTLOCKUP=y
...@@ -1489,12 +1496,10 @@ CONFIG_DETECT_SOFTLOCKUP=y ...@@ -1489,12 +1496,10 @@ CONFIG_DETECT_SOFTLOCKUP=y
# CONFIG_DEBUG_HIGHMEM is not set # CONFIG_DEBUG_HIGHMEM is not set
CONFIG_DEBUG_BUGVERBOSE=y CONFIG_DEBUG_BUGVERBOSE=y
# CONFIG_DEBUG_INFO is not set # CONFIG_DEBUG_INFO is not set
# CONFIG_DEBUG_FS is not set
# CONFIG_DEBUG_VM is not set # CONFIG_DEBUG_VM is not set
# CONFIG_DEBUG_LIST is not set # CONFIG_DEBUG_LIST is not set
# CONFIG_FRAME_POINTER is not set # CONFIG_FRAME_POINTER is not set
# CONFIG_FORCED_INLINING is not set # CONFIG_FORCED_INLINING is not set
# CONFIG_HEADERS_CHECK is not set
# CONFIG_RCU_TORTURE_TEST is not set # CONFIG_RCU_TORTURE_TEST is not set
# CONFIG_LKDTM is not set # CONFIG_LKDTM is not set
CONFIG_EARLY_PRINTK=y CONFIG_EARLY_PRINTK=y
...@@ -1527,6 +1532,7 @@ CONFIG_CRC32=y ...@@ -1527,6 +1532,7 @@ CONFIG_CRC32=y
# CONFIG_LIBCRC32C is not set # CONFIG_LIBCRC32C is not set
CONFIG_ZLIB_INFLATE=y CONFIG_ZLIB_INFLATE=y
CONFIG_PLIST=y CONFIG_PLIST=y
CONFIG_IOMAP_COPY=y
CONFIG_GENERIC_HARDIRQS=y CONFIG_GENERIC_HARDIRQS=y
CONFIG_GENERIC_IRQ_PROBE=y CONFIG_GENERIC_IRQ_PROBE=y
CONFIG_GENERIC_PENDING_IRQ=y CONFIG_GENERIC_PENDING_IRQ=y
......
...@@ -36,7 +36,7 @@ ...@@ -36,7 +36,7 @@
/* Have we found an MP table */ /* Have we found an MP table */
int smp_found_config; int smp_found_config;
unsigned int __initdata maxcpus = NR_CPUS; unsigned int __cpuinitdata maxcpus = NR_CPUS;
/* /*
* Various Linux-internal data structures created from the * Various Linux-internal data structures created from the
...@@ -102,9 +102,9 @@ static int __init mpf_checksum(unsigned char *mp, int len) ...@@ -102,9 +102,9 @@ static int __init mpf_checksum(unsigned char *mp, int len)
*/ */
static int mpc_record; static int mpc_record;
static struct mpc_config_translation *translation_table[MAX_MPC_ENTRY] __initdata; static struct mpc_config_translation *translation_table[MAX_MPC_ENTRY] __cpuinitdata;
static void __devinit MP_processor_info (struct mpc_config_processor *m) static void __cpuinit MP_processor_info (struct mpc_config_processor *m)
{ {
int ver, apicid; int ver, apicid;
physid_mask_t phys_cpu; physid_mask_t phys_cpu;
...@@ -822,7 +822,7 @@ void __init mp_register_lapic_address(u64 address) ...@@ -822,7 +822,7 @@ void __init mp_register_lapic_address(u64 address)
Dprintk("Boot CPU = %d\n", boot_cpu_physical_apicid); Dprintk("Boot CPU = %d\n", boot_cpu_physical_apicid);
} }
void __devinit mp_register_lapic (u8 id, u8 enabled) void __cpuinit mp_register_lapic (u8 id, u8 enabled)
{ {
struct mpc_config_processor processor; struct mpc_config_processor processor;
int boot_cpu = 0; int boot_cpu = 0;
......
...@@ -77,7 +77,7 @@ extern struct resource code_resource; ...@@ -77,7 +77,7 @@ extern struct resource code_resource;
extern struct resource data_resource; extern struct resource data_resource;
/* cpu data as detected by the assembly code in head.S */ /* cpu data as detected by the assembly code in head.S */
struct cpuinfo_x86 new_cpu_data __initdata = { 0, 0, 0, 0, -1, 1, 0, 0, -1 }; struct cpuinfo_x86 new_cpu_data __cpuinitdata = { 0, 0, 0, 0, -1, 1, 0, 0, -1 };
/* common cpu data for all cpus */ /* common cpu data for all cpus */
struct cpuinfo_x86 boot_cpu_data __read_mostly = { 0, 0, 0, 0, -1, 1, 0, 0, -1 }; struct cpuinfo_x86 boot_cpu_data __read_mostly = { 0, 0, 0, 0, -1, 1, 0, 0, -1 };
EXPORT_SYMBOL(boot_cpu_data); EXPORT_SYMBOL(boot_cpu_data);
...@@ -495,7 +495,7 @@ static void set_mca_bus(int x) { } ...@@ -495,7 +495,7 @@ static void set_mca_bus(int x) { }
#endif #endif
/* Overridden in paravirt.c if CONFIG_PARAVIRT */ /* Overridden in paravirt.c if CONFIG_PARAVIRT */
char * __attribute__((weak)) memory_setup(void) char * __init __attribute__((weak)) memory_setup(void)
{ {
return machine_specific_memory_setup(); return machine_specific_memory_setup();
} }
......
...@@ -159,7 +159,7 @@ void __init smp_alloc_memory(void) ...@@ -159,7 +159,7 @@ void __init smp_alloc_memory(void)
* a given CPU * a given CPU
*/ */
static void __devinit smp_store_cpu_info(int id) static void __cpuinit smp_store_cpu_info(int id)
{ {
struct cpuinfo_x86 *c = cpu_data + id; struct cpuinfo_x86 *c = cpu_data + id;
...@@ -364,7 +364,7 @@ extern void calibrate_delay(void); ...@@ -364,7 +364,7 @@ extern void calibrate_delay(void);
static atomic_t init_deasserted; static atomic_t init_deasserted;
static void __devinit smp_callin(void) static void __cpuinit smp_callin(void)
{ {
int cpuid, phys_id; int cpuid, phys_id;
unsigned long timeout; unsigned long timeout;
...@@ -538,7 +538,7 @@ set_cpu_sibling_map(int cpu) ...@@ -538,7 +538,7 @@ set_cpu_sibling_map(int cpu)
/* /*
* Activate a secondary processor. * Activate a secondary processor.
*/ */
static void __devinit start_secondary(void *unused) static void __cpuinit start_secondary(void *unused)
{ {
/* /*
* Don't put *anything* before secondary_cpu_init(), SMP * Don't put *anything* before secondary_cpu_init(), SMP
...@@ -931,7 +931,7 @@ static inline struct task_struct * alloc_idle_task(int cpu) ...@@ -931,7 +931,7 @@ static inline struct task_struct * alloc_idle_task(int cpu)
#define alloc_idle_task(cpu) fork_idle(cpu) #define alloc_idle_task(cpu) fork_idle(cpu)
#endif #endif
static int __devinit do_boot_cpu(int apicid, int cpu) static int __cpuinit do_boot_cpu(int apicid, int cpu)
/* /*
* NOTE - on most systems this is a PHYSICAL apic ID, but on multiquad * NOTE - on most systems this is a PHYSICAL apic ID, but on multiquad
* (ie clustered apic addressing mode), this is a LOGICAL apic ID. * (ie clustered apic addressing mode), this is a LOGICAL apic ID.
...@@ -1432,7 +1432,7 @@ void __cpu_die(unsigned int cpu) ...@@ -1432,7 +1432,7 @@ void __cpu_die(unsigned int cpu)
} }
#endif /* CONFIG_HOTPLUG_CPU */ #endif /* CONFIG_HOTPLUG_CPU */
int __devinit __cpu_up(unsigned int cpu) int __cpuinit __cpu_up(unsigned int cpu)
{ {
#ifdef CONFIG_HOTPLUG_CPU #ifdef CONFIG_HOTPLUG_CPU
int ret=0; int ret=0;
......
...@@ -45,7 +45,7 @@ static struct dmi_system_id __initdata bigsmp_dmi_table[] = { ...@@ -45,7 +45,7 @@ static struct dmi_system_id __initdata bigsmp_dmi_table[] = {
}; };
static __init int probe_bigsmp(void) static int probe_bigsmp(void)
{ {
if (def_to_bigsmp) if (def_to_bigsmp)
dmi_bigsmp = 1; dmi_bigsmp = 1;
......
...@@ -18,7 +18,7 @@ ...@@ -18,7 +18,7 @@
#include <asm/mach-default/mach_mpparse.h> #include <asm/mach-default/mach_mpparse.h>
/* should be called last. */ /* should be called last. */
static __init int probe_default(void) static int probe_default(void)
{ {
return 1; return 1;
} }
......
...@@ -19,7 +19,7 @@ ...@@ -19,7 +19,7 @@
#include <asm/mach-es7000/mach_mpparse.h> #include <asm/mach-es7000/mach_mpparse.h>
#include <asm/mach-es7000/mach_wakecpu.h> #include <asm/mach-es7000/mach_wakecpu.h>
static __init int probe_es7000(void) static int probe_es7000(void)
{ {
/* probed later in mptable/ACPI hooks */ /* probed later in mptable/ACPI hooks */
return 0; return 0;
......
...@@ -18,7 +18,7 @@ ...@@ -18,7 +18,7 @@
#include <asm/mach-summit/mach_ipi.h> #include <asm/mach-summit/mach_ipi.h>
#include <asm/mach-summit/mach_mpparse.h> #include <asm/mach-summit/mach_mpparse.h>
static __init int probe_summit(void) static int probe_summit(void)
{ {
/* probed later in mptable/ACPI hooks */ /* probed later in mptable/ACPI hooks */
return 0; return 0;
......
...@@ -283,7 +283,7 @@ void __init add_one_highpage_init(struct page *page, int pfn, int bad_ppro) ...@@ -283,7 +283,7 @@ void __init add_one_highpage_init(struct page *page, int pfn, int bad_ppro)
SetPageReserved(page); SetPageReserved(page);
} }
static int add_one_highpage_hotplug(struct page *page, unsigned long pfn) static int __meminit add_one_highpage_hotplug(struct page *page, unsigned long pfn)
{ {
free_new_highpage(page); free_new_highpage(page);
totalram_pages++; totalram_pages++;
...@@ -300,7 +300,7 @@ static int add_one_highpage_hotplug(struct page *page, unsigned long pfn) ...@@ -300,7 +300,7 @@ static int add_one_highpage_hotplug(struct page *page, unsigned long pfn)
* has been added dynamically that would be * has been added dynamically that would be
* onlined here is in HIGHMEM * onlined here is in HIGHMEM
*/ */
void online_page(struct page *page) void __meminit online_page(struct page *page)
{ {
ClearPageReserved(page); ClearPageReserved(page);
add_one_highpage_hotplug(page, page_to_pfn(page)); add_one_highpage_hotplug(page, page_to_pfn(page));
......
# #
# Automatically generated make config: don't edit # Automatically generated make config: don't edit
# Linux kernel version: 2.6.19-git14 # Linux kernel version: 2.6.20-rc3
# Sat Dec 9 21:23:09 2006 # Fri Jan 5 11:54:41 2007
# #
CONFIG_X86_64=y CONFIG_X86_64=y
CONFIG_64BIT=y CONFIG_64BIT=y
...@@ -1056,6 +1056,7 @@ CONFIG_HWMON=y ...@@ -1056,6 +1056,7 @@ CONFIG_HWMON=y
# CONFIG_SENSORS_LM92 is not set # CONFIG_SENSORS_LM92 is not set
# CONFIG_SENSORS_MAX1619 is not set # CONFIG_SENSORS_MAX1619 is not set
# CONFIG_SENSORS_PC87360 is not set # CONFIG_SENSORS_PC87360 is not set
# CONFIG_SENSORS_PC87427 is not set
# CONFIG_SENSORS_SIS5595 is not set # CONFIG_SENSORS_SIS5595 is not set
# CONFIG_SENSORS_SMSC47M1 is not set # CONFIG_SENSORS_SMSC47M1 is not set
# CONFIG_SENSORS_SMSC47M192 is not set # CONFIG_SENSORS_SMSC47M192 is not set
...@@ -1066,6 +1067,7 @@ CONFIG_SENSORS_SMSC47B397=m ...@@ -1066,6 +1067,7 @@ CONFIG_SENSORS_SMSC47B397=m
# CONFIG_SENSORS_W83781D is not set # CONFIG_SENSORS_W83781D is not set
# CONFIG_SENSORS_W83791D is not set # CONFIG_SENSORS_W83791D is not set
# CONFIG_SENSORS_W83792D is not set # CONFIG_SENSORS_W83792D is not set
# CONFIG_SENSORS_W83793 is not set
# CONFIG_SENSORS_W83L785TS is not set # CONFIG_SENSORS_W83L785TS is not set
# CONFIG_SENSORS_W83627HF is not set # CONFIG_SENSORS_W83627HF is not set
# CONFIG_SENSORS_W83627EHF is not set # CONFIG_SENSORS_W83627EHF is not set
...@@ -1310,6 +1312,11 @@ CONFIG_USB_MON=y ...@@ -1310,6 +1312,11 @@ CONFIG_USB_MON=y
# DMA Devices # DMA Devices
# #
#
# Virtualization
#
# CONFIG_KVM is not set
# #
# Firmware Drivers # Firmware Drivers
# #
...@@ -1502,6 +1509,8 @@ CONFIG_TRACE_IRQFLAGS_SUPPORT=y ...@@ -1502,6 +1509,8 @@ CONFIG_TRACE_IRQFLAGS_SUPPORT=y
# CONFIG_ENABLE_MUST_CHECK is not set # CONFIG_ENABLE_MUST_CHECK is not set
CONFIG_MAGIC_SYSRQ=y CONFIG_MAGIC_SYSRQ=y
CONFIG_UNUSED_SYMBOLS=y CONFIG_UNUSED_SYMBOLS=y
CONFIG_DEBUG_FS=y
# CONFIG_HEADERS_CHECK is not set
CONFIG_DEBUG_KERNEL=y CONFIG_DEBUG_KERNEL=y
CONFIG_LOG_BUF_SHIFT=18 CONFIG_LOG_BUF_SHIFT=18
CONFIG_DETECT_SOFTLOCKUP=y CONFIG_DETECT_SOFTLOCKUP=y
...@@ -1519,12 +1528,10 @@ CONFIG_DETECT_SOFTLOCKUP=y ...@@ -1519,12 +1528,10 @@ CONFIG_DETECT_SOFTLOCKUP=y
# CONFIG_DEBUG_KOBJECT is not set # CONFIG_DEBUG_KOBJECT is not set
CONFIG_DEBUG_BUGVERBOSE=y CONFIG_DEBUG_BUGVERBOSE=y
# CONFIG_DEBUG_INFO is not set # CONFIG_DEBUG_INFO is not set
CONFIG_DEBUG_FS=y
# CONFIG_DEBUG_VM is not set # CONFIG_DEBUG_VM is not set
# CONFIG_DEBUG_LIST is not set # CONFIG_DEBUG_LIST is not set
# CONFIG_FRAME_POINTER is not set # CONFIG_FRAME_POINTER is not set
# CONFIG_FORCED_INLINING is not set # CONFIG_FORCED_INLINING is not set
# CONFIG_HEADERS_CHECK is not set
# CONFIG_RCU_TORTURE_TEST is not set # CONFIG_RCU_TORTURE_TEST is not set
# CONFIG_LKDTM is not set # CONFIG_LKDTM is not set
# CONFIG_DEBUG_RODATA is not set # CONFIG_DEBUG_RODATA is not set
...@@ -1553,3 +1560,4 @@ CONFIG_CRC32=y ...@@ -1553,3 +1560,4 @@ CONFIG_CRC32=y
# CONFIG_LIBCRC32C is not set # CONFIG_LIBCRC32C is not set
CONFIG_ZLIB_INFLATE=y CONFIG_ZLIB_INFLATE=y
CONFIG_PLIST=y CONFIG_PLIST=y
CONFIG_IOMAP_COPY=y
...@@ -241,7 +241,7 @@ static u32 __user *create_aout_tables(char __user *p, struct linux_binprm *bprm) ...@@ -241,7 +241,7 @@ static u32 __user *create_aout_tables(char __user *p, struct linux_binprm *bprm)
get_user(c,p++); get_user(c,p++);
} while (c); } while (c);
} }
put_user(NULL,argv); put_user(0, argv);
current->mm->arg_end = current->mm->env_start = (unsigned long) p; current->mm->arg_end = current->mm->env_start = (unsigned long) p;
while (envc-->0) { while (envc-->0) {
char c; char c;
...@@ -250,7 +250,7 @@ static u32 __user *create_aout_tables(char __user *p, struct linux_binprm *bprm) ...@@ -250,7 +250,7 @@ static u32 __user *create_aout_tables(char __user *p, struct linux_binprm *bprm)
get_user(c,p++); get_user(c,p++);
} while (c); } while (c);
} }
put_user(NULL,envp); put_user(0, envp);
current->mm->env_end = (unsigned long) p; current->mm->env_end = (unsigned long) p;
return sp; return sp;
} }
......
...@@ -1068,6 +1068,8 @@ void __init detect_calgary(void) ...@@ -1068,6 +1068,8 @@ void __init detect_calgary(void)
if (!early_pci_allowed()) if (!early_pci_allowed())
return; return;
printk(KERN_DEBUG "Calgary: detecting Calgary via BIOS EBDA area\n");
ptr = (unsigned long)phys_to_virt(get_bios_ebda()); ptr = (unsigned long)phys_to_virt(get_bios_ebda());
rio_table_hdr = NULL; rio_table_hdr = NULL;
...@@ -1088,14 +1090,14 @@ void __init detect_calgary(void) ...@@ -1088,14 +1090,14 @@ void __init detect_calgary(void)
offset = *((unsigned short *)(ptr + offset)); offset = *((unsigned short *)(ptr + offset));
} }
if (!rio_table_hdr) { if (!rio_table_hdr) {
printk(KERN_ERR "Calgary: Unable to locate " printk(KERN_DEBUG "Calgary: Unable to locate Rio Grande table "
"Rio Grande Table in EBDA - bailing!\n"); "in EBDA - bailing!\n");
return; return;
} }
ret = build_detail_arrays(); ret = build_detail_arrays();
if (ret) { if (ret) {
printk(KERN_ERR "Calgary: build_detail_arrays ret %d\n", ret); printk(KERN_DEBUG "Calgary: build_detail_arrays ret %d\n", ret);
return; return;
} }
...@@ -1128,6 +1130,9 @@ void __init detect_calgary(void) ...@@ -1128,6 +1130,9 @@ void __init detect_calgary(void)
} }
} }
printk(KERN_DEBUG "Calgary: finished detection, Calgary %s\n",
calgary_found ? "found" : "not found");
if (calgary_found) { if (calgary_found) {
iommu_detected = 1; iommu_detected = 1;
calgary_detected = 1; calgary_detected = 1;
......
...@@ -656,6 +656,25 @@ core_initcall(cpufreq_tsc); ...@@ -656,6 +656,25 @@ core_initcall(cpufreq_tsc);
*/ */
#define TICK_COUNT 100000000 #define TICK_COUNT 100000000
#define TICK_MIN 5000
/*
* Some platforms take periodic SMI interrupts with 5ms duration. Make sure none
* occurs between the reads of the hpet & TSC.
*/
static void __init read_hpet_tsc(int *hpet, int *tsc)
{
int tsc1, tsc2, hpet1;
do {
tsc1 = get_cycles_sync();
hpet1 = hpet_readl(HPET_COUNTER);
tsc2 = get_cycles_sync();
} while (tsc2 - tsc1 > TICK_MIN);
*hpet = hpet1;
*tsc = tsc2;
}
static unsigned int __init hpet_calibrate_tsc(void) static unsigned int __init hpet_calibrate_tsc(void)
{ {
...@@ -666,13 +685,11 @@ static unsigned int __init hpet_calibrate_tsc(void) ...@@ -666,13 +685,11 @@ static unsigned int __init hpet_calibrate_tsc(void)
local_irq_save(flags); local_irq_save(flags);
local_irq_disable(); local_irq_disable();
hpet_start = hpet_readl(HPET_COUNTER); read_hpet_tsc(&hpet_start, &tsc_start);
rdtscl(tsc_start);
do { do {
local_irq_disable(); local_irq_disable();
hpet_now = hpet_readl(HPET_COUNTER); read_hpet_tsc(&hpet_now, &tsc_now);
tsc_now = get_cycles_sync();
local_irq_restore(flags); local_irq_restore(flags);
} while ((tsc_now - tsc_start) < TICK_COUNT && } while ((tsc_now - tsc_start) < TICK_COUNT &&
(hpet_now - hpet_start) < TICK_COUNT); (hpet_now - hpet_start) < TICK_COUNT);
......
...@@ -955,7 +955,7 @@ DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8237, k8t_sound_ho ...@@ -955,7 +955,7 @@ DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8237, k8t_sound_ho
* becomes necessary to do this tweak in two steps -- I've chosen the Host * becomes necessary to do this tweak in two steps -- I've chosen the Host
* bridge as trigger. * bridge as trigger.
*/ */
static int __initdata asus_hides_smbus; static int asus_hides_smbus;
static void __init asus_hides_smbus_hostbridge(struct pci_dev *dev) static void __init asus_hides_smbus_hostbridge(struct pci_dev *dev)
{ {
......
...@@ -2296,7 +2296,7 @@ serial8250_console_write(struct console *co, const char *s, unsigned int count) ...@@ -2296,7 +2296,7 @@ serial8250_console_write(struct console *co, const char *s, unsigned int count)
local_irq_restore(flags); local_irq_restore(flags);
} }
static int serial8250_console_setup(struct console *co, char *options) static int __init serial8250_console_setup(struct console *co, char *options)
{ {
struct uart_port *port; struct uart_port *port;
int baud = 9600; int baud = 9600;
......
...@@ -7,7 +7,13 @@ ...@@ -7,7 +7,13 @@
#include <asm/alternative.h> #include <asm/alternative.h>
#define ADDR (*(volatile long *) addr) #if __GNUC__ < 4 || __GNUC_MINOR__ < 1
/* Technically wrong, but this avoids compilation errors on some gcc
versions. */
#define ADDR "=m" (*(volatile long *) addr)
#else
#define ADDR "+m" (*(volatile long *) addr)
#endif
/** /**
* set_bit - Atomically set a bit in memory * set_bit - Atomically set a bit in memory
...@@ -23,7 +29,7 @@ static __inline__ void set_bit(int nr, volatile void * addr) ...@@ -23,7 +29,7 @@ static __inline__ void set_bit(int nr, volatile void * addr)
{ {
__asm__ __volatile__( LOCK_PREFIX __asm__ __volatile__( LOCK_PREFIX
"btsl %1,%0" "btsl %1,%0"
:"+m" (ADDR) :ADDR
:"dIr" (nr) : "memory"); :"dIr" (nr) : "memory");
} }
...@@ -40,7 +46,7 @@ static __inline__ void __set_bit(int nr, volatile void * addr) ...@@ -40,7 +46,7 @@ static __inline__ void __set_bit(int nr, volatile void * addr)
{ {
__asm__ volatile( __asm__ volatile(
"btsl %1,%0" "btsl %1,%0"
:"+m" (ADDR) :ADDR
:"dIr" (nr) : "memory"); :"dIr" (nr) : "memory");
} }
...@@ -58,7 +64,7 @@ static __inline__ void clear_bit(int nr, volatile void * addr) ...@@ -58,7 +64,7 @@ static __inline__ void clear_bit(int nr, volatile void * addr)
{ {
__asm__ __volatile__( LOCK_PREFIX __asm__ __volatile__( LOCK_PREFIX
"btrl %1,%0" "btrl %1,%0"
:"+m" (ADDR) :ADDR
:"dIr" (nr)); :"dIr" (nr));
} }
...@@ -66,7 +72,7 @@ static __inline__ void __clear_bit(int nr, volatile void * addr) ...@@ -66,7 +72,7 @@ static __inline__ void __clear_bit(int nr, volatile void * addr)
{ {
__asm__ __volatile__( __asm__ __volatile__(
"btrl %1,%0" "btrl %1,%0"
:"+m" (ADDR) :ADDR
:"dIr" (nr)); :"dIr" (nr));
} }
...@@ -86,7 +92,7 @@ static __inline__ void __change_bit(int nr, volatile void * addr) ...@@ -86,7 +92,7 @@ static __inline__ void __change_bit(int nr, volatile void * addr)
{ {
__asm__ __volatile__( __asm__ __volatile__(
"btcl %1,%0" "btcl %1,%0"
:"+m" (ADDR) :ADDR
:"dIr" (nr)); :"dIr" (nr));
} }
...@@ -103,7 +109,7 @@ static __inline__ void change_bit(int nr, volatile void * addr) ...@@ -103,7 +109,7 @@ static __inline__ void change_bit(int nr, volatile void * addr)
{ {
__asm__ __volatile__( LOCK_PREFIX __asm__ __volatile__( LOCK_PREFIX
"btcl %1,%0" "btcl %1,%0"
:"+m" (ADDR) :ADDR
:"dIr" (nr)); :"dIr" (nr));
} }
...@@ -121,7 +127,7 @@ static __inline__ int test_and_set_bit(int nr, volatile void * addr) ...@@ -121,7 +127,7 @@ static __inline__ int test_and_set_bit(int nr, volatile void * addr)
__asm__ __volatile__( LOCK_PREFIX __asm__ __volatile__( LOCK_PREFIX
"btsl %2,%1\n\tsbbl %0,%0" "btsl %2,%1\n\tsbbl %0,%0"
:"=r" (oldbit),"+m" (ADDR) :"=r" (oldbit),ADDR
:"dIr" (nr) : "memory"); :"dIr" (nr) : "memory");
return oldbit; return oldbit;
} }
...@@ -141,7 +147,7 @@ static __inline__ int __test_and_set_bit(int nr, volatile void * addr) ...@@ -141,7 +147,7 @@ static __inline__ int __test_and_set_bit(int nr, volatile void * addr)
__asm__( __asm__(
"btsl %2,%1\n\tsbbl %0,%0" "btsl %2,%1\n\tsbbl %0,%0"
:"=r" (oldbit),"+m" (ADDR) :"=r" (oldbit),ADDR
:"dIr" (nr)); :"dIr" (nr));
return oldbit; return oldbit;
} }
...@@ -160,7 +166,7 @@ static __inline__ int test_and_clear_bit(int nr, volatile void * addr) ...@@ -160,7 +166,7 @@ static __inline__ int test_and_clear_bit(int nr, volatile void * addr)
__asm__ __volatile__( LOCK_PREFIX __asm__ __volatile__( LOCK_PREFIX
"btrl %2,%1\n\tsbbl %0,%0" "btrl %2,%1\n\tsbbl %0,%0"
:"=r" (oldbit),"+m" (ADDR) :"=r" (oldbit),ADDR
:"dIr" (nr) : "memory"); :"dIr" (nr) : "memory");
return oldbit; return oldbit;
} }
...@@ -180,7 +186,7 @@ static __inline__ int __test_and_clear_bit(int nr, volatile void * addr) ...@@ -180,7 +186,7 @@ static __inline__ int __test_and_clear_bit(int nr, volatile void * addr)
__asm__( __asm__(
"btrl %2,%1\n\tsbbl %0,%0" "btrl %2,%1\n\tsbbl %0,%0"
:"=r" (oldbit),"+m" (ADDR) :"=r" (oldbit),ADDR
:"dIr" (nr)); :"dIr" (nr));
return oldbit; return oldbit;
} }
...@@ -192,7 +198,7 @@ static __inline__ int __test_and_change_bit(int nr, volatile void * addr) ...@@ -192,7 +198,7 @@ static __inline__ int __test_and_change_bit(int nr, volatile void * addr)
__asm__ __volatile__( __asm__ __volatile__(
"btcl %2,%1\n\tsbbl %0,%0" "btcl %2,%1\n\tsbbl %0,%0"
:"=r" (oldbit),"+m" (ADDR) :"=r" (oldbit),ADDR
:"dIr" (nr) : "memory"); :"dIr" (nr) : "memory");
return oldbit; return oldbit;
} }
...@@ -211,7 +217,7 @@ static __inline__ int test_and_change_bit(int nr, volatile void * addr) ...@@ -211,7 +217,7 @@ static __inline__ int test_and_change_bit(int nr, volatile void * addr)
__asm__ __volatile__( LOCK_PREFIX __asm__ __volatile__( LOCK_PREFIX
"btcl %2,%1\n\tsbbl %0,%0" "btcl %2,%1\n\tsbbl %0,%0"
:"=r" (oldbit),"+m" (ADDR) :"=r" (oldbit),ADDR
:"dIr" (nr) : "memory"); :"dIr" (nr) : "memory");
return oldbit; return oldbit;
} }
...@@ -237,7 +243,7 @@ static __inline__ int variable_test_bit(int nr, volatile const void * addr) ...@@ -237,7 +243,7 @@ static __inline__ int variable_test_bit(int nr, volatile const void * addr)
__asm__ __volatile__( __asm__ __volatile__(
"btl %2,%1\n\tsbbl %0,%0" "btl %2,%1\n\tsbbl %0,%0"
:"=r" (oldbit) :"=r" (oldbit)
:"m" (ADDR),"dIr" (nr)); :"m" (*(volatile long *)addr),"dIr" (nr));
return oldbit; return oldbit;
} }
......
...@@ -695,7 +695,7 @@ static void __init do_basic_setup(void) ...@@ -695,7 +695,7 @@ static void __init do_basic_setup(void)
do_initcalls(); do_initcalls();
} }
static void do_pre_smp_initcalls(void) static void __init do_pre_smp_initcalls(void)
{ {
extern int spawn_ksoftirqd(void); extern int spawn_ksoftirqd(void);
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
......
...@@ -176,7 +176,7 @@ void note_interrupt(unsigned int irq, struct irq_desc *desc, ...@@ -176,7 +176,7 @@ void note_interrupt(unsigned int irq, struct irq_desc *desc,
int noirqdebug __read_mostly; int noirqdebug __read_mostly;
int __init noirqdebug_setup(char *str) int noirqdebug_setup(char *str)
{ {
noirqdebug = 1; noirqdebug = 1;
printk(KERN_INFO "IRQ lockup detection disabled\n"); printk(KERN_INFO "IRQ lockup detection disabled\n");
......
...@@ -582,9 +582,19 @@ static int strrcmp(const char *s, const char *sub) ...@@ -582,9 +582,19 @@ static int strrcmp(const char *s, const char *sub)
* tosec = .init.text | .exit.text | .init.data * tosec = .init.text | .exit.text | .init.data
* fromsec = .data * fromsec = .data
* atsym = *driver, *_template, *_sht, *_ops, *_probe, *probe_one * atsym = *driver, *_template, *_sht, *_ops, *_probe, *probe_one
*
* Pattern 3:
* Some symbols belong to init section but still it is ok to reference
* these from non-init sections as these symbols don't have any memory
* allocated for them and symbol address and value are same. So even
* if init section is freed, its ok to reference those symbols.
* For ex. symbols marking the init section boundaries.
* This pattern is identified by
* refsymname = __init_begin, _sinittext, _einittext
**/ **/
static int secref_whitelist(const char *modname, const char *tosec, static int secref_whitelist(const char *modname, const char *tosec,
const char *fromsec, const char *atsym) const char *fromsec, const char *atsym,
const char *refsymname)
{ {
int f1 = 1, f2 = 1; int f1 = 1, f2 = 1;
const char **s; const char **s;
...@@ -595,6 +605,14 @@ static int secref_whitelist(const char *modname, const char *tosec, ...@@ -595,6 +605,14 @@ static int secref_whitelist(const char *modname, const char *tosec,
"_ops", "_ops",
"_probe", "_probe",
"_probe_one", "_probe_one",
"_console",
NULL
};
const char *pat3refsym[] = {
"__init_begin",
"_sinittext",
"_einittext",
NULL NULL
}; };
...@@ -628,6 +646,11 @@ static int secref_whitelist(const char *modname, const char *tosec, ...@@ -628,6 +646,11 @@ static int secref_whitelist(const char *modname, const char *tosec,
if ((strcmp(fromsec, ".pci_fixup") == 0) && if ((strcmp(fromsec, ".pci_fixup") == 0) &&
(strcmp(tosec, ".init.text") == 0)) (strcmp(tosec, ".init.text") == 0))
return 1; return 1;
/* Check for pattern 3 */
for (s = pat3refsym; *s; s++)
if (strcmp(refsymname, *s) == 0)
return 1;
} }
return 0; return 0;
} }
...@@ -737,7 +760,7 @@ static void warn_sec_mismatch(const char *modname, const char *fromsec, ...@@ -737,7 +760,7 @@ static void warn_sec_mismatch(const char *modname, const char *fromsec,
/* check whitelist - we may ignore it */ /* check whitelist - we may ignore it */
if (before && if (before &&
secref_whitelist(modname, secname, fromsec, secref_whitelist(modname, secname, fromsec,
elf->strtab + before->st_name)) elf->strtab + before->st_name, refsymname))
return; return;
if (before && after) { if (before && after) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment