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 (33856B)


      1/*
      2 * This file is subject to the terms and conditions of the GNU General Public
      3 * License.  See the file "COPYING" in the main directory of this archive
      4 * for more details.
      5 *
      6 * Copyright (C) 1992 Ross Biro
      7 * Copyright (C) Linus Torvalds
      8 * Copyright (C) 1994, 95, 96, 97, 98, 2000 Ralf Baechle
      9 * Copyright (C) 1996 David S. Miller
     10 * Kevin D. Kissell, kevink@mips.com and Carsten Langgaard, carstenl@mips.com
     11 * Copyright (C) 1999 MIPS Technologies, Inc.
     12 * Copyright (C) 2000 Ulf Carlsson
     13 *
     14 * At this time Linux/MIPS64 only supports syscall tracing, even for 32-bit
     15 * binaries.
     16 */
     17#include <linux/compiler.h>
     18#include <linux/context_tracking.h>
     19#include <linux/elf.h>
     20#include <linux/kernel.h>
     21#include <linux/sched.h>
     22#include <linux/sched/task_stack.h>
     23#include <linux/mm.h>
     24#include <linux/errno.h>
     25#include <linux/ptrace.h>
     26#include <linux/regset.h>
     27#include <linux/smp.h>
     28#include <linux/security.h>
     29#include <linux/stddef.h>
     30#include <linux/audit.h>
     31#include <linux/seccomp.h>
     32#include <linux/ftrace.h>
     33
     34#include <asm/byteorder.h>
     35#include <asm/cpu.h>
     36#include <asm/cpu-info.h>
     37#include <asm/dsp.h>
     38#include <asm/fpu.h>
     39#include <asm/mipsregs.h>
     40#include <asm/mipsmtregs.h>
     41#include <asm/page.h>
     42#include <asm/processor.h>
     43#include <asm/syscall.h>
     44#include <linux/uaccess.h>
     45#include <asm/bootinfo.h>
     46#include <asm/reg.h>
     47
     48#define CREATE_TRACE_POINTS
     49#include <trace/events/syscalls.h>
     50
     51/*
     52 * Called by kernel/ptrace.c when detaching..
     53 *
     54 * Make sure single step bits etc are not set.
     55 */
     56void ptrace_disable(struct task_struct *child)
     57{
     58	/* Don't load the watchpoint registers for the ex-child. */
     59	clear_tsk_thread_flag(child, TIF_LOAD_WATCH);
     60}
     61
     62/*
     63 * Read a general register set.	 We always use the 64-bit format, even
     64 * for 32-bit kernels and for 32-bit processes on a 64-bit kernel.
     65 * Registers are sign extended to fill the available space.
     66 */
     67int ptrace_getregs(struct task_struct *child, struct user_pt_regs __user *data)
     68{
     69	struct pt_regs *regs;
     70	int i;
     71
     72	if (!access_ok(data, 38 * 8))
     73		return -EIO;
     74
     75	regs = task_pt_regs(child);
     76
     77	for (i = 0; i < 32; i++)
     78		__put_user((long)regs->regs[i], (__s64 __user *)&data->regs[i]);
     79	__put_user((long)regs->lo, (__s64 __user *)&data->lo);
     80	__put_user((long)regs->hi, (__s64 __user *)&data->hi);
     81	__put_user((long)regs->cp0_epc, (__s64 __user *)&data->cp0_epc);
     82	__put_user((long)regs->cp0_badvaddr, (__s64 __user *)&data->cp0_badvaddr);
     83	__put_user((long)regs->cp0_status, (__s64 __user *)&data->cp0_status);
     84	__put_user((long)regs->cp0_cause, (__s64 __user *)&data->cp0_cause);
     85
     86	return 0;
     87}
     88
     89/*
     90 * Write a general register set.  As for PTRACE_GETREGS, we always use
     91 * the 64-bit format.  On a 32-bit kernel only the lower order half
     92 * (according to endianness) will be used.
     93 */
     94int ptrace_setregs(struct task_struct *child, struct user_pt_regs __user *data)
     95{
     96	struct pt_regs *regs;
     97	int i;
     98
     99	if (!access_ok(data, 38 * 8))
    100		return -EIO;
    101
    102	regs = task_pt_regs(child);
    103
    104	for (i = 0; i < 32; i++)
    105		__get_user(regs->regs[i], (__s64 __user *)&data->regs[i]);
    106	__get_user(regs->lo, (__s64 __user *)&data->lo);
    107	__get_user(regs->hi, (__s64 __user *)&data->hi);
    108	__get_user(regs->cp0_epc, (__s64 __user *)&data->cp0_epc);
    109
    110	/* badvaddr, status, and cause may not be written.  */
    111
    112	/* System call number may have been changed */
    113	mips_syscall_update_nr(child, regs);
    114
    115	return 0;
    116}
    117
    118int ptrace_get_watch_regs(struct task_struct *child,
    119			  struct pt_watch_regs __user *addr)
    120{
    121	enum pt_watch_style style;
    122	int i;
    123
    124	if (!cpu_has_watch || boot_cpu_data.watch_reg_use_cnt == 0)
    125		return -EIO;
    126	if (!access_ok(addr, sizeof(struct pt_watch_regs)))
    127		return -EIO;
    128
    129#ifdef CONFIG_32BIT
    130	style = pt_watch_style_mips32;
    131#define WATCH_STYLE mips32
    132#else
    133	style = pt_watch_style_mips64;
    134#define WATCH_STYLE mips64
    135#endif
    136
    137	__put_user(style, &addr->style);
    138	__put_user(boot_cpu_data.watch_reg_use_cnt,
    139		   &addr->WATCH_STYLE.num_valid);
    140	for (i = 0; i < boot_cpu_data.watch_reg_use_cnt; i++) {
    141		__put_user(child->thread.watch.mips3264.watchlo[i],
    142			   &addr->WATCH_STYLE.watchlo[i]);
    143		__put_user(child->thread.watch.mips3264.watchhi[i] &
    144				(MIPS_WATCHHI_MASK | MIPS_WATCHHI_IRW),
    145			   &addr->WATCH_STYLE.watchhi[i]);
    146		__put_user(boot_cpu_data.watch_reg_masks[i],
    147			   &addr->WATCH_STYLE.watch_masks[i]);
    148	}
    149	for (; i < 8; i++) {
    150		__put_user(0, &addr->WATCH_STYLE.watchlo[i]);
    151		__put_user(0, &addr->WATCH_STYLE.watchhi[i]);
    152		__put_user(0, &addr->WATCH_STYLE.watch_masks[i]);
    153	}
    154
    155	return 0;
    156}
    157
    158int ptrace_set_watch_regs(struct task_struct *child,
    159			  struct pt_watch_regs __user *addr)
    160{
    161	int i;
    162	int watch_active = 0;
    163	unsigned long lt[NUM_WATCH_REGS];
    164	u16 ht[NUM_WATCH_REGS];
    165
    166	if (!cpu_has_watch || boot_cpu_data.watch_reg_use_cnt == 0)
    167		return -EIO;
    168	if (!access_ok(addr, sizeof(struct pt_watch_regs)))
    169		return -EIO;
    170	/* Check the values. */
    171	for (i = 0; i < boot_cpu_data.watch_reg_use_cnt; i++) {
    172		__get_user(lt[i], &addr->WATCH_STYLE.watchlo[i]);
    173#ifdef CONFIG_32BIT
    174		if (lt[i] & __UA_LIMIT)
    175			return -EINVAL;
    176#else
    177		if (test_tsk_thread_flag(child, TIF_32BIT_ADDR)) {
    178			if (lt[i] & 0xffffffff80000000UL)
    179				return -EINVAL;
    180		} else {
    181			if (lt[i] & __UA_LIMIT)
    182				return -EINVAL;
    183		}
    184#endif
    185		__get_user(ht[i], &addr->WATCH_STYLE.watchhi[i]);
    186		if (ht[i] & ~MIPS_WATCHHI_MASK)
    187			return -EINVAL;
    188	}
    189	/* Install them. */
    190	for (i = 0; i < boot_cpu_data.watch_reg_use_cnt; i++) {
    191		if (lt[i] & MIPS_WATCHLO_IRW)
    192			watch_active = 1;
    193		child->thread.watch.mips3264.watchlo[i] = lt[i];
    194		/* Set the G bit. */
    195		child->thread.watch.mips3264.watchhi[i] = ht[i];
    196	}
    197
    198	if (watch_active)
    199		set_tsk_thread_flag(child, TIF_LOAD_WATCH);
    200	else
    201		clear_tsk_thread_flag(child, TIF_LOAD_WATCH);
    202
    203	return 0;
    204}
    205
    206/* regset get/set implementations */
    207
    208#if defined(CONFIG_32BIT) || defined(CONFIG_MIPS32_O32)
    209
    210static int gpr32_get(struct task_struct *target,
    211		     const struct user_regset *regset,
    212		     struct membuf to)
    213{
    214	struct pt_regs *regs = task_pt_regs(target);
    215	u32 uregs[ELF_NGREG] = {};
    216
    217	mips_dump_regs32(uregs, regs);
    218	return membuf_write(&to, uregs, sizeof(uregs));
    219}
    220
    221static int gpr32_set(struct task_struct *target,
    222		     const struct user_regset *regset,
    223		     unsigned int pos, unsigned int count,
    224		     const void *kbuf, const void __user *ubuf)
    225{
    226	struct pt_regs *regs = task_pt_regs(target);
    227	u32 uregs[ELF_NGREG];
    228	unsigned start, num_regs, i;
    229	int err;
    230
    231	start = pos / sizeof(u32);
    232	num_regs = count / sizeof(u32);
    233
    234	if (start + num_regs > ELF_NGREG)
    235		return -EIO;
    236
    237	err = user_regset_copyin(&pos, &count, &kbuf, &ubuf, uregs, 0,
    238				 sizeof(uregs));
    239	if (err)
    240		return err;
    241
    242	for (i = start; i < num_regs; i++) {
    243		/*
    244		 * Cast all values to signed here so that if this is a 64-bit
    245		 * kernel, the supplied 32-bit values will be sign extended.
    246		 */
    247		switch (i) {
    248		case MIPS32_EF_R1 ... MIPS32_EF_R25:
    249			/* k0/k1 are ignored. */
    250		case MIPS32_EF_R28 ... MIPS32_EF_R31:
    251			regs->regs[i - MIPS32_EF_R0] = (s32)uregs[i];
    252			break;
    253		case MIPS32_EF_LO:
    254			regs->lo = (s32)uregs[i];
    255			break;
    256		case MIPS32_EF_HI:
    257			regs->hi = (s32)uregs[i];
    258			break;
    259		case MIPS32_EF_CP0_EPC:
    260			regs->cp0_epc = (s32)uregs[i];
    261			break;
    262		}
    263	}
    264
    265	/* System call number may have been changed */
    266	mips_syscall_update_nr(target, regs);
    267
    268	return 0;
    269}
    270
    271#endif /* CONFIG_32BIT || CONFIG_MIPS32_O32 */
    272
    273#ifdef CONFIG_64BIT
    274
    275static int gpr64_get(struct task_struct *target,
    276		     const struct user_regset *regset,
    277		     struct membuf to)
    278{
    279	struct pt_regs *regs = task_pt_regs(target);
    280	u64 uregs[ELF_NGREG] = {};
    281
    282	mips_dump_regs64(uregs, regs);
    283	return membuf_write(&to, uregs, sizeof(uregs));
    284}
    285
    286static int gpr64_set(struct task_struct *target,
    287		     const struct user_regset *regset,
    288		     unsigned int pos, unsigned int count,
    289		     const void *kbuf, const void __user *ubuf)
    290{
    291	struct pt_regs *regs = task_pt_regs(target);
    292	u64 uregs[ELF_NGREG];
    293	unsigned start, num_regs, i;
    294	int err;
    295
    296	start = pos / sizeof(u64);
    297	num_regs = count / sizeof(u64);
    298
    299	if (start + num_regs > ELF_NGREG)
    300		return -EIO;
    301
    302	err = user_regset_copyin(&pos, &count, &kbuf, &ubuf, uregs, 0,
    303				 sizeof(uregs));
    304	if (err)
    305		return err;
    306
    307	for (i = start; i < num_regs; i++) {
    308		switch (i) {
    309		case MIPS64_EF_R1 ... MIPS64_EF_R25:
    310			/* k0/k1 are ignored. */
    311		case MIPS64_EF_R28 ... MIPS64_EF_R31:
    312			regs->regs[i - MIPS64_EF_R0] = uregs[i];
    313			break;
    314		case MIPS64_EF_LO:
    315			regs->lo = uregs[i];
    316			break;
    317		case MIPS64_EF_HI:
    318			regs->hi = uregs[i];
    319			break;
    320		case MIPS64_EF_CP0_EPC:
    321			regs->cp0_epc = uregs[i];
    322			break;
    323		}
    324	}
    325
    326	/* System call number may have been changed */
    327	mips_syscall_update_nr(target, regs);
    328
    329	return 0;
    330}
    331
    332#endif /* CONFIG_64BIT */
    333
    334
    335#ifdef CONFIG_MIPS_FP_SUPPORT
    336
    337/*
    338 * Poke at FCSR according to its mask.  Set the Cause bits even
    339 * if a corresponding Enable bit is set.  This will be noticed at
    340 * the time the thread is switched to and SIGFPE thrown accordingly.
    341 */
    342static void ptrace_setfcr31(struct task_struct *child, u32 value)
    343{
    344	u32 fcr31;
    345	u32 mask;
    346
    347	fcr31 = child->thread.fpu.fcr31;
    348	mask = boot_cpu_data.fpu_msk31;
    349	child->thread.fpu.fcr31 = (value & ~mask) | (fcr31 & mask);
    350}
    351
    352int ptrace_getfpregs(struct task_struct *child, __u32 __user *data)
    353{
    354	int i;
    355
    356	if (!access_ok(data, 33 * 8))
    357		return -EIO;
    358
    359	if (tsk_used_math(child)) {
    360		union fpureg *fregs = get_fpu_regs(child);
    361		for (i = 0; i < 32; i++)
    362			__put_user(get_fpr64(&fregs[i], 0),
    363				   i + (__u64 __user *)data);
    364	} else {
    365		for (i = 0; i < 32; i++)
    366			__put_user((__u64) -1, i + (__u64 __user *) data);
    367	}
    368
    369	__put_user(child->thread.fpu.fcr31, data + 64);
    370	__put_user(boot_cpu_data.fpu_id, data + 65);
    371
    372	return 0;
    373}
    374
    375int ptrace_setfpregs(struct task_struct *child, __u32 __user *data)
    376{
    377	union fpureg *fregs;
    378	u64 fpr_val;
    379	u32 value;
    380	int i;
    381
    382	if (!access_ok(data, 33 * 8))
    383		return -EIO;
    384
    385	init_fp_ctx(child);
    386	fregs = get_fpu_regs(child);
    387
    388	for (i = 0; i < 32; i++) {
    389		__get_user(fpr_val, i + (__u64 __user *)data);
    390		set_fpr64(&fregs[i], 0, fpr_val);
    391	}
    392
    393	__get_user(value, data + 64);
    394	ptrace_setfcr31(child, value);
    395
    396	/* FIR may not be written.  */
    397
    398	return 0;
    399}
    400
    401/*
    402 * Copy the floating-point context to the supplied NT_PRFPREG buffer,
    403 * !CONFIG_CPU_HAS_MSA variant.  FP context's general register slots
    404 * correspond 1:1 to buffer slots.  Only general registers are copied.
    405 */
    406static void fpr_get_fpa(struct task_struct *target,
    407		       struct membuf *to)
    408{
    409	membuf_write(to, &target->thread.fpu,
    410			NUM_FPU_REGS * sizeof(elf_fpreg_t));
    411}
    412
    413/*
    414 * Copy the floating-point context to the supplied NT_PRFPREG buffer,
    415 * CONFIG_CPU_HAS_MSA variant.  Only lower 64 bits of FP context's
    416 * general register slots are copied to buffer slots.  Only general
    417 * registers are copied.
    418 */
    419static void fpr_get_msa(struct task_struct *target, struct membuf *to)
    420{
    421	unsigned int i;
    422
    423	BUILD_BUG_ON(sizeof(u64) != sizeof(elf_fpreg_t));
    424	for (i = 0; i < NUM_FPU_REGS; i++)
    425		membuf_store(to, get_fpr64(&target->thread.fpu.fpr[i], 0));
    426}
    427
    428/*
    429 * Copy the floating-point context to the supplied NT_PRFPREG buffer.
    430 * Choose the appropriate helper for general registers, and then copy
    431 * the FCSR and FIR registers separately.
    432 */
    433static int fpr_get(struct task_struct *target,
    434		   const struct user_regset *regset,
    435		   struct membuf to)
    436{
    437	if (sizeof(target->thread.fpu.fpr[0]) == sizeof(elf_fpreg_t))
    438		fpr_get_fpa(target, &to);
    439	else
    440		fpr_get_msa(target, &to);
    441
    442	membuf_write(&to, &target->thread.fpu.fcr31, sizeof(u32));
    443	membuf_write(&to, &boot_cpu_data.fpu_id, sizeof(u32));
    444	return 0;
    445}
    446
    447/*
    448 * Copy the supplied NT_PRFPREG buffer to the floating-point context,
    449 * !CONFIG_CPU_HAS_MSA variant.   Buffer slots correspond 1:1 to FP
    450 * context's general register slots.  Only general registers are copied.
    451 */
    452static int fpr_set_fpa(struct task_struct *target,
    453		       unsigned int *pos, unsigned int *count,
    454		       const void **kbuf, const void __user **ubuf)
    455{
    456	return user_regset_copyin(pos, count, kbuf, ubuf,
    457				  &target->thread.fpu,
    458				  0, NUM_FPU_REGS * sizeof(elf_fpreg_t));
    459}
    460
    461/*
    462 * Copy the supplied NT_PRFPREG buffer to the floating-point context,
    463 * CONFIG_CPU_HAS_MSA variant.  Buffer slots are copied to lower 64
    464 * bits only of FP context's general register slots.  Only general
    465 * registers are copied.
    466 */
    467static int fpr_set_msa(struct task_struct *target,
    468		       unsigned int *pos, unsigned int *count,
    469		       const void **kbuf, const void __user **ubuf)
    470{
    471	unsigned int i;
    472	u64 fpr_val;
    473	int err;
    474
    475	BUILD_BUG_ON(sizeof(fpr_val) != sizeof(elf_fpreg_t));
    476	for (i = 0; i < NUM_FPU_REGS && *count > 0; i++) {
    477		err = user_regset_copyin(pos, count, kbuf, ubuf,
    478					 &fpr_val, i * sizeof(elf_fpreg_t),
    479					 (i + 1) * sizeof(elf_fpreg_t));
    480		if (err)
    481			return err;
    482		set_fpr64(&target->thread.fpu.fpr[i], 0, fpr_val);
    483	}
    484
    485	return 0;
    486}
    487
    488/*
    489 * Copy the supplied NT_PRFPREG buffer to the floating-point context.
    490 * Choose the appropriate helper for general registers, and then copy
    491 * the FCSR register separately.  Ignore the incoming FIR register
    492 * contents though, as the register is read-only.
    493 *
    494 * We optimize for the case where `count % sizeof(elf_fpreg_t) == 0',
    495 * which is supposed to have been guaranteed by the kernel before
    496 * calling us, e.g. in `ptrace_regset'.  We enforce that requirement,
    497 * so that we can safely avoid preinitializing temporaries for
    498 * partial register writes.
    499 */
    500static int fpr_set(struct task_struct *target,
    501		   const struct user_regset *regset,
    502		   unsigned int pos, unsigned int count,
    503		   const void *kbuf, const void __user *ubuf)
    504{
    505	const int fcr31_pos = NUM_FPU_REGS * sizeof(elf_fpreg_t);
    506	const int fir_pos = fcr31_pos + sizeof(u32);
    507	u32 fcr31;
    508	int err;
    509
    510	BUG_ON(count % sizeof(elf_fpreg_t));
    511
    512	if (pos + count > sizeof(elf_fpregset_t))
    513		return -EIO;
    514
    515	init_fp_ctx(target);
    516
    517	if (sizeof(target->thread.fpu.fpr[0]) == sizeof(elf_fpreg_t))
    518		err = fpr_set_fpa(target, &pos, &count, &kbuf, &ubuf);
    519	else
    520		err = fpr_set_msa(target, &pos, &count, &kbuf, &ubuf);
    521	if (err)
    522		return err;
    523
    524	if (count > 0) {
    525		err = user_regset_copyin(&pos, &count, &kbuf, &ubuf,
    526					 &fcr31,
    527					 fcr31_pos, fcr31_pos + sizeof(u32));
    528		if (err)
    529			return err;
    530
    531		ptrace_setfcr31(target, fcr31);
    532	}
    533
    534	if (count > 0)
    535		err = user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf,
    536						fir_pos,
    537						fir_pos + sizeof(u32));
    538
    539	return err;
    540}
    541
    542/* Copy the FP mode setting to the supplied NT_MIPS_FP_MODE buffer.  */
    543static int fp_mode_get(struct task_struct *target,
    544		       const struct user_regset *regset,
    545		       struct membuf to)
    546{
    547	return membuf_store(&to, (int)mips_get_process_fp_mode(target));
    548}
    549
    550/*
    551 * Copy the supplied NT_MIPS_FP_MODE buffer to the FP mode setting.
    552 *
    553 * We optimize for the case where `count % sizeof(int) == 0', which
    554 * is supposed to have been guaranteed by the kernel before calling
    555 * us, e.g. in `ptrace_regset'.  We enforce that requirement, so
    556 * that we can safely avoid preinitializing temporaries for partial
    557 * mode writes.
    558 */
    559static int fp_mode_set(struct task_struct *target,
    560		       const struct user_regset *regset,
    561		       unsigned int pos, unsigned int count,
    562		       const void *kbuf, const void __user *ubuf)
    563{
    564	int fp_mode;
    565	int err;
    566
    567	BUG_ON(count % sizeof(int));
    568
    569	if (pos + count > sizeof(fp_mode))
    570		return -EIO;
    571
    572	err = user_regset_copyin(&pos, &count, &kbuf, &ubuf, &fp_mode, 0,
    573				 sizeof(fp_mode));
    574	if (err)
    575		return err;
    576
    577	if (count > 0)
    578		err = mips_set_process_fp_mode(target, fp_mode);
    579
    580	return err;
    581}
    582
    583#endif /* CONFIG_MIPS_FP_SUPPORT */
    584
    585#ifdef CONFIG_CPU_HAS_MSA
    586
    587struct msa_control_regs {
    588	unsigned int fir;
    589	unsigned int fcsr;
    590	unsigned int msair;
    591	unsigned int msacsr;
    592};
    593
    594static void copy_pad_fprs(struct task_struct *target,
    595			 const struct user_regset *regset,
    596			 struct membuf *to,
    597			 unsigned int live_sz)
    598{
    599	int i, j;
    600	unsigned long long fill = ~0ull;
    601	unsigned int cp_sz, pad_sz;
    602
    603	cp_sz = min(regset->size, live_sz);
    604	pad_sz = regset->size - cp_sz;
    605	WARN_ON(pad_sz % sizeof(fill));
    606
    607	for (i = 0; i < NUM_FPU_REGS; i++) {
    608		membuf_write(to, &target->thread.fpu.fpr[i], cp_sz);
    609		for (j = 0; j < (pad_sz / sizeof(fill)); j++)
    610			membuf_store(to, fill);
    611	}
    612}
    613
    614static int msa_get(struct task_struct *target,
    615		   const struct user_regset *regset,
    616		   struct membuf to)
    617{
    618	const unsigned int wr_size = NUM_FPU_REGS * regset->size;
    619	const struct msa_control_regs ctrl_regs = {
    620		.fir = boot_cpu_data.fpu_id,
    621		.fcsr = target->thread.fpu.fcr31,
    622		.msair = boot_cpu_data.msa_id,
    623		.msacsr = target->thread.fpu.msacsr,
    624	};
    625
    626	if (!tsk_used_math(target)) {
    627		/* The task hasn't used FP or MSA, fill with 0xff */
    628		copy_pad_fprs(target, regset, &to, 0);
    629	} else if (!test_tsk_thread_flag(target, TIF_MSA_CTX_LIVE)) {
    630		/* Copy scalar FP context, fill the rest with 0xff */
    631		copy_pad_fprs(target, regset, &to, 8);
    632	} else if (sizeof(target->thread.fpu.fpr[0]) == regset->size) {
    633		/* Trivially copy the vector registers */
    634		membuf_write(&to, &target->thread.fpu.fpr, wr_size);
    635	} else {
    636		/* Copy as much context as possible, fill the rest with 0xff */
    637		copy_pad_fprs(target, regset, &to,
    638				sizeof(target->thread.fpu.fpr[0]));
    639	}
    640
    641	return membuf_write(&to, &ctrl_regs, sizeof(ctrl_regs));
    642}
    643
    644static int msa_set(struct task_struct *target,
    645		   const struct user_regset *regset,
    646		   unsigned int pos, unsigned int count,
    647		   const void *kbuf, const void __user *ubuf)
    648{
    649	const unsigned int wr_size = NUM_FPU_REGS * regset->size;
    650	struct msa_control_regs ctrl_regs;
    651	unsigned int cp_sz;
    652	int i, err, start;
    653
    654	init_fp_ctx(target);
    655
    656	if (sizeof(target->thread.fpu.fpr[0]) == regset->size) {
    657		/* Trivially copy the vector registers */
    658		err = user_regset_copyin(&pos, &count, &kbuf, &ubuf,
    659					 &target->thread.fpu.fpr,
    660					 0, wr_size);
    661	} else {
    662		/* Copy as much context as possible */
    663		cp_sz = min_t(unsigned int, regset->size,
    664			      sizeof(target->thread.fpu.fpr[0]));
    665
    666		i = start = err = 0;
    667		for (; i < NUM_FPU_REGS; i++, start += regset->size) {
    668			err |= user_regset_copyin(&pos, &count, &kbuf, &ubuf,
    669						  &target->thread.fpu.fpr[i],
    670						  start, start + cp_sz);
    671		}
    672	}
    673
    674	if (!err)
    675		err = user_regset_copyin(&pos, &count, &kbuf, &ubuf, &ctrl_regs,
    676					 wr_size, wr_size + sizeof(ctrl_regs));
    677	if (!err) {
    678		target->thread.fpu.fcr31 = ctrl_regs.fcsr & ~FPU_CSR_ALL_X;
    679		target->thread.fpu.msacsr = ctrl_regs.msacsr & ~MSA_CSR_CAUSEF;
    680	}
    681
    682	return err;
    683}
    684
    685#endif /* CONFIG_CPU_HAS_MSA */
    686
    687#if defined(CONFIG_32BIT) || defined(CONFIG_MIPS32_O32)
    688
    689/*
    690 * Copy the DSP context to the supplied 32-bit NT_MIPS_DSP buffer.
    691 */
    692static int dsp32_get(struct task_struct *target,
    693		     const struct user_regset *regset,
    694		     struct membuf to)
    695{
    696	u32 dspregs[NUM_DSP_REGS + 1];
    697	unsigned int i;
    698
    699	BUG_ON(to.left % sizeof(u32));
    700
    701	if (!cpu_has_dsp)
    702		return -EIO;
    703
    704	for (i = 0; i < NUM_DSP_REGS; i++)
    705		dspregs[i] = target->thread.dsp.dspr[i];
    706	dspregs[NUM_DSP_REGS] = target->thread.dsp.dspcontrol;
    707	return membuf_write(&to, dspregs, sizeof(dspregs));
    708}
    709
    710/*
    711 * Copy the supplied 32-bit NT_MIPS_DSP buffer to the DSP context.
    712 */
    713static int dsp32_set(struct task_struct *target,
    714		     const struct user_regset *regset,
    715		     unsigned int pos, unsigned int count,
    716		     const void *kbuf, const void __user *ubuf)
    717{
    718	unsigned int start, num_regs, i;
    719	u32 dspregs[NUM_DSP_REGS + 1];
    720	int err;
    721
    722	BUG_ON(count % sizeof(u32));
    723
    724	if (!cpu_has_dsp)
    725		return -EIO;
    726
    727	start = pos / sizeof(u32);
    728	num_regs = count / sizeof(u32);
    729
    730	if (start + num_regs > NUM_DSP_REGS + 1)
    731		return -EIO;
    732
    733	err = user_regset_copyin(&pos, &count, &kbuf, &ubuf, dspregs, 0,
    734				 sizeof(dspregs));
    735	if (err)
    736		return err;
    737
    738	for (i = start; i < num_regs; i++)
    739		switch (i) {
    740		case 0 ... NUM_DSP_REGS - 1:
    741			target->thread.dsp.dspr[i] = (s32)dspregs[i];
    742			break;
    743		case NUM_DSP_REGS:
    744			target->thread.dsp.dspcontrol = (s32)dspregs[i];
    745			break;
    746		}
    747
    748	return 0;
    749}
    750
    751#endif /* CONFIG_32BIT || CONFIG_MIPS32_O32 */
    752
    753#ifdef CONFIG_64BIT
    754
    755/*
    756 * Copy the DSP context to the supplied 64-bit NT_MIPS_DSP buffer.
    757 */
    758static int dsp64_get(struct task_struct *target,
    759		     const struct user_regset *regset,
    760		     struct membuf to)
    761{
    762	u64 dspregs[NUM_DSP_REGS + 1];
    763	unsigned int i;
    764
    765	BUG_ON(to.left % sizeof(u64));
    766
    767	if (!cpu_has_dsp)
    768		return -EIO;
    769
    770	for (i = 0; i < NUM_DSP_REGS; i++)
    771		dspregs[i] = target->thread.dsp.dspr[i];
    772	dspregs[NUM_DSP_REGS] = target->thread.dsp.dspcontrol;
    773	return membuf_write(&to, dspregs, sizeof(dspregs));
    774}
    775
    776/*
    777 * Copy the supplied 64-bit NT_MIPS_DSP buffer to the DSP context.
    778 */
    779static int dsp64_set(struct task_struct *target,
    780		     const struct user_regset *regset,
    781		     unsigned int pos, unsigned int count,
    782		     const void *kbuf, const void __user *ubuf)
    783{
    784	unsigned int start, num_regs, i;
    785	u64 dspregs[NUM_DSP_REGS + 1];
    786	int err;
    787
    788	BUG_ON(count % sizeof(u64));
    789
    790	if (!cpu_has_dsp)
    791		return -EIO;
    792
    793	start = pos / sizeof(u64);
    794	num_regs = count / sizeof(u64);
    795
    796	if (start + num_regs > NUM_DSP_REGS + 1)
    797		return -EIO;
    798
    799	err = user_regset_copyin(&pos, &count, &kbuf, &ubuf, dspregs, 0,
    800				 sizeof(dspregs));
    801	if (err)
    802		return err;
    803
    804	for (i = start; i < num_regs; i++)
    805		switch (i) {
    806		case 0 ... NUM_DSP_REGS - 1:
    807			target->thread.dsp.dspr[i] = dspregs[i];
    808			break;
    809		case NUM_DSP_REGS:
    810			target->thread.dsp.dspcontrol = dspregs[i];
    811			break;
    812		}
    813
    814	return 0;
    815}
    816
    817#endif /* CONFIG_64BIT */
    818
    819/*
    820 * Determine whether the DSP context is present.
    821 */
    822static int dsp_active(struct task_struct *target,
    823		      const struct user_regset *regset)
    824{
    825	return cpu_has_dsp ? NUM_DSP_REGS + 1 : -ENODEV;
    826}
    827
    828enum mips_regset {
    829	REGSET_GPR,
    830	REGSET_DSP,
    831#ifdef CONFIG_MIPS_FP_SUPPORT
    832	REGSET_FPR,
    833	REGSET_FP_MODE,
    834#endif
    835#ifdef CONFIG_CPU_HAS_MSA
    836	REGSET_MSA,
    837#endif
    838};
    839
    840struct pt_regs_offset {
    841	const char *name;
    842	int offset;
    843};
    844
    845#define REG_OFFSET_NAME(reg, r) {					\
    846	.name = #reg,							\
    847	.offset = offsetof(struct pt_regs, r)				\
    848}
    849
    850#define REG_OFFSET_END {						\
    851	.name = NULL,							\
    852	.offset = 0							\
    853}
    854
    855static const struct pt_regs_offset regoffset_table[] = {
    856	REG_OFFSET_NAME(r0, regs[0]),
    857	REG_OFFSET_NAME(r1, regs[1]),
    858	REG_OFFSET_NAME(r2, regs[2]),
    859	REG_OFFSET_NAME(r3, regs[3]),
    860	REG_OFFSET_NAME(r4, regs[4]),
    861	REG_OFFSET_NAME(r5, regs[5]),
    862	REG_OFFSET_NAME(r6, regs[6]),
    863	REG_OFFSET_NAME(r7, regs[7]),
    864	REG_OFFSET_NAME(r8, regs[8]),
    865	REG_OFFSET_NAME(r9, regs[9]),
    866	REG_OFFSET_NAME(r10, regs[10]),
    867	REG_OFFSET_NAME(r11, regs[11]),
    868	REG_OFFSET_NAME(r12, regs[12]),
    869	REG_OFFSET_NAME(r13, regs[13]),
    870	REG_OFFSET_NAME(r14, regs[14]),
    871	REG_OFFSET_NAME(r15, regs[15]),
    872	REG_OFFSET_NAME(r16, regs[16]),
    873	REG_OFFSET_NAME(r17, regs[17]),
    874	REG_OFFSET_NAME(r18, regs[18]),
    875	REG_OFFSET_NAME(r19, regs[19]),
    876	REG_OFFSET_NAME(r20, regs[20]),
    877	REG_OFFSET_NAME(r21, regs[21]),
    878	REG_OFFSET_NAME(r22, regs[22]),
    879	REG_OFFSET_NAME(r23, regs[23]),
    880	REG_OFFSET_NAME(r24, regs[24]),
    881	REG_OFFSET_NAME(r25, regs[25]),
    882	REG_OFFSET_NAME(r26, regs[26]),
    883	REG_OFFSET_NAME(r27, regs[27]),
    884	REG_OFFSET_NAME(r28, regs[28]),
    885	REG_OFFSET_NAME(r29, regs[29]),
    886	REG_OFFSET_NAME(r30, regs[30]),
    887	REG_OFFSET_NAME(r31, regs[31]),
    888	REG_OFFSET_NAME(c0_status, cp0_status),
    889	REG_OFFSET_NAME(hi, hi),
    890	REG_OFFSET_NAME(lo, lo),
    891#ifdef CONFIG_CPU_HAS_SMARTMIPS
    892	REG_OFFSET_NAME(acx, acx),
    893#endif
    894	REG_OFFSET_NAME(c0_badvaddr, cp0_badvaddr),
    895	REG_OFFSET_NAME(c0_cause, cp0_cause),
    896	REG_OFFSET_NAME(c0_epc, cp0_epc),
    897#ifdef CONFIG_CPU_CAVIUM_OCTEON
    898	REG_OFFSET_NAME(mpl0, mpl[0]),
    899	REG_OFFSET_NAME(mpl1, mpl[1]),
    900	REG_OFFSET_NAME(mpl2, mpl[2]),
    901	REG_OFFSET_NAME(mtp0, mtp[0]),
    902	REG_OFFSET_NAME(mtp1, mtp[1]),
    903	REG_OFFSET_NAME(mtp2, mtp[2]),
    904#endif
    905	REG_OFFSET_END,
    906};
    907
    908/**
    909 * regs_query_register_offset() - query register offset from its name
    910 * @name:       the name of a register
    911 *
    912 * regs_query_register_offset() returns the offset of a register in struct
    913 * pt_regs from its name. If the name is invalid, this returns -EINVAL;
    914 */
    915int regs_query_register_offset(const char *name)
    916{
    917        const struct pt_regs_offset *roff;
    918        for (roff = regoffset_table; roff->name != NULL; roff++)
    919                if (!strcmp(roff->name, name))
    920                        return roff->offset;
    921        return -EINVAL;
    922}
    923
    924#if defined(CONFIG_32BIT) || defined(CONFIG_MIPS32_O32)
    925
    926static const struct user_regset mips_regsets[] = {
    927	[REGSET_GPR] = {
    928		.core_note_type	= NT_PRSTATUS,
    929		.n		= ELF_NGREG,
    930		.size		= sizeof(unsigned int),
    931		.align		= sizeof(unsigned int),
    932		.regset_get		= gpr32_get,
    933		.set		= gpr32_set,
    934	},
    935	[REGSET_DSP] = {
    936		.core_note_type	= NT_MIPS_DSP,
    937		.n		= NUM_DSP_REGS + 1,
    938		.size		= sizeof(u32),
    939		.align		= sizeof(u32),
    940		.regset_get		= dsp32_get,
    941		.set		= dsp32_set,
    942		.active		= dsp_active,
    943	},
    944#ifdef CONFIG_MIPS_FP_SUPPORT
    945	[REGSET_FPR] = {
    946		.core_note_type	= NT_PRFPREG,
    947		.n		= ELF_NFPREG,
    948		.size		= sizeof(elf_fpreg_t),
    949		.align		= sizeof(elf_fpreg_t),
    950		.regset_get		= fpr_get,
    951		.set		= fpr_set,
    952	},
    953	[REGSET_FP_MODE] = {
    954		.core_note_type	= NT_MIPS_FP_MODE,
    955		.n		= 1,
    956		.size		= sizeof(int),
    957		.align		= sizeof(int),
    958		.regset_get		= fp_mode_get,
    959		.set		= fp_mode_set,
    960	},
    961#endif
    962#ifdef CONFIG_CPU_HAS_MSA
    963	[REGSET_MSA] = {
    964		.core_note_type	= NT_MIPS_MSA,
    965		.n		= NUM_FPU_REGS + 1,
    966		.size		= 16,
    967		.align		= 16,
    968		.regset_get		= msa_get,
    969		.set		= msa_set,
    970	},
    971#endif
    972};
    973
    974static const struct user_regset_view user_mips_view = {
    975	.name		= "mips",
    976	.e_machine	= ELF_ARCH,
    977	.ei_osabi	= ELF_OSABI,
    978	.regsets	= mips_regsets,
    979	.n		= ARRAY_SIZE(mips_regsets),
    980};
    981
    982#endif /* CONFIG_32BIT || CONFIG_MIPS32_O32 */
    983
    984#ifdef CONFIG_64BIT
    985
    986static const struct user_regset mips64_regsets[] = {
    987	[REGSET_GPR] = {
    988		.core_note_type	= NT_PRSTATUS,
    989		.n		= ELF_NGREG,
    990		.size		= sizeof(unsigned long),
    991		.align		= sizeof(unsigned long),
    992		.regset_get		= gpr64_get,
    993		.set		= gpr64_set,
    994	},
    995	[REGSET_DSP] = {
    996		.core_note_type	= NT_MIPS_DSP,
    997		.n		= NUM_DSP_REGS + 1,
    998		.size		= sizeof(u64),
    999		.align		= sizeof(u64),
   1000		.regset_get		= dsp64_get,
   1001		.set		= dsp64_set,
   1002		.active		= dsp_active,
   1003	},
   1004#ifdef CONFIG_MIPS_FP_SUPPORT
   1005	[REGSET_FP_MODE] = {
   1006		.core_note_type	= NT_MIPS_FP_MODE,
   1007		.n		= 1,
   1008		.size		= sizeof(int),
   1009		.align		= sizeof(int),
   1010		.regset_get		= fp_mode_get,
   1011		.set		= fp_mode_set,
   1012	},
   1013	[REGSET_FPR] = {
   1014		.core_note_type	= NT_PRFPREG,
   1015		.n		= ELF_NFPREG,
   1016		.size		= sizeof(elf_fpreg_t),
   1017		.align		= sizeof(elf_fpreg_t),
   1018		.regset_get		= fpr_get,
   1019		.set		= fpr_set,
   1020	},
   1021#endif
   1022#ifdef CONFIG_CPU_HAS_MSA
   1023	[REGSET_MSA] = {
   1024		.core_note_type	= NT_MIPS_MSA,
   1025		.n		= NUM_FPU_REGS + 1,
   1026		.size		= 16,
   1027		.align		= 16,
   1028		.regset_get		= msa_get,
   1029		.set		= msa_set,
   1030	},
   1031#endif
   1032};
   1033
   1034static const struct user_regset_view user_mips64_view = {
   1035	.name		= "mips64",
   1036	.e_machine	= ELF_ARCH,
   1037	.ei_osabi	= ELF_OSABI,
   1038	.regsets	= mips64_regsets,
   1039	.n		= ARRAY_SIZE(mips64_regsets),
   1040};
   1041
   1042#ifdef CONFIG_MIPS32_N32
   1043
   1044static const struct user_regset_view user_mipsn32_view = {
   1045	.name		= "mipsn32",
   1046	.e_flags	= EF_MIPS_ABI2,
   1047	.e_machine	= ELF_ARCH,
   1048	.ei_osabi	= ELF_OSABI,
   1049	.regsets	= mips64_regsets,
   1050	.n		= ARRAY_SIZE(mips64_regsets),
   1051};
   1052
   1053#endif /* CONFIG_MIPS32_N32 */
   1054
   1055#endif /* CONFIG_64BIT */
   1056
   1057const struct user_regset_view *task_user_regset_view(struct task_struct *task)
   1058{
   1059#ifdef CONFIG_32BIT
   1060	return &user_mips_view;
   1061#else
   1062#ifdef CONFIG_MIPS32_O32
   1063	if (test_tsk_thread_flag(task, TIF_32BIT_REGS))
   1064		return &user_mips_view;
   1065#endif
   1066#ifdef CONFIG_MIPS32_N32
   1067	if (test_tsk_thread_flag(task, TIF_32BIT_ADDR))
   1068		return &user_mipsn32_view;
   1069#endif
   1070	return &user_mips64_view;
   1071#endif
   1072}
   1073
   1074long arch_ptrace(struct task_struct *child, long request,
   1075		 unsigned long addr, unsigned long data)
   1076{
   1077	int ret;
   1078	void __user *addrp = (void __user *) addr;
   1079	void __user *datavp = (void __user *) data;
   1080	unsigned long __user *datalp = (void __user *) data;
   1081
   1082	switch (request) {
   1083	/* when I and D space are separate, these will need to be fixed. */
   1084	case PTRACE_PEEKTEXT: /* read word at location addr. */
   1085	case PTRACE_PEEKDATA:
   1086		ret = generic_ptrace_peekdata(child, addr, data);
   1087		break;
   1088
   1089	/* Read the word at location addr in the USER area. */
   1090	case PTRACE_PEEKUSR: {
   1091		struct pt_regs *regs;
   1092		unsigned long tmp = 0;
   1093
   1094		regs = task_pt_regs(child);
   1095		ret = 0;  /* Default return value. */
   1096
   1097		switch (addr) {
   1098		case 0 ... 31:
   1099			tmp = regs->regs[addr];
   1100			break;
   1101#ifdef CONFIG_MIPS_FP_SUPPORT
   1102		case FPR_BASE ... FPR_BASE + 31: {
   1103			union fpureg *fregs;
   1104
   1105			if (!tsk_used_math(child)) {
   1106				/* FP not yet used */
   1107				tmp = -1;
   1108				break;
   1109			}
   1110			fregs = get_fpu_regs(child);
   1111
   1112#ifdef CONFIG_32BIT
   1113			if (test_tsk_thread_flag(child, TIF_32BIT_FPREGS)) {
   1114				/*
   1115				 * The odd registers are actually the high
   1116				 * order bits of the values stored in the even
   1117				 * registers.
   1118				 */
   1119				tmp = get_fpr32(&fregs[(addr & ~1) - FPR_BASE],
   1120						addr & 1);
   1121				break;
   1122			}
   1123#endif
   1124			tmp = get_fpr64(&fregs[addr - FPR_BASE], 0);
   1125			break;
   1126		}
   1127		case FPC_CSR:
   1128			tmp = child->thread.fpu.fcr31;
   1129			break;
   1130		case FPC_EIR:
   1131			/* implementation / version register */
   1132			tmp = boot_cpu_data.fpu_id;
   1133			break;
   1134#endif
   1135		case PC:
   1136			tmp = regs->cp0_epc;
   1137			break;
   1138		case CAUSE:
   1139			tmp = regs->cp0_cause;
   1140			break;
   1141		case BADVADDR:
   1142			tmp = regs->cp0_badvaddr;
   1143			break;
   1144		case MMHI:
   1145			tmp = regs->hi;
   1146			break;
   1147		case MMLO:
   1148			tmp = regs->lo;
   1149			break;
   1150#ifdef CONFIG_CPU_HAS_SMARTMIPS
   1151		case ACX:
   1152			tmp = regs->acx;
   1153			break;
   1154#endif
   1155		case DSP_BASE ... DSP_BASE + 5: {
   1156			dspreg_t *dregs;
   1157
   1158			if (!cpu_has_dsp) {
   1159				tmp = 0;
   1160				ret = -EIO;
   1161				goto out;
   1162			}
   1163			dregs = __get_dsp_regs(child);
   1164			tmp = dregs[addr - DSP_BASE];
   1165			break;
   1166		}
   1167		case DSP_CONTROL:
   1168			if (!cpu_has_dsp) {
   1169				tmp = 0;
   1170				ret = -EIO;
   1171				goto out;
   1172			}
   1173			tmp = child->thread.dsp.dspcontrol;
   1174			break;
   1175		default:
   1176			tmp = 0;
   1177			ret = -EIO;
   1178			goto out;
   1179		}
   1180		ret = put_user(tmp, datalp);
   1181		break;
   1182	}
   1183
   1184	/* when I and D space are separate, this will have to be fixed. */
   1185	case PTRACE_POKETEXT: /* write the word at location addr. */
   1186	case PTRACE_POKEDATA:
   1187		ret = generic_ptrace_pokedata(child, addr, data);
   1188		break;
   1189
   1190	case PTRACE_POKEUSR: {
   1191		struct pt_regs *regs;
   1192		ret = 0;
   1193		regs = task_pt_regs(child);
   1194
   1195		switch (addr) {
   1196		case 0 ... 31:
   1197			regs->regs[addr] = data;
   1198			/* System call number may have been changed */
   1199			if (addr == 2)
   1200				mips_syscall_update_nr(child, regs);
   1201			else if (addr == 4 &&
   1202				 mips_syscall_is_indirect(child, regs))
   1203				mips_syscall_update_nr(child, regs);
   1204			break;
   1205#ifdef CONFIG_MIPS_FP_SUPPORT
   1206		case FPR_BASE ... FPR_BASE + 31: {
   1207			union fpureg *fregs = get_fpu_regs(child);
   1208
   1209			init_fp_ctx(child);
   1210#ifdef CONFIG_32BIT
   1211			if (test_tsk_thread_flag(child, TIF_32BIT_FPREGS)) {
   1212				/*
   1213				 * The odd registers are actually the high
   1214				 * order bits of the values stored in the even
   1215				 * registers.
   1216				 */
   1217				set_fpr32(&fregs[(addr & ~1) - FPR_BASE],
   1218					  addr & 1, data);
   1219				break;
   1220			}
   1221#endif
   1222			set_fpr64(&fregs[addr - FPR_BASE], 0, data);
   1223			break;
   1224		}
   1225		case FPC_CSR:
   1226			init_fp_ctx(child);
   1227			ptrace_setfcr31(child, data);
   1228			break;
   1229#endif
   1230		case PC:
   1231			regs->cp0_epc = data;
   1232			break;
   1233		case MMHI:
   1234			regs->hi = data;
   1235			break;
   1236		case MMLO:
   1237			regs->lo = data;
   1238			break;
   1239#ifdef CONFIG_CPU_HAS_SMARTMIPS
   1240		case ACX:
   1241			regs->acx = data;
   1242			break;
   1243#endif
   1244		case DSP_BASE ... DSP_BASE + 5: {
   1245			dspreg_t *dregs;
   1246
   1247			if (!cpu_has_dsp) {
   1248				ret = -EIO;
   1249				break;
   1250			}
   1251
   1252			dregs = __get_dsp_regs(child);
   1253			dregs[addr - DSP_BASE] = data;
   1254			break;
   1255		}
   1256		case DSP_CONTROL:
   1257			if (!cpu_has_dsp) {
   1258				ret = -EIO;
   1259				break;
   1260			}
   1261			child->thread.dsp.dspcontrol = data;
   1262			break;
   1263		default:
   1264			/* The rest are not allowed. */
   1265			ret = -EIO;
   1266			break;
   1267		}
   1268		break;
   1269		}
   1270
   1271	case PTRACE_GETREGS:
   1272		ret = ptrace_getregs(child, datavp);
   1273		break;
   1274
   1275	case PTRACE_SETREGS:
   1276		ret = ptrace_setregs(child, datavp);
   1277		break;
   1278
   1279#ifdef CONFIG_MIPS_FP_SUPPORT
   1280	case PTRACE_GETFPREGS:
   1281		ret = ptrace_getfpregs(child, datavp);
   1282		break;
   1283
   1284	case PTRACE_SETFPREGS:
   1285		ret = ptrace_setfpregs(child, datavp);
   1286		break;
   1287#endif
   1288	case PTRACE_GET_THREAD_AREA:
   1289		ret = put_user(task_thread_info(child)->tp_value, datalp);
   1290		break;
   1291
   1292	case PTRACE_GET_WATCH_REGS:
   1293		ret = ptrace_get_watch_regs(child, addrp);
   1294		break;
   1295
   1296	case PTRACE_SET_WATCH_REGS:
   1297		ret = ptrace_set_watch_regs(child, addrp);
   1298		break;
   1299
   1300	default:
   1301		ret = ptrace_request(child, request, addr, data);
   1302		break;
   1303	}
   1304 out:
   1305	return ret;
   1306}
   1307
   1308/*
   1309 * Notification of system call entry/exit
   1310 * - triggered by current->work.syscall_trace
   1311 */
   1312asmlinkage long syscall_trace_enter(struct pt_regs *regs, long syscall)
   1313{
   1314	user_exit();
   1315
   1316	current_thread_info()->syscall = syscall;
   1317
   1318	if (test_thread_flag(TIF_SYSCALL_TRACE)) {
   1319		if (ptrace_report_syscall_entry(regs))
   1320			return -1;
   1321		syscall = current_thread_info()->syscall;
   1322	}
   1323
   1324#ifdef CONFIG_SECCOMP
   1325	if (unlikely(test_thread_flag(TIF_SECCOMP))) {
   1326		int ret, i;
   1327		struct seccomp_data sd;
   1328		unsigned long args[6];
   1329
   1330		sd.nr = syscall;
   1331		sd.arch = syscall_get_arch(current);
   1332		syscall_get_arguments(current, regs, args);
   1333		for (i = 0; i < 6; i++)
   1334			sd.args[i] = args[i];
   1335		sd.instruction_pointer = KSTK_EIP(current);
   1336
   1337		ret = __secure_computing(&sd);
   1338		if (ret == -1)
   1339			return ret;
   1340		syscall = current_thread_info()->syscall;
   1341	}
   1342#endif
   1343
   1344	if (unlikely(test_thread_flag(TIF_SYSCALL_TRACEPOINT)))
   1345		trace_sys_enter(regs, regs->regs[2]);
   1346
   1347	audit_syscall_entry(syscall, regs->regs[4], regs->regs[5],
   1348			    regs->regs[6], regs->regs[7]);
   1349
   1350	/*
   1351	 * Negative syscall numbers are mistaken for rejected syscalls, but
   1352	 * won't have had the return value set appropriately, so we do so now.
   1353	 */
   1354	if (syscall < 0)
   1355		syscall_set_return_value(current, regs, -ENOSYS, 0);
   1356	return syscall;
   1357}
   1358
   1359/*
   1360 * Notification of system call entry/exit
   1361 * - triggered by current->work.syscall_trace
   1362 */
   1363asmlinkage void syscall_trace_leave(struct pt_regs *regs)
   1364{
   1365        /*
   1366	 * We may come here right after calling schedule_user()
   1367	 * or do_notify_resume(), in which case we can be in RCU
   1368	 * user mode.
   1369	 */
   1370	user_exit();
   1371
   1372	audit_syscall_exit(regs);
   1373
   1374	if (unlikely(test_thread_flag(TIF_SYSCALL_TRACEPOINT)))
   1375		trace_sys_exit(regs, regs_return_value(regs));
   1376
   1377	if (test_thread_flag(TIF_SYSCALL_TRACE))
   1378		ptrace_report_syscall_exit(regs, 0);
   1379
   1380	user_enter();
   1381}