|
@@ -186,20 +186,21 @@ static void clear_regs_spsr_ss(struct pt_regs *regs)
|
|
|
|
|
|
/* EL1 Single Step Handler hooks */
|
|
|
static LIST_HEAD(step_hook);
|
|
|
-static DEFINE_RWLOCK(step_hook_lock);
|
|
|
+static DEFINE_SPINLOCK(step_hook_lock);
|
|
|
|
|
|
void register_step_hook(struct step_hook *hook)
|
|
|
{
|
|
|
- write_lock(&step_hook_lock);
|
|
|
- list_add(&hook->node, &step_hook);
|
|
|
- write_unlock(&step_hook_lock);
|
|
|
+ spin_lock(&step_hook_lock);
|
|
|
+ list_add_rcu(&hook->node, &step_hook);
|
|
|
+ spin_unlock(&step_hook_lock);
|
|
|
}
|
|
|
|
|
|
void unregister_step_hook(struct step_hook *hook)
|
|
|
{
|
|
|
- write_lock(&step_hook_lock);
|
|
|
- list_del(&hook->node);
|
|
|
- write_unlock(&step_hook_lock);
|
|
|
+ spin_lock(&step_hook_lock);
|
|
|
+ list_del_rcu(&hook->node);
|
|
|
+ spin_unlock(&step_hook_lock);
|
|
|
+ synchronize_rcu();
|
|
|
}
|
|
|
|
|
|
/*
|
|
@@ -213,15 +214,15 @@ static int call_step_hook(struct pt_regs *regs, unsigned int esr)
|
|
|
struct step_hook *hook;
|
|
|
int retval = DBG_HOOK_ERROR;
|
|
|
|
|
|
- read_lock(&step_hook_lock);
|
|
|
+ rcu_read_lock();
|
|
|
|
|
|
- list_for_each_entry(hook, &step_hook, node) {
|
|
|
+ list_for_each_entry_rcu(hook, &step_hook, node) {
|
|
|
retval = hook->fn(regs, esr);
|
|
|
if (retval == DBG_HOOK_HANDLED)
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
- read_unlock(&step_hook_lock);
|
|
|
+ rcu_read_unlock();
|
|
|
|
|
|
return retval;
|
|
|
}
|