Commit 99aedde0 authored by Linus Torvalds's avatar Linus Torvalds

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

Pull x86 fixes from Ingo Molnar:
 "Misc fixes: EFI fixes, an Intel Quark fix, an asm fix and an FPU
  handling fix"

* 'x86-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
  x86/fpu/xsaves: Fix improper uses of __ex_table
  x86/intel/quark: Select COMMON_CLK
  x86/asm/entry/64: Remove a bogus 'ret_from_fork' optimization
  firmware: dmi_scan: Fix dmi_len type
  efi/libstub: Fix boundary checking in efi_high_alloc()
  firmware: dmi_scan: Fix dmi scan to handle "End of Table" structure
parents 8a001af4 06c8173e
...@@ -499,6 +499,7 @@ config X86_INTEL_QUARK ...@@ -499,6 +499,7 @@ config X86_INTEL_QUARK
depends on X86_IO_APIC depends on X86_IO_APIC
select IOSF_MBI select IOSF_MBI
select INTEL_IMR select INTEL_IMR
select COMMON_CLK
---help--- ---help---
Select to include support for Quark X1000 SoC. Select to include support for Quark X1000 SoC.
Say Y here if you have a Quark based system such as the Arduino Say Y here if you have a Quark based system such as the Arduino
......
...@@ -82,18 +82,15 @@ static inline int xsave_state_booting(struct xsave_struct *fx, u64 mask) ...@@ -82,18 +82,15 @@ static inline int xsave_state_booting(struct xsave_struct *fx, u64 mask)
if (boot_cpu_has(X86_FEATURE_XSAVES)) if (boot_cpu_has(X86_FEATURE_XSAVES))
asm volatile("1:"XSAVES"\n\t" asm volatile("1:"XSAVES"\n\t"
"2:\n\t" "2:\n\t"
: : "D" (fx), "m" (*fx), "a" (lmask), "d" (hmask) xstate_fault
: "D" (fx), "m" (*fx), "a" (lmask), "d" (hmask)
: "memory"); : "memory");
else else
asm volatile("1:"XSAVE"\n\t" asm volatile("1:"XSAVE"\n\t"
"2:\n\t" "2:\n\t"
: : "D" (fx), "m" (*fx), "a" (lmask), "d" (hmask) xstate_fault
: "memory"); : "D" (fx), "m" (*fx), "a" (lmask), "d" (hmask)
asm volatile(xstate_fault
: "0" (0)
: "memory"); : "memory");
return err; return err;
} }
...@@ -112,18 +109,15 @@ static inline int xrstor_state_booting(struct xsave_struct *fx, u64 mask) ...@@ -112,18 +109,15 @@ static inline int xrstor_state_booting(struct xsave_struct *fx, u64 mask)
if (boot_cpu_has(X86_FEATURE_XSAVES)) if (boot_cpu_has(X86_FEATURE_XSAVES))
asm volatile("1:"XRSTORS"\n\t" asm volatile("1:"XRSTORS"\n\t"
"2:\n\t" "2:\n\t"
: : "D" (fx), "m" (*fx), "a" (lmask), "d" (hmask) xstate_fault
: "D" (fx), "m" (*fx), "a" (lmask), "d" (hmask)
: "memory"); : "memory");
else else
asm volatile("1:"XRSTOR"\n\t" asm volatile("1:"XRSTOR"\n\t"
"2:\n\t" "2:\n\t"
: : "D" (fx), "m" (*fx), "a" (lmask), "d" (hmask) xstate_fault
: "memory"); : "D" (fx), "m" (*fx), "a" (lmask), "d" (hmask)
asm volatile(xstate_fault
: "0" (0)
: "memory"); : "memory");
return err; return err;
} }
...@@ -149,9 +143,9 @@ static inline int xsave_state(struct xsave_struct *fx, u64 mask) ...@@ -149,9 +143,9 @@ static inline int xsave_state(struct xsave_struct *fx, u64 mask)
*/ */
alternative_input_2( alternative_input_2(
"1:"XSAVE, "1:"XSAVE,
"1:"XSAVEOPT, XSAVEOPT,
X86_FEATURE_XSAVEOPT, X86_FEATURE_XSAVEOPT,
"1:"XSAVES, XSAVES,
X86_FEATURE_XSAVES, X86_FEATURE_XSAVES,
[fx] "D" (fx), "a" (lmask), "d" (hmask) : [fx] "D" (fx), "a" (lmask), "d" (hmask) :
"memory"); "memory");
...@@ -178,7 +172,7 @@ static inline int xrstor_state(struct xsave_struct *fx, u64 mask) ...@@ -178,7 +172,7 @@ static inline int xrstor_state(struct xsave_struct *fx, u64 mask)
*/ */
alternative_input( alternative_input(
"1: " XRSTOR, "1: " XRSTOR,
"1: " XRSTORS, XRSTORS,
X86_FEATURE_XSAVES, X86_FEATURE_XSAVES,
"D" (fx), "m" (*fx), "a" (lmask), "d" (hmask) "D" (fx), "m" (*fx), "a" (lmask), "d" (hmask)
: "memory"); : "memory");
......
...@@ -269,11 +269,14 @@ ENTRY(ret_from_fork) ...@@ -269,11 +269,14 @@ ENTRY(ret_from_fork)
testl $3, CS-ARGOFFSET(%rsp) # from kernel_thread? testl $3, CS-ARGOFFSET(%rsp) # from kernel_thread?
jz 1f jz 1f
testl $_TIF_IA32, TI_flags(%rcx) # 32-bit compat task needs IRET /*
jnz int_ret_from_sys_call * By the time we get here, we have no idea whether our pt_regs,
* ti flags, and ti status came from the 64-bit SYSCALL fast path,
RESTORE_TOP_OF_STACK %rdi, -ARGOFFSET * the slow path, or one of the ia32entry paths.
jmp ret_from_sys_call # go to the SYSRET fastpath * Use int_ret_from_sys_call to return, since it can safely handle
* all of the above.
*/
jmp int_ret_from_sys_call
1: 1:
subq $REST_SKIP, %rsp # leave space for volatiles subq $REST_SKIP, %rsp # leave space for volatiles
......
...@@ -78,7 +78,7 @@ static const char * __init dmi_string(const struct dmi_header *dm, u8 s) ...@@ -78,7 +78,7 @@ static const char * __init dmi_string(const struct dmi_header *dm, u8 s)
* We have to be cautious here. We have seen BIOSes with DMI pointers * We have to be cautious here. We have seen BIOSes with DMI pointers
* pointing to completely the wrong place for example * pointing to completely the wrong place for example
*/ */
static void dmi_table(u8 *buf, int len, int num, static void dmi_table(u8 *buf, u32 len, int num,
void (*decode)(const struct dmi_header *, void *), void (*decode)(const struct dmi_header *, void *),
void *private_data) void *private_data)
{ {
...@@ -92,12 +92,6 @@ static void dmi_table(u8 *buf, int len, int num, ...@@ -92,12 +92,6 @@ static void dmi_table(u8 *buf, int len, int num,
while ((i < num) && (data - buf + sizeof(struct dmi_header)) <= len) { while ((i < num) && (data - buf + sizeof(struct dmi_header)) <= len) {
const struct dmi_header *dm = (const struct dmi_header *)data; const struct dmi_header *dm = (const struct dmi_header *)data;
/*
* 7.45 End-of-Table (Type 127) [SMBIOS reference spec v3.0.0]
*/
if (dm->type == DMI_ENTRY_END_OF_TABLE)
break;
/* /*
* We want to know the total length (formatted area and * We want to know the total length (formatted area and
* strings) before decoding to make sure we won't run off the * strings) before decoding to make sure we won't run off the
...@@ -108,13 +102,20 @@ static void dmi_table(u8 *buf, int len, int num, ...@@ -108,13 +102,20 @@ static void dmi_table(u8 *buf, int len, int num,
data++; data++;
if (data - buf < len - 1) if (data - buf < len - 1)
decode(dm, private_data); decode(dm, private_data);
/*
* 7.45 End-of-Table (Type 127) [SMBIOS reference spec v3.0.0]
*/
if (dm->type == DMI_ENTRY_END_OF_TABLE)
break;
data += 2; data += 2;
i++; i++;
} }
} }
static phys_addr_t dmi_base; static phys_addr_t dmi_base;
static u16 dmi_len; static u32 dmi_len;
static u16 dmi_num; static u16 dmi_num;
static int __init dmi_walk_early(void (*decode)(const struct dmi_header *, static int __init dmi_walk_early(void (*decode)(const struct dmi_header *,
......
...@@ -179,12 +179,12 @@ efi_status_t efi_high_alloc(efi_system_table_t *sys_table_arg, ...@@ -179,12 +179,12 @@ efi_status_t efi_high_alloc(efi_system_table_t *sys_table_arg,
start = desc->phys_addr; start = desc->phys_addr;
end = start + desc->num_pages * (1UL << EFI_PAGE_SHIFT); end = start + desc->num_pages * (1UL << EFI_PAGE_SHIFT);
if ((start + size) > end || (start + size) > max) if (end > max)
continue;
if (end - size > max)
end = max; end = max;
if ((start + size) > end)
continue;
if (round_down(end - size, align) < start) if (round_down(end - size, align) < start)
continue; continue;
......
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