Merge tag 'x86-urgent-2020-08-15' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull x86 fixes from Ingo Molnar: "Misc fixes and small updates all around the place: - Fix mitigation state sysfs output - Fix an FPU xstate/sxave code assumption bug triggered by Architectural LBR support - Fix Lightning Mountain SoC TSC frequency enumeration bug - Fix kexec debug output - Fix kexec memory range assumption bug - Fix a boundary condition in the crash kernel code - Optimize porgatory.ro generation a bit - Enable ACRN guests to use X2APIC mode - Reduce a __text_poke() IRQs-off critical section for the benefit of PREEMPT_RT" * tag 'x86-urgent-2020-08-15' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: x86/alternatives: Acquire pte lock with interrupts enabled x86/bugs/multihit: Fix mitigation reporting when VMX is not in use x86/fpu/xstate: Fix an xstate size check warning with architectural LBRs x86/purgatory: Don't generate debug info for purgatory.ro x86/tsr: Fix tsc frequency enumeration bug on Lightning Mountain SoC kexec_file: Correctly output debugging information for the PT_LOAD ELF header kexec: Improve & fix crash_exclude_mem_range() to handle overlapping ranges x86/crash: Correct the address boundary of function parameters x86/acrn: Remove redundant chars from ACRN signature x86/acrn: Allow ACRN guest to use X2APIC mode
This commit is contained in:
@@ -875,8 +875,6 @@ static void *__text_poke(void *addr, const void *opcode, size_t len)
|
||||
*/
|
||||
BUG_ON(!pages[0] || (cross_page_boundary && !pages[1]));
|
||||
|
||||
local_irq_save(flags);
|
||||
|
||||
/*
|
||||
* Map the page without the global bit, as TLB flushing is done with
|
||||
* flush_tlb_mm_range(), which is intended for non-global PTEs.
|
||||
@@ -893,6 +891,8 @@ static void *__text_poke(void *addr, const void *opcode, size_t len)
|
||||
*/
|
||||
VM_BUG_ON(!ptep);
|
||||
|
||||
local_irq_save(flags);
|
||||
|
||||
pte = mk_pte(pages[0], pgprot);
|
||||
set_pte_at(poking_mm, poking_addr, ptep, pte);
|
||||
|
||||
@@ -942,8 +942,8 @@ static void *__text_poke(void *addr, const void *opcode, size_t len)
|
||||
*/
|
||||
BUG_ON(memcmp(addr, opcode, len));
|
||||
|
||||
pte_unmap_unlock(ptep, ptl);
|
||||
local_irq_restore(flags);
|
||||
pte_unmap_unlock(ptep, ptl);
|
||||
return addr;
|
||||
}
|
||||
|
||||
|
@@ -11,14 +11,15 @@
|
||||
|
||||
#include <linux/interrupt.h>
|
||||
#include <asm/apic.h>
|
||||
#include <asm/cpufeatures.h>
|
||||
#include <asm/desc.h>
|
||||
#include <asm/hypervisor.h>
|
||||
#include <asm/idtentry.h>
|
||||
#include <asm/irq_regs.h>
|
||||
|
||||
static uint32_t __init acrn_detect(void)
|
||||
static u32 __init acrn_detect(void)
|
||||
{
|
||||
return hypervisor_cpuid_base("ACRNACRNACRN\0\0", 0);
|
||||
return hypervisor_cpuid_base("ACRNACRNACRN", 0);
|
||||
}
|
||||
|
||||
static void __init acrn_init_platform(void)
|
||||
@@ -29,12 +30,7 @@ static void __init acrn_init_platform(void)
|
||||
|
||||
static bool acrn_x2apic_available(void)
|
||||
{
|
||||
/*
|
||||
* x2apic is not supported for now. Future enablement will have to check
|
||||
* X86_FEATURE_X2APIC to determine whether x2apic is supported in the
|
||||
* guest.
|
||||
*/
|
||||
return false;
|
||||
return boot_cpu_has(X86_FEATURE_X2APIC);
|
||||
}
|
||||
|
||||
static void (*acrn_intr_handler)(void);
|
||||
|
@@ -31,6 +31,7 @@
|
||||
#include <asm/intel-family.h>
|
||||
#include <asm/e820/api.h>
|
||||
#include <asm/hypervisor.h>
|
||||
#include <asm/tlbflush.h>
|
||||
|
||||
#include "cpu.h"
|
||||
|
||||
@@ -1549,7 +1550,12 @@ static ssize_t l1tf_show_state(char *buf)
|
||||
|
||||
static ssize_t itlb_multihit_show_state(char *buf)
|
||||
{
|
||||
if (itlb_multihit_kvm_mitigation)
|
||||
if (!boot_cpu_has(X86_FEATURE_MSR_IA32_FEAT_CTL) ||
|
||||
!boot_cpu_has(X86_FEATURE_VMX))
|
||||
return sprintf(buf, "KVM: Mitigation: VMX unsupported\n");
|
||||
else if (!(cr4_read_shadow() & X86_CR4_VMXE))
|
||||
return sprintf(buf, "KVM: Mitigation: VMX disabled\n");
|
||||
else if (itlb_multihit_kvm_mitigation)
|
||||
return sprintf(buf, "KVM: Mitigation: Split huge pages\n");
|
||||
else
|
||||
return sprintf(buf, "KVM: Vulnerable\n");
|
||||
|
@@ -230,7 +230,7 @@ static int elf_header_exclude_ranges(struct crash_mem *cmem)
|
||||
int ret = 0;
|
||||
|
||||
/* Exclude the low 1M because it is always reserved */
|
||||
ret = crash_exclude_mem_range(cmem, 0, 1<<20);
|
||||
ret = crash_exclude_mem_range(cmem, 0, (1<<20)-1);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
|
@@ -611,6 +611,10 @@ static void check_xstate_against_struct(int nr)
|
||||
* This essentially double-checks what the cpu told us about
|
||||
* how large the XSAVE buffer needs to be. We are recalculating
|
||||
* it to be safe.
|
||||
*
|
||||
* Dynamic XSAVE features allocate their own buffers and are not
|
||||
* covered by these checks. Only the size of the buffer for task->fpu
|
||||
* is checked here.
|
||||
*/
|
||||
static void do_extra_xstate_size_checks(void)
|
||||
{
|
||||
@@ -673,6 +677,33 @@ static unsigned int __init get_xsaves_size(void)
|
||||
return ebx;
|
||||
}
|
||||
|
||||
/*
|
||||
* Get the total size of the enabled xstates without the dynamic supervisor
|
||||
* features.
|
||||
*/
|
||||
static unsigned int __init get_xsaves_size_no_dynamic(void)
|
||||
{
|
||||
u64 mask = xfeatures_mask_dynamic();
|
||||
unsigned int size;
|
||||
|
||||
if (!mask)
|
||||
return get_xsaves_size();
|
||||
|
||||
/* Disable dynamic features. */
|
||||
wrmsrl(MSR_IA32_XSS, xfeatures_mask_supervisor());
|
||||
|
||||
/*
|
||||
* Ask the hardware what size is required of the buffer.
|
||||
* This is the size required for the task->fpu buffer.
|
||||
*/
|
||||
size = get_xsaves_size();
|
||||
|
||||
/* Re-enable dynamic features so XSAVES will work on them again. */
|
||||
wrmsrl(MSR_IA32_XSS, xfeatures_mask_supervisor() | mask);
|
||||
|
||||
return size;
|
||||
}
|
||||
|
||||
static unsigned int __init get_xsave_size(void)
|
||||
{
|
||||
unsigned int eax, ebx, ecx, edx;
|
||||
@@ -710,7 +741,7 @@ static int __init init_xstate_size(void)
|
||||
xsave_size = get_xsave_size();
|
||||
|
||||
if (boot_cpu_has(X86_FEATURE_XSAVES))
|
||||
possible_xstate_size = get_xsaves_size();
|
||||
possible_xstate_size = get_xsaves_size_no_dynamic();
|
||||
else
|
||||
possible_xstate_size = xsave_size;
|
||||
|
||||
|
@@ -134,10 +134,15 @@ static const struct freq_desc freq_desc_ann = {
|
||||
.mask = 0x0f,
|
||||
};
|
||||
|
||||
/* 24 MHz crystal? : 24 * 13 / 4 = 78 MHz */
|
||||
/*
|
||||
* 24 MHz crystal? : 24 * 13 / 4 = 78 MHz
|
||||
* Frequency step for Lightning Mountain SoC is fixed to 78 MHz,
|
||||
* so all the frequency entries are 78000.
|
||||
*/
|
||||
static const struct freq_desc freq_desc_lgm = {
|
||||
.use_msr_plat = true,
|
||||
.freqs = { 78000, 78000, 78000, 78000, 78000, 78000, 78000, 78000 },
|
||||
.freqs = { 78000, 78000, 78000, 78000, 78000, 78000, 78000, 78000,
|
||||
78000, 78000, 78000, 78000, 78000, 78000, 78000, 78000 },
|
||||
.mask = 0x0f,
|
||||
};
|
||||
|
||||
|
Reference in New Issue
Block a user