mirror of
https://github.com/torvalds/linux.git
synced 2026-05-31 10:33:41 +02:00
Merge branch 'for-next/misc' into for-next/core
* for-next/misc:
arm64/sysreg: refactor deprecated strncpy
arm64: sysreg: Generate C compiler warnings on {read,write}_sysreg_s arguments
arm64: sdei: abort running SDEI handlers during crash
arm64: Explicitly include correct DT includes
arm64/Kconfig: Sort the RCpc feature under the ARMv8.3 features menu
arm64: vdso: remove two .altinstructions related symbols
arm64/ptrace: Clean up error handling path in sve_set_common()
This commit is contained in:
commit
438ddc3c42
|
|
@ -1793,9 +1793,6 @@ config ARM64_PAN
|
|||
The feature is detected at runtime, and will remain as a 'nop'
|
||||
instruction if the cpu does not implement the feature.
|
||||
|
||||
config AS_HAS_LDAPR
|
||||
def_bool $(as-instr,.arch_extension rcpc)
|
||||
|
||||
config AS_HAS_LSE_ATOMICS
|
||||
def_bool $(as-instr,.arch_extension lse)
|
||||
|
||||
|
|
@ -1933,6 +1930,9 @@ config AS_HAS_ARMV8_3
|
|||
config AS_HAS_CFI_NEGATE_RA_STATE
|
||||
def_bool $(as-instr,.cfi_startproc\n.cfi_negate_ra_state\n.cfi_endproc\n)
|
||||
|
||||
config AS_HAS_LDAPR
|
||||
def_bool $(as-instr,.arch_extension rcpc)
|
||||
|
||||
endmenu # "ARMv8.3 architectural features"
|
||||
|
||||
menu "ARMv8.4 architectural features"
|
||||
|
|
|
|||
|
|
@ -17,6 +17,9 @@
|
|||
|
||||
#include <asm/virt.h>
|
||||
|
||||
DECLARE_PER_CPU(struct sdei_registered_event *, sdei_active_normal_event);
|
||||
DECLARE_PER_CPU(struct sdei_registered_event *, sdei_active_critical_event);
|
||||
|
||||
extern unsigned long sdei_exit_mode;
|
||||
|
||||
/* Software Delegated Exception entry point from firmware*/
|
||||
|
|
@ -29,6 +32,9 @@ asmlinkage void __sdei_asm_entry_trampoline(unsigned long event_num,
|
|||
unsigned long pc,
|
||||
unsigned long pstate);
|
||||
|
||||
/* Abort a running handler. Context is discarded. */
|
||||
void __sdei_handler_abort(void);
|
||||
|
||||
/*
|
||||
* The above entry point does the minimum to call C code. This function does
|
||||
* anything else, before calling the driver.
|
||||
|
|
|
|||
|
|
@ -803,15 +803,21 @@
|
|||
/*
|
||||
* For registers without architectural names, or simply unsupported by
|
||||
* GAS.
|
||||
*
|
||||
* __check_r forces warnings to be generated by the compiler when
|
||||
* evaluating r which wouldn't normally happen due to being passed to
|
||||
* the assembler via __stringify(r).
|
||||
*/
|
||||
#define read_sysreg_s(r) ({ \
|
||||
u64 __val; \
|
||||
u32 __maybe_unused __check_r = (u32)(r); \
|
||||
asm volatile(__mrs_s("%0", r) : "=r" (__val)); \
|
||||
__val; \
|
||||
})
|
||||
|
||||
#define write_sysreg_s(v, r) do { \
|
||||
u64 __val = (u64)(v); \
|
||||
u32 __maybe_unused __check_r = (u32)(r); \
|
||||
asm volatile(__msr_s(r, "%x0") : : "rZ" (__val)); \
|
||||
} while (0)
|
||||
|
||||
|
|
|
|||
|
|
@ -9,8 +9,6 @@
|
|||
#include <linux/acpi.h>
|
||||
#include <linux/cpuidle.h>
|
||||
#include <linux/cpu_pm.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_device.h>
|
||||
#include <linux/psci.h>
|
||||
|
||||
#ifdef CONFIG_ACPI_PROCESSOR_IDLE
|
||||
|
|
|
|||
|
|
@ -986,9 +986,13 @@ SYM_CODE_START(__sdei_asm_handler)
|
|||
|
||||
mov x19, x1
|
||||
|
||||
#if defined(CONFIG_VMAP_STACK) || defined(CONFIG_SHADOW_CALL_STACK)
|
||||
/* Store the registered-event for crash_smp_send_stop() */
|
||||
ldrb w4, [x19, #SDEI_EVENT_PRIORITY]
|
||||
#endif
|
||||
cbnz w4, 1f
|
||||
adr_this_cpu dst=x5, sym=sdei_active_normal_event, tmp=x6
|
||||
b 2f
|
||||
1: adr_this_cpu dst=x5, sym=sdei_active_critical_event, tmp=x6
|
||||
2: str x19, [x5]
|
||||
|
||||
#ifdef CONFIG_VMAP_STACK
|
||||
/*
|
||||
|
|
@ -1055,6 +1059,14 @@ SYM_CODE_START(__sdei_asm_handler)
|
|||
|
||||
ldr_l x2, sdei_exit_mode
|
||||
|
||||
/* Clear the registered-event seen by crash_smp_send_stop() */
|
||||
ldrb w3, [x4, #SDEI_EVENT_PRIORITY]
|
||||
cbnz w3, 1f
|
||||
adr_this_cpu dst=x5, sym=sdei_active_normal_event, tmp=x6
|
||||
b 2f
|
||||
1: adr_this_cpu dst=x5, sym=sdei_active_critical_event, tmp=x6
|
||||
2: str xzr, [x5]
|
||||
|
||||
alternative_if_not ARM64_UNMAP_KERNEL_AT_EL0
|
||||
sdei_handler_exit exit_mode=x2
|
||||
alternative_else_nop_endif
|
||||
|
|
@ -1065,4 +1077,15 @@ alternative_else_nop_endif
|
|||
#endif
|
||||
SYM_CODE_END(__sdei_asm_handler)
|
||||
NOKPROBE(__sdei_asm_handler)
|
||||
|
||||
SYM_CODE_START(__sdei_handler_abort)
|
||||
mov_q x0, SDEI_1_0_FN_SDEI_EVENT_COMPLETE_AND_RESUME
|
||||
adr x1, 1f
|
||||
ldr_l x2, sdei_exit_mode
|
||||
sdei_handler_exit exit_mode=x2
|
||||
// exit the handler and jump to the next instruction.
|
||||
// Exit will stomp x0-x17, PSTATE, ELR_ELx, and SPSR_ELx.
|
||||
1: ret
|
||||
SYM_CODE_END(__sdei_handler_abort)
|
||||
NOKPROBE(__sdei_handler_abort)
|
||||
#endif /* CONFIG_ARM_SDE_INTERFACE */
|
||||
|
|
|
|||
|
|
@ -262,9 +262,9 @@ static __init void __parse_cmdline(const char *cmdline, bool parse_aliases)
|
|||
if (!len)
|
||||
return;
|
||||
|
||||
len = min(len, ARRAY_SIZE(buf) - 1);
|
||||
strncpy(buf, cmdline, len);
|
||||
buf[len] = 0;
|
||||
len = strscpy(buf, cmdline, ARRAY_SIZE(buf));
|
||||
if (len == -E2BIG)
|
||||
len = ARRAY_SIZE(buf) - 1;
|
||||
|
||||
if (strcmp(buf, "--") == 0)
|
||||
return;
|
||||
|
|
|
|||
|
|
@ -11,8 +11,6 @@
|
|||
#include <linux/io.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/of_pci.h>
|
||||
#include <linux/of_platform.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/pci-acpi.h>
|
||||
#include <linux/pci-ecam.h>
|
||||
|
|
|
|||
|
|
@ -884,7 +884,8 @@ static int sve_set_common(struct task_struct *target,
|
|||
break;
|
||||
default:
|
||||
WARN_ON_ONCE(1);
|
||||
return -EINVAL;
|
||||
ret = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -47,6 +47,9 @@ DEFINE_PER_CPU(unsigned long *, sdei_shadow_call_stack_normal_ptr);
|
|||
DEFINE_PER_CPU(unsigned long *, sdei_shadow_call_stack_critical_ptr);
|
||||
#endif
|
||||
|
||||
DEFINE_PER_CPU(struct sdei_registered_event *, sdei_active_normal_event);
|
||||
DEFINE_PER_CPU(struct sdei_registered_event *, sdei_active_critical_event);
|
||||
|
||||
static void _free_sdei_stack(unsigned long * __percpu *ptr, int cpu)
|
||||
{
|
||||
unsigned long *p;
|
||||
|
|
|
|||
|
|
@ -1044,10 +1044,8 @@ void crash_smp_send_stop(void)
|
|||
* If this cpu is the only one alive at this point in time, online or
|
||||
* not, there are no stop messages to be sent around, so just back out.
|
||||
*/
|
||||
if (num_other_online_cpus() == 0) {
|
||||
sdei_mask_local_cpu();
|
||||
return;
|
||||
}
|
||||
if (num_other_online_cpus() == 0)
|
||||
goto skip_ipi;
|
||||
|
||||
cpumask_copy(&mask, cpu_online_mask);
|
||||
cpumask_clear_cpu(smp_processor_id(), &mask);
|
||||
|
|
@ -1066,7 +1064,9 @@ void crash_smp_send_stop(void)
|
|||
pr_warn("SMP: failed to stop secondary CPUs %*pbl\n",
|
||||
cpumask_pr_args(&mask));
|
||||
|
||||
skip_ipi:
|
||||
sdei_mask_local_cpu();
|
||||
sdei_handler_abort();
|
||||
}
|
||||
|
||||
bool smp_crash_stop_failed(void)
|
||||
|
|
|
|||
|
|
@ -50,9 +50,7 @@ SECTIONS
|
|||
|
||||
. = ALIGN(4);
|
||||
.altinstructions : {
|
||||
__alt_instructions = .;
|
||||
*(.altinstructions)
|
||||
__alt_instructions_end = .;
|
||||
}
|
||||
|
||||
.dynamic : { *(.dynamic) } :text :dynamic
|
||||
|
|
|
|||
|
|
@ -1095,3 +1095,22 @@ int sdei_event_handler(struct pt_regs *regs,
|
|||
return err;
|
||||
}
|
||||
NOKPROBE_SYMBOL(sdei_event_handler);
|
||||
|
||||
void sdei_handler_abort(void)
|
||||
{
|
||||
/*
|
||||
* If the crash happened in an SDEI event handler then we need to
|
||||
* finish the handler with the firmware so that we can have working
|
||||
* interrupts in the crash kernel.
|
||||
*/
|
||||
if (__this_cpu_read(sdei_active_critical_event)) {
|
||||
pr_warn("still in SDEI critical event context, attempting to finish handler.\n");
|
||||
__sdei_handler_abort();
|
||||
__this_cpu_write(sdei_active_critical_event, NULL);
|
||||
}
|
||||
if (__this_cpu_read(sdei_active_normal_event)) {
|
||||
pr_warn("still in SDEI normal event context, attempting to finish handler.\n");
|
||||
__sdei_handler_abort();
|
||||
__this_cpu_write(sdei_active_normal_event, NULL);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -47,10 +47,12 @@ int sdei_unregister_ghes(struct ghes *ghes);
|
|||
int sdei_mask_local_cpu(void);
|
||||
int sdei_unmask_local_cpu(void);
|
||||
void __init sdei_init(void);
|
||||
void sdei_handler_abort(void);
|
||||
#else
|
||||
static inline int sdei_mask_local_cpu(void) { return 0; }
|
||||
static inline int sdei_unmask_local_cpu(void) { return 0; }
|
||||
static inline void sdei_init(void) { }
|
||||
static inline void sdei_handler_abort(void) { }
|
||||
#endif /* CONFIG_ARM_SDE_INTERFACE */
|
||||
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user