cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

ptrace.c (44539B)


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