linux/arch/s390/kernel/ptrace.c
<<
>>
Prefs
   1/*
   2 *  Ptrace user space interface.
   3 *
   4 *    Copyright IBM Corp. 1999, 2010
   5 *    Author(s): Denis Joseph Barrow
   6 *               Martin Schwidefsky (schwidefsky@de.ibm.com)
   7 */
   8
   9#include <linux/kernel.h>
  10#include <linux/sched.h>
  11#include <linux/mm.h>
  12#include <linux/smp.h>
  13#include <linux/errno.h>
  14#include <linux/ptrace.h>
  15#include <linux/user.h>
  16#include <linux/security.h>
  17#include <linux/audit.h>
  18#include <linux/signal.h>
  19#include <linux/elf.h>
  20#include <linux/regset.h>
  21#include <linux/tracehook.h>
  22#include <linux/seccomp.h>
  23#include <linux/compat.h>
  24#include <trace/syscall.h>
  25#include <asm/segment.h>
  26#include <asm/page.h>
  27#include <asm/pgtable.h>
  28#include <asm/pgalloc.h>
  29#include <asm/uaccess.h>
  30#include <asm/unistd.h>
  31#include <asm/switch_to.h>
  32#include "entry.h"
  33
  34#ifdef CONFIG_COMPAT
  35#include "compat_ptrace.h"
  36#endif
  37
  38#define CREATE_TRACE_POINTS
  39#include <trace/events/syscalls.h>
  40
  41void update_cr_regs(struct task_struct *task)
  42{
  43        struct pt_regs *regs = task_pt_regs(task);
  44        struct thread_struct *thread = &task->thread;
  45        struct per_regs old, new;
  46
  47        /* Take care of the enable/disable of transactional execution. */
  48        if (MACHINE_HAS_TE) {
  49                unsigned long cr, cr_new;
  50
  51                __ctl_store(cr, 0, 0);
  52                /* Set or clear transaction execution TXC bit 8. */
  53                cr_new = cr | (1UL << 55);
  54                if (task->thread.per_flags & PER_FLAG_NO_TE)
  55                        cr_new &= ~(1UL << 55);
  56                if (cr_new != cr)
  57                        __ctl_load(cr_new, 0, 0);
  58                /* Set or clear transaction execution TDC bits 62 and 63. */
  59                __ctl_store(cr, 2, 2);
  60                cr_new = cr & ~3UL;
  61                if (task->thread.per_flags & PER_FLAG_TE_ABORT_RAND) {
  62                        if (task->thread.per_flags & PER_FLAG_TE_ABORT_RAND_TEND)
  63                                cr_new |= 1UL;
  64                        else
  65                                cr_new |= 2UL;
  66                }
  67                if (cr_new != cr)
  68                        __ctl_load(cr_new, 2, 2);
  69        }
  70        /* Copy user specified PER registers */
  71        new.control = thread->per_user.control;
  72        new.start = thread->per_user.start;
  73        new.end = thread->per_user.end;
  74
  75        /* merge TIF_SINGLE_STEP into user specified PER registers. */
  76        if (test_tsk_thread_flag(task, TIF_SINGLE_STEP) ||
  77            test_tsk_thread_flag(task, TIF_UPROBE_SINGLESTEP)) {
  78                if (test_tsk_thread_flag(task, TIF_BLOCK_STEP))
  79                        new.control |= PER_EVENT_BRANCH;
  80                else
  81                        new.control |= PER_EVENT_IFETCH;
  82                new.control |= PER_CONTROL_SUSPENSION;
  83                new.control |= PER_EVENT_TRANSACTION_END;
  84                if (test_tsk_thread_flag(task, TIF_UPROBE_SINGLESTEP))
  85                        new.control |= PER_EVENT_IFETCH;
  86                new.start = 0;
  87                new.end = -1UL;
  88        }
  89
  90        /* Take care of the PER enablement bit in the PSW. */
  91        if (!(new.control & PER_EVENT_MASK)) {
  92                regs->psw.mask &= ~PSW_MASK_PER;
  93                return;
  94        }
  95        regs->psw.mask |= PSW_MASK_PER;
  96        __ctl_store(old, 9, 11);
  97        if (memcmp(&new, &old, sizeof(struct per_regs)) != 0)
  98                __ctl_load(new, 9, 11);
  99}
 100
 101void user_enable_single_step(struct task_struct *task)
 102{
 103        clear_tsk_thread_flag(task, TIF_BLOCK_STEP);
 104        set_tsk_thread_flag(task, TIF_SINGLE_STEP);
 105}
 106
 107void user_disable_single_step(struct task_struct *task)
 108{
 109        clear_tsk_thread_flag(task, TIF_BLOCK_STEP);
 110        clear_tsk_thread_flag(task, TIF_SINGLE_STEP);
 111}
 112
 113void user_enable_block_step(struct task_struct *task)
 114{
 115        set_tsk_thread_flag(task, TIF_SINGLE_STEP);
 116        set_tsk_thread_flag(task, TIF_BLOCK_STEP);
 117}
 118
 119/*
 120 * Called by kernel/ptrace.c when detaching..
 121 *
 122 * Clear all debugging related fields.
 123 */
 124void ptrace_disable(struct task_struct *task)
 125{
 126        memset(&task->thread.per_user, 0, sizeof(task->thread.per_user));
 127        memset(&task->thread.per_event, 0, sizeof(task->thread.per_event));
 128        clear_tsk_thread_flag(task, TIF_SINGLE_STEP);
 129        clear_pt_regs_flag(task_pt_regs(task), PIF_PER_TRAP);
 130        task->thread.per_flags = 0;
 131}
 132
 133#define __ADDR_MASK 7
 134
 135static inline unsigned long __peek_user_per(struct task_struct *child,
 136                                            addr_t addr)
 137{
 138        struct per_struct_kernel *dummy = NULL;
 139
 140        if (addr == (addr_t) &dummy->cr9)
 141                /* Control bits of the active per set. */
 142                return test_thread_flag(TIF_SINGLE_STEP) ?
 143                        PER_EVENT_IFETCH : child->thread.per_user.control;
 144        else if (addr == (addr_t) &dummy->cr10)
 145                /* Start address of the active per set. */
 146                return test_thread_flag(TIF_SINGLE_STEP) ?
 147                        0 : child->thread.per_user.start;
 148        else if (addr == (addr_t) &dummy->cr11)
 149                /* End address of the active per set. */
 150                return test_thread_flag(TIF_SINGLE_STEP) ?
 151                        -1UL : child->thread.per_user.end;
 152        else if (addr == (addr_t) &dummy->bits)
 153                /* Single-step bit. */
 154                return test_thread_flag(TIF_SINGLE_STEP) ?
 155                        (1UL << (BITS_PER_LONG - 1)) : 0;
 156        else if (addr == (addr_t) &dummy->starting_addr)
 157                /* Start address of the user specified per set. */
 158                return child->thread.per_user.start;
 159        else if (addr == (addr_t) &dummy->ending_addr)
 160                /* End address of the user specified per set. */
 161                return child->thread.per_user.end;
 162        else if (addr == (addr_t) &dummy->perc_atmid)
 163                /* PER code, ATMID and AI of the last PER trap */
 164                return (unsigned long)
 165                        child->thread.per_event.cause << (BITS_PER_LONG - 16);
 166        else if (addr == (addr_t) &dummy->address)
 167                /* Address of the last PER trap */
 168                return child->thread.per_event.address;
 169        else if (addr == (addr_t) &dummy->access_id)
 170                /* Access id of the last PER trap */
 171                return (unsigned long)
 172                        child->thread.per_event.paid << (BITS_PER_LONG - 8);
 173        return 0;
 174}
 175
 176/*
 177 * Read the word at offset addr from the user area of a process. The
 178 * trouble here is that the information is littered over different
 179 * locations. The process registers are found on the kernel stack,
 180 * the floating point stuff and the trace settings are stored in
 181 * the task structure. In addition the different structures in
 182 * struct user contain pad bytes that should be read as zeroes.
 183 * Lovely...
 184 */
 185static unsigned long __peek_user(struct task_struct *child, addr_t addr)
 186{
 187        struct user *dummy = NULL;
 188        addr_t offset, tmp;
 189
 190        if (addr < (addr_t) &dummy->regs.acrs) {
 191                /*
 192                 * psw and gprs are stored on the stack
 193                 */
 194                tmp = *(addr_t *)((addr_t) &task_pt_regs(child)->psw + addr);
 195                if (addr == (addr_t) &dummy->regs.psw.mask) {
 196                        /* Return a clean psw mask. */
 197                        tmp &= PSW_MASK_USER | PSW_MASK_RI;
 198                        tmp |= PSW_USER_BITS;
 199                }
 200
 201        } else if (addr < (addr_t) &dummy->regs.orig_gpr2) {
 202                /*
 203                 * access registers are stored in the thread structure
 204                 */
 205                offset = addr - (addr_t) &dummy->regs.acrs;
 206                /*
 207                 * Very special case: old & broken 64 bit gdb reading
 208                 * from acrs[15]. Result is a 64 bit value. Read the
 209                 * 32 bit acrs[15] value and shift it by 32. Sick...
 210                 */
 211                if (addr == (addr_t) &dummy->regs.acrs[15])
 212                        tmp = ((unsigned long) child->thread.acrs[15]) << 32;
 213                else
 214                        tmp = *(addr_t *)((addr_t) &child->thread.acrs + offset);
 215
 216        } else if (addr == (addr_t) &dummy->regs.orig_gpr2) {
 217                /*
 218                 * orig_gpr2 is stored on the kernel stack
 219                 */
 220                tmp = (addr_t) task_pt_regs(child)->orig_gpr2;
 221
 222        } else if (addr < (addr_t) &dummy->regs.fp_regs) {
 223                /*
 224                 * prevent reads of padding hole between
 225                 * orig_gpr2 and fp_regs on s390.
 226                 */
 227                tmp = 0;
 228
 229        } else if (addr == (addr_t) &dummy->regs.fp_regs.fpc) {
 230                /*
 231                 * floating point control reg. is in the thread structure
 232                 */
 233                tmp = child->thread.fpu.fpc;
 234                tmp <<= BITS_PER_LONG - 32;
 235
 236        } else if (addr < (addr_t) (&dummy->regs.fp_regs + 1)) {
 237                /*
 238                 * floating point regs. are either in child->thread.fpu
 239                 * or the child->thread.fpu.vxrs array
 240                 */
 241                offset = addr - (addr_t) &dummy->regs.fp_regs.fprs;
 242                if (MACHINE_HAS_VX)
 243                        tmp = *(addr_t *)
 244                               ((addr_t) child->thread.fpu.vxrs + 2*offset);
 245                else
 246                        tmp = *(addr_t *)
 247                               ((addr_t) child->thread.fpu.fprs + offset);
 248
 249        } else if (addr < (addr_t) (&dummy->regs.per_info + 1)) {
 250                /*
 251                 * Handle access to the per_info structure.
 252                 */
 253                addr -= (addr_t) &dummy->regs.per_info;
 254                tmp = __peek_user_per(child, addr);
 255
 256        } else
 257                tmp = 0;
 258
 259        return tmp;
 260}
 261
 262static int
 263peek_user(struct task_struct *child, addr_t addr, addr_t data)
 264{
 265        addr_t tmp, mask;
 266
 267        /*
 268         * Stupid gdb peeks/pokes the access registers in 64 bit with
 269         * an alignment of 4. Programmers from hell...
 270         */
 271        mask = __ADDR_MASK;
 272        if (addr >= (addr_t) &((struct user *) NULL)->regs.acrs &&
 273            addr < (addr_t) &((struct user *) NULL)->regs.orig_gpr2)
 274                mask = 3;
 275        if ((addr & mask) || addr > sizeof(struct user) - __ADDR_MASK)
 276                return -EIO;
 277
 278        tmp = __peek_user(child, addr);
 279        return put_user(tmp, (addr_t __user *) data);
 280}
 281
 282static inline void __poke_user_per(struct task_struct *child,
 283                                   addr_t addr, addr_t data)
 284{
 285        struct per_struct_kernel *dummy = NULL;
 286
 287        /*
 288         * There are only three fields in the per_info struct that the
 289         * debugger user can write to.
 290         * 1) cr9: the debugger wants to set a new PER event mask
 291         * 2) starting_addr: the debugger wants to set a new starting
 292         *    address to use with the PER event mask.
 293         * 3) ending_addr: the debugger wants to set a new ending
 294         *    address to use with the PER event mask.
 295         * The user specified PER event mask and the start and end
 296         * addresses are used only if single stepping is not in effect.
 297         * Writes to any other field in per_info are ignored.
 298         */
 299        if (addr == (addr_t) &dummy->cr9)
 300                /* PER event mask of the user specified per set. */
 301                child->thread.per_user.control =
 302                        data & (PER_EVENT_MASK | PER_CONTROL_MASK);
 303        else if (addr == (addr_t) &dummy->starting_addr)
 304                /* Starting address of the user specified per set. */
 305                child->thread.per_user.start = data;
 306        else if (addr == (addr_t) &dummy->ending_addr)
 307                /* Ending address of the user specified per set. */
 308                child->thread.per_user.end = data;
 309}
 310
 311/*
 312 * Write a word to the user area of a process at location addr. This
 313 * operation does have an additional problem compared to peek_user.
 314 * Stores to the program status word and on the floating point
 315 * control register needs to get checked for validity.
 316 */
 317static int __poke_user(struct task_struct *child, addr_t addr, addr_t data)
 318{
 319        struct user *dummy = NULL;
 320        addr_t offset;
 321
 322        if (addr < (addr_t) &dummy->regs.acrs) {
 323                /*
 324                 * psw and gprs are stored on the stack
 325                 */
 326                if (addr == (addr_t) &dummy->regs.psw.mask) {
 327                        unsigned long mask = PSW_MASK_USER;
 328
 329                        mask |= is_ri_task(child) ? PSW_MASK_RI : 0;
 330                        if ((data ^ PSW_USER_BITS) & ~mask)
 331                                /* Invalid psw mask. */
 332                                return -EINVAL;
 333                        if ((data & PSW_MASK_ASC) == PSW_ASC_HOME)
 334                                /* Invalid address-space-control bits */
 335                                return -EINVAL;
 336                        if ((data & PSW_MASK_EA) && !(data & PSW_MASK_BA))
 337                                /* Invalid addressing mode bits */
 338                                return -EINVAL;
 339                }
 340                *(addr_t *)((addr_t) &task_pt_regs(child)->psw + addr) = data;
 341
 342        } else if (addr < (addr_t) (&dummy->regs.orig_gpr2)) {
 343                /*
 344                 * access registers are stored in the thread structure
 345                 */
 346                offset = addr - (addr_t) &dummy->regs.acrs;
 347                /*
 348                 * Very special case: old & broken 64 bit gdb writing
 349                 * to acrs[15] with a 64 bit value. Ignore the lower
 350                 * half of the value and write the upper 32 bit to
 351                 * acrs[15]. Sick...
 352                 */
 353                if (addr == (addr_t) &dummy->regs.acrs[15])
 354                        child->thread.acrs[15] = (unsigned int) (data >> 32);
 355                else
 356                        *(addr_t *)((addr_t) &child->thread.acrs + offset) = data;
 357
 358        } else if (addr == (addr_t) &dummy->regs.orig_gpr2) {
 359                /*
 360                 * orig_gpr2 is stored on the kernel stack
 361                 */
 362                task_pt_regs(child)->orig_gpr2 = data;
 363
 364        } else if (addr < (addr_t) &dummy->regs.fp_regs) {
 365                /*
 366                 * prevent writes of padding hole between
 367                 * orig_gpr2 and fp_regs on s390.
 368                 */
 369                return 0;
 370
 371        } else if (addr == (addr_t) &dummy->regs.fp_regs.fpc) {
 372                /*
 373                 * floating point control reg. is in the thread structure
 374                 */
 375                if ((unsigned int) data != 0 ||
 376                    test_fp_ctl(data >> (BITS_PER_LONG - 32)))
 377                        return -EINVAL;
 378                child->thread.fpu.fpc = data >> (BITS_PER_LONG - 32);
 379
 380        } else if (addr < (addr_t) (&dummy->regs.fp_regs + 1)) {
 381                /*
 382                 * floating point regs. are either in child->thread.fpu
 383                 * or the child->thread.fpu.vxrs array
 384                 */
 385                offset = addr - (addr_t) &dummy->regs.fp_regs.fprs;
 386                if (MACHINE_HAS_VX)
 387                        *(addr_t *)((addr_t)
 388                                child->thread.fpu.vxrs + 2*offset) = data;
 389                else
 390                        *(addr_t *)((addr_t)
 391                                child->thread.fpu.fprs + offset) = data;
 392
 393        } else if (addr < (addr_t) (&dummy->regs.per_info + 1)) {
 394                /*
 395                 * Handle access to the per_info structure.
 396                 */
 397                addr -= (addr_t) &dummy->regs.per_info;
 398                __poke_user_per(child, addr, data);
 399
 400        }
 401
 402        return 0;
 403}
 404
 405static int poke_user(struct task_struct *child, addr_t addr, addr_t data)
 406{
 407        addr_t mask;
 408
 409        /*
 410         * Stupid gdb peeks/pokes the access registers in 64 bit with
 411         * an alignment of 4. Programmers from hell indeed...
 412         */
 413        mask = __ADDR_MASK;
 414        if (addr >= (addr_t) &((struct user *) NULL)->regs.acrs &&
 415            addr < (addr_t) &((struct user *) NULL)->regs.orig_gpr2)
 416                mask = 3;
 417        if ((addr & mask) || addr > sizeof(struct user) - __ADDR_MASK)
 418                return -EIO;
 419
 420        return __poke_user(child, addr, data);
 421}
 422
 423long arch_ptrace(struct task_struct *child, long request,
 424                 unsigned long addr, unsigned long data)
 425{
 426        ptrace_area parea; 
 427        int copied, ret;
 428
 429        switch (request) {
 430        case PTRACE_PEEKUSR:
 431                /* read the word at location addr in the USER area. */
 432                return peek_user(child, addr, data);
 433
 434        case PTRACE_POKEUSR:
 435                /* write the word at location addr in the USER area */
 436                return poke_user(child, addr, data);
 437
 438        case PTRACE_PEEKUSR_AREA:
 439        case PTRACE_POKEUSR_AREA:
 440                if (copy_from_user(&parea, (void __force __user *) addr,
 441                                                        sizeof(parea)))
 442                        return -EFAULT;
 443                addr = parea.kernel_addr;
 444                data = parea.process_addr;
 445                copied = 0;
 446                while (copied < parea.len) {
 447                        if (request == PTRACE_PEEKUSR_AREA)
 448                                ret = peek_user(child, addr, data);
 449                        else {
 450                                addr_t utmp;
 451                                if (get_user(utmp,
 452                                             (addr_t __force __user *) data))
 453                                        return -EFAULT;
 454                                ret = poke_user(child, addr, utmp);
 455                        }
 456                        if (ret)
 457                                return ret;
 458                        addr += sizeof(unsigned long);
 459                        data += sizeof(unsigned long);
 460                        copied += sizeof(unsigned long);
 461                }
 462                return 0;
 463        case PTRACE_GET_LAST_BREAK:
 464                put_user(task_thread_info(child)->last_break,
 465                         (unsigned long __user *) data);
 466                return 0;
 467        case PTRACE_ENABLE_TE:
 468                if (!MACHINE_HAS_TE)
 469                        return -EIO;
 470                child->thread.per_flags &= ~PER_FLAG_NO_TE;
 471                return 0;
 472        case PTRACE_DISABLE_TE:
 473                if (!MACHINE_HAS_TE)
 474                        return -EIO;
 475                child->thread.per_flags |= PER_FLAG_NO_TE;
 476                child->thread.per_flags &= ~PER_FLAG_TE_ABORT_RAND;
 477                return 0;
 478        case PTRACE_TE_ABORT_RAND:
 479                if (!MACHINE_HAS_TE || (child->thread.per_flags & PER_FLAG_NO_TE))
 480                        return -EIO;
 481                switch (data) {
 482                case 0UL:
 483                        child->thread.per_flags &= ~PER_FLAG_TE_ABORT_RAND;
 484                        break;
 485                case 1UL:
 486                        child->thread.per_flags |= PER_FLAG_TE_ABORT_RAND;
 487                        child->thread.per_flags |= PER_FLAG_TE_ABORT_RAND_TEND;
 488                        break;
 489                case 2UL:
 490                        child->thread.per_flags |= PER_FLAG_TE_ABORT_RAND;
 491                        child->thread.per_flags &= ~PER_FLAG_TE_ABORT_RAND_TEND;
 492                        break;
 493                default:
 494                        return -EINVAL;
 495                }
 496                return 0;
 497        default:
 498                return ptrace_request(child, request, addr, data);
 499        }
 500}
 501
 502#ifdef CONFIG_COMPAT
 503/*
 504 * Now the fun part starts... a 31 bit program running in the
 505 * 31 bit emulation tracing another program. PTRACE_PEEKTEXT,
 506 * PTRACE_PEEKDATA, PTRACE_POKETEXT and PTRACE_POKEDATA are easy
 507 * to handle, the difference to the 64 bit versions of the requests
 508 * is that the access is done in multiples of 4 byte instead of
 509 * 8 bytes (sizeof(unsigned long) on 31/64 bit).
 510 * The ugly part are PTRACE_PEEKUSR, PTRACE_PEEKUSR_AREA,
 511 * PTRACE_POKEUSR and PTRACE_POKEUSR_AREA. If the traced program
 512 * is a 31 bit program too, the content of struct user can be
 513 * emulated. A 31 bit program peeking into the struct user of
 514 * a 64 bit program is a no-no.
 515 */
 516
 517/*
 518 * Same as peek_user_per but for a 31 bit program.
 519 */
 520static inline __u32 __peek_user_per_compat(struct task_struct *child,
 521                                           addr_t addr)
 522{
 523        struct compat_per_struct_kernel *dummy32 = NULL;
 524
 525        if (addr == (addr_t) &dummy32->cr9)
 526                /* Control bits of the active per set. */
 527                return (__u32) test_thread_flag(TIF_SINGLE_STEP) ?
 528                        PER_EVENT_IFETCH : child->thread.per_user.control;
 529        else if (addr == (addr_t) &dummy32->cr10)
 530                /* Start address of the active per set. */
 531                return (__u32) test_thread_flag(TIF_SINGLE_STEP) ?
 532                        0 : child->thread.per_user.start;
 533        else if (addr == (addr_t) &dummy32->cr11)
 534                /* End address of the active per set. */
 535                return test_thread_flag(TIF_SINGLE_STEP) ?
 536                        PSW32_ADDR_INSN : child->thread.per_user.end;
 537        else if (addr == (addr_t) &dummy32->bits)
 538                /* Single-step bit. */
 539                return (__u32) test_thread_flag(TIF_SINGLE_STEP) ?
 540                        0x80000000 : 0;
 541        else if (addr == (addr_t) &dummy32->starting_addr)
 542                /* Start address of the user specified per set. */
 543                return (__u32) child->thread.per_user.start;
 544        else if (addr == (addr_t) &dummy32->ending_addr)
 545                /* End address of the user specified per set. */
 546                return (__u32) child->thread.per_user.end;
 547        else if (addr == (addr_t) &dummy32->perc_atmid)
 548                /* PER code, ATMID and AI of the last PER trap */
 549                return (__u32) child->thread.per_event.cause << 16;
 550        else if (addr == (addr_t) &dummy32->address)
 551                /* Address of the last PER trap */
 552                return (__u32) child->thread.per_event.address;
 553        else if (addr == (addr_t) &dummy32->access_id)
 554                /* Access id of the last PER trap */
 555                return (__u32) child->thread.per_event.paid << 24;
 556        return 0;
 557}
 558
 559/*
 560 * Same as peek_user but for a 31 bit program.
 561 */
 562static u32 __peek_user_compat(struct task_struct *child, addr_t addr)
 563{
 564        struct compat_user *dummy32 = NULL;
 565        addr_t offset;
 566        __u32 tmp;
 567
 568        if (addr < (addr_t) &dummy32->regs.acrs) {
 569                struct pt_regs *regs = task_pt_regs(child);
 570                /*
 571                 * psw and gprs are stored on the stack
 572                 */
 573                if (addr == (addr_t) &dummy32->regs.psw.mask) {
 574                        /* Fake a 31 bit psw mask. */
 575                        tmp = (__u32)(regs->psw.mask >> 32);
 576                        tmp &= PSW32_MASK_USER | PSW32_MASK_RI;
 577                        tmp |= PSW32_USER_BITS;
 578                } else if (addr == (addr_t) &dummy32->regs.psw.addr) {
 579                        /* Fake a 31 bit psw address. */
 580                        tmp = (__u32) regs->psw.addr |
 581                                (__u32)(regs->psw.mask & PSW_MASK_BA);
 582                } else {
 583                        /* gpr 0-15 */
 584                        tmp = *(__u32 *)((addr_t) &regs->psw + addr*2 + 4);
 585                }
 586        } else if (addr < (addr_t) (&dummy32->regs.orig_gpr2)) {
 587                /*
 588                 * access registers are stored in the thread structure
 589                 */
 590                offset = addr - (addr_t) &dummy32->regs.acrs;
 591                tmp = *(__u32*)((addr_t) &child->thread.acrs + offset);
 592
 593        } else if (addr == (addr_t) (&dummy32->regs.orig_gpr2)) {
 594                /*
 595                 * orig_gpr2 is stored on the kernel stack
 596                 */
 597                tmp = *(__u32*)((addr_t) &task_pt_regs(child)->orig_gpr2 + 4);
 598
 599        } else if (addr < (addr_t) &dummy32->regs.fp_regs) {
 600                /*
 601                 * prevent reads of padding hole between
 602                 * orig_gpr2 and fp_regs on s390.
 603                 */
 604                tmp = 0;
 605
 606        } else if (addr == (addr_t) &dummy32->regs.fp_regs.fpc) {
 607                /*
 608                 * floating point control reg. is in the thread structure
 609                 */
 610                tmp = child->thread.fpu.fpc;
 611
 612        } else if (addr < (addr_t) (&dummy32->regs.fp_regs + 1)) {
 613                /*
 614                 * floating point regs. are either in child->thread.fpu
 615                 * or the child->thread.fpu.vxrs array
 616                 */
 617                offset = addr - (addr_t) &dummy32->regs.fp_regs.fprs;
 618                if (MACHINE_HAS_VX)
 619                        tmp = *(__u32 *)
 620                               ((addr_t) child->thread.fpu.vxrs + 2*offset);
 621                else
 622                        tmp = *(__u32 *)
 623                               ((addr_t) child->thread.fpu.fprs + offset);
 624
 625        } else if (addr < (addr_t) (&dummy32->regs.per_info + 1)) {
 626                /*
 627                 * Handle access to the per_info structure.
 628                 */
 629                addr -= (addr_t) &dummy32->regs.per_info;
 630                tmp = __peek_user_per_compat(child, addr);
 631
 632        } else
 633                tmp = 0;
 634
 635        return tmp;
 636}
 637
 638static int peek_user_compat(struct task_struct *child,
 639                            addr_t addr, addr_t data)
 640{
 641        __u32 tmp;
 642
 643        if (!is_compat_task() || (addr & 3) || addr > sizeof(struct user) - 3)
 644                return -EIO;
 645
 646        tmp = __peek_user_compat(child, addr);
 647        return put_user(tmp, (__u32 __user *) data);
 648}
 649
 650/*
 651 * Same as poke_user_per but for a 31 bit program.
 652 */
 653static inline void __poke_user_per_compat(struct task_struct *child,
 654                                          addr_t addr, __u32 data)
 655{
 656        struct compat_per_struct_kernel *dummy32 = NULL;
 657
 658        if (addr == (addr_t) &dummy32->cr9)
 659                /* PER event mask of the user specified per set. */
 660                child->thread.per_user.control =
 661                        data & (PER_EVENT_MASK | PER_CONTROL_MASK);
 662        else if (addr == (addr_t) &dummy32->starting_addr)
 663                /* Starting address of the user specified per set. */
 664                child->thread.per_user.start = data;
 665        else if (addr == (addr_t) &dummy32->ending_addr)
 666                /* Ending address of the user specified per set. */
 667                child->thread.per_user.end = data;
 668}
 669
 670/*
 671 * Same as poke_user but for a 31 bit program.
 672 */
 673static int __poke_user_compat(struct task_struct *child,
 674                              addr_t addr, addr_t data)
 675{
 676        struct compat_user *dummy32 = NULL;
 677        __u32 tmp = (__u32) data;
 678        addr_t offset;
 679
 680        if (addr < (addr_t) &dummy32->regs.acrs) {
 681                struct pt_regs *regs = task_pt_regs(child);
 682                /*
 683                 * psw, gprs, acrs and orig_gpr2 are stored on the stack
 684                 */
 685                if (addr == (addr_t) &dummy32->regs.psw.mask) {
 686                        __u32 mask = PSW32_MASK_USER;
 687
 688                        mask |= is_ri_task(child) ? PSW32_MASK_RI : 0;
 689                        /* Build a 64 bit psw mask from 31 bit mask. */
 690                        if ((tmp ^ PSW32_USER_BITS) & ~mask)
 691                                /* Invalid psw mask. */
 692                                return -EINVAL;
 693                        if ((data & PSW32_MASK_ASC) == PSW32_ASC_HOME)
 694                                /* Invalid address-space-control bits */
 695                                return -EINVAL;
 696                        regs->psw.mask = (regs->psw.mask & ~PSW_MASK_USER) |
 697                                (regs->psw.mask & PSW_MASK_BA) |
 698                                (__u64)(tmp & mask) << 32;
 699                } else if (addr == (addr_t) &dummy32->regs.psw.addr) {
 700                        /* Build a 64 bit psw address from 31 bit address. */
 701                        regs->psw.addr = (__u64) tmp & PSW32_ADDR_INSN;
 702                        /* Transfer 31 bit amode bit to psw mask. */
 703                        regs->psw.mask = (regs->psw.mask & ~PSW_MASK_BA) |
 704                                (__u64)(tmp & PSW32_ADDR_AMODE);
 705                } else {
 706                        /* gpr 0-15 */
 707                        *(__u32*)((addr_t) &regs->psw + addr*2 + 4) = tmp;
 708                }
 709        } else if (addr < (addr_t) (&dummy32->regs.orig_gpr2)) {
 710                /*
 711                 * access registers are stored in the thread structure
 712                 */
 713                offset = addr - (addr_t) &dummy32->regs.acrs;
 714                *(__u32*)((addr_t) &child->thread.acrs + offset) = tmp;
 715
 716        } else if (addr == (addr_t) (&dummy32->regs.orig_gpr2)) {
 717                /*
 718                 * orig_gpr2 is stored on the kernel stack
 719                 */
 720                *(__u32*)((addr_t) &task_pt_regs(child)->orig_gpr2 + 4) = tmp;
 721
 722        } else if (addr < (addr_t) &dummy32->regs.fp_regs) {
 723                /*
 724                 * prevent writess of padding hole between
 725                 * orig_gpr2 and fp_regs on s390.
 726                 */
 727                return 0;
 728
 729        } else if (addr == (addr_t) &dummy32->regs.fp_regs.fpc) {
 730                /*
 731                 * floating point control reg. is in the thread structure
 732                 */
 733                if (test_fp_ctl(tmp))
 734                        return -EINVAL;
 735                child->thread.fpu.fpc = data;
 736
 737        } else if (addr < (addr_t) (&dummy32->regs.fp_regs + 1)) {
 738                /*
 739                 * floating point regs. are either in child->thread.fpu
 740                 * or the child->thread.fpu.vxrs array
 741                 */
 742                offset = addr - (addr_t) &dummy32->regs.fp_regs.fprs;
 743                if (MACHINE_HAS_VX)
 744                        *(__u32 *)((addr_t)
 745                                child->thread.fpu.vxrs + 2*offset) = tmp;
 746                else
 747                        *(__u32 *)((addr_t)
 748                                child->thread.fpu.fprs + offset) = tmp;
 749
 750        } else if (addr < (addr_t) (&dummy32->regs.per_info + 1)) {
 751                /*
 752                 * Handle access to the per_info structure.
 753                 */
 754                addr -= (addr_t) &dummy32->regs.per_info;
 755                __poke_user_per_compat(child, addr, data);
 756        }
 757
 758        return 0;
 759}
 760
 761static int poke_user_compat(struct task_struct *child,
 762                            addr_t addr, addr_t data)
 763{
 764        if (!is_compat_task() || (addr & 3) ||
 765            addr > sizeof(struct compat_user) - 3)
 766                return -EIO;
 767
 768        return __poke_user_compat(child, addr, data);
 769}
 770
 771long compat_arch_ptrace(struct task_struct *child, compat_long_t request,
 772                        compat_ulong_t caddr, compat_ulong_t cdata)
 773{
 774        unsigned long addr = caddr;
 775        unsigned long data = cdata;
 776        compat_ptrace_area parea;
 777        int copied, ret;
 778
 779        switch (request) {
 780        case PTRACE_PEEKUSR:
 781                /* read the word at location addr in the USER area. */
 782                return peek_user_compat(child, addr, data);
 783
 784        case PTRACE_POKEUSR:
 785                /* write the word at location addr in the USER area */
 786                return poke_user_compat(child, addr, data);
 787
 788        case PTRACE_PEEKUSR_AREA:
 789        case PTRACE_POKEUSR_AREA:
 790                if (copy_from_user(&parea, (void __force __user *) addr,
 791                                                        sizeof(parea)))
 792                        return -EFAULT;
 793                addr = parea.kernel_addr;
 794                data = parea.process_addr;
 795                copied = 0;
 796                while (copied < parea.len) {
 797                        if (request == PTRACE_PEEKUSR_AREA)
 798                                ret = peek_user_compat(child, addr, data);
 799                        else {
 800                                __u32 utmp;
 801                                if (get_user(utmp,
 802                                             (__u32 __force __user *) data))
 803                                        return -EFAULT;
 804                                ret = poke_user_compat(child, addr, utmp);
 805                        }
 806                        if (ret)
 807                                return ret;
 808                        addr += sizeof(unsigned int);
 809                        data += sizeof(unsigned int);
 810                        copied += sizeof(unsigned int);
 811                }
 812                return 0;
 813        case PTRACE_GET_LAST_BREAK:
 814                put_user(task_thread_info(child)->last_break,
 815                         (unsigned int __user *) data);
 816                return 0;
 817        }
 818        return compat_ptrace_request(child, request, addr, data);
 819}
 820#endif
 821
 822asmlinkage long do_syscall_trace_enter(struct pt_regs *regs)
 823{
 824        long ret = 0;
 825
 826        /* Do the secure computing check first. */
 827        if (secure_computing()) {
 828                /* seccomp failures shouldn't expose any additional code. */
 829                ret = -1;
 830                goto out;
 831        }
 832
 833        /*
 834         * The sysc_tracesys code in entry.S stored the system
 835         * call number to gprs[2].
 836         */
 837        if (test_thread_flag(TIF_SYSCALL_TRACE) &&
 838            (tracehook_report_syscall_entry(regs) ||
 839             regs->gprs[2] >= NR_syscalls)) {
 840                /*
 841                 * Tracing decided this syscall should not happen or the
 842                 * debugger stored an invalid system call number. Skip
 843                 * the system call and the system call restart handling.
 844                 */
 845                clear_pt_regs_flag(regs, PIF_SYSCALL);
 846                ret = -1;
 847        }
 848
 849        if (unlikely(test_thread_flag(TIF_SYSCALL_TRACEPOINT)))
 850                trace_sys_enter(regs, regs->gprs[2]);
 851
 852        audit_syscall_entry(regs->gprs[2], regs->orig_gpr2,
 853                            regs->gprs[3], regs->gprs[4],
 854                            regs->gprs[5]);
 855out:
 856        return ret ?: regs->gprs[2];
 857}
 858
 859asmlinkage void do_syscall_trace_exit(struct pt_regs *regs)
 860{
 861        audit_syscall_exit(regs);
 862
 863        if (unlikely(test_thread_flag(TIF_SYSCALL_TRACEPOINT)))
 864                trace_sys_exit(regs, regs->gprs[2]);
 865
 866        if (test_thread_flag(TIF_SYSCALL_TRACE))
 867                tracehook_report_syscall_exit(regs, 0);
 868}
 869
 870/*
 871 * user_regset definitions.
 872 */
 873
 874static int s390_regs_get(struct task_struct *target,
 875                         const struct user_regset *regset,
 876                         unsigned int pos, unsigned int count,
 877                         void *kbuf, void __user *ubuf)
 878{
 879        if (target == current)
 880                save_access_regs(target->thread.acrs);
 881
 882        if (kbuf) {
 883                unsigned long *k = kbuf;
 884                while (count > 0) {
 885                        *k++ = __peek_user(target, pos);
 886                        count -= sizeof(*k);
 887                        pos += sizeof(*k);
 888                }
 889        } else {
 890                unsigned long __user *u = ubuf;
 891                while (count > 0) {
 892                        if (__put_user(__peek_user(target, pos), u++))
 893                                return -EFAULT;
 894                        count -= sizeof(*u);
 895                        pos += sizeof(*u);
 896                }
 897        }
 898        return 0;
 899}
 900
 901static int s390_regs_set(struct task_struct *target,
 902                         const struct user_regset *regset,
 903                         unsigned int pos, unsigned int count,
 904                         const void *kbuf, const void __user *ubuf)
 905{
 906        int rc = 0;
 907
 908        if (target == current)
 909                save_access_regs(target->thread.acrs);
 910
 911        if (kbuf) {
 912                const unsigned long *k = kbuf;
 913                while (count > 0 && !rc) {
 914                        rc = __poke_user(target, pos, *k++);
 915                        count -= sizeof(*k);
 916                        pos += sizeof(*k);
 917                }
 918        } else {
 919                const unsigned long  __user *u = ubuf;
 920                while (count > 0 && !rc) {
 921                        unsigned long word;
 922                        rc = __get_user(word, u++);
 923                        if (rc)
 924                                break;
 925                        rc = __poke_user(target, pos, word);
 926                        count -= sizeof(*u);
 927                        pos += sizeof(*u);
 928                }
 929        }
 930
 931        if (rc == 0 && target == current)
 932                restore_access_regs(target->thread.acrs);
 933
 934        return rc;
 935}
 936
 937static int s390_fpregs_get(struct task_struct *target,
 938                           const struct user_regset *regset, unsigned int pos,
 939                           unsigned int count, void *kbuf, void __user *ubuf)
 940{
 941        _s390_fp_regs fp_regs;
 942
 943        if (target == current)
 944                save_fpu_regs();
 945
 946        fp_regs.fpc = target->thread.fpu.fpc;
 947        fpregs_store(&fp_regs, &target->thread.fpu);
 948
 949        return user_regset_copyout(&pos, &count, &kbuf, &ubuf,
 950                                   &fp_regs, 0, -1);
 951}
 952
 953static int s390_fpregs_set(struct task_struct *target,
 954                           const struct user_regset *regset, unsigned int pos,
 955                           unsigned int count, const void *kbuf,
 956                           const void __user *ubuf)
 957{
 958        int rc = 0;
 959        freg_t fprs[__NUM_FPRS];
 960
 961        if (target == current)
 962                save_fpu_regs();
 963
 964        /* If setting FPC, must validate it first. */
 965        if (count > 0 && pos < offsetof(s390_fp_regs, fprs)) {
 966                u32 ufpc[2] = { target->thread.fpu.fpc, 0 };
 967                rc = user_regset_copyin(&pos, &count, &kbuf, &ubuf, &ufpc,
 968                                        0, offsetof(s390_fp_regs, fprs));
 969                if (rc)
 970                        return rc;
 971                if (ufpc[1] != 0 || test_fp_ctl(ufpc[0]))
 972                        return -EINVAL;
 973                target->thread.fpu.fpc = ufpc[0];
 974        }
 975
 976        if (rc == 0 && count > 0)
 977                rc = user_regset_copyin(&pos, &count, &kbuf, &ubuf,
 978                                        fprs, offsetof(s390_fp_regs, fprs), -1);
 979        if (rc)
 980                return rc;
 981
 982        if (MACHINE_HAS_VX)
 983                convert_fp_to_vx(target->thread.fpu.vxrs, fprs);
 984        else
 985                memcpy(target->thread.fpu.fprs, &fprs, sizeof(fprs));
 986
 987        return rc;
 988}
 989
 990static int s390_last_break_get(struct task_struct *target,
 991                               const struct user_regset *regset,
 992                               unsigned int pos, unsigned int count,
 993                               void *kbuf, void __user *ubuf)
 994{
 995        if (count > 0) {
 996                if (kbuf) {
 997                        unsigned long *k = kbuf;
 998                        *k = task_thread_info(target)->last_break;
 999                } else {
1000                        unsigned long  __user *u = ubuf;
1001                        if (__put_user(task_thread_info(target)->last_break, u))
1002                                return -EFAULT;
1003                }
1004        }
1005        return 0;
1006}
1007
1008static int s390_last_break_set(struct task_struct *target,
1009                               const struct user_regset *regset,
1010                               unsigned int pos, unsigned int count,
1011                               const void *kbuf, const void __user *ubuf)
1012{
1013        return 0;
1014}
1015
1016static int s390_tdb_get(struct task_struct *target,
1017                        const struct user_regset *regset,
1018                        unsigned int pos, unsigned int count,
1019                        void *kbuf, void __user *ubuf)
1020{
1021        struct pt_regs *regs = task_pt_regs(target);
1022        unsigned char *data;
1023
1024        if (!(regs->int_code & 0x200))
1025                return -ENODATA;
1026        data = target->thread.trap_tdb;
1027        return user_regset_copyout(&pos, &count, &kbuf, &ubuf, data, 0, 256);
1028}
1029
1030static int s390_tdb_set(struct task_struct *target,
1031                        const struct user_regset *regset,
1032                        unsigned int pos, unsigned int count,
1033                        const void *kbuf, const void __user *ubuf)
1034{
1035        return 0;
1036}
1037
1038static int s390_vxrs_low_get(struct task_struct *target,
1039                             const struct user_regset *regset,
1040                             unsigned int pos, unsigned int count,
1041                             void *kbuf, void __user *ubuf)
1042{
1043        __u64 vxrs[__NUM_VXRS_LOW];
1044        int i;
1045
1046        if (!MACHINE_HAS_VX)
1047                return -ENODEV;
1048        if (target == current)
1049                save_fpu_regs();
1050        for (i = 0; i < __NUM_VXRS_LOW; i++)
1051                vxrs[i] = *((__u64 *)(target->thread.fpu.vxrs + i) + 1);
1052        return user_regset_copyout(&pos, &count, &kbuf, &ubuf, vxrs, 0, -1);
1053}
1054
1055static int s390_vxrs_low_set(struct task_struct *target,
1056                             const struct user_regset *regset,
1057                             unsigned int pos, unsigned int count,
1058                             const void *kbuf, const void __user *ubuf)
1059{
1060        __u64 vxrs[__NUM_VXRS_LOW];
1061        int i, rc;
1062
1063        if (!MACHINE_HAS_VX)
1064                return -ENODEV;
1065        if (target == current)
1066                save_fpu_regs();
1067
1068        rc = user_regset_copyin(&pos, &count, &kbuf, &ubuf, vxrs, 0, -1);
1069        if (rc == 0)
1070                for (i = 0; i < __NUM_VXRS_LOW; i++)
1071                        *((__u64 *)(target->thread.fpu.vxrs + i) + 1) = vxrs[i];
1072
1073        return rc;
1074}
1075
1076static int s390_vxrs_high_get(struct task_struct *target,
1077                              const struct user_regset *regset,
1078                              unsigned int pos, unsigned int count,
1079                              void *kbuf, void __user *ubuf)
1080{
1081        __vector128 vxrs[__NUM_VXRS_HIGH];
1082
1083        if (!MACHINE_HAS_VX)
1084                return -ENODEV;
1085        if (target == current)
1086                save_fpu_regs();
1087        memcpy(vxrs, target->thread.fpu.vxrs + __NUM_VXRS_LOW, sizeof(vxrs));
1088
1089        return user_regset_copyout(&pos, &count, &kbuf, &ubuf, vxrs, 0, -1);
1090}
1091
1092static int s390_vxrs_high_set(struct task_struct *target,
1093                              const struct user_regset *regset,
1094                              unsigned int pos, unsigned int count,
1095                              const void *kbuf, const void __user *ubuf)
1096{
1097        int rc;
1098
1099        if (!MACHINE_HAS_VX)
1100                return -ENODEV;
1101        if (target == current)
1102                save_fpu_regs();
1103
1104        rc = user_regset_copyin(&pos, &count, &kbuf, &ubuf,
1105                                target->thread.fpu.vxrs + __NUM_VXRS_LOW, 0, -1);
1106        return rc;
1107}
1108
1109static int s390_system_call_get(struct task_struct *target,
1110                                const struct user_regset *regset,
1111                                unsigned int pos, unsigned int count,
1112                                void *kbuf, void __user *ubuf)
1113{
1114        unsigned int *data = &task_thread_info(target)->system_call;
1115        return user_regset_copyout(&pos, &count, &kbuf, &ubuf,
1116                                   data, 0, sizeof(unsigned int));
1117}
1118
1119static int s390_system_call_set(struct task_struct *target,
1120                                const struct user_regset *regset,
1121                                unsigned int pos, unsigned int count,
1122                                const void *kbuf, const void __user *ubuf)
1123{
1124        unsigned int *data = &task_thread_info(target)->system_call;
1125        return user_regset_copyin(&pos, &count, &kbuf, &ubuf,
1126                                  data, 0, sizeof(unsigned int));
1127}
1128
1129static const struct user_regset s390_regsets[] = {
1130        {
1131                .core_note_type = NT_PRSTATUS,
1132                .n = sizeof(s390_regs) / sizeof(long),
1133                .size = sizeof(long),
1134                .align = sizeof(long),
1135                .get = s390_regs_get,
1136                .set = s390_regs_set,
1137        },
1138        {
1139                .core_note_type = NT_PRFPREG,
1140                .n = sizeof(s390_fp_regs) / sizeof(long),
1141                .size = sizeof(long),
1142                .align = sizeof(long),
1143                .get = s390_fpregs_get,
1144                .set = s390_fpregs_set,
1145        },
1146        {
1147                .core_note_type = NT_S390_SYSTEM_CALL,
1148                .n = 1,
1149                .size = sizeof(unsigned int),
1150                .align = sizeof(unsigned int),
1151                .get = s390_system_call_get,
1152                .set = s390_system_call_set,
1153        },
1154        {
1155                .core_note_type = NT_S390_LAST_BREAK,
1156                .n = 1,
1157                .size = sizeof(long),
1158                .align = sizeof(long),
1159                .get = s390_last_break_get,
1160                .set = s390_last_break_set,
1161        },
1162        {
1163                .core_note_type = NT_S390_TDB,
1164                .n = 1,
1165                .size = 256,
1166                .align = 1,
1167                .get = s390_tdb_get,
1168                .set = s390_tdb_set,
1169        },
1170        {
1171                .core_note_type = NT_S390_VXRS_LOW,
1172                .n = __NUM_VXRS_LOW,
1173                .size = sizeof(__u64),
1174                .align = sizeof(__u64),
1175                .get = s390_vxrs_low_get,
1176                .set = s390_vxrs_low_set,
1177        },
1178        {
1179                .core_note_type = NT_S390_VXRS_HIGH,
1180                .n = __NUM_VXRS_HIGH,
1181                .size = sizeof(__vector128),
1182                .align = sizeof(__vector128),
1183                .get = s390_vxrs_high_get,
1184                .set = s390_vxrs_high_set,
1185        },
1186};
1187
1188static const struct user_regset_view user_s390_view = {
1189        .name = UTS_MACHINE,
1190        .e_machine = EM_S390,
1191        .regsets = s390_regsets,
1192        .n = ARRAY_SIZE(s390_regsets)
1193};
1194
1195#ifdef CONFIG_COMPAT
1196static int s390_compat_regs_get(struct task_struct *target,
1197                                const struct user_regset *regset,
1198                                unsigned int pos, unsigned int count,
1199                                void *kbuf, void __user *ubuf)
1200{
1201        if (target == current)
1202                save_access_regs(target->thread.acrs);
1203
1204        if (kbuf) {
1205                compat_ulong_t *k = kbuf;
1206                while (count > 0) {
1207                        *k++ = __peek_user_compat(target, pos);
1208                        count -= sizeof(*k);
1209                        pos += sizeof(*k);
1210                }
1211        } else {
1212                compat_ulong_t __user *u = ubuf;
1213                while (count > 0) {
1214                        if (__put_user(__peek_user_compat(target, pos), u++))
1215                                return -EFAULT;
1216                        count -= sizeof(*u);
1217                        pos += sizeof(*u);
1218                }
1219        }
1220        return 0;
1221}
1222
1223static int s390_compat_regs_set(struct task_struct *target,
1224                                const struct user_regset *regset,
1225                                unsigned int pos, unsigned int count,
1226                                const void *kbuf, const void __user *ubuf)
1227{
1228        int rc = 0;
1229
1230        if (target == current)
1231                save_access_regs(target->thread.acrs);
1232
1233        if (kbuf) {
1234                const compat_ulong_t *k = kbuf;
1235                while (count > 0 && !rc) {
1236                        rc = __poke_user_compat(target, pos, *k++);
1237                        count -= sizeof(*k);
1238                        pos += sizeof(*k);
1239                }
1240        } else {
1241                const compat_ulong_t  __user *u = ubuf;
1242                while (count > 0 && !rc) {
1243                        compat_ulong_t word;
1244                        rc = __get_user(word, u++);
1245                        if (rc)
1246                                break;
1247                        rc = __poke_user_compat(target, pos, word);
1248                        count -= sizeof(*u);
1249                        pos += sizeof(*u);
1250                }
1251        }
1252
1253        if (rc == 0 && target == current)
1254                restore_access_regs(target->thread.acrs);
1255
1256        return rc;
1257}
1258
1259static int s390_compat_regs_high_get(struct task_struct *target,
1260                                     const struct user_regset *regset,
1261                                     unsigned int pos, unsigned int count,
1262                                     void *kbuf, void __user *ubuf)
1263{
1264        compat_ulong_t *gprs_high;
1265
1266        gprs_high = (compat_ulong_t *)
1267                &task_pt_regs(target)->gprs[pos / sizeof(compat_ulong_t)];
1268        if (kbuf) {
1269                compat_ulong_t *k = kbuf;
1270                while (count > 0) {
1271                        *k++ = *gprs_high;
1272                        gprs_high += 2;
1273                        count -= sizeof(*k);
1274                }
1275        } else {
1276                compat_ulong_t __user *u = ubuf;
1277                while (count > 0) {
1278                        if (__put_user(*gprs_high, u++))
1279                                return -EFAULT;
1280                        gprs_high += 2;
1281                        count -= sizeof(*u);
1282                }
1283        }
1284        return 0;
1285}
1286
1287static int s390_compat_regs_high_set(struct task_struct *target,
1288                                     const struct user_regset *regset,
1289                                     unsigned int pos, unsigned int count,
1290                                     const void *kbuf, const void __user *ubuf)
1291{
1292        compat_ulong_t *gprs_high;
1293        int rc = 0;
1294
1295        gprs_high = (compat_ulong_t *)
1296                &task_pt_regs(target)->gprs[pos / sizeof(compat_ulong_t)];
1297        if (kbuf) {
1298                const compat_ulong_t *k = kbuf;
1299                while (count > 0) {
1300                        *gprs_high = *k++;
1301                        *gprs_high += 2;
1302                        count -= sizeof(*k);
1303                }
1304        } else {
1305                const compat_ulong_t  __user *u = ubuf;
1306                while (count > 0 && !rc) {
1307                        unsigned long word;
1308                        rc = __get_user(word, u++);
1309                        if (rc)
1310                                break;
1311                        *gprs_high = word;
1312                        *gprs_high += 2;
1313                        count -= sizeof(*u);
1314                }
1315        }
1316
1317        return rc;
1318}
1319
1320static int s390_compat_last_break_get(struct task_struct *target,
1321                                      const struct user_regset *regset,
1322                                      unsigned int pos, unsigned int count,
1323                                      void *kbuf, void __user *ubuf)
1324{
1325        compat_ulong_t last_break;
1326
1327        if (count > 0) {
1328                last_break = task_thread_info(target)->last_break;
1329                if (kbuf) {
1330                        unsigned long *k = kbuf;
1331                        *k = last_break;
1332                } else {
1333                        unsigned long  __user *u = ubuf;
1334                        if (__put_user(last_break, u))
1335                                return -EFAULT;
1336                }
1337        }
1338        return 0;
1339}
1340
1341static int s390_compat_last_break_set(struct task_struct *target,
1342                                      const struct user_regset *regset,
1343                                      unsigned int pos, unsigned int count,
1344                                      const void *kbuf, const void __user *ubuf)
1345{
1346        return 0;
1347}
1348
1349static const struct user_regset s390_compat_regsets[] = {
1350        {
1351                .core_note_type = NT_PRSTATUS,
1352                .n = sizeof(s390_compat_regs) / sizeof(compat_long_t),
1353                .size = sizeof(compat_long_t),
1354                .align = sizeof(compat_long_t),
1355                .get = s390_compat_regs_get,
1356                .set = s390_compat_regs_set,
1357        },
1358        {
1359                .core_note_type = NT_PRFPREG,
1360                .n = sizeof(s390_fp_regs) / sizeof(compat_long_t),
1361                .size = sizeof(compat_long_t),
1362                .align = sizeof(compat_long_t),
1363                .get = s390_fpregs_get,
1364                .set = s390_fpregs_set,
1365        },
1366        {
1367                .core_note_type = NT_S390_SYSTEM_CALL,
1368                .n = 1,
1369                .size = sizeof(compat_uint_t),
1370                .align = sizeof(compat_uint_t),
1371                .get = s390_system_call_get,
1372                .set = s390_system_call_set,
1373        },
1374        {
1375                .core_note_type = NT_S390_LAST_BREAK,
1376                .n = 1,
1377                .size = sizeof(long),
1378                .align = sizeof(long),
1379                .get = s390_compat_last_break_get,
1380                .set = s390_compat_last_break_set,
1381        },
1382        {
1383                .core_note_type = NT_S390_TDB,
1384                .n = 1,
1385                .size = 256,
1386                .align = 1,
1387                .get = s390_tdb_get,
1388                .set = s390_tdb_set,
1389        },
1390        {
1391                .core_note_type = NT_S390_VXRS_LOW,
1392                .n = __NUM_VXRS_LOW,
1393                .size = sizeof(__u64),
1394                .align = sizeof(__u64),
1395                .get = s390_vxrs_low_get,
1396                .set = s390_vxrs_low_set,
1397        },
1398        {
1399                .core_note_type = NT_S390_VXRS_HIGH,
1400                .n = __NUM_VXRS_HIGH,
1401                .size = sizeof(__vector128),
1402                .align = sizeof(__vector128),
1403                .get = s390_vxrs_high_get,
1404                .set = s390_vxrs_high_set,
1405        },
1406        {
1407                .core_note_type = NT_S390_HIGH_GPRS,
1408                .n = sizeof(s390_compat_regs_high) / sizeof(compat_long_t),
1409                .size = sizeof(compat_long_t),
1410                .align = sizeof(compat_long_t),
1411                .get = s390_compat_regs_high_get,
1412                .set = s390_compat_regs_high_set,
1413        },
1414};
1415
1416static const struct user_regset_view user_s390_compat_view = {
1417        .name = "s390",
1418        .e_machine = EM_S390,
1419        .regsets = s390_compat_regsets,
1420        .n = ARRAY_SIZE(s390_compat_regsets)
1421};
1422#endif
1423
1424const struct user_regset_view *task_user_regset_view(struct task_struct *task)
1425{
1426#ifdef CONFIG_COMPAT
1427        if (test_tsk_thread_flag(task, TIF_31BIT))
1428                return &user_s390_compat_view;
1429#endif
1430        return &user_s390_view;
1431}
1432
1433static const char *gpr_names[NUM_GPRS] = {
1434        "r0", "r1",  "r2",  "r3",  "r4",  "r5",  "r6",  "r7",
1435        "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1436};
1437
1438unsigned long regs_get_register(struct pt_regs *regs, unsigned int offset)
1439{
1440        if (offset >= NUM_GPRS)
1441                return 0;
1442        return regs->gprs[offset];
1443}
1444
1445int regs_query_register_offset(const char *name)
1446{
1447        unsigned long offset;
1448
1449        if (!name || *name != 'r')
1450                return -EINVAL;
1451        if (kstrtoul(name + 1, 10, &offset))
1452                return -EINVAL;
1453        if (offset >= NUM_GPRS)
1454                return -EINVAL;
1455        return offset;
1456}
1457
1458const char *regs_query_register_name(unsigned int offset)
1459{
1460        if (offset >= NUM_GPRS)
1461                return NULL;
1462        return gpr_names[offset];
1463}
1464
1465static int regs_within_kernel_stack(struct pt_regs *regs, unsigned long addr)
1466{
1467        unsigned long ksp = kernel_stack_pointer(regs);
1468
1469        return (addr & ~(THREAD_SIZE - 1)) == (ksp & ~(THREAD_SIZE - 1));
1470}
1471
1472/**
1473 * regs_get_kernel_stack_nth() - get Nth entry of the stack
1474 * @regs:pt_regs which contains kernel stack pointer.
1475 * @n:stack entry number.
1476 *
1477 * regs_get_kernel_stack_nth() returns @n th entry of the kernel stack which
1478 * is specifined by @regs. If the @n th entry is NOT in the kernel stack,
1479 * this returns 0.
1480 */
1481unsigned long regs_get_kernel_stack_nth(struct pt_regs *regs, unsigned int n)
1482{
1483        unsigned long addr;
1484
1485        addr = kernel_stack_pointer(regs) + n * sizeof(long);
1486        if (!regs_within_kernel_stack(regs, addr))
1487                return 0;
1488        return *(unsigned long *)addr;
1489}
1490