linux/arch/sh/kernel/hw_breakpoint.c
<<
>>
Prefs
   1/*
   2 * arch/sh/kernel/hw_breakpoint.c
   3 *
   4 * Unified kernel/user-space hardware breakpoint facility for the on-chip UBC.
   5 *
   6 * Copyright (C) 2009 - 2010  Paul Mundt
   7 *
   8 * This file is subject to the terms and conditions of the GNU General Public
   9 * License.  See the file "COPYING" in the main directory of this archive
  10 * for more details.
  11 */
  12#include <linux/init.h>
  13#include <linux/perf_event.h>
  14#include <linux/hw_breakpoint.h>
  15#include <linux/percpu.h>
  16#include <linux/kallsyms.h>
  17#include <linux/notifier.h>
  18#include <linux/kprobes.h>
  19#include <linux/kdebug.h>
  20#include <linux/io.h>
  21#include <linux/clk.h>
  22#include <asm/hw_breakpoint.h>
  23#include <asm/mmu_context.h>
  24#include <asm/ptrace.h>
  25#include <asm/traps.h>
  26
  27/*
  28 * Stores the breakpoints currently in use on each breakpoint address
  29 * register for each cpus
  30 */
  31static DEFINE_PER_CPU(struct perf_event *, bp_per_reg[HBP_NUM]);
  32
  33/*
  34 * A dummy placeholder for early accesses until the CPUs get a chance to
  35 * register their UBCs later in the boot process.
  36 */
  37static struct sh_ubc ubc_dummy = { .num_events = 0 };
  38
  39static struct sh_ubc *sh_ubc __read_mostly = &ubc_dummy;
  40
  41/*
  42 * Install a perf counter breakpoint.
  43 *
  44 * We seek a free UBC channel and use it for this breakpoint.
  45 *
  46 * Atomic: we hold the counter->ctx->lock and we only handle variables
  47 * and registers local to this cpu.
  48 */
  49int arch_install_hw_breakpoint(struct perf_event *bp)
  50{
  51        struct arch_hw_breakpoint *info = counter_arch_bp(bp);
  52        int i;
  53
  54        for (i = 0; i < sh_ubc->num_events; i++) {
  55                struct perf_event **slot = this_cpu_ptr(&bp_per_reg[i]);
  56
  57                if (!*slot) {
  58                        *slot = bp;
  59                        break;
  60                }
  61        }
  62
  63        if (WARN_ONCE(i == sh_ubc->num_events, "Can't find any breakpoint slot"))
  64                return -EBUSY;
  65
  66        clk_enable(sh_ubc->clk);
  67        sh_ubc->enable(info, i);
  68
  69        return 0;
  70}
  71
  72/*
  73 * Uninstall the breakpoint contained in the given counter.
  74 *
  75 * First we search the debug address register it uses and then we disable
  76 * it.
  77 *
  78 * Atomic: we hold the counter->ctx->lock and we only handle variables
  79 * and registers local to this cpu.
  80 */
  81void arch_uninstall_hw_breakpoint(struct perf_event *bp)
  82{
  83        struct arch_hw_breakpoint *info = counter_arch_bp(bp);
  84        int i;
  85
  86        for (i = 0; i < sh_ubc->num_events; i++) {
  87                struct perf_event **slot = this_cpu_ptr(&bp_per_reg[i]);
  88
  89                if (*slot == bp) {
  90                        *slot = NULL;
  91                        break;
  92                }
  93        }
  94
  95        if (WARN_ONCE(i == sh_ubc->num_events, "Can't find any breakpoint slot"))
  96                return;
  97
  98        sh_ubc->disable(info, i);
  99        clk_disable(sh_ubc->clk);
 100}
 101
 102static int get_hbp_len(u16 hbp_len)
 103{
 104        unsigned int len_in_bytes = 0;
 105
 106        switch (hbp_len) {
 107        case SH_BREAKPOINT_LEN_1:
 108                len_in_bytes = 1;
 109                break;
 110        case SH_BREAKPOINT_LEN_2:
 111                len_in_bytes = 2;
 112                break;
 113        case SH_BREAKPOINT_LEN_4:
 114                len_in_bytes = 4;
 115                break;
 116        case SH_BREAKPOINT_LEN_8:
 117                len_in_bytes = 8;
 118                break;
 119        }
 120        return len_in_bytes;
 121}
 122
 123/*
 124 * Check for virtual address in kernel space.
 125 */
 126int arch_check_bp_in_kernelspace(struct perf_event *bp)
 127{
 128        unsigned int len;
 129        unsigned long va;
 130        struct arch_hw_breakpoint *info = counter_arch_bp(bp);
 131
 132        va = info->address;
 133        len = get_hbp_len(info->len);
 134
 135        return (va >= TASK_SIZE) && ((va + len - 1) >= TASK_SIZE);
 136}
 137
 138int arch_bp_generic_fields(int sh_len, int sh_type,
 139                           int *gen_len, int *gen_type)
 140{
 141        /* Len */
 142        switch (sh_len) {
 143        case SH_BREAKPOINT_LEN_1:
 144                *gen_len = HW_BREAKPOINT_LEN_1;
 145                break;
 146        case SH_BREAKPOINT_LEN_2:
 147                *gen_len = HW_BREAKPOINT_LEN_2;
 148                break;
 149        case SH_BREAKPOINT_LEN_4:
 150                *gen_len = HW_BREAKPOINT_LEN_4;
 151                break;
 152        case SH_BREAKPOINT_LEN_8:
 153                *gen_len = HW_BREAKPOINT_LEN_8;
 154                break;
 155        default:
 156                return -EINVAL;
 157        }
 158
 159        /* Type */
 160        switch (sh_type) {
 161        case SH_BREAKPOINT_READ:
 162                *gen_type = HW_BREAKPOINT_R;
 163        case SH_BREAKPOINT_WRITE:
 164                *gen_type = HW_BREAKPOINT_W;
 165                break;
 166        case SH_BREAKPOINT_RW:
 167                *gen_type = HW_BREAKPOINT_W | HW_BREAKPOINT_R;
 168                break;
 169        default:
 170                return -EINVAL;
 171        }
 172
 173        return 0;
 174}
 175
 176static int arch_build_bp_info(struct perf_event *bp)
 177{
 178        struct arch_hw_breakpoint *info = counter_arch_bp(bp);
 179
 180        info->address = bp->attr.bp_addr;
 181
 182        /* Len */
 183        switch (bp->attr.bp_len) {
 184        case HW_BREAKPOINT_LEN_1:
 185                info->len = SH_BREAKPOINT_LEN_1;
 186                break;
 187        case HW_BREAKPOINT_LEN_2:
 188                info->len = SH_BREAKPOINT_LEN_2;
 189                break;
 190        case HW_BREAKPOINT_LEN_4:
 191                info->len = SH_BREAKPOINT_LEN_4;
 192                break;
 193        case HW_BREAKPOINT_LEN_8:
 194                info->len = SH_BREAKPOINT_LEN_8;
 195                break;
 196        default:
 197                return -EINVAL;
 198        }
 199
 200        /* Type */
 201        switch (bp->attr.bp_type) {
 202        case HW_BREAKPOINT_R:
 203                info->type = SH_BREAKPOINT_READ;
 204                break;
 205        case HW_BREAKPOINT_W:
 206                info->type = SH_BREAKPOINT_WRITE;
 207                break;
 208        case HW_BREAKPOINT_W | HW_BREAKPOINT_R:
 209                info->type = SH_BREAKPOINT_RW;
 210                break;
 211        default:
 212                return -EINVAL;
 213        }
 214
 215        return 0;
 216}
 217
 218/*
 219 * Validate the arch-specific HW Breakpoint register settings
 220 */
 221int arch_validate_hwbkpt_settings(struct perf_event *bp)
 222{
 223        struct arch_hw_breakpoint *info = counter_arch_bp(bp);
 224        unsigned int align;
 225        int ret;
 226
 227        ret = arch_build_bp_info(bp);
 228        if (ret)
 229                return ret;
 230
 231        ret = -EINVAL;
 232
 233        switch (info->len) {
 234        case SH_BREAKPOINT_LEN_1:
 235                align = 0;
 236                break;
 237        case SH_BREAKPOINT_LEN_2:
 238                align = 1;
 239                break;
 240        case SH_BREAKPOINT_LEN_4:
 241                align = 3;
 242                break;
 243        case SH_BREAKPOINT_LEN_8:
 244                align = 7;
 245                break;
 246        default:
 247                return ret;
 248        }
 249
 250        /*
 251         * For kernel-addresses, either the address or symbol name can be
 252         * specified.
 253         */
 254        if (info->name)
 255                info->address = (unsigned long)kallsyms_lookup_name(info->name);
 256
 257        /*
 258         * Check that the low-order bits of the address are appropriate
 259         * for the alignment implied by len.
 260         */
 261        if (info->address & align)
 262                return -EINVAL;
 263
 264        return 0;
 265}
 266
 267/*
 268 * Release the user breakpoints used by ptrace
 269 */
 270void flush_ptrace_hw_breakpoint(struct task_struct *tsk)
 271{
 272        int i;
 273        struct thread_struct *t = &tsk->thread;
 274
 275        for (i = 0; i < sh_ubc->num_events; i++) {
 276                unregister_hw_breakpoint(t->ptrace_bps[i]);
 277                t->ptrace_bps[i] = NULL;
 278        }
 279}
 280
 281static int __kprobes hw_breakpoint_handler(struct die_args *args)
 282{
 283        int cpu, i, rc = NOTIFY_STOP;
 284        struct perf_event *bp;
 285        unsigned int cmf, resume_mask;
 286
 287        /*
 288         * Do an early return if none of the channels triggered.
 289         */
 290        cmf = sh_ubc->triggered_mask();
 291        if (unlikely(!cmf))
 292                return NOTIFY_DONE;
 293
 294        /*
 295         * By default, resume all of the active channels.
 296         */
 297        resume_mask = sh_ubc->active_mask();
 298
 299        /*
 300         * Disable breakpoints during exception handling.
 301         */
 302        sh_ubc->disable_all();
 303
 304        cpu = get_cpu();
 305        for (i = 0; i < sh_ubc->num_events; i++) {
 306                unsigned long event_mask = (1 << i);
 307
 308                if (likely(!(cmf & event_mask)))
 309                        continue;
 310
 311                /*
 312                 * The counter may be concurrently released but that can only
 313                 * occur from a call_rcu() path. We can then safely fetch
 314                 * the breakpoint, use its callback, touch its counter
 315                 * while we are in an rcu_read_lock() path.
 316                 */
 317                rcu_read_lock();
 318
 319                bp = per_cpu(bp_per_reg[i], cpu);
 320                if (bp)
 321                        rc = NOTIFY_DONE;
 322
 323                /*
 324                 * Reset the condition match flag to denote completion of
 325                 * exception handling.
 326                 */
 327                sh_ubc->clear_triggered_mask(event_mask);
 328
 329                /*
 330                 * bp can be NULL due to concurrent perf counter
 331                 * removing.
 332                 */
 333                if (!bp) {
 334                        rcu_read_unlock();
 335                        break;
 336                }
 337
 338                /*
 339                 * Don't restore the channel if the breakpoint is from
 340                 * ptrace, as it always operates in one-shot mode.
 341                 */
 342                if (bp->overflow_handler == ptrace_triggered)
 343                        resume_mask &= ~(1 << i);
 344
 345                perf_bp_event(bp, args->regs);
 346
 347                /* Deliver the signal to userspace */
 348                if (!arch_check_bp_in_kernelspace(bp)) {
 349                        siginfo_t info;
 350
 351                        info.si_signo = args->signr;
 352                        info.si_errno = notifier_to_errno(rc);
 353                        info.si_code = TRAP_HWBKPT;
 354
 355                        force_sig_info(args->signr, &info, current);
 356                }
 357
 358                rcu_read_unlock();
 359        }
 360
 361        if (cmf == 0)
 362                rc = NOTIFY_DONE;
 363
 364        sh_ubc->enable_all(resume_mask);
 365
 366        put_cpu();
 367
 368        return rc;
 369}
 370
 371BUILD_TRAP_HANDLER(breakpoint)
 372{
 373        unsigned long ex = lookup_exception_vector();
 374        TRAP_HANDLER_DECL;
 375
 376        notify_die(DIE_BREAKPOINT, "breakpoint", regs, 0, ex, SIGTRAP);
 377}
 378
 379/*
 380 * Handle debug exception notifications.
 381 */
 382int __kprobes hw_breakpoint_exceptions_notify(struct notifier_block *unused,
 383                                    unsigned long val, void *data)
 384{
 385        struct die_args *args = data;
 386
 387        if (val != DIE_BREAKPOINT)
 388                return NOTIFY_DONE;
 389
 390        /*
 391         * If the breakpoint hasn't been triggered by the UBC, it's
 392         * probably from a debugger, so don't do anything more here.
 393         *
 394         * This also permits the UBC interface clock to remain off for
 395         * non-UBC breakpoints, as we don't need to check the triggered
 396         * or active channel masks.
 397         */
 398        if (args->trapnr != sh_ubc->trap_nr)
 399                return NOTIFY_DONE;
 400
 401        return hw_breakpoint_handler(data);
 402}
 403
 404void hw_breakpoint_pmu_read(struct perf_event *bp)
 405{
 406        /* TODO */
 407}
 408
 409int register_sh_ubc(struct sh_ubc *ubc)
 410{
 411        /* Bail if it's already assigned */
 412        if (sh_ubc != &ubc_dummy)
 413                return -EBUSY;
 414        sh_ubc = ubc;
 415
 416        pr_info("HW Breakpoints: %s UBC support registered\n", ubc->name);
 417
 418        WARN_ON(ubc->num_events > HBP_NUM);
 419
 420        return 0;
 421}
 422