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: user_regset_view table fix for ia32 on 64-bit x86: arch/x86/mm/pat.c - fix warning x86: fix csum_partial() export x86: early_init_centaur(): use set_cpu_cap() x86: fix app crashes after SMP resume x86: wakeup.lds.S - section ordering fix x86: [VOYAGER] fix duplicate phys_cpu_present_map symbol x86/pci: fix broken ISA DMA
This commit is contained in:
Коммит
4ef7e3e90f
|
@ -12,11 +12,6 @@ ENTRY(_start)
|
||||||
|
|
||||||
SECTIONS
|
SECTIONS
|
||||||
{
|
{
|
||||||
. = HEADER_OFFSET;
|
|
||||||
.header : {
|
|
||||||
*(.header)
|
|
||||||
}
|
|
||||||
|
|
||||||
. = 0;
|
. = 0;
|
||||||
.text : {
|
.text : {
|
||||||
*(.text*)
|
*(.text*)
|
||||||
|
@ -50,6 +45,11 @@ SECTIONS
|
||||||
__bss_end = .;
|
__bss_end = .;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
. = HEADER_OFFSET;
|
||||||
|
.header : {
|
||||||
|
*(.header)
|
||||||
|
}
|
||||||
|
|
||||||
. = ALIGN(16);
|
. = ALIGN(16);
|
||||||
_end = .;
|
_end = .;
|
||||||
|
|
||||||
|
|
|
@ -1303,6 +1303,9 @@ static const struct user_regset_view user_x86_64_view = {
|
||||||
#define genregs32_get genregs_get
|
#define genregs32_get genregs_get
|
||||||
#define genregs32_set genregs_set
|
#define genregs32_set genregs_set
|
||||||
|
|
||||||
|
#define user_i387_ia32_struct user_i387_struct
|
||||||
|
#define user32_fxsr_struct user_fxsr_struct
|
||||||
|
|
||||||
#endif /* CONFIG_X86_64 */
|
#endif /* CONFIG_X86_64 */
|
||||||
|
|
||||||
#if defined CONFIG_X86_32 || defined CONFIG_IA32_EMULATION
|
#if defined CONFIG_X86_32 || defined CONFIG_IA32_EMULATION
|
||||||
|
@ -1315,13 +1318,13 @@ static const struct user_regset x86_32_regsets[] = {
|
||||||
},
|
},
|
||||||
[REGSET_FP] = {
|
[REGSET_FP] = {
|
||||||
.core_note_type = NT_PRFPREG,
|
.core_note_type = NT_PRFPREG,
|
||||||
.n = sizeof(struct user_i387_struct) / sizeof(u32),
|
.n = sizeof(struct user_i387_ia32_struct) / sizeof(u32),
|
||||||
.size = sizeof(u32), .align = sizeof(u32),
|
.size = sizeof(u32), .align = sizeof(u32),
|
||||||
.active = fpregs_active, .get = fpregs_get, .set = fpregs_set
|
.active = fpregs_active, .get = fpregs_get, .set = fpregs_set
|
||||||
},
|
},
|
||||||
[REGSET_XFP] = {
|
[REGSET_XFP] = {
|
||||||
.core_note_type = NT_PRXFPREG,
|
.core_note_type = NT_PRXFPREG,
|
||||||
.n = sizeof(struct user_i387_struct) / sizeof(u32),
|
.n = sizeof(struct user32_fxsr_struct) / sizeof(u32),
|
||||||
.size = sizeof(u32), .align = sizeof(u32),
|
.size = sizeof(u32), .align = sizeof(u32),
|
||||||
.active = xfpregs_active, .get = xfpregs_get, .set = xfpregs_set
|
.active = xfpregs_active, .get = xfpregs_get, .set = xfpregs_set
|
||||||
},
|
},
|
||||||
|
|
|
@ -12,6 +12,7 @@
|
||||||
#include <asm/mpspec.h>
|
#include <asm/mpspec.h>
|
||||||
#include <asm/apicdef.h>
|
#include <asm/apicdef.h>
|
||||||
|
|
||||||
|
#ifdef CONFIG_X86_LOCAL_APIC
|
||||||
unsigned int num_processors;
|
unsigned int num_processors;
|
||||||
unsigned disabled_cpus __cpuinitdata;
|
unsigned disabled_cpus __cpuinitdata;
|
||||||
/* Processor that is doing the boot up */
|
/* Processor that is doing the boot up */
|
||||||
|
@ -23,8 +24,9 @@ EXPORT_PER_CPU_SYMBOL(x86_cpu_to_apicid);
|
||||||
|
|
||||||
/* Bitmask of physically existing CPUs */
|
/* Bitmask of physically existing CPUs */
|
||||||
physid_mask_t phys_cpu_present_map;
|
physid_mask_t phys_cpu_present_map;
|
||||||
|
#endif
|
||||||
|
|
||||||
#if defined(CONFIG_HAVE_SETUP_PER_CPU_AREA) && defined(CONFIG_SMP)
|
#if defined(CONFIG_HAVE_SETUP_PER_CPU_AREA) && defined(CONFIG_X86_SMP)
|
||||||
/*
|
/*
|
||||||
* Copy data used in early init routines from the initial arrays to the
|
* Copy data used in early init routines from the initial arrays to the
|
||||||
* per cpu data areas. These arrays then become expendable and the
|
* per cpu data areas. These arrays then become expendable and the
|
||||||
|
|
|
@ -951,7 +951,7 @@ static void __cpuinit init_intel(struct cpuinfo_x86 *c)
|
||||||
static void __cpuinit early_init_centaur(struct cpuinfo_x86 *c)
|
static void __cpuinit early_init_centaur(struct cpuinfo_x86 *c)
|
||||||
{
|
{
|
||||||
if (c->x86 == 0x6 && c->x86_model >= 0xf)
|
if (c->x86 == 0x6 && c->x86_model >= 0xf)
|
||||||
set_bit(X86_FEATURE_CONSTANT_TSC, &c->x86_capability);
|
set_cpu_cap(c, X86_FEATURE_CONSTANT_TSC);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __cpuinit init_centaur(struct cpuinfo_x86 *c)
|
static void __cpuinit init_centaur(struct cpuinfo_x86 *c)
|
||||||
|
|
|
@ -231,7 +231,8 @@ native_smp_call_function_mask(cpumask_t mask,
|
||||||
wmb();
|
wmb();
|
||||||
|
|
||||||
/* Send a message to other CPUs */
|
/* Send a message to other CPUs */
|
||||||
if (cpus_equal(mask, allbutself))
|
if (cpus_equal(mask, allbutself) &&
|
||||||
|
cpus_equal(cpu_online_map, cpu_callout_map))
|
||||||
send_IPI_allbutself(CALL_FUNCTION_VECTOR);
|
send_IPI_allbutself(CALL_FUNCTION_VECTOR);
|
||||||
else
|
else
|
||||||
send_IPI_mask(mask, CALL_FUNCTION_VECTOR);
|
send_IPI_mask(mask, CALL_FUNCTION_VECTOR);
|
||||||
|
|
|
@ -86,6 +86,7 @@ void *x86_bios_cpu_apicid_early_ptr;
|
||||||
|
|
||||||
#ifdef CONFIG_X86_32
|
#ifdef CONFIG_X86_32
|
||||||
u8 apicid_2_node[MAX_APICID];
|
u8 apicid_2_node[MAX_APICID];
|
||||||
|
static int low_mappings;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* State of each CPU */
|
/* State of each CPU */
|
||||||
|
@ -326,6 +327,12 @@ static void __cpuinit start_secondary(void *unused)
|
||||||
enable_8259A_irq(0);
|
enable_8259A_irq(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_X86_32
|
||||||
|
while (low_mappings)
|
||||||
|
cpu_relax();
|
||||||
|
__flush_tlb_all();
|
||||||
|
#endif
|
||||||
|
|
||||||
/* This must be done before setting cpu_online_map */
|
/* This must be done before setting cpu_online_map */
|
||||||
set_cpu_sibling_map(raw_smp_processor_id());
|
set_cpu_sibling_map(raw_smp_processor_id());
|
||||||
wmb();
|
wmb();
|
||||||
|
@ -1040,14 +1047,20 @@ int __cpuinit native_cpu_up(unsigned int cpu)
|
||||||
#ifdef CONFIG_X86_32
|
#ifdef CONFIG_X86_32
|
||||||
/* init low mem mapping */
|
/* init low mem mapping */
|
||||||
clone_pgd_range(swapper_pg_dir, swapper_pg_dir + KERNEL_PGD_BOUNDARY,
|
clone_pgd_range(swapper_pg_dir, swapper_pg_dir + KERNEL_PGD_BOUNDARY,
|
||||||
min_t(unsigned long, KERNEL_PGD_PTRS, KERNEL_PGD_BOUNDARY));
|
min_t(unsigned long, KERNEL_PGD_PTRS, KERNEL_PGD_BOUNDARY));
|
||||||
flush_tlb_all();
|
flush_tlb_all();
|
||||||
#endif
|
low_mappings = 1;
|
||||||
|
|
||||||
err = do_boot_cpu(apicid, cpu);
|
err = do_boot_cpu(apicid, cpu);
|
||||||
if (err < 0) {
|
|
||||||
|
zap_low_mappings();
|
||||||
|
low_mappings = 0;
|
||||||
|
#else
|
||||||
|
err = do_boot_cpu(apicid, cpu);
|
||||||
|
#endif
|
||||||
|
if (err) {
|
||||||
Dprintk("do_boot_cpu failed %d\n", err);
|
Dprintk("do_boot_cpu failed %d\n", err);
|
||||||
return err;
|
return -EIO;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -1259,9 +1272,6 @@ void __init native_smp_cpus_done(unsigned int max_cpus)
|
||||||
setup_ioapic_dest();
|
setup_ioapic_dest();
|
||||||
#endif
|
#endif
|
||||||
check_nmi_watchdog();
|
check_nmi_watchdog();
|
||||||
#ifdef CONFIG_X86_32
|
|
||||||
zap_low_mappings();
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_HOTPLUG_CPU
|
#ifdef CONFIG_HOTPLUG_CPU
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
All C exports should go in the respective C files. */
|
All C exports should go in the respective C files. */
|
||||||
|
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
|
#include <net/checksum.h>
|
||||||
#include <linux/smp.h>
|
#include <linux/smp.h>
|
||||||
|
|
||||||
#include <asm/processor.h>
|
#include <asm/processor.h>
|
||||||
|
@ -29,6 +30,8 @@ EXPORT_SYMBOL(__copy_from_user_inatomic);
|
||||||
EXPORT_SYMBOL(copy_page);
|
EXPORT_SYMBOL(copy_page);
|
||||||
EXPORT_SYMBOL(clear_page);
|
EXPORT_SYMBOL(clear_page);
|
||||||
|
|
||||||
|
EXPORT_SYMBOL(csum_partial);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Export string functions. We normally rely on gcc builtin for most of these,
|
* Export string functions. We normally rely on gcc builtin for most of these,
|
||||||
* but gcc sometimes decides not to inline them.
|
* but gcc sometimes decides not to inline them.
|
||||||
|
|
|
@ -136,8 +136,6 @@ __wsum csum_partial(const void *buff, int len, __wsum sum)
|
||||||
(__force u32)sum);
|
(__force u32)sum);
|
||||||
}
|
}
|
||||||
|
|
||||||
EXPORT_SYMBOL(csum_partial);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* this routine is used for miscellaneous IP-like checksums, mainly
|
* this routine is used for miscellaneous IP-like checksums, mainly
|
||||||
* in icmp.c
|
* in icmp.c
|
||||||
|
|
|
@ -438,8 +438,6 @@ void zap_low_mappings(void)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
save_pg_dir();
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Zap initial low-memory mappings.
|
* Zap initial low-memory mappings.
|
||||||
*
|
*
|
||||||
|
@ -663,16 +661,8 @@ void __init mem_init(void)
|
||||||
test_wp_bit();
|
test_wp_bit();
|
||||||
|
|
||||||
cpa_init();
|
cpa_init();
|
||||||
|
save_pg_dir();
|
||||||
/*
|
|
||||||
* Subtle. SMP is doing it's boot stuff late (because it has to
|
|
||||||
* fork idle threads) - but it also needs low mappings for the
|
|
||||||
* protected-mode entry to work. We zap these entries only after
|
|
||||||
* the WP-bit has been tested.
|
|
||||||
*/
|
|
||||||
#ifndef CONFIG_SMP
|
|
||||||
zap_low_mappings();
|
zap_low_mappings();
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_MEMORY_HOTPLUG
|
#ifdef CONFIG_MEMORY_HOTPLUG
|
||||||
|
|
|
@ -555,7 +555,7 @@ int phys_mem_access_prot_allowed(struct file *file, unsigned long pfn,
|
||||||
"%s:%d /dev/mem ioremap_change_attr failed %s for %Lx-%Lx\n",
|
"%s:%d /dev/mem ioremap_change_attr failed %s for %Lx-%Lx\n",
|
||||||
current->comm, current->pid,
|
current->comm, current->pid,
|
||||||
cattr_name(flags),
|
cattr_name(flags),
|
||||||
offset, offset + size);
|
offset, (unsigned long long)(offset + size));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -576,7 +576,7 @@ void map_devmem(unsigned long pfn, unsigned long size, pgprot_t vma_prot)
|
||||||
"%s:%d /dev/mem expected mapping type %s for %Lx-%Lx, got %s\n",
|
"%s:%d /dev/mem expected mapping type %s for %Lx-%Lx, got %s\n",
|
||||||
current->comm, current->pid,
|
current->comm, current->pid,
|
||||||
cattr_name(want_flags),
|
cattr_name(want_flags),
|
||||||
addr, addr + size,
|
addr, (unsigned long long)(addr + size),
|
||||||
cattr_name(flags));
|
cattr_name(flags));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Загрузка…
Ссылка в новой задаче