mirror of
https://github.com/adulau/aha.git
synced 2024-12-28 03:36:19 +00:00
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:
commit
05e12a699e
10 changed files with 49 additions and 42 deletions
|
@ -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);
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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);
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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"),
|
||||||
|
},
|
||||||
|
},
|
||||||
{ }
|
{ }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -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()) {
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Reference in a new issue