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, pebs: correct qualifier passed to ds_write_config() from ds_request_pebs()
  x86, bts: remove bad warning
  x86: add Dell XPS710 reboot quirk
  x86, math-emu: fix init_fpu for task != current
  x86: EFI: Back efi_ioremap with init_memory_mapping instead of FIX_MAP
  x86: fix DMI on EFI
This commit is contained in:
Linus Torvalds 2009-03-08 10:27:13 -07:00
commit 05e12a699e
10 changed files with 49 additions and 42 deletions

View file

@ -37,8 +37,6 @@ extern unsigned long asmlinkage efi_call_phys(void *, ...);
#else /* !CONFIG_X86_32 */ #else /* !CONFIG_X86_32 */
#define MAX_EFI_IO_PAGES 100
extern u64 efi_call0(void *fp); extern u64 efi_call0(void *fp);
extern u64 efi_call1(void *fp, u64 arg1); extern u64 efi_call1(void *fp, u64 arg1);
extern u64 efi_call2(void *fp, u64 arg1, u64 arg2); extern u64 efi_call2(void *fp, u64 arg1, u64 arg2);

View file

@ -16,7 +16,6 @@
#include <asm/apicdef.h> #include <asm/apicdef.h>
#include <asm/page.h> #include <asm/page.h>
#include <asm/vsyscall.h> #include <asm/vsyscall.h>
#include <asm/efi.h>
/* /*
* Here we define all the compile-time 'special' virtual * Here we define all the compile-time 'special' virtual
@ -43,9 +42,6 @@ enum fixed_addresses {
FIX_APIC_BASE, /* local (CPU) APIC) -- required for SMP or not */ FIX_APIC_BASE, /* local (CPU) APIC) -- required for SMP or not */
FIX_IO_APIC_BASE_0, FIX_IO_APIC_BASE_0,
FIX_IO_APIC_BASE_END = FIX_IO_APIC_BASE_0 + MAX_IO_APICS - 1, FIX_IO_APIC_BASE_END = FIX_IO_APIC_BASE_0 + MAX_IO_APICS - 1,
FIX_EFI_IO_MAP_LAST_PAGE,
FIX_EFI_IO_MAP_FIRST_PAGE = FIX_EFI_IO_MAP_LAST_PAGE
+ MAX_EFI_IO_PAGES - 1,
#ifdef CONFIG_PARAVIRT #ifdef CONFIG_PARAVIRT
FIX_PARAVIRT_BOOTMAP, FIX_PARAVIRT_BOOTMAP,
#endif #endif

View file

@ -172,7 +172,13 @@ static inline void __save_init_fpu(struct task_struct *tsk)
#else /* CONFIG_X86_32 */ #else /* CONFIG_X86_32 */
extern void finit(void); #ifdef CONFIG_MATH_EMULATION
extern void finit_task(struct task_struct *tsk);
#else
static inline void finit_task(struct task_struct *tsk)
{
}
#endif
static inline void tolerant_fwait(void) static inline void tolerant_fwait(void)
{ {

View file

@ -729,7 +729,7 @@ struct pebs_tracer *ds_request_pebs(struct task_struct *task,
spin_unlock_irqrestore(&ds_lock, irq); spin_unlock_irqrestore(&ds_lock, irq);
ds_write_config(tracer->ds.context, &tracer->trace.ds, ds_bts); ds_write_config(tracer->ds.context, &tracer->trace.ds, ds_pebs);
ds_resume_pebs(tracer); ds_resume_pebs(tracer);
return tracer; return tracer;
@ -1029,5 +1029,4 @@ void ds_copy_thread(struct task_struct *tsk, struct task_struct *father)
void ds_exit_thread(struct task_struct *tsk) void ds_exit_thread(struct task_struct *tsk)
{ {
WARN_ON(tsk->thread.ds_ctx);
} }

View file

@ -467,7 +467,7 @@ void __init efi_enter_virtual_mode(void)
efi_memory_desc_t *md; efi_memory_desc_t *md;
efi_status_t status; efi_status_t status;
unsigned long size; unsigned long size;
u64 end, systab, addr, npages; u64 end, systab, addr, npages, end_pfn;
void *p, *va; void *p, *va;
efi.systab = NULL; efi.systab = NULL;
@ -479,7 +479,10 @@ void __init efi_enter_virtual_mode(void)
size = md->num_pages << EFI_PAGE_SHIFT; size = md->num_pages << EFI_PAGE_SHIFT;
end = md->phys_addr + size; end = md->phys_addr + size;
if (PFN_UP(end) <= max_low_pfn_mapped) end_pfn = PFN_UP(end);
if (end_pfn <= max_low_pfn_mapped
|| (end_pfn > (1UL << (32 - PAGE_SHIFT))
&& end_pfn <= max_pfn_mapped))
va = __va(md->phys_addr); va = __va(md->phys_addr);
else else
va = efi_ioremap(md->phys_addr, size); va = efi_ioremap(md->phys_addr, size);

View file

@ -99,24 +99,11 @@ void __init efi_call_phys_epilog(void)
void __iomem *__init efi_ioremap(unsigned long phys_addr, unsigned long size) void __iomem *__init efi_ioremap(unsigned long phys_addr, unsigned long size)
{ {
static unsigned pages_mapped __initdata; unsigned long last_map_pfn;
unsigned i, pages;
unsigned long offset;
pages = PFN_UP(phys_addr + size) - PFN_DOWN(phys_addr); last_map_pfn = init_memory_mapping(phys_addr, phys_addr + size);
offset = phys_addr & ~PAGE_MASK; if ((last_map_pfn << PAGE_SHIFT) < phys_addr + size)
phys_addr &= PAGE_MASK;
if (pages_mapped + pages > MAX_EFI_IO_PAGES)
return NULL; return NULL;
for (i = 0; i < pages; i++) { return (void __iomem *)__va(phys_addr);
__set_fixmap(FIX_EFI_IO_MAP_FIRST_PAGE - pages_mapped,
phys_addr, PAGE_KERNEL);
phys_addr += PAGE_SIZE;
pages_mapped++;
}
return (void __iomem *)__fix_to_virt(FIX_EFI_IO_MAP_FIRST_PAGE - \
(pages_mapped - pages)) + offset;
} }

View file

@ -136,7 +136,7 @@ int init_fpu(struct task_struct *tsk)
#ifdef CONFIG_X86_32 #ifdef CONFIG_X86_32
if (!HAVE_HWFP) { if (!HAVE_HWFP) {
memset(tsk->thread.xstate, 0, xstate_size); memset(tsk->thread.xstate, 0, xstate_size);
finit(); finit_task(tsk);
set_stopped_child_used_math(tsk); set_stopped_child_used_math(tsk);
return 0; return 0;
} }

View file

@ -217,6 +217,14 @@ static struct dmi_system_id __initdata reboot_dmi_table[] = {
DMI_MATCH(DMI_PRODUCT_NAME, "HP Compaq"), DMI_MATCH(DMI_PRODUCT_NAME, "HP Compaq"),
}, },
}, },
{ /* Handle problems with rebooting on Dell XPS710 */
.callback = set_bios_reboot,
.ident = "Dell XPS710",
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
DMI_MATCH(DMI_PRODUCT_NAME, "Dell XPS710"),
},
},
{ } { }
}; };

View file

@ -770,6 +770,9 @@ void __init setup_arch(char **cmdline_p)
finish_e820_parsing(); finish_e820_parsing();
if (efi_enabled)
efi_init();
dmi_scan_machine(); dmi_scan_machine();
dmi_check_system(bad_bios_dmi_table); dmi_check_system(bad_bios_dmi_table);
@ -789,8 +792,6 @@ void __init setup_arch(char **cmdline_p)
insert_resource(&iomem_resource, &data_resource); insert_resource(&iomem_resource, &data_resource);
insert_resource(&iomem_resource, &bss_resource); insert_resource(&iomem_resource, &bss_resource);
if (efi_enabled)
efi_init();
#ifdef CONFIG_X86_32 #ifdef CONFIG_X86_32
if (ppro_with_ram_bug()) { if (ppro_with_ram_bug()) {

View file

@ -30,20 +30,29 @@ static void fclex(void)
} }
/* Needs to be externally visible */ /* Needs to be externally visible */
void finit(void) void finit_task(struct task_struct *tsk)
{ {
control_word = 0x037f; struct i387_soft_struct *soft = &tsk->thread.xstate->soft;
partial_status = 0; struct address *oaddr, *iaddr;
top = 0; /* We don't keep top in the status word internally. */ soft->cwd = 0x037f;
fpu_tag_word = 0xffff; soft->swd = 0;
soft->ftop = 0; /* We don't keep top in the status word internally. */
soft->twd = 0xffff;
/* The behaviour is different from that detailed in /* The behaviour is different from that detailed in
Section 15.1.6 of the Intel manual */ Section 15.1.6 of the Intel manual */
operand_address.offset = 0; oaddr = (struct address *)&soft->foo;
operand_address.selector = 0; oaddr->offset = 0;
instruction_address.offset = 0; oaddr->selector = 0;
instruction_address.selector = 0; iaddr = (struct address *)&soft->fip;
instruction_address.opcode = 0; iaddr->offset = 0;
no_ip_update = 1; iaddr->selector = 0;
iaddr->opcode = 0;
soft->no_update = 1;
}
void finit(void)
{
finit_task(current);
} }
/* /*