Commit a7f5aaf3 authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'x86-fixes-for-linus' of...

Merge branch 'x86-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip

* 'x86-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip:
  x86: fix build warnings in real mode code
  x86, calgary: fix section mismatch warning - get_tce_space_from_tar
  x86: silence section mismatch warning - get_local_pda
  x86, percpu: silence section mismatch warnings related to EARLY_PER_CPU variables
  x86: fix i486 suspend to disk CR4 oops
  x86: mpparse.c: fix section mismatch warning
  x86: mmconf: fix section mismatch warning
  x86: fix MP_processor_info section mismatch warning
  x86, tsc: fix section mismatch warning
  x86: correct register constraints for 64-bit atomic operations
parents bba59525 1b72691c
...@@ -30,6 +30,8 @@ ...@@ -30,6 +30,8 @@
/* Useful macros */ /* Useful macros */
#define BUILD_BUG_ON(condition) ((void)sizeof(char[1 - 2*!!(condition)])) #define BUILD_BUG_ON(condition) ((void)sizeof(char[1 - 2*!!(condition)]))
#define ARRAY_SIZE(x) (sizeof(x) / sizeof(*(x)))
extern struct setup_header hdr; extern struct setup_header hdr;
extern struct boot_params boot_params; extern struct boot_params boot_params;
......
...@@ -13,7 +13,6 @@ ...@@ -13,7 +13,6 @@
*/ */
#include "boot.h" #include "boot.h"
#include <linux/kernel.h>
#define SMAP 0x534d4150 /* ASCII "SMAP" */ #define SMAP 0x534d4150 /* ASCII "SMAP" */
......
...@@ -86,7 +86,7 @@ int acpi_save_state_mem(void) ...@@ -86,7 +86,7 @@ int acpi_save_state_mem(void)
#endif /* !CONFIG_64BIT */ #endif /* !CONFIG_64BIT */
header->pmode_cr0 = read_cr0(); header->pmode_cr0 = read_cr0();
header->pmode_cr4 = read_cr4(); header->pmode_cr4 = read_cr4_safe();
header->realmode_flags = acpi_realmode_flags; header->realmode_flags = acpi_realmode_flags;
header->real_magic = 0x12345678; header->real_magic = 0x12345678;
......
...@@ -53,7 +53,7 @@ void efi_call_phys_prelog(void) ...@@ -53,7 +53,7 @@ void efi_call_phys_prelog(void)
* directory. If I have PAE, I just need to duplicate one entry in * directory. If I have PAE, I just need to duplicate one entry in
* page directory. * page directory.
*/ */
cr4 = read_cr4(); cr4 = read_cr4_safe();
if (cr4 & X86_CR4_PAE) { if (cr4 & X86_CR4_PAE) {
efi_bak_pg_dir_pointer[0].pgd = efi_bak_pg_dir_pointer[0].pgd =
...@@ -91,7 +91,7 @@ void efi_call_phys_epilog(void) ...@@ -91,7 +91,7 @@ void efi_call_phys_epilog(void)
gdt_descr.size = GDT_SIZE - 1; gdt_descr.size = GDT_SIZE - 1;
load_gdt(&gdt_descr); load_gdt(&gdt_descr);
cr4 = read_cr4(); cr4 = read_cr4_safe();
if (cr4 & X86_CR4_PAE) { if (cr4 & X86_CR4_PAE) {
swapper_pg_dir[pgd_index(0)].pgd = swapper_pg_dir[pgd_index(0)].pgd =
......
...@@ -238,7 +238,7 @@ static struct dmi_system_id __devinitdata mmconf_dmi_table[] = { ...@@ -238,7 +238,7 @@ static struct dmi_system_id __devinitdata mmconf_dmi_table[] = {
{} {}
}; };
void __init check_enable_amd_mmconf_dmi(void) void __cpuinit check_enable_amd_mmconf_dmi(void)
{ {
dmi_check_system(mmconf_dmi_table); dmi_check_system(mmconf_dmi_table);
} }
...@@ -49,7 +49,7 @@ static int __init mpf_checksum(unsigned char *mp, int len) ...@@ -49,7 +49,7 @@ static int __init mpf_checksum(unsigned char *mp, int len)
return sum & 0xFF; return sum & 0xFF;
} }
static void __cpuinit MP_processor_info(struct mpc_config_processor *m) static void __init MP_processor_info(struct mpc_config_processor *m)
{ {
int apicid; int apicid;
char *bootup_cpu = ""; char *bootup_cpu = "";
...@@ -484,7 +484,7 @@ static void __init construct_default_ioirq_mptable(int mpc_default_type) ...@@ -484,7 +484,7 @@ static void __init construct_default_ioirq_mptable(int mpc_default_type)
} }
static void construct_ioapic_table(int mpc_default_type) static void __init construct_ioapic_table(int mpc_default_type)
{ {
struct mpc_config_ioapic ioapic; struct mpc_config_ioapic ioapic;
struct mpc_config_bus bus; struct mpc_config_bus bus;
...@@ -529,7 +529,7 @@ static void construct_ioapic_table(int mpc_default_type) ...@@ -529,7 +529,7 @@ static void construct_ioapic_table(int mpc_default_type)
construct_default_ioirq_mptable(mpc_default_type); construct_default_ioirq_mptable(mpc_default_type);
} }
#else #else
static inline void construct_ioapic_table(int mpc_default_type) { } static inline void __init construct_ioapic_table(int mpc_default_type) { }
#endif #endif
static inline void __init construct_default_ISA_mptable(int mpc_default_type) static inline void __init construct_default_ISA_mptable(int mpc_default_type)
......
...@@ -1350,7 +1350,7 @@ static void calgary_init_bitmap_from_tce_table(struct iommu_table *tbl) ...@@ -1350,7 +1350,7 @@ static void calgary_init_bitmap_from_tce_table(struct iommu_table *tbl)
* Function for kdump case. Get the tce tables from first kernel * Function for kdump case. Get the tce tables from first kernel
* by reading the contents of the base adress register of calgary iommu * by reading the contents of the base adress register of calgary iommu
*/ */
static void get_tce_space_from_tar(void) static void __init get_tce_space_from_tar(void)
{ {
int bus; int bus;
void __iomem *target; void __iomem *target;
......
...@@ -756,6 +756,14 @@ static void __cpuinit do_fork_idle(struct work_struct *work) ...@@ -756,6 +756,14 @@ static void __cpuinit do_fork_idle(struct work_struct *work)
} }
#ifdef CONFIG_X86_64 #ifdef CONFIG_X86_64
/* __ref because it's safe to call free_bootmem when after_bootmem == 0. */
static void __ref free_bootmem_pda(struct x8664_pda *oldpda)
{
if (!after_bootmem)
free_bootmem((unsigned long)oldpda, sizeof(*oldpda));
}
/* /*
* Allocate node local memory for the AP pda. * Allocate node local memory for the AP pda.
* *
...@@ -784,8 +792,7 @@ int __cpuinit get_local_pda(int cpu) ...@@ -784,8 +792,7 @@ int __cpuinit get_local_pda(int cpu)
if (oldpda) { if (oldpda) {
memcpy(newpda, oldpda, size); memcpy(newpda, oldpda, size);
if (!after_bootmem) free_bootmem_pda(oldpda);
free_bootmem((unsigned long)oldpda, size);
} }
newpda->in_bootmem = 0; newpda->in_bootmem = 0;
......
...@@ -104,7 +104,7 @@ __setup("notsc", notsc_setup); ...@@ -104,7 +104,7 @@ __setup("notsc", notsc_setup);
/* /*
* Read TSC and the reference counters. Take care of SMI disturbance * Read TSC and the reference counters. Take care of SMI disturbance
*/ */
static u64 __init tsc_read_refs(u64 *pm, u64 *hpet) static u64 tsc_read_refs(u64 *pm, u64 *hpet)
{ {
u64 t1, t2; u64 t1, t2;
int i; int i;
......
...@@ -45,7 +45,7 @@ static void __save_processor_state(struct saved_context *ctxt) ...@@ -45,7 +45,7 @@ static void __save_processor_state(struct saved_context *ctxt)
ctxt->cr0 = read_cr0(); ctxt->cr0 = read_cr0();
ctxt->cr2 = read_cr2(); ctxt->cr2 = read_cr2();
ctxt->cr3 = read_cr3(); ctxt->cr3 = read_cr3();
ctxt->cr4 = read_cr4(); ctxt->cr4 = read_cr4_safe();
} }
/* Needed by apm.c */ /* Needed by apm.c */
...@@ -98,6 +98,8 @@ static void __restore_processor_state(struct saved_context *ctxt) ...@@ -98,6 +98,8 @@ static void __restore_processor_state(struct saved_context *ctxt)
/* /*
* control registers * control registers
*/ */
/* cr4 was introduced in the Pentium CPU */
if (ctxt->cr4)
write_cr4(ctxt->cr4); write_cr4(ctxt->cr4);
write_cr3(ctxt->cr3); write_cr3(ctxt->cr3);
write_cr2(ctxt->cr2); write_cr2(ctxt->cr2);
......
...@@ -28,9 +28,9 @@ ENTRY(swsusp_arch_suspend) ...@@ -28,9 +28,9 @@ ENTRY(swsusp_arch_suspend)
ret ret
ENTRY(restore_image) ENTRY(restore_image)
movl resume_pg_dir, %ecx movl resume_pg_dir, %eax
subl $__PAGE_OFFSET, %ecx subl $__PAGE_OFFSET, %eax
movl %ecx, %cr3 movl %eax, %cr3
movl restore_pblist, %edx movl restore_pblist, %edx
.p2align 4,,7 .p2align 4,,7
...@@ -52,17 +52,21 @@ copy_loop: ...@@ -52,17 +52,21 @@ copy_loop:
done: done:
/* go back to the original page tables */ /* go back to the original page tables */
movl $swapper_pg_dir, %ecx movl $swapper_pg_dir, %eax
subl $__PAGE_OFFSET, %ecx subl $__PAGE_OFFSET, %eax
movl %ecx, %cr3 movl %eax, %cr3
/* Flush TLB, including "global" things (vmalloc) */ /* Flush TLB, including "global" things (vmalloc) */
movl mmu_cr4_features, %eax movl mmu_cr4_features, %ecx
movl %eax, %edx jecxz 1f # cr4 Pentium and higher, skip if zero
movl %ecx, %edx
andl $~(1<<7), %edx; # PGE andl $~(1<<7), %edx; # PGE
movl %edx, %cr4; # turn off PGE movl %edx, %cr4; # turn off PGE
movl %cr3, %ecx; # flush TLB 1:
movl %ecx, %cr3 movl %cr3, %eax; # flush TLB
movl %eax, %cr4; # turn PGE back on movl %eax, %cr3
jecxz 1f # cr4 Pentium and higher, skip if zero
movl %ecx, %cr4; # turn PGE back on
1:
movl saved_context_esp, %esp movl saved_context_esp, %esp
movl saved_context_ebp, %ebp movl saved_context_ebp, %ebp
......
...@@ -228,7 +228,7 @@ static inline void atomic64_add(long i, atomic64_t *v) ...@@ -228,7 +228,7 @@ static inline void atomic64_add(long i, atomic64_t *v)
{ {
asm volatile(LOCK_PREFIX "addq %1,%0" asm volatile(LOCK_PREFIX "addq %1,%0"
: "=m" (v->counter) : "=m" (v->counter)
: "ir" (i), "m" (v->counter)); : "er" (i), "m" (v->counter));
} }
/** /**
...@@ -242,7 +242,7 @@ static inline void atomic64_sub(long i, atomic64_t *v) ...@@ -242,7 +242,7 @@ static inline void atomic64_sub(long i, atomic64_t *v)
{ {
asm volatile(LOCK_PREFIX "subq %1,%0" asm volatile(LOCK_PREFIX "subq %1,%0"
: "=m" (v->counter) : "=m" (v->counter)
: "ir" (i), "m" (v->counter)); : "er" (i), "m" (v->counter));
} }
/** /**
...@@ -260,7 +260,7 @@ static inline int atomic64_sub_and_test(long i, atomic64_t *v) ...@@ -260,7 +260,7 @@ static inline int atomic64_sub_and_test(long i, atomic64_t *v)
asm volatile(LOCK_PREFIX "subq %2,%0; sete %1" asm volatile(LOCK_PREFIX "subq %2,%0; sete %1"
: "=m" (v->counter), "=qm" (c) : "=m" (v->counter), "=qm" (c)
: "ir" (i), "m" (v->counter) : "memory"); : "er" (i), "m" (v->counter) : "memory");
return c; return c;
} }
...@@ -341,7 +341,7 @@ static inline int atomic64_add_negative(long i, atomic64_t *v) ...@@ -341,7 +341,7 @@ static inline int atomic64_add_negative(long i, atomic64_t *v)
asm volatile(LOCK_PREFIX "addq %2,%0; sets %1" asm volatile(LOCK_PREFIX "addq %2,%0; sets %1"
: "=m" (v->counter), "=qm" (c) : "=m" (v->counter), "=qm" (c)
: "ir" (i), "m" (v->counter) : "memory"); : "er" (i), "m" (v->counter) : "memory");
return c; return c;
} }
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
#ifdef CONFIG_PCI_MMCONFIG #ifdef CONFIG_PCI_MMCONFIG
extern void __cpuinit fam10h_check_enable_mmcfg(void); extern void __cpuinit fam10h_check_enable_mmcfg(void);
extern void __init check_enable_amd_mmconf_dmi(void); extern void __cpuinit check_enable_amd_mmconf_dmi(void);
#else #else
static inline void fam10h_check_enable_mmcfg(void) { } static inline void fam10h_check_enable_mmcfg(void) { }
static inline void check_enable_amd_mmconf_dmi(void) { } static inline void check_enable_amd_mmconf_dmi(void) { }
......
...@@ -182,7 +182,7 @@ do { \ ...@@ -182,7 +182,7 @@ do { \
DEFINE_PER_CPU(_type, _name) = _initvalue; \ DEFINE_PER_CPU(_type, _name) = _initvalue; \
__typeof__(_type) _name##_early_map[NR_CPUS] __initdata = \ __typeof__(_type) _name##_early_map[NR_CPUS] __initdata = \
{ [0 ... NR_CPUS-1] = _initvalue }; \ { [0 ... NR_CPUS-1] = _initvalue }; \
__typeof__(_type) *_name##_early_ptr = _name##_early_map __typeof__(_type) *_name##_early_ptr __refdata = _name##_early_map
#define EXPORT_EARLY_PER_CPU_SYMBOL(_name) \ #define EXPORT_EARLY_PER_CPU_SYMBOL(_name) \
EXPORT_PER_CPU_SYMBOL(_name) EXPORT_PER_CPU_SYMBOL(_name)
......
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