Commit cd557bc0 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'x86_urgent_for_v6.7_rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip

Pull x86 fixes from Borislav Petkov:

 - Ignore invalid x2APIC entries in order to not waste per-CPU data

 - Fix a back-to-back signals handling scenario when shadow stack is in
   use

 - A documentation fix

 - Add Kirill as TDX maintainer

* tag 'x86_urgent_for_v6.7_rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
  x86/acpi: Ignore invalid x2APIC entries
  x86/shstk: Delay signal entry SSP write until after user accesses
  x86/Documentation: Indent 'note::' directive for protocol version number note
  MAINTAINERS: Add Intel TDX entry
parents b0014556 ec9aedb2
...@@ -77,7 +77,7 @@ Protocol 2.14 BURNT BY INCORRECT COMMIT ...@@ -77,7 +77,7 @@ Protocol 2.14 BURNT BY INCORRECT COMMIT
Protocol 2.15 (Kernel 5.5) Added the kernel_info and kernel_info.setup_type_max. Protocol 2.15 (Kernel 5.5) Added the kernel_info and kernel_info.setup_type_max.
============= ============================================================ ============= ============================================================
.. note:: .. note::
The protocol version number should be changed only if the setup header The protocol version number should be changed only if the setup header
is changed. There is no need to update the version number if boot_params is changed. There is no need to update the version number if boot_params
or kernel_info are changed. Additionally, it is recommended to use or kernel_info are changed. Additionally, it is recommended to use
......
...@@ -23702,6 +23702,20 @@ F: arch/x86/kernel/dumpstack.c ...@@ -23702,6 +23702,20 @@ F: arch/x86/kernel/dumpstack.c
F: arch/x86/kernel/stacktrace.c F: arch/x86/kernel/stacktrace.c
F: arch/x86/kernel/unwind_*.c F: arch/x86/kernel/unwind_*.c
X86 TRUST DOMAIN EXTENSIONS (TDX)
M: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
R: Dave Hansen <dave.hansen@linux.intel.com>
L: x86@kernel.org
L: linux-coco@lists.linux.dev
S: Supported
T: git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git x86/tdx
F: arch/x86/boot/compressed/tdx*
F: arch/x86/coco/tdx/
F: arch/x86/include/asm/shared/tdx.h
F: arch/x86/include/asm/tdx.h
F: arch/x86/virt/vmx/tdx/
F: drivers/virt/coco/tdx-guest
X86 VDSO X86 VDSO
M: Andy Lutomirski <luto@kernel.org> M: Andy Lutomirski <luto@kernel.org>
L: linux-kernel@vger.kernel.org L: linux-kernel@vger.kernel.org
......
...@@ -63,6 +63,7 @@ int acpi_fix_pin2_polarity __initdata; ...@@ -63,6 +63,7 @@ int acpi_fix_pin2_polarity __initdata;
#ifdef CONFIG_X86_LOCAL_APIC #ifdef CONFIG_X86_LOCAL_APIC
static u64 acpi_lapic_addr __initdata = APIC_DEFAULT_PHYS_BASE; static u64 acpi_lapic_addr __initdata = APIC_DEFAULT_PHYS_BASE;
static bool has_lapic_cpus __initdata;
static bool acpi_support_online_capable; static bool acpi_support_online_capable;
#endif #endif
...@@ -232,6 +233,14 @@ acpi_parse_x2apic(union acpi_subtable_headers *header, const unsigned long end) ...@@ -232,6 +233,14 @@ acpi_parse_x2apic(union acpi_subtable_headers *header, const unsigned long end)
if (!acpi_is_processor_usable(processor->lapic_flags)) if (!acpi_is_processor_usable(processor->lapic_flags))
return 0; return 0;
/*
* According to https://uefi.org/specs/ACPI/6.5/05_ACPI_Software_Programming_Model.html#processor-local-x2apic-structure
* when MADT provides both valid LAPIC and x2APIC entries, the APIC ID
* in x2APIC must be equal or greater than 0xff.
*/
if (has_lapic_cpus && apic_id < 0xff)
return 0;
/* /*
* We need to register disabled CPU as well to permit * We need to register disabled CPU as well to permit
* counting disabled CPUs. This allows us to size * counting disabled CPUs. This allows us to size
...@@ -1114,10 +1123,7 @@ static int __init early_acpi_parse_madt_lapic_addr_ovr(void) ...@@ -1114,10 +1123,7 @@ static int __init early_acpi_parse_madt_lapic_addr_ovr(void)
static int __init acpi_parse_madt_lapic_entries(void) static int __init acpi_parse_madt_lapic_entries(void)
{ {
int count; int count, x2count = 0;
int x2count = 0;
int ret;
struct acpi_subtable_proc madt_proc[2];
if (!boot_cpu_has(X86_FEATURE_APIC)) if (!boot_cpu_has(X86_FEATURE_APIC))
return -ENODEV; return -ENODEV;
...@@ -1126,21 +1132,11 @@ static int __init acpi_parse_madt_lapic_entries(void) ...@@ -1126,21 +1132,11 @@ static int __init acpi_parse_madt_lapic_entries(void)
acpi_parse_sapic, MAX_LOCAL_APIC); acpi_parse_sapic, MAX_LOCAL_APIC);
if (!count) { if (!count) {
memset(madt_proc, 0, sizeof(madt_proc)); count = acpi_table_parse_madt(ACPI_MADT_TYPE_LOCAL_APIC,
madt_proc[0].id = ACPI_MADT_TYPE_LOCAL_APIC; acpi_parse_lapic, MAX_LOCAL_APIC);
madt_proc[0].handler = acpi_parse_lapic; has_lapic_cpus = count > 0;
madt_proc[1].id = ACPI_MADT_TYPE_LOCAL_X2APIC; x2count = acpi_table_parse_madt(ACPI_MADT_TYPE_LOCAL_X2APIC,
madt_proc[1].handler = acpi_parse_x2apic; acpi_parse_x2apic, MAX_LOCAL_APIC);
ret = acpi_table_parse_entries_array(ACPI_SIG_MADT,
sizeof(struct acpi_table_madt),
madt_proc, ARRAY_SIZE(madt_proc), MAX_LOCAL_APIC);
if (ret < 0) {
pr_err("Error parsing LAPIC/X2APIC entries\n");
return ret;
}
count = madt_proc[0].count;
x2count = madt_proc[1].count;
} }
if (!count && !x2count) { if (!count && !x2count) {
pr_err("No LAPIC entries present\n"); pr_err("No LAPIC entries present\n");
......
...@@ -175,9 +175,6 @@ int x64_setup_rt_frame(struct ksignal *ksig, struct pt_regs *regs) ...@@ -175,9 +175,6 @@ int x64_setup_rt_frame(struct ksignal *ksig, struct pt_regs *regs)
frame = get_sigframe(ksig, regs, sizeof(struct rt_sigframe), &fp); frame = get_sigframe(ksig, regs, sizeof(struct rt_sigframe), &fp);
uc_flags = frame_uc_flags(regs); uc_flags = frame_uc_flags(regs);
if (setup_signal_shadow_stack(ksig))
return -EFAULT;
if (!user_access_begin(frame, sizeof(*frame))) if (!user_access_begin(frame, sizeof(*frame)))
return -EFAULT; return -EFAULT;
...@@ -198,6 +195,9 @@ int x64_setup_rt_frame(struct ksignal *ksig, struct pt_regs *regs) ...@@ -198,6 +195,9 @@ int x64_setup_rt_frame(struct ksignal *ksig, struct pt_regs *regs)
return -EFAULT; return -EFAULT;
} }
if (setup_signal_shadow_stack(ksig))
return -EFAULT;
/* Set up registers for signal handler */ /* Set up registers for signal handler */
regs->di = ksig->sig; regs->di = ksig->sig;
/* In case the signal handler was declared without prototypes */ /* In case the signal handler was declared without prototypes */
......
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