linux/arch/x86/kernel/ptrace.c
<<
>>
Prefs
   1/* By Ross Biro 1/23/92 */
   2/*
   3 * Pentium III FXSR, SSE support
   4 *      Gareth Hughes <gareth@valinux.com>, May 2000
   5 */
   6
   7#include <linux/kernel.h>
   8#include <linux/sched.h>
   9#include <linux/mm.h>
  10#include <linux/smp.h>
  11#include <linux/errno.h>
  12#include <linux/slab.h>
  13#include <linux/ptrace.h>
  14#include <linux/tracehook.h>
  15#include <linux/user.h>
  16#include <linux/elf.h>
  17#include <linux/security.h>
  18#include <linux/audit.h>
  19#include <linux/seccomp.h>
  20#include <linux/signal.h>
  21#include <linux/perf_event.h>
  22#include <linux/hw_breakpoint.h>
  23#include <linux/rcupdate.h>
  24#include <linux/export.h>
  25#include <linux/context_tracking.h>
  26
  27#include <asm/uaccess.h>
  28#include <asm/pgtable.h>
  29#include <asm/processor.h>
  30#include <asm/fpu/internal.h>
  31#include <asm/fpu/signal.h>
  32#include <asm/fpu/regset.h>
  33#include <asm/debugreg.h>
  34#include <asm/ldt.h>
  35#include <asm/desc.h>
  36#include <asm/prctl.h>
  37#include <asm/proto.h>
  38#include <asm/hw_breakpoint.h>
  39#include <asm/traps.h>
  40#include <asm/syscall.h>
  41
  42#include "tls.h"
  43
  44enum x86_regset {
  45        REGSET_GENERAL,
  46        REGSET_FP,
  47        REGSET_XFP,
  48        REGSET_IOPERM64 = REGSET_XFP,
  49        REGSET_XSTATE,
  50        REGSET_TLS,
  51        REGSET_IOPERM32,
  52};
  53
  54struct pt_regs_offset {
  55        const char *name;
  56        int offset;
  57};
  58
  59#define REG_OFFSET_NAME(r) {.name = #r, .offset = offsetof(struct pt_regs, r)}
  60#define REG_OFFSET_END {.name = NULL, .offset = 0}
  61
  62static const struct pt_regs_offset regoffset_table[] = {
  63#ifdef CONFIG_X86_64
  64        REG_OFFSET_NAME(r15),
  65        REG_OFFSET_NAME(r14),
  66        REG_OFFSET_NAME(r13),
  67        REG_OFFSET_NAME(r12),
  68        REG_OFFSET_NAME(r11),
  69        REG_OFFSET_NAME(r10),
  70        REG_OFFSET_NAME(r9),
  71        REG_OFFSET_NAME(r8),
  72#endif
  73        REG_OFFSET_NAME(bx),
  74        REG_OFFSET_NAME(cx),
  75        REG_OFFSET_NAME(dx),
  76        REG_OFFSET_NAME(si),
  77        REG_OFFSET_NAME(di),
  78        REG_OFFSET_NAME(bp),
  79        REG_OFFSET_NAME(ax),
  80#ifdef CONFIG_X86_32
  81        REG_OFFSET_NAME(ds),
  82        REG_OFFSET_NAME(es),
  83        REG_OFFSET_NAME(fs),
  84        REG_OFFSET_NAME(gs),
  85#endif
  86        REG_OFFSET_NAME(orig_ax),
  87        REG_OFFSET_NAME(ip),
  88        REG_OFFSET_NAME(cs),
  89        REG_OFFSET_NAME(flags),
  90        REG_OFFSET_NAME(sp),
  91        REG_OFFSET_NAME(ss),
  92        REG_OFFSET_END,
  93};
  94
  95/**
  96 * regs_query_register_offset() - query register offset from its name
  97 * @name:       the name of a register
  98 *
  99 * regs_query_register_offset() returns the offset of a register in struct
 100 * pt_regs from its name. If the name is invalid, this returns -EINVAL;
 101 */
 102int regs_query_register_offset(const char *name)
 103{
 104        const struct pt_regs_offset *roff;
 105        for (roff = regoffset_table; roff->name != NULL; roff++)
 106                if (!strcmp(roff->name, name))
 107                        return roff->offset;
 108        return -EINVAL;
 109}
 110
 111/**
 112 * regs_query_register_name() - query register name from its offset
 113 * @offset:     the offset of a register in struct pt_regs.
 114 *
 115 * regs_query_register_name() returns the name of a register from its
 116 * offset in struct pt_regs. If the @offset is invalid, this returns NULL;
 117 */
 118const char *regs_query_register_name(unsigned int offset)
 119{
 120        const struct pt_regs_offset *roff;
 121        for (roff = regoffset_table; roff->name != NULL; roff++)
 122                if (roff->offset == offset)
 123                        return roff->name;
 124        return NULL;
 125}
 126
 127/*
 128 * does not yet catch signals sent when the child dies.
 129 * in exit.c or in signal.c.
 130 */
 131
 132/*
 133 * Determines which flags the user has access to [1 = access, 0 = no access].
 134 */
 135#define FLAG_MASK_32            ((unsigned long)                        \
 136                                 (X86_EFLAGS_CF | X86_EFLAGS_PF |       \
 137                                  X86_EFLAGS_AF | X86_EFLAGS_ZF |       \
 138                                  X86_EFLAGS_SF | X86_EFLAGS_TF |       \
 139                                  X86_EFLAGS_DF | X86_EFLAGS_OF |       \
 140                                  X86_EFLAGS_RF | X86_EFLAGS_AC))
 141
 142/*
 143 * Determines whether a value may be installed in a segment register.
 144 */
 145static inline bool invalid_selector(u16 value)
 146{
 147        return unlikely(value != 0 && (value & SEGMENT_RPL_MASK) != USER_RPL);
 148}
 149
 150#ifdef CONFIG_X86_32
 151
 152#define FLAG_MASK               FLAG_MASK_32
 153
 154/*
 155 * X86_32 CPUs don't save ss and esp if the CPU is already in kernel mode
 156 * when it traps.  The previous stack will be directly underneath the saved
 157 * registers, and 'sp/ss' won't even have been saved. Thus the '&regs->sp'.
 158 *
 159 * Now, if the stack is empty, '&regs->sp' is out of range. In this
 160 * case we try to take the previous stack. To always return a non-null
 161 * stack pointer we fall back to regs as stack if no previous stack
 162 * exists.
 163 *
 164 * This is valid only for kernel mode traps.
 165 */
 166unsigned long kernel_stack_pointer(struct pt_regs *regs)
 167{
 168        unsigned long context = (unsigned long)regs & ~(THREAD_SIZE - 1);
 169        unsigned long sp = (unsigned long)&regs->sp;
 170        u32 *prev_esp;
 171
 172        if (context == (sp & ~(THREAD_SIZE - 1)))
 173                return sp;
 174
 175        prev_esp = (u32 *)(context);
 176        if (prev_esp)
 177                return (unsigned long)prev_esp;
 178
 179        return (unsigned long)regs;
 180}
 181EXPORT_SYMBOL_GPL(kernel_stack_pointer);
 182
 183static unsigned long *pt_regs_access(struct pt_regs *regs, unsigned long regno)
 184{
 185        BUILD_BUG_ON(offsetof(struct pt_regs, bx) != 0);
 186        return &regs->bx + (regno >> 2);
 187}
 188
 189static u16 get_segment_reg(struct task_struct *task, unsigned long offset)
 190{
 191        /*
 192         * Returning the value truncates it to 16 bits.
 193         */
 194        unsigned int retval;
 195        if (offset != offsetof(struct user_regs_struct, gs))
 196                retval = *pt_regs_access(task_pt_regs(task), offset);
 197        else {
 198                if (task == current)
 199                        retval = get_user_gs(task_pt_regs(task));
 200                else
 201                        retval = task_user_gs(task);
 202        }
 203        return retval;
 204}
 205
 206static int set_segment_reg(struct task_struct *task,
 207                           unsigned long offset, u16 value)
 208{
 209        /*
 210         * The value argument was already truncated to 16 bits.
 211         */
 212        if (invalid_selector(value))
 213                return -EIO;
 214
 215        /*
 216         * For %cs and %ss we cannot permit a null selector.
 217         * We can permit a bogus selector as long as it has USER_RPL.
 218         * Null selectors are fine for other segment registers, but
 219         * we will never get back to user mode with invalid %cs or %ss
 220         * and will take the trap in iret instead.  Much code relies
 221         * on user_mode() to distinguish a user trap frame (which can
 222         * safely use invalid selectors) from a kernel trap frame.
 223         */
 224        switch (offset) {
 225        case offsetof(struct user_regs_struct, cs):
 226        case offsetof(struct user_regs_struct, ss):
 227                if (unlikely(value == 0))
 228                        return -EIO;
 229
 230        default:
 231                *pt_regs_access(task_pt_regs(task), offset) = value;
 232                break;
 233
 234        case offsetof(struct user_regs_struct, gs):
 235                if (task == current)
 236                        set_user_gs(task_pt_regs(task), value);
 237                else
 238                        task_user_gs(task) = value;
 239        }
 240
 241        return 0;
 242}
 243
 244#else  /* CONFIG_X86_64 */
 245
 246#define FLAG_MASK               (FLAG_MASK_32 | X86_EFLAGS_NT)
 247
 248static unsigned long *pt_regs_access(struct pt_regs *regs, unsigned long offset)
 249{
 250        BUILD_BUG_ON(offsetof(struct pt_regs, r15) != 0);
 251        return &regs->r15 + (offset / sizeof(regs->r15));
 252}
 253
 254static u16 get_segment_reg(struct task_struct *task, unsigned long offset)
 255{
 256        /*
 257         * Returning the value truncates it to 16 bits.
 258         */
 259        unsigned int seg;
 260
 261        switch (offset) {
 262        case offsetof(struct user_regs_struct, fs):
 263                if (task == current) {
 264                        /* Older gas can't assemble movq %?s,%r?? */
 265                        asm("movl %%fs,%0" : "=r" (seg));
 266                        return seg;
 267                }
 268                return task->thread.fsindex;
 269        case offsetof(struct user_regs_struct, gs):
 270                if (task == current) {
 271                        asm("movl %%gs,%0" : "=r" (seg));
 272                        return seg;
 273                }
 274                return task->thread.gsindex;
 275        case offsetof(struct user_regs_struct, ds):
 276                if (task == current) {
 277                        asm("movl %%ds,%0" : "=r" (seg));
 278                        return seg;
 279                }
 280                return task->thread.ds;
 281        case offsetof(struct user_regs_struct, es):
 282                if (task == current) {
 283                        asm("movl %%es,%0" : "=r" (seg));
 284                        return seg;
 285                }
 286                return task->thread.es;
 287
 288        case offsetof(struct user_regs_struct, cs):
 289        case offsetof(struct user_regs_struct, ss):
 290                break;
 291        }
 292        return *pt_regs_access(task_pt_regs(task), offset);
 293}
 294
 295static int set_segment_reg(struct task_struct *task,
 296                           unsigned long offset, u16 value)
 297{
 298        /*
 299         * The value argument was already truncated to 16 bits.
 300         */
 301        if (invalid_selector(value))
 302                return -EIO;
 303
 304        switch (offset) {
 305        case offsetof(struct user_regs_struct,fs):
 306                /*
 307                 * If this is setting fs as for normal 64-bit use but
 308                 * setting fs_base has implicitly changed it, leave it.
 309                 */
 310                if ((value == FS_TLS_SEL && task->thread.fsindex == 0 &&
 311                     task->thread.fs != 0) ||
 312                    (value == 0 && task->thread.fsindex == FS_TLS_SEL &&
 313                     task->thread.fs == 0))
 314                        break;
 315                task->thread.fsindex = value;
 316                if (task == current)
 317                        loadsegment(fs, task->thread.fsindex);
 318                break;
 319        case offsetof(struct user_regs_struct,gs):
 320                /*
 321                 * If this is setting gs as for normal 64-bit use but
 322                 * setting gs_base has implicitly changed it, leave it.
 323                 */
 324                if ((value == GS_TLS_SEL && task->thread.gsindex == 0 &&
 325                     task->thread.gs != 0) ||
 326                    (value == 0 && task->thread.gsindex == GS_TLS_SEL &&
 327                     task->thread.gs == 0))
 328                        break;
 329                task->thread.gsindex = value;
 330                if (task == current)
 331                        load_gs_index(task->thread.gsindex);
 332                break;
 333        case offsetof(struct user_regs_struct,ds):
 334                task->thread.ds = value;
 335                if (task == current)
 336                        loadsegment(ds, task->thread.ds);
 337                break;
 338        case offsetof(struct user_regs_struct,es):
 339                task->thread.es = value;
 340                if (task == current)
 341                        loadsegment(es, task->thread.es);
 342                break;
 343
 344                /*
 345                 * Can't actually change these in 64-bit mode.
 346                 */
 347        case offsetof(struct user_regs_struct,cs):
 348                if (unlikely(value == 0))
 349                        return -EIO;
 350                task_pt_regs(task)->cs = value;
 351                break;
 352        case offsetof(struct user_regs_struct,ss):
 353                if (unlikely(value == 0))
 354                        return -EIO;
 355                task_pt_regs(task)->ss = value;
 356                break;
 357        }
 358
 359        return 0;
 360}
 361
 362#endif  /* CONFIG_X86_32 */
 363
 364static unsigned long get_flags(struct task_struct *task)
 365{
 366        unsigned long retval = task_pt_regs(task)->flags;
 367
 368        /*
 369         * If the debugger set TF, hide it from the readout.
 370         */
 371        if (test_tsk_thread_flag(task, TIF_FORCED_TF))
 372                retval &= ~X86_EFLAGS_TF;
 373
 374        return retval;
 375}
 376
 377static int set_flags(struct task_struct *task, unsigned long value)
 378{
 379        struct pt_regs *regs = task_pt_regs(task);
 380
 381        /*
 382         * If the user value contains TF, mark that
 383         * it was not "us" (the debugger) that set it.
 384         * If not, make sure it stays set if we had.
 385         */
 386        if (value & X86_EFLAGS_TF)
 387                clear_tsk_thread_flag(task, TIF_FORCED_TF);
 388        else if (test_tsk_thread_flag(task, TIF_FORCED_TF))
 389                value |= X86_EFLAGS_TF;
 390
 391        regs->flags = (regs->flags & ~FLAG_MASK) | (value & FLAG_MASK);
 392
 393        return 0;
 394}
 395
 396static int putreg(struct task_struct *child,
 397                  unsigned long offset, unsigned long value)
 398{
 399        switch (offset) {
 400        case offsetof(struct user_regs_struct, cs):
 401        case offsetof(struct user_regs_struct, ds):
 402        case offsetof(struct user_regs_struct, es):
 403        case offsetof(struct user_regs_struct, fs):
 404        case offsetof(struct user_regs_struct, gs):
 405        case offsetof(struct user_regs_struct, ss):
 406                return set_segment_reg(child, offset, value);
 407
 408        case offsetof(struct user_regs_struct, flags):
 409                return set_flags(child, value);
 410
 411#ifdef CONFIG_X86_64
 412        case offsetof(struct user_regs_struct,fs_base):
 413                if (value >= TASK_SIZE_OF(child))
 414                        return -EIO;
 415                /*
 416                 * When changing the segment base, use do_arch_prctl
 417                 * to set either thread.fs or thread.fsindex and the
 418                 * corresponding GDT slot.
 419                 */
 420                if (child->thread.fs != value)
 421                        return do_arch_prctl(child, ARCH_SET_FS, value);
 422                return 0;
 423        case offsetof(struct user_regs_struct,gs_base):
 424                /*
 425                 * Exactly the same here as the %fs handling above.
 426                 */
 427                if (value >= TASK_SIZE_OF(child))
 428                        return -EIO;
 429                if (child->thread.gs != value)
 430                        return do_arch_prctl(child, ARCH_SET_GS, value);
 431                return 0;
 432#endif
 433        }
 434
 435        *pt_regs_access(task_pt_regs(child), offset) = value;
 436        return 0;
 437}
 438
 439static unsigned long getreg(struct task_struct *task, unsigned long offset)
 440{
 441        switch (offset) {
 442        case offsetof(struct user_regs_struct, cs):
 443        case offsetof(struct user_regs_struct, ds):
 444        case offsetof(struct user_regs_struct, es):
 445        case offsetof(struct user_regs_struct, fs):
 446        case offsetof(struct user_regs_struct, gs):
 447        case offsetof(struct user_regs_struct, ss):
 448                return get_segment_reg(task, offset);
 449
 450        case offsetof(struct user_regs_struct, flags):
 451                return get_flags(task);
 452
 453#ifdef CONFIG_X86_64
 454        case offsetof(struct user_regs_struct, fs_base): {
 455                /*
 456                 * do_arch_prctl may have used a GDT slot instead of
 457                 * the MSR.  To userland, it appears the same either
 458                 * way, except the %fs segment selector might not be 0.
 459                 */
 460                unsigned int seg = task->thread.fsindex;
 461                if (task->thread.fs != 0)
 462                        return task->thread.fs;
 463                if (task == current)
 464                        asm("movl %%fs,%0" : "=r" (seg));
 465                if (seg != FS_TLS_SEL)
 466                        return 0;
 467                return get_desc_base(&task->thread.tls_array[FS_TLS]);
 468        }
 469        case offsetof(struct user_regs_struct, gs_base): {
 470                /*
 471                 * Exactly the same here as the %fs handling above.
 472                 */
 473                unsigned int seg = task->thread.gsindex;
 474                if (task->thread.gs != 0)
 475                        return task->thread.gs;
 476                if (task == current)
 477                        asm("movl %%gs,%0" : "=r" (seg));
 478                if (seg != GS_TLS_SEL)
 479                        return 0;
 480                return get_desc_base(&task->thread.tls_array[GS_TLS]);
 481        }
 482#endif
 483        }
 484
 485        return *pt_regs_access(task_pt_regs(task), offset);
 486}
 487
 488static int genregs_get(struct task_struct *target,
 489                       const struct user_regset *regset,
 490                       unsigned int pos, unsigned int count,
 491                       void *kbuf, void __user *ubuf)
 492{
 493        if (kbuf) {
 494                unsigned long *k = kbuf;
 495                while (count >= sizeof(*k)) {
 496                        *k++ = getreg(target, pos);
 497                        count -= sizeof(*k);
 498                        pos += sizeof(*k);
 499                }
 500        } else {
 501                unsigned long __user *u = ubuf;
 502                while (count >= sizeof(*u)) {
 503                        if (__put_user(getreg(target, pos), u++))
 504                                return -EFAULT;
 505                        count -= sizeof(*u);
 506                        pos += sizeof(*u);
 507                }
 508        }
 509
 510        return 0;
 511}
 512
 513static int genregs_set(struct task_struct *target,
 514                       const struct user_regset *regset,
 515                       unsigned int pos, unsigned int count,
 516                       const void *kbuf, const void __user *ubuf)
 517{
 518        int ret = 0;
 519        if (kbuf) {
 520                const unsigned long *k = kbuf;
 521                while (count >= sizeof(*k) && !ret) {
 522                        ret = putreg(target, pos, *k++);
 523                        count -= sizeof(*k);
 524                        pos += sizeof(*k);
 525                }
 526        } else {
 527                const unsigned long  __user *u = ubuf;
 528                while (count >= sizeof(*u) && !ret) {
 529                        unsigned long word;
 530                        ret = __get_user(word, u++);
 531                        if (ret)
 532                                break;
 533                        ret = putreg(target, pos, word);
 534                        count -= sizeof(*u);
 535                        pos += sizeof(*u);
 536                }
 537        }
 538        return ret;
 539}
 540
 541static void ptrace_triggered(struct perf_event *bp,
 542                             struct perf_sample_data *data,
 543                             struct pt_regs *regs)
 544{
 545        int i;
 546        struct thread_struct *thread = &(current->thread);
 547
 548        /*
 549         * Store in the virtual DR6 register the fact that the breakpoint
 550         * was hit so the thread's debugger will see it.
 551         */
 552        for (i = 0; i < HBP_NUM; i++) {
 553                if (thread->ptrace_bps[i] == bp)
 554                        break;
 555        }
 556
 557        thread->debugreg6 |= (DR_TRAP0 << i);
 558}
 559
 560/*
 561 * Walk through every ptrace breakpoints for this thread and
 562 * build the dr7 value on top of their attributes.
 563 *
 564 */
 565static unsigned long ptrace_get_dr7(struct perf_event *bp[])
 566{
 567        int i;
 568        int dr7 = 0;
 569        struct arch_hw_breakpoint *info;
 570
 571        for (i = 0; i < HBP_NUM; i++) {
 572                if (bp[i] && !bp[i]->attr.disabled) {
 573                        info = counter_arch_bp(bp[i]);
 574                        dr7 |= encode_dr7(i, info->len, info->type);
 575                }
 576        }
 577
 578        return dr7;
 579}
 580
 581static int ptrace_fill_bp_fields(struct perf_event_attr *attr,
 582                                        int len, int type, bool disabled)
 583{
 584        int err, bp_len, bp_type;
 585
 586        err = arch_bp_generic_fields(len, type, &bp_len, &bp_type);
 587        if (!err) {
 588                attr->bp_len = bp_len;
 589                attr->bp_type = bp_type;
 590                attr->disabled = disabled;
 591        }
 592
 593        return err;
 594}
 595
 596static struct perf_event *
 597ptrace_register_breakpoint(struct task_struct *tsk, int len, int type,
 598                                unsigned long addr, bool disabled)
 599{
 600        struct perf_event_attr attr;
 601        int err;
 602
 603        ptrace_breakpoint_init(&attr);
 604        attr.bp_addr = addr;
 605
 606        err = ptrace_fill_bp_fields(&attr, len, type, disabled);
 607        if (err)
 608                return ERR_PTR(err);
 609
 610        return register_user_hw_breakpoint(&attr, ptrace_triggered,
 611                                                 NULL, tsk);
 612}
 613
 614static int ptrace_modify_breakpoint(struct perf_event *bp, int len, int type,
 615                                        int disabled)
 616{
 617        struct perf_event_attr attr = bp->attr;
 618        int err;
 619
 620        err = ptrace_fill_bp_fields(&attr, len, type, disabled);
 621        if (err)
 622                return err;
 623
 624        return modify_user_hw_breakpoint(bp, &attr);
 625}
 626
 627/*
 628 * Handle ptrace writes to debug register 7.
 629 */
 630static int ptrace_write_dr7(struct task_struct *tsk, unsigned long data)
 631{
 632        struct thread_struct *thread = &tsk->thread;
 633        unsigned long old_dr7;
 634        bool second_pass = false;
 635        int i, rc, ret = 0;
 636
 637        data &= ~DR_CONTROL_RESERVED;
 638        old_dr7 = ptrace_get_dr7(thread->ptrace_bps);
 639
 640restore:
 641        rc = 0;
 642        for (i = 0; i < HBP_NUM; i++) {
 643                unsigned len, type;
 644                bool disabled = !decode_dr7(data, i, &len, &type);
 645                struct perf_event *bp = thread->ptrace_bps[i];
 646
 647                if (!bp) {
 648                        if (disabled)
 649                                continue;
 650
 651                        bp = ptrace_register_breakpoint(tsk,
 652                                        len, type, 0, disabled);
 653                        if (IS_ERR(bp)) {
 654                                rc = PTR_ERR(bp);
 655                                break;
 656                        }
 657
 658                        thread->ptrace_bps[i] = bp;
 659                        continue;
 660                }
 661
 662                rc = ptrace_modify_breakpoint(bp, len, type, disabled);
 663                if (rc)
 664                        break;
 665        }
 666
 667        /* Restore if the first pass failed, second_pass shouldn't fail. */
 668        if (rc && !WARN_ON(second_pass)) {
 669                ret = rc;
 670                data = old_dr7;
 671                second_pass = true;
 672                goto restore;
 673        }
 674
 675        return ret;
 676}
 677
 678/*
 679 * Handle PTRACE_PEEKUSR calls for the debug register area.
 680 */
 681static unsigned long ptrace_get_debugreg(struct task_struct *tsk, int n)
 682{
 683        struct thread_struct *thread = &tsk->thread;
 684        unsigned long val = 0;
 685
 686        if (n < HBP_NUM) {
 687                struct perf_event *bp = thread->ptrace_bps[n];
 688
 689                if (bp)
 690                        val = bp->hw.info.address;
 691        } else if (n == 6) {
 692                val = thread->debugreg6;
 693        } else if (n == 7) {
 694                val = thread->ptrace_dr7;
 695        }
 696        return val;
 697}
 698
 699static int ptrace_set_breakpoint_addr(struct task_struct *tsk, int nr,
 700                                      unsigned long addr)
 701{
 702        struct thread_struct *t = &tsk->thread;
 703        struct perf_event *bp = t->ptrace_bps[nr];
 704        int err = 0;
 705
 706        if (!bp) {
 707                /*
 708                 * Put stub len and type to create an inactive but correct bp.
 709                 *
 710                 * CHECKME: the previous code returned -EIO if the addr wasn't
 711                 * a valid task virtual addr. The new one will return -EINVAL in
 712                 *  this case.
 713                 * -EINVAL may be what we want for in-kernel breakpoints users,
 714                 * but -EIO looks better for ptrace, since we refuse a register
 715                 * writing for the user. And anyway this is the previous
 716                 * behaviour.
 717                 */
 718                bp = ptrace_register_breakpoint(tsk,
 719                                X86_BREAKPOINT_LEN_1, X86_BREAKPOINT_WRITE,
 720                                addr, true);
 721                if (IS_ERR(bp))
 722                        err = PTR_ERR(bp);
 723                else
 724                        t->ptrace_bps[nr] = bp;
 725        } else {
 726                struct perf_event_attr attr = bp->attr;
 727
 728                attr.bp_addr = addr;
 729                err = modify_user_hw_breakpoint(bp, &attr);
 730        }
 731
 732        return err;
 733}
 734
 735/*
 736 * Handle PTRACE_POKEUSR calls for the debug register area.
 737 */
 738static int ptrace_set_debugreg(struct task_struct *tsk, int n,
 739                               unsigned long val)
 740{
 741        struct thread_struct *thread = &tsk->thread;
 742        /* There are no DR4 or DR5 registers */
 743        int rc = -EIO;
 744
 745        if (n < HBP_NUM) {
 746                rc = ptrace_set_breakpoint_addr(tsk, n, val);
 747        } else if (n == 6) {
 748                thread->debugreg6 = val;
 749                rc = 0;
 750        } else if (n == 7) {
 751                rc = ptrace_write_dr7(tsk, val);
 752                if (!rc)
 753                        thread->ptrace_dr7 = val;
 754        }
 755        return rc;
 756}
 757
 758/*
 759 * These access the current or another (stopped) task's io permission
 760 * bitmap for debugging or core dump.
 761 */
 762static int ioperm_active(struct task_struct *target,
 763                         const struct user_regset *regset)
 764{
 765        return target->thread.io_bitmap_max / regset->size;
 766}
 767
 768static int ioperm_get(struct task_struct *target,
 769                      const struct user_regset *regset,
 770                      unsigned int pos, unsigned int count,
 771                      void *kbuf, void __user *ubuf)
 772{
 773        if (!target->thread.io_bitmap_ptr)
 774                return -ENXIO;
 775
 776        return user_regset_copyout(&pos, &count, &kbuf, &ubuf,
 777                                   target->thread.io_bitmap_ptr,
 778                                   0, IO_BITMAP_BYTES);
 779}
 780
 781/*
 782 * Called by kernel/ptrace.c when detaching..
 783 *
 784 * Make sure the single step bit is not set.
 785 */
 786void ptrace_disable(struct task_struct *child)
 787{
 788        user_disable_single_step(child);
 789#ifdef TIF_SYSCALL_EMU
 790        clear_tsk_thread_flag(child, TIF_SYSCALL_EMU);
 791#endif
 792}
 793
 794#if defined CONFIG_X86_32 || defined CONFIG_IA32_EMULATION
 795static const struct user_regset_view user_x86_32_view; /* Initialized below. */
 796#endif
 797
 798long arch_ptrace(struct task_struct *child, long request,
 799                 unsigned long addr, unsigned long data)
 800{
 801        int ret;
 802        unsigned long __user *datap = (unsigned long __user *)data;
 803
 804        switch (request) {
 805        /* read the word at location addr in the USER area. */
 806        case PTRACE_PEEKUSR: {
 807                unsigned long tmp;
 808
 809                ret = -EIO;
 810                if ((addr & (sizeof(data) - 1)) || addr >= sizeof(struct user))
 811                        break;
 812
 813                tmp = 0;  /* Default return condition */
 814                if (addr < sizeof(struct user_regs_struct))
 815                        tmp = getreg(child, addr);
 816                else if (addr >= offsetof(struct user, u_debugreg[0]) &&
 817                         addr <= offsetof(struct user, u_debugreg[7])) {
 818                        addr -= offsetof(struct user, u_debugreg[0]);
 819                        tmp = ptrace_get_debugreg(child, addr / sizeof(data));
 820                }
 821                ret = put_user(tmp, datap);
 822                break;
 823        }
 824
 825        case PTRACE_POKEUSR: /* write the word at location addr in the USER area */
 826                ret = -EIO;
 827                if ((addr & (sizeof(data) - 1)) || addr >= sizeof(struct user))
 828                        break;
 829
 830                if (addr < sizeof(struct user_regs_struct))
 831                        ret = putreg(child, addr, data);
 832                else if (addr >= offsetof(struct user, u_debugreg[0]) &&
 833                         addr <= offsetof(struct user, u_debugreg[7])) {
 834                        addr -= offsetof(struct user, u_debugreg[0]);
 835                        ret = ptrace_set_debugreg(child,
 836                                                  addr / sizeof(data), data);
 837                }
 838                break;
 839
 840        case PTRACE_GETREGS:    /* Get all gp regs from the child. */
 841                return copy_regset_to_user(child,
 842                                           task_user_regset_view(current),
 843                                           REGSET_GENERAL,
 844                                           0, sizeof(struct user_regs_struct),
 845                                           datap);
 846
 847        case PTRACE_SETREGS:    /* Set all gp regs in the child. */
 848                return copy_regset_from_user(child,
 849                                             task_user_regset_view(current),
 850                                             REGSET_GENERAL,
 851                                             0, sizeof(struct user_regs_struct),
 852                                             datap);
 853
 854        case PTRACE_GETFPREGS:  /* Get the child FPU state. */
 855                return copy_regset_to_user(child,
 856                                           task_user_regset_view(current),
 857                                           REGSET_FP,
 858                                           0, sizeof(struct user_i387_struct),
 859                                           datap);
 860
 861        case PTRACE_SETFPREGS:  /* Set the child FPU state. */
 862                return copy_regset_from_user(child,
 863                                             task_user_regset_view(current),
 864                                             REGSET_FP,
 865                                             0, sizeof(struct user_i387_struct),
 866                                             datap);
 867
 868#ifdef CONFIG_X86_32
 869        case PTRACE_GETFPXREGS: /* Get the child extended FPU state. */
 870                return copy_regset_to_user(child, &user_x86_32_view,
 871                                           REGSET_XFP,
 872                                           0, sizeof(struct user_fxsr_struct),
 873                                           datap) ? -EIO : 0;
 874
 875        case PTRACE_SETFPXREGS: /* Set the child extended FPU state. */
 876                return copy_regset_from_user(child, &user_x86_32_view,
 877                                             REGSET_XFP,
 878                                             0, sizeof(struct user_fxsr_struct),
 879                                             datap) ? -EIO : 0;
 880#endif
 881
 882#if defined CONFIG_X86_32 || defined CONFIG_IA32_EMULATION
 883        case PTRACE_GET_THREAD_AREA:
 884                if ((int) addr < 0)
 885                        return -EIO;
 886                ret = do_get_thread_area(child, addr,
 887                                        (struct user_desc __user *)data);
 888                break;
 889
 890        case PTRACE_SET_THREAD_AREA:
 891                if ((int) addr < 0)
 892                        return -EIO;
 893                ret = do_set_thread_area(child, addr,
 894                                        (struct user_desc __user *)data, 0);
 895                break;
 896#endif
 897
 898#ifdef CONFIG_X86_64
 899                /* normal 64bit interface to access TLS data.
 900                   Works just like arch_prctl, except that the arguments
 901                   are reversed. */
 902        case PTRACE_ARCH_PRCTL:
 903                ret = do_arch_prctl(child, data, addr);
 904                break;
 905#endif
 906
 907        default:
 908                ret = ptrace_request(child, request, addr, data);
 909                break;
 910        }
 911
 912        return ret;
 913}
 914
 915#ifdef CONFIG_IA32_EMULATION
 916
 917#include <linux/compat.h>
 918#include <linux/syscalls.h>
 919#include <asm/ia32.h>
 920#include <asm/user32.h>
 921
 922#define R32(l,q)                                                        \
 923        case offsetof(struct user32, regs.l):                           \
 924                regs->q = value; break
 925
 926#define SEG32(rs)                                                       \
 927        case offsetof(struct user32, regs.rs):                          \
 928                return set_segment_reg(child,                           \
 929                                       offsetof(struct user_regs_struct, rs), \
 930                                       value);                          \
 931                break
 932
 933static int putreg32(struct task_struct *child, unsigned regno, u32 value)
 934{
 935        struct pt_regs *regs = task_pt_regs(child);
 936
 937        switch (regno) {
 938
 939        SEG32(cs);
 940        SEG32(ds);
 941        SEG32(es);
 942        SEG32(fs);
 943        SEG32(gs);
 944        SEG32(ss);
 945
 946        R32(ebx, bx);
 947        R32(ecx, cx);
 948        R32(edx, dx);
 949        R32(edi, di);
 950        R32(esi, si);
 951        R32(ebp, bp);
 952        R32(eax, ax);
 953        R32(eip, ip);
 954        R32(esp, sp);
 955
 956        case offsetof(struct user32, regs.orig_eax):
 957                /*
 958                 * A 32-bit debugger setting orig_eax means to restore
 959                 * the state of the task restarting a 32-bit syscall.
 960                 * Make sure we interpret the -ERESTART* codes correctly
 961                 * in case the task is not actually still sitting at the
 962                 * exit from a 32-bit syscall with TS_COMPAT still set.
 963                 */
 964                regs->orig_ax = value;
 965                if (syscall_get_nr(child, regs) >= 0)
 966                        task_thread_info(child)->status |= TS_COMPAT;
 967                break;
 968
 969        case offsetof(struct user32, regs.eflags):
 970                return set_flags(child, value);
 971
 972        case offsetof(struct user32, u_debugreg[0]) ...
 973                offsetof(struct user32, u_debugreg[7]):
 974                regno -= offsetof(struct user32, u_debugreg[0]);
 975                return ptrace_set_debugreg(child, regno / 4, value);
 976
 977        default:
 978                if (regno > sizeof(struct user32) || (regno & 3))
 979                        return -EIO;
 980
 981                /*
 982                 * Other dummy fields in the virtual user structure
 983                 * are ignored
 984                 */
 985                break;
 986        }
 987        return 0;
 988}
 989
 990#undef R32
 991#undef SEG32
 992
 993#define R32(l,q)                                                        \
 994        case offsetof(struct user32, regs.l):                           \
 995                *val = regs->q; break
 996
 997#define SEG32(rs)                                                       \
 998        case offsetof(struct user32, regs.rs):                          \
 999                *val = get_segment_reg(child,                           \
1000                                       offsetof(struct user_regs_struct, rs)); \
1001                break
1002
1003static int getreg32(struct task_struct *child, unsigned regno, u32 *val)
1004{
1005        struct pt_regs *regs = task_pt_regs(child);
1006
1007        switch (regno) {
1008
1009        SEG32(ds);
1010        SEG32(es);
1011        SEG32(fs);
1012        SEG32(gs);
1013
1014        R32(cs, cs);
1015        R32(ss, ss);
1016        R32(ebx, bx);
1017        R32(ecx, cx);
1018        R32(edx, dx);
1019        R32(edi, di);
1020        R32(esi, si);
1021        R32(ebp, bp);
1022        R32(eax, ax);
1023        R32(orig_eax, orig_ax);
1024        R32(eip, ip);
1025        R32(esp, sp);
1026
1027        case offsetof(struct user32, regs.eflags):
1028                *val = get_flags(child);
1029                break;
1030
1031        case offsetof(struct user32, u_debugreg[0]) ...
1032                offsetof(struct user32, u_debugreg[7]):
1033                regno -= offsetof(struct user32, u_debugreg[0]);
1034                *val = ptrace_get_debugreg(child, regno / 4);
1035                break;
1036
1037        default:
1038                if (regno > sizeof(struct user32) || (regno & 3))
1039                        return -EIO;
1040
1041                /*
1042                 * Other dummy fields in the virtual user structure
1043                 * are ignored
1044                 */
1045                *val = 0;
1046                break;
1047        }
1048        return 0;
1049}
1050
1051#undef R32
1052#undef SEG32
1053
1054static int genregs32_get(struct task_struct *target,
1055                         const struct user_regset *regset,
1056                         unsigned int pos, unsigned int count,
1057                         void *kbuf, void __user *ubuf)
1058{
1059        if (kbuf) {
1060                compat_ulong_t *k = kbuf;
1061                while (count >= sizeof(*k)) {
1062                        getreg32(target, pos, k++);
1063                        count -= sizeof(*k);
1064                        pos += sizeof(*k);
1065                }
1066        } else {
1067                compat_ulong_t __user *u = ubuf;
1068                while (count >= sizeof(*u)) {
1069                        compat_ulong_t word;
1070                        getreg32(target, pos, &word);
1071                        if (__put_user(word, u++))
1072                                return -EFAULT;
1073                        count -= sizeof(*u);
1074                        pos += sizeof(*u);
1075                }
1076        }
1077
1078        return 0;
1079}
1080
1081static int genregs32_set(struct task_struct *target,
1082                         const struct user_regset *regset,
1083                         unsigned int pos, unsigned int count,
1084                         const void *kbuf, const void __user *ubuf)
1085{
1086        int ret = 0;
1087        if (kbuf) {
1088                const compat_ulong_t *k = kbuf;
1089                while (count >= sizeof(*k) && !ret) {
1090                        ret = putreg32(target, pos, *k++);
1091                        count -= sizeof(*k);
1092                        pos += sizeof(*k);
1093                }
1094        } else {
1095                const compat_ulong_t __user *u = ubuf;
1096                while (count >= sizeof(*u) && !ret) {
1097                        compat_ulong_t word;
1098                        ret = __get_user(word, u++);
1099                        if (ret)
1100                                break;
1101                        ret = putreg32(target, pos, word);
1102                        count -= sizeof(*u);
1103                        pos += sizeof(*u);
1104                }
1105        }
1106        return ret;
1107}
1108
1109static long ia32_arch_ptrace(struct task_struct *child, compat_long_t request,
1110                             compat_ulong_t caddr, compat_ulong_t cdata)
1111{
1112        unsigned long addr = caddr;
1113        unsigned long data = cdata;
1114        void __user *datap = compat_ptr(data);
1115        int ret;
1116        __u32 val;
1117
1118        switch (request) {
1119        case PTRACE_PEEKUSR:
1120                ret = getreg32(child, addr, &val);
1121                if (ret == 0)
1122                        ret = put_user(val, (__u32 __user *)datap);
1123                break;
1124
1125        case PTRACE_POKEUSR:
1126                ret = putreg32(child, addr, data);
1127                break;
1128
1129        case PTRACE_GETREGS:    /* Get all gp regs from the child. */
1130                return copy_regset_to_user(child, &user_x86_32_view,
1131                                           REGSET_GENERAL,
1132                                           0, sizeof(struct user_regs_struct32),
1133                                           datap);
1134
1135        case PTRACE_SETREGS:    /* Set all gp regs in the child. */
1136                return copy_regset_from_user(child, &user_x86_32_view,
1137                                             REGSET_GENERAL, 0,
1138                                             sizeof(struct user_regs_struct32),
1139                                             datap);
1140
1141        case PTRACE_GETFPREGS:  /* Get the child FPU state. */
1142                return copy_regset_to_user(child, &user_x86_32_view,
1143                                           REGSET_FP, 0,
1144                                           sizeof(struct user_i387_ia32_struct),
1145                                           datap);
1146
1147        case PTRACE_SETFPREGS:  /* Set the child FPU state. */
1148                return copy_regset_from_user(
1149                        child, &user_x86_32_view, REGSET_FP,
1150                        0, sizeof(struct user_i387_ia32_struct), datap);
1151
1152        case PTRACE_GETFPXREGS: /* Get the child extended FPU state. */
1153                return copy_regset_to_user(child, &user_x86_32_view,
1154                                           REGSET_XFP, 0,
1155                                           sizeof(struct user32_fxsr_struct),
1156                                           datap);
1157
1158        case PTRACE_SETFPXREGS: /* Set the child extended FPU state. */
1159                return copy_regset_from_user(child, &user_x86_32_view,
1160                                             REGSET_XFP, 0,
1161                                             sizeof(struct user32_fxsr_struct),
1162                                             datap);
1163
1164        case PTRACE_GET_THREAD_AREA:
1165        case PTRACE_SET_THREAD_AREA:
1166                return arch_ptrace(child, request, addr, data);
1167
1168        default:
1169                return compat_ptrace_request(child, request, addr, data);
1170        }
1171
1172        return ret;
1173}
1174#endif /* CONFIG_IA32_EMULATION */
1175
1176#ifdef CONFIG_X86_X32_ABI
1177static long x32_arch_ptrace(struct task_struct *child,
1178                            compat_long_t request, compat_ulong_t caddr,
1179                            compat_ulong_t cdata)
1180{
1181        unsigned long addr = caddr;
1182        unsigned long data = cdata;
1183        void __user *datap = compat_ptr(data);
1184        int ret;
1185
1186        switch (request) {
1187        /* Read 32bits at location addr in the USER area.  Only allow
1188           to return the lower 32bits of segment and debug registers.  */
1189        case PTRACE_PEEKUSR: {
1190                u32 tmp;
1191
1192                ret = -EIO;
1193                if ((addr & (sizeof(data) - 1)) || addr >= sizeof(struct user) ||
1194                    addr < offsetof(struct user_regs_struct, cs))
1195                        break;
1196
1197                tmp = 0;  /* Default return condition */
1198                if (addr < sizeof(struct user_regs_struct))
1199                        tmp = getreg(child, addr);
1200                else if (addr >= offsetof(struct user, u_debugreg[0]) &&
1201                         addr <= offsetof(struct user, u_debugreg[7])) {
1202                        addr -= offsetof(struct user, u_debugreg[0]);
1203                        tmp = ptrace_get_debugreg(child, addr / sizeof(data));
1204                }
1205                ret = put_user(tmp, (__u32 __user *)datap);
1206                break;
1207        }
1208
1209        /* Write the word at location addr in the USER area.  Only allow
1210           to update segment and debug registers with the upper 32bits
1211           zero-extended. */
1212        case PTRACE_POKEUSR:
1213                ret = -EIO;
1214                if ((addr & (sizeof(data) - 1)) || addr >= sizeof(struct user) ||
1215                    addr < offsetof(struct user_regs_struct, cs))
1216                        break;
1217
1218                if (addr < sizeof(struct user_regs_struct))
1219                        ret = putreg(child, addr, data);
1220                else if (addr >= offsetof(struct user, u_debugreg[0]) &&
1221                         addr <= offsetof(struct user, u_debugreg[7])) {
1222                        addr -= offsetof(struct user, u_debugreg[0]);
1223                        ret = ptrace_set_debugreg(child,
1224                                                  addr / sizeof(data), data);
1225                }
1226                break;
1227
1228        case PTRACE_GETREGS:    /* Get all gp regs from the child. */
1229                return copy_regset_to_user(child,
1230                                           task_user_regset_view(current),
1231                                           REGSET_GENERAL,
1232                                           0, sizeof(struct user_regs_struct),
1233                                           datap);
1234
1235        case PTRACE_SETREGS:    /* Set all gp regs in the child. */
1236                return copy_regset_from_user(child,
1237                                             task_user_regset_view(current),
1238                                             REGSET_GENERAL,
1239                                             0, sizeof(struct user_regs_struct),
1240                                             datap);
1241
1242        case PTRACE_GETFPREGS:  /* Get the child FPU state. */
1243                return copy_regset_to_user(child,
1244                                           task_user_regset_view(current),
1245                                           REGSET_FP,
1246                                           0, sizeof(struct user_i387_struct),
1247                                           datap);
1248
1249        case PTRACE_SETFPREGS:  /* Set the child FPU state. */
1250                return copy_regset_from_user(child,
1251                                             task_user_regset_view(current),
1252                                             REGSET_FP,
1253                                             0, sizeof(struct user_i387_struct),
1254                                             datap);
1255
1256        default:
1257                return compat_ptrace_request(child, request, addr, data);
1258        }
1259
1260        return ret;
1261}
1262#endif
1263
1264#ifdef CONFIG_COMPAT
1265long compat_arch_ptrace(struct task_struct *child, compat_long_t request,
1266                        compat_ulong_t caddr, compat_ulong_t cdata)
1267{
1268#ifdef CONFIG_X86_X32_ABI
1269        if (!is_ia32_task())
1270                return x32_arch_ptrace(child, request, caddr, cdata);
1271#endif
1272#ifdef CONFIG_IA32_EMULATION
1273        return ia32_arch_ptrace(child, request, caddr, cdata);
1274#else
1275        return 0;
1276#endif
1277}
1278#endif  /* CONFIG_COMPAT */
1279
1280#ifdef CONFIG_X86_64
1281
1282static struct user_regset x86_64_regsets[] __read_mostly = {
1283        [REGSET_GENERAL] = {
1284                .core_note_type = NT_PRSTATUS,
1285                .n = sizeof(struct user_regs_struct) / sizeof(long),
1286                .size = sizeof(long), .align = sizeof(long),
1287                .get = genregs_get, .set = genregs_set
1288        },
1289        [REGSET_FP] = {
1290                .core_note_type = NT_PRFPREG,
1291                .n = sizeof(struct user_i387_struct) / sizeof(long),
1292                .size = sizeof(long), .align = sizeof(long),
1293                .active = regset_xregset_fpregs_active, .get = xfpregs_get, .set = xfpregs_set
1294        },
1295        [REGSET_XSTATE] = {
1296                .core_note_type = NT_X86_XSTATE,
1297                .size = sizeof(u64), .align = sizeof(u64),
1298                .active = xstateregs_active, .get = xstateregs_get,
1299                .set = xstateregs_set
1300        },
1301        [REGSET_IOPERM64] = {
1302                .core_note_type = NT_386_IOPERM,
1303                .n = IO_BITMAP_LONGS,
1304                .size = sizeof(long), .align = sizeof(long),
1305                .active = ioperm_active, .get = ioperm_get
1306        },
1307};
1308
1309static const struct user_regset_view user_x86_64_view = {
1310        .name = "x86_64", .e_machine = EM_X86_64,
1311        .regsets = x86_64_regsets, .n = ARRAY_SIZE(x86_64_regsets)
1312};
1313
1314#else  /* CONFIG_X86_32 */
1315
1316#define user_regs_struct32      user_regs_struct
1317#define genregs32_get           genregs_get
1318#define genregs32_set           genregs_set
1319
1320#endif  /* CONFIG_X86_64 */
1321
1322#if defined CONFIG_X86_32 || defined CONFIG_IA32_EMULATION
1323static struct user_regset x86_32_regsets[] __read_mostly = {
1324        [REGSET_GENERAL] = {
1325                .core_note_type = NT_PRSTATUS,
1326                .n = sizeof(struct user_regs_struct32) / sizeof(u32),
1327                .size = sizeof(u32), .align = sizeof(u32),
1328                .get = genregs32_get, .set = genregs32_set
1329        },
1330        [REGSET_FP] = {
1331                .core_note_type = NT_PRFPREG,
1332                .n = sizeof(struct user_i387_ia32_struct) / sizeof(u32),
1333                .size = sizeof(u32), .align = sizeof(u32),
1334                .active = regset_fpregs_active, .get = fpregs_get, .set = fpregs_set
1335        },
1336        [REGSET_XFP] = {
1337                .core_note_type = NT_PRXFPREG,
1338                .n = sizeof(struct user32_fxsr_struct) / sizeof(u32),
1339                .size = sizeof(u32), .align = sizeof(u32),
1340                .active = regset_xregset_fpregs_active, .get = xfpregs_get, .set = xfpregs_set
1341        },
1342        [REGSET_XSTATE] = {
1343                .core_note_type = NT_X86_XSTATE,
1344                .size = sizeof(u64), .align = sizeof(u64),
1345                .active = xstateregs_active, .get = xstateregs_get,
1346                .set = xstateregs_set
1347        },
1348        [REGSET_TLS] = {
1349                .core_note_type = NT_386_TLS,
1350                .n = GDT_ENTRY_TLS_ENTRIES, .bias = GDT_ENTRY_TLS_MIN,
1351                .size = sizeof(struct user_desc),
1352                .align = sizeof(struct user_desc),
1353                .active = regset_tls_active,
1354                .get = regset_tls_get, .set = regset_tls_set
1355        },
1356        [REGSET_IOPERM32] = {
1357                .core_note_type = NT_386_IOPERM,
1358                .n = IO_BITMAP_BYTES / sizeof(u32),
1359                .size = sizeof(u32), .align = sizeof(u32),
1360                .active = ioperm_active, .get = ioperm_get
1361        },
1362};
1363
1364static const struct user_regset_view user_x86_32_view = {
1365        .name = "i386", .e_machine = EM_386,
1366        .regsets = x86_32_regsets, .n = ARRAY_SIZE(x86_32_regsets)
1367};
1368#endif
1369
1370/*
1371 * This represents bytes 464..511 in the memory layout exported through
1372 * the REGSET_XSTATE interface.
1373 */
1374u64 xstate_fx_sw_bytes[USER_XSTATE_FX_SW_WORDS];
1375
1376void update_regset_xstate_info(unsigned int size, u64 xstate_mask)
1377{
1378#ifdef CONFIG_X86_64
1379        x86_64_regsets[REGSET_XSTATE].n = size / sizeof(u64);
1380#endif
1381#if defined CONFIG_X86_32 || defined CONFIG_IA32_EMULATION
1382        x86_32_regsets[REGSET_XSTATE].n = size / sizeof(u64);
1383#endif
1384        xstate_fx_sw_bytes[USER_XSTATE_XCR0_WORD] = xstate_mask;
1385}
1386
1387const struct user_regset_view *task_user_regset_view(struct task_struct *task)
1388{
1389#ifdef CONFIG_IA32_EMULATION
1390        if (test_tsk_thread_flag(task, TIF_IA32))
1391#endif
1392#if defined CONFIG_X86_32 || defined CONFIG_IA32_EMULATION
1393                return &user_x86_32_view;
1394#endif
1395#ifdef CONFIG_X86_64
1396        return &user_x86_64_view;
1397#endif
1398}
1399
1400static void fill_sigtrap_info(struct task_struct *tsk,
1401                                struct pt_regs *regs,
1402                                int error_code, int si_code,
1403                                struct siginfo *info)
1404{
1405        tsk->thread.trap_nr = X86_TRAP_DB;
1406        tsk->thread.error_code = error_code;
1407
1408        memset(info, 0, sizeof(*info));
1409        info->si_signo = SIGTRAP;
1410        info->si_code = si_code;
1411        info->si_addr = user_mode(regs) ? (void __user *)regs->ip : NULL;
1412}
1413
1414void user_single_step_siginfo(struct task_struct *tsk,
1415                                struct pt_regs *regs,
1416                                struct siginfo *info)
1417{
1418        fill_sigtrap_info(tsk, regs, 0, TRAP_BRKPT, info);
1419}
1420
1421void send_sigtrap(struct task_struct *tsk, struct pt_regs *regs,
1422                                         int error_code, int si_code)
1423{
1424        struct siginfo info;
1425
1426        fill_sigtrap_info(tsk, regs, error_code, si_code, &info);
1427        /* Send us the fake SIGTRAP */
1428        force_sig_info(SIGTRAP, &info, tsk);
1429}
1430