Commit 81444b77 authored by Will Deacon's avatar Will Deacon

Merge branch 'for-next/misc' into for-next/core

* for-next/misc:
  arm64: kexec: include reboot.h
  arm64: delete dead code in this_cpu_set_vectors()
  arm64: kernel: Fix kernel warning when nokaslr is passed to commandline
  arm64: kgdb: Set PSTATE.SS to 1 to re-enable single-step
  arm64/sme: Fix some comments of ARM SME
  arm64/signal: Alloc tpidr2 sigframe after checking system_supports_tpidr2()
  arm64/signal: Use system_supports_tpidr2() to check TPIDR2
  arm64: compat: Remove defines now in asm-generic
  arm64: kexec: remove unnecessary (void*) conversions
  arm64: armv8_deprecated: remove unnecessary (void*) conversions
  firmware: arm_sdei: Fix sleep from invalid context BUG
parents f8863bc8 b7b4ce84
...@@ -83,10 +83,6 @@ struct compat_statfs { ...@@ -83,10 +83,6 @@ struct compat_statfs {
int f_spare[4]; int f_spare[4];
}; };
#define COMPAT_RLIM_INFINITY 0xffffffff
#define COMPAT_OFF_T_MAX 0x7fffffff
#define compat_user_stack_pointer() (user_stack_pointer(task_pt_regs(current))) #define compat_user_stack_pointer() (user_stack_pointer(task_pt_regs(current)))
#define COMPAT_MINSIGSTKSZ 2048 #define COMPAT_MINSIGSTKSZ 2048
......
...@@ -104,6 +104,7 @@ void user_regs_reset_single_step(struct user_pt_regs *regs, ...@@ -104,6 +104,7 @@ void user_regs_reset_single_step(struct user_pt_regs *regs,
void kernel_enable_single_step(struct pt_regs *regs); void kernel_enable_single_step(struct pt_regs *regs);
void kernel_disable_single_step(void); void kernel_disable_single_step(void);
int kernel_active_single_step(void); int kernel_active_single_step(void);
void kernel_rewind_single_step(struct pt_regs *regs);
#ifdef CONFIG_HAVE_HW_BREAKPOINT #ifdef CONFIG_HAVE_HW_BREAKPOINT
int reinstall_suspended_bps(struct pt_regs *regs); int reinstall_suspended_bps(struct pt_regs *regs);
......
...@@ -420,14 +420,14 @@ static DEFINE_MUTEX(insn_emulation_mutex); ...@@ -420,14 +420,14 @@ static DEFINE_MUTEX(insn_emulation_mutex);
static void enable_insn_hw_mode(void *data) static void enable_insn_hw_mode(void *data)
{ {
struct insn_emulation *insn = (struct insn_emulation *)data; struct insn_emulation *insn = data;
if (insn->set_hw_mode) if (insn->set_hw_mode)
insn->set_hw_mode(true); insn->set_hw_mode(true);
} }
static void disable_insn_hw_mode(void *data) static void disable_insn_hw_mode(void *data)
{ {
struct insn_emulation *insn = (struct insn_emulation *)data; struct insn_emulation *insn = data;
if (insn->set_hw_mode) if (insn->set_hw_mode)
insn->set_hw_mode(false); insn->set_hw_mode(false);
} }
......
...@@ -438,6 +438,11 @@ int kernel_active_single_step(void) ...@@ -438,6 +438,11 @@ int kernel_active_single_step(void)
} }
NOKPROBE_SYMBOL(kernel_active_single_step); NOKPROBE_SYMBOL(kernel_active_single_step);
void kernel_rewind_single_step(struct pt_regs *regs)
{
set_regs_spsr_ss(regs);
}
/* ptrace API */ /* ptrace API */
void user_enable_single_step(struct task_struct *task) void user_enable_single_step(struct task_struct *task)
{ {
......
...@@ -299,7 +299,7 @@ void task_set_vl_onexec(struct task_struct *task, enum vec_type type, ...@@ -299,7 +299,7 @@ void task_set_vl_onexec(struct task_struct *task, enum vec_type type,
/* /*
* TIF_SME controls whether a task can use SME without trapping while * TIF_SME controls whether a task can use SME without trapping while
* in userspace, when TIF_SME is set then we must have storage * in userspace, when TIF_SME is set then we must have storage
* alocated in sve_state and sme_state to store the contents of both ZA * allocated in sve_state and sme_state to store the contents of both ZA
* and the SVE registers for both streaming and non-streaming modes. * and the SVE registers for both streaming and non-streaming modes.
* *
* If both SVCR.ZA and SVCR.SM are disabled then at any point we * If both SVCR.ZA and SVCR.SM are disabled then at any point we
...@@ -1477,7 +1477,7 @@ void do_sve_acc(unsigned long esr, struct pt_regs *regs) ...@@ -1477,7 +1477,7 @@ void do_sve_acc(unsigned long esr, struct pt_regs *regs)
* *
* TIF_SME should be clear on entry: otherwise, fpsimd_restore_current_state() * TIF_SME should be clear on entry: otherwise, fpsimd_restore_current_state()
* would have disabled the SME access trap for userspace during * would have disabled the SME access trap for userspace during
* ret_to_user, making an SVE access trap impossible in that case. * ret_to_user, making an SME access trap impossible in that case.
*/ */
void do_sme_acc(unsigned long esr, struct pt_regs *regs) void do_sme_acc(unsigned long esr, struct pt_regs *regs)
{ {
......
...@@ -178,6 +178,13 @@ static const struct { ...@@ -178,6 +178,13 @@ static const struct {
{ "nokaslr", "kaslr.disabled=1" }, { "nokaslr", "kaslr.disabled=1" },
}; };
static int __init parse_nokaslr(char *unused)
{
/* nokaslr param handling is done by early cpufeature code */
return 0;
}
early_param("nokaslr", parse_nokaslr);
static int __init find_field(const char *cmdline, static int __init find_field(const char *cmdline,
const struct ftr_set_desc *reg, int f, u64 *v) const struct ftr_set_desc *reg, int f, u64 *v)
{ {
......
...@@ -224,6 +224,8 @@ int kgdb_arch_handle_exception(int exception_vector, int signo, ...@@ -224,6 +224,8 @@ int kgdb_arch_handle_exception(int exception_vector, int signo,
*/ */
if (!kernel_active_single_step()) if (!kernel_active_single_step())
kernel_enable_single_step(linux_regs); kernel_enable_single_step(linux_regs);
else
kernel_rewind_single_step(linux_regs);
err = 0; err = 0;
break; break;
default: default:
......
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/kexec.h> #include <linux/kexec.h>
#include <linux/page-flags.h> #include <linux/page-flags.h>
#include <linux/reboot.h>
#include <linux/set_memory.h> #include <linux/set_memory.h>
#include <linux/smp.h> #include <linux/smp.h>
...@@ -102,7 +103,7 @@ static void kexec_segment_flush(const struct kimage *kimage) ...@@ -102,7 +103,7 @@ static void kexec_segment_flush(const struct kimage *kimage)
/* Allocates pages for kexec page table */ /* Allocates pages for kexec page table */
static void *kexec_page_alloc(void *arg) static void *kexec_page_alloc(void *arg)
{ {
struct kimage *kimage = (struct kimage *)arg; struct kimage *kimage = arg;
struct page *page = kimage_alloc_control_pages(kimage, 0); struct page *page = kimage_alloc_control_pages(kimage, 0);
void *vaddr = NULL; void *vaddr = NULL;
......
...@@ -966,9 +966,6 @@ static void this_cpu_set_vectors(enum arm64_bp_harden_el1_vectors slot) ...@@ -966,9 +966,6 @@ static void this_cpu_set_vectors(enum arm64_bp_harden_el1_vectors slot)
{ {
const char *v = arm64_get_bp_hardening_vector(slot); const char *v = arm64_get_bp_hardening_vector(slot);
if (slot < 0)
return;
__this_cpu_write(this_cpu_vector, v); __this_cpu_write(this_cpu_vector, v);
/* /*
......
...@@ -651,7 +651,7 @@ static int parse_user_sigframe(struct user_ctxs *user, ...@@ -651,7 +651,7 @@ static int parse_user_sigframe(struct user_ctxs *user,
break; break;
case TPIDR2_MAGIC: case TPIDR2_MAGIC:
if (!system_supports_sme()) if (!system_supports_tpidr2())
goto invalid; goto invalid;
if (user->tpidr2) if (user->tpidr2)
...@@ -802,7 +802,7 @@ static int restore_sigframe(struct pt_regs *regs, ...@@ -802,7 +802,7 @@ static int restore_sigframe(struct pt_regs *regs,
err = restore_fpsimd_context(&user); err = restore_fpsimd_context(&user);
} }
if (err == 0 && system_supports_sme() && user.tpidr2) if (err == 0 && system_supports_tpidr2() && user.tpidr2)
err = restore_tpidr2_context(&user); err = restore_tpidr2_context(&user);
if (err == 0 && system_supports_sme() && user.za) if (err == 0 && system_supports_sme() && user.za)
...@@ -893,6 +893,13 @@ static int setup_sigframe_layout(struct rt_sigframe_user_layout *user, ...@@ -893,6 +893,13 @@ static int setup_sigframe_layout(struct rt_sigframe_user_layout *user,
return err; return err;
} }
if (system_supports_tpidr2()) {
err = sigframe_alloc(user, &user->tpidr2_offset,
sizeof(struct tpidr2_context));
if (err)
return err;
}
if (system_supports_sme()) { if (system_supports_sme()) {
unsigned int vl; unsigned int vl;
unsigned int vq = 0; unsigned int vq = 0;
...@@ -902,11 +909,6 @@ static int setup_sigframe_layout(struct rt_sigframe_user_layout *user, ...@@ -902,11 +909,6 @@ static int setup_sigframe_layout(struct rt_sigframe_user_layout *user,
else else
vl = task_get_sme_vl(current); vl = task_get_sme_vl(current);
err = sigframe_alloc(user, &user->tpidr2_offset,
sizeof(struct tpidr2_context));
if (err)
return err;
if (thread_za_enabled(&current->thread)) if (thread_za_enabled(&current->thread))
vq = sve_vq_from_vl(vl); vq = sve_vq_from_vl(vl);
...@@ -974,7 +976,7 @@ static int setup_sigframe(struct rt_sigframe_user_layout *user, ...@@ -974,7 +976,7 @@ static int setup_sigframe(struct rt_sigframe_user_layout *user,
} }
/* TPIDR2 if supported */ /* TPIDR2 if supported */
if (system_supports_sme() && err == 0) { if (system_supports_tpidr2() && err == 0) {
struct tpidr2_context __user *tpidr2_ctx = struct tpidr2_context __user *tpidr2_ctx =
apply_user_offset(user, user->tpidr2_offset); apply_user_offset(user, user->tpidr2_offset);
err |= preserve_tpidr2_context(tpidr2_ctx); err |= preserve_tpidr2_context(tpidr2_ctx);
......
...@@ -43,6 +43,8 @@ static asmlinkage void (*sdei_firmware_call)(unsigned long function_id, ...@@ -43,6 +43,8 @@ static asmlinkage void (*sdei_firmware_call)(unsigned long function_id,
/* entry point from firmware to arch asm code */ /* entry point from firmware to arch asm code */
static unsigned long sdei_entry_point; static unsigned long sdei_entry_point;
static int sdei_hp_state;
struct sdei_event { struct sdei_event {
/* These three are protected by the sdei_list_lock */ /* These three are protected by the sdei_list_lock */
struct list_head list; struct list_head list;
...@@ -301,8 +303,6 @@ int sdei_mask_local_cpu(void) ...@@ -301,8 +303,6 @@ int sdei_mask_local_cpu(void)
{ {
int err; int err;
WARN_ON_ONCE(preemptible());
err = invoke_sdei_fn(SDEI_1_0_FN_SDEI_PE_MASK, 0, 0, 0, 0, 0, NULL); err = invoke_sdei_fn(SDEI_1_0_FN_SDEI_PE_MASK, 0, 0, 0, 0, 0, NULL);
if (err && err != -EIO) { if (err && err != -EIO) {
pr_warn_once("failed to mask CPU[%u]: %d\n", pr_warn_once("failed to mask CPU[%u]: %d\n",
...@@ -315,6 +315,7 @@ int sdei_mask_local_cpu(void) ...@@ -315,6 +315,7 @@ int sdei_mask_local_cpu(void)
static void _ipi_mask_cpu(void *ignored) static void _ipi_mask_cpu(void *ignored)
{ {
WARN_ON_ONCE(preemptible());
sdei_mask_local_cpu(); sdei_mask_local_cpu();
} }
...@@ -322,8 +323,6 @@ int sdei_unmask_local_cpu(void) ...@@ -322,8 +323,6 @@ int sdei_unmask_local_cpu(void)
{ {
int err; int err;
WARN_ON_ONCE(preemptible());
err = invoke_sdei_fn(SDEI_1_0_FN_SDEI_PE_UNMASK, 0, 0, 0, 0, 0, NULL); err = invoke_sdei_fn(SDEI_1_0_FN_SDEI_PE_UNMASK, 0, 0, 0, 0, 0, NULL);
if (err && err != -EIO) { if (err && err != -EIO) {
pr_warn_once("failed to unmask CPU[%u]: %d\n", pr_warn_once("failed to unmask CPU[%u]: %d\n",
...@@ -336,6 +335,7 @@ int sdei_unmask_local_cpu(void) ...@@ -336,6 +335,7 @@ int sdei_unmask_local_cpu(void)
static void _ipi_unmask_cpu(void *ignored) static void _ipi_unmask_cpu(void *ignored)
{ {
WARN_ON_ONCE(preemptible());
sdei_unmask_local_cpu(); sdei_unmask_local_cpu();
} }
...@@ -343,6 +343,8 @@ static void _ipi_private_reset(void *ignored) ...@@ -343,6 +343,8 @@ static void _ipi_private_reset(void *ignored)
{ {
int err; int err;
WARN_ON_ONCE(preemptible());
err = invoke_sdei_fn(SDEI_1_0_FN_SDEI_PRIVATE_RESET, 0, 0, 0, 0, 0, err = invoke_sdei_fn(SDEI_1_0_FN_SDEI_PRIVATE_RESET, 0, 0, 0, 0, 0,
NULL); NULL);
if (err && err != -EIO) if (err && err != -EIO)
...@@ -389,8 +391,6 @@ static void _local_event_enable(void *data) ...@@ -389,8 +391,6 @@ static void _local_event_enable(void *data)
int err; int err;
struct sdei_crosscall_args *arg = data; struct sdei_crosscall_args *arg = data;
WARN_ON_ONCE(preemptible());
err = sdei_api_event_enable(arg->event->event_num); err = sdei_api_event_enable(arg->event->event_num);
sdei_cross_call_return(arg, err); sdei_cross_call_return(arg, err);
...@@ -479,8 +479,6 @@ static void _local_event_unregister(void *data) ...@@ -479,8 +479,6 @@ static void _local_event_unregister(void *data)
int err; int err;
struct sdei_crosscall_args *arg = data; struct sdei_crosscall_args *arg = data;
WARN_ON_ONCE(preemptible());
err = sdei_api_event_unregister(arg->event->event_num); err = sdei_api_event_unregister(arg->event->event_num);
sdei_cross_call_return(arg, err); sdei_cross_call_return(arg, err);
...@@ -561,8 +559,6 @@ static void _local_event_register(void *data) ...@@ -561,8 +559,6 @@ static void _local_event_register(void *data)
struct sdei_registered_event *reg; struct sdei_registered_event *reg;
struct sdei_crosscall_args *arg = data; struct sdei_crosscall_args *arg = data;
WARN_ON(preemptible());
reg = per_cpu_ptr(arg->event->private_registered, smp_processor_id()); reg = per_cpu_ptr(arg->event->private_registered, smp_processor_id());
err = sdei_api_event_register(arg->event->event_num, sdei_entry_point, err = sdei_api_event_register(arg->event->event_num, sdei_entry_point,
reg, 0, 0); reg, 0, 0);
...@@ -717,6 +713,8 @@ static int sdei_pm_notifier(struct notifier_block *nb, unsigned long action, ...@@ -717,6 +713,8 @@ static int sdei_pm_notifier(struct notifier_block *nb, unsigned long action,
{ {
int rv; int rv;
WARN_ON_ONCE(preemptible());
switch (action) { switch (action) {
case CPU_PM_ENTER: case CPU_PM_ENTER:
rv = sdei_mask_local_cpu(); rv = sdei_mask_local_cpu();
...@@ -765,7 +763,7 @@ static int sdei_device_freeze(struct device *dev) ...@@ -765,7 +763,7 @@ static int sdei_device_freeze(struct device *dev)
int err; int err;
/* unregister private events */ /* unregister private events */
cpuhp_remove_state(CPUHP_AP_ARM_SDEI_STARTING); cpuhp_remove_state(sdei_entry_point);
err = sdei_unregister_shared(); err = sdei_unregister_shared();
if (err) if (err)
...@@ -786,12 +784,15 @@ static int sdei_device_thaw(struct device *dev) ...@@ -786,12 +784,15 @@ static int sdei_device_thaw(struct device *dev)
return err; return err;
} }
err = cpuhp_setup_state(CPUHP_AP_ARM_SDEI_STARTING, "SDEI", err = cpuhp_setup_state(CPUHP_AP_ONLINE_DYN, "SDEI",
&sdei_cpuhp_up, &sdei_cpuhp_down); &sdei_cpuhp_up, &sdei_cpuhp_down);
if (err) if (err < 0) {
pr_warn("Failed to re-register CPU hotplug notifier...\n"); pr_warn("Failed to re-register CPU hotplug notifier...\n");
return err; return err;
}
sdei_hp_state = err;
return 0;
} }
static int sdei_device_restore(struct device *dev) static int sdei_device_restore(struct device *dev)
...@@ -823,7 +824,7 @@ static int sdei_reboot_notifier(struct notifier_block *nb, unsigned long action, ...@@ -823,7 +824,7 @@ static int sdei_reboot_notifier(struct notifier_block *nb, unsigned long action,
* We are going to reset the interface, after this there is no point * We are going to reset the interface, after this there is no point
* doing work when we take CPUs offline. * doing work when we take CPUs offline.
*/ */
cpuhp_remove_state(CPUHP_AP_ARM_SDEI_STARTING); cpuhp_remove_state(sdei_hp_state);
sdei_platform_reset(); sdei_platform_reset();
...@@ -1003,13 +1004,15 @@ static int sdei_probe(struct platform_device *pdev) ...@@ -1003,13 +1004,15 @@ static int sdei_probe(struct platform_device *pdev)
goto remove_cpupm; goto remove_cpupm;
} }
err = cpuhp_setup_state(CPUHP_AP_ARM_SDEI_STARTING, "SDEI", err = cpuhp_setup_state(CPUHP_AP_ONLINE_DYN, "SDEI",
&sdei_cpuhp_up, &sdei_cpuhp_down); &sdei_cpuhp_up, &sdei_cpuhp_down);
if (err) { if (err < 0) {
pr_warn("Failed to register CPU hotplug notifier...\n"); pr_warn("Failed to register CPU hotplug notifier...\n");
goto remove_reboot; goto remove_reboot;
} }
sdei_hp_state = err;
return 0; return 0;
remove_reboot: remove_reboot:
......
...@@ -163,7 +163,6 @@ enum cpuhp_state { ...@@ -163,7 +163,6 @@ enum cpuhp_state {
CPUHP_AP_PERF_X86_CSTATE_STARTING, CPUHP_AP_PERF_X86_CSTATE_STARTING,
CPUHP_AP_PERF_XTENSA_STARTING, CPUHP_AP_PERF_XTENSA_STARTING,
CPUHP_AP_MIPS_OP_LOONGSON3_STARTING, CPUHP_AP_MIPS_OP_LOONGSON3_STARTING,
CPUHP_AP_ARM_SDEI_STARTING,
CPUHP_AP_ARM_VFP_STARTING, CPUHP_AP_ARM_VFP_STARTING,
CPUHP_AP_ARM64_DEBUG_MONITORS_STARTING, CPUHP_AP_ARM64_DEBUG_MONITORS_STARTING,
CPUHP_AP_PERF_ARM_HW_BREAKPOINT_STARTING, CPUHP_AP_PERF_ARM_HW_BREAKPOINT_STARTING,
......
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