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
Unified · Split
| @@ -77,7 +77,7 @@ Protocol 2.14 BURNT BY INCORRECT COMMIT · 76 unmodified lines | ||
| 77 | 77 | Protocol 2.15 (Kernel 5.5) Added the kernel_info and kernel_info.setup_type_max. |
| 78 | 78 | ============= ============================================================ |
| 79 | 79 | |
| 80 | −.. note:: | |
| 80 | + .. note:: | |
| 81 | 81 | The protocol version number should be changed only if the setup header |
| 82 | 82 | is changed. There is no need to update the version number if boot_params |
| 83 | 83 | or kernel_info are changed. Additionally, it is recommended to use |
| @@ -23702,6 +23702,20 @@ F: arch/x86/kernel/dumpstack.c · 23701 unmodified lines | ||
| 23702 | 23702 | F: arch/x86/kernel/stacktrace.c |
| 23703 | 23703 | F: arch/x86/kernel/unwind_*.c |
| 23704 | 23704 | |
| 23705 | +X86 TRUST DOMAIN EXTENSIONS (TDX) | |
| 23706 | +M: Kirill A. Shutemov <kirill.shutemov@linux.intel.com> | |
| 23707 | +R: Dave Hansen <dave.hansen@linux.intel.com> | |
| 23708 | +L: x86@kernel.org | |
| 23709 | +L: linux-coco@lists.linux.dev | |
| 23710 | +S: Supported | |
| 23711 | +T: git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git x86/tdx | |
| 23712 | +F: arch/x86/boot/compressed/tdx* | |
| 23713 | +F: arch/x86/coco/tdx/ | |
| 23714 | +F: arch/x86/include/asm/shared/tdx.h | |
| 23715 | +F: arch/x86/include/asm/tdx.h | |
| 23716 | +F: arch/x86/virt/vmx/tdx/ | |
| 23717 | +F: drivers/virt/coco/tdx-guest | |
| 23718 | + | |
| 23705 | 23719 | X86 VDSO |
| 23706 | 23720 | M: Andy Lutomirski <luto@kernel.org> |
| 23707 | 23721 | L: linux-kernel@vger.kernel.org |
| @@ -63,6 +63,7 @@ int acpi_fix_pin2_polarity __initdata; · 62 unmodified lines | ||
| 63 | 63 | |
| 64 | 64 | #ifdef CONFIG_X86_LOCAL_APIC |
| 65 | 65 | static u64 acpi_lapic_addr __initdata = APIC_DEFAULT_PHYS_BASE; |
| 66 | +static bool has_lapic_cpus __initdata; | |
| 66 | 67 | static bool acpi_support_online_capable; |
| 67 | 68 | #endif |
| 68 | 69 | |
| @@ -232,6 +233,14 @@ acpi_parse_x2apic(union acpi_subtable_headers *header, const unsigned long end) · 163 unmodified lines | ||
| 232 | 233 | if (!acpi_is_processor_usable(processor->lapic_flags)) |
| 233 | 234 | return 0; |
| 234 | 235 | |
| 236 | + /* | |
| 237 | + * According to https://uefi.org/specs/ACPI/6.5/05_ACPI_Software_Programming_Model.html#processor-local-x2apic-structure | |
| 238 | + * when MADT provides both valid LAPIC and x2APIC entries, the APIC ID | |
| 239 | + * in x2APIC must be equal or greater than 0xff. | |
| 240 | + */ | |
| 241 | + if (has_lapic_cpus && apic_id < 0xff) | |
| 242 | + return 0; | |
| 243 | + | |
| 235 | 244 | /* |
| 236 | 245 | * We need to register disabled CPU as well to permit |
| 237 | 246 | * counting disabled CPUs. This allows us to size |
| @@ -1114,10 +1123,7 @@ static int __init early_acpi_parse_madt_lapic_addr_ovr(void) · 876 unmodified lines | ||
| 1114 | 1123 | |
| 1115 | 1124 | static int __init acpi_parse_madt_lapic_entries(void) |
| 1116 | 1125 | { |
| 1117 | − int count; | |
| 1118 | − int x2count = 0; | |
| 1119 | − int ret; | |
| 1120 | − struct acpi_subtable_proc madt_proc[2]; | |
| 1126 | + int count, x2count = 0; | |
| 1121 | 1127 | |
| 1122 | 1128 | if (!boot_cpu_has(X86_FEATURE_APIC)) |
| 1123 | 1129 | return -ENODEV; |
| @@ -1126,21 +1132,11 @@ static int __init acpi_parse_madt_lapic_entries(void) · 2 unmodified lines | ||
| 1126 | 1132 | acpi_parse_sapic, MAX_LOCAL_APIC); |
| 1127 | 1133 | |
| 1128 | 1134 | if (!count) { |
| 1129 | − memset(madt_proc, 0, sizeof(madt_proc)); | |
| 1130 | − madt_proc[0].id = ACPI_MADT_TYPE_LOCAL_APIC; | |
| 1131 | − madt_proc[0].handler = acpi_parse_lapic; | |
| 1132 | − madt_proc[1].id = ACPI_MADT_TYPE_LOCAL_X2APIC; | |
| 1133 | − madt_proc[1].handler = acpi_parse_x2apic; | |
| 1134 | − ret = acpi_table_parse_entries_array(ACPI_SIG_MADT, | |
| 1135 | − sizeof(struct acpi_table_madt), | |
| 1136 | − madt_proc, ARRAY_SIZE(madt_proc), MAX_LOCAL_APIC); | |
| 1137 | − if (ret < 0) { | |
| 1138 | − pr_err("Error parsing LAPIC/X2APIC entries\n"); | |
| 1139 | − return ret; | |
| 1140 | − } | |
| 1141 | − | |
| 1142 | − count = madt_proc[0].count; | |
| 1143 | − x2count = madt_proc[1].count; | |
| 1135 | + count = acpi_table_parse_madt(ACPI_MADT_TYPE_LOCAL_APIC, | |
| 1136 | + acpi_parse_lapic, MAX_LOCAL_APIC); | |
| 1137 | + has_lapic_cpus = count > 0; | |
| 1138 | + x2count = acpi_table_parse_madt(ACPI_MADT_TYPE_LOCAL_X2APIC, | |
| 1139 | + acpi_parse_x2apic, MAX_LOCAL_APIC); | |
| 1144 | 1140 | } |
| 1145 | 1141 | if (!count && !x2count) { |
| 1146 | 1142 | pr_err("No LAPIC entries present\n"); |
| @@ -175,9 +175,6 @@ int x64_setup_rt_frame(struct ksignal *ksig, struct pt_regs *regs) · 174 unmodified lines | ||
| 175 | 175 | frame = get_sigframe(ksig, regs, sizeof(struct rt_sigframe), &fp); |
| 176 | 176 | uc_flags = frame_uc_flags(regs); |
| 177 | 177 | |
| 178 | − if (setup_signal_shadow_stack(ksig)) | |
| 179 | − return -EFAULT; | |
| 180 | − | |
| 181 | 178 | if (!user_access_begin(frame, sizeof(*frame))) |
| 182 | 179 | return -EFAULT; |
| 183 | 180 | |
| @@ -198,6 +195,9 @@ int x64_setup_rt_frame(struct ksignal *ksig, struct pt_regs *regs) · 14 unmodified lines | ||
| 198 | 195 | return -EFAULT; |
| 199 | 196 | } |
| 200 | 197 | |
| 198 | + if (setup_signal_shadow_stack(ksig)) | |
| 199 | + return -EFAULT; | |
| 200 | + | |
| 201 | 201 | /* Set up registers for signal handler */ |
| 202 | 202 | regs->di = ksig->sig; |
| 203 | 203 | /* In case the signal handler was declared without prototypes */ |