ptrace.c 46.3 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3 4 5 6 7 8 9 10
/*
 *  PowerPC version
 *    Copyright (C) 1995-1996 Gary Thomas (gdt@linuxppc.org)
 *
 *  Derived from "arch/m68k/kernel/ptrace.c"
 *  Copyright (C) 1994 by Hamish Macdonald
 *  Taken from linux/kernel/ptrace.c and modified for M680x0.
 *  linux/kernel/ptrace.c is by Ross Biro 1/23/92, edited by Linus Torvalds
 *
 * Modified by Cort Dougan (cort@hq.fsmlabs.com)
11
 * and Paul Mackerras (paulus@samba.org).
L
Linus Torvalds 已提交
12 13 14 15 16 17 18 19 20 21 22 23
 *
 * This file is subject to the terms and conditions of the GNU General
 * Public License.  See the file README.legal in the main directory of
 * this archive for more details.
 */

#include <linux/kernel.h>
#include <linux/sched.h>
#include <linux/mm.h>
#include <linux/smp.h>
#include <linux/errno.h>
#include <linux/ptrace.h>
24
#include <linux/regset.h>
25
#include <linux/tracehook.h>
26
#include <linux/elf.h>
L
Linus Torvalds 已提交
27 28
#include <linux/user.h>
#include <linux/security.h>
29
#include <linux/signal.h>
30 31
#include <linux/seccomp.h>
#include <linux/audit.h>
32
#include <trace/syscall.h>
33 34
#include <linux/hw_breakpoint.h>
#include <linux/perf_event.h>
35
#include <linux/context_tracking.h>
L
Linus Torvalds 已提交
36 37 38 39

#include <asm/uaccess.h>
#include <asm/page.h>
#include <asm/pgtable.h>
40
#include <asm/switch_to.h>
41

42 43 44
#define CREATE_TRACE_POINTS
#include <trace/events/syscalls.h>

45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147
/*
 * The parameter save area on the stack is used to store arguments being passed
 * to callee function and is located at fixed offset from stack pointer.
 */
#ifdef CONFIG_PPC32
#define PARAMETER_SAVE_AREA_OFFSET	24  /* bytes */
#else /* CONFIG_PPC32 */
#define PARAMETER_SAVE_AREA_OFFSET	48  /* bytes */
#endif

struct pt_regs_offset {
	const char *name;
	int offset;
};

#define STR(s)	#s			/* convert to string */
#define REG_OFFSET_NAME(r) {.name = #r, .offset = offsetof(struct pt_regs, r)}
#define GPR_OFFSET_NAME(num)	\
	{.name = STR(gpr##num), .offset = offsetof(struct pt_regs, gpr[num])}
#define REG_OFFSET_END {.name = NULL, .offset = 0}

static const struct pt_regs_offset regoffset_table[] = {
	GPR_OFFSET_NAME(0),
	GPR_OFFSET_NAME(1),
	GPR_OFFSET_NAME(2),
	GPR_OFFSET_NAME(3),
	GPR_OFFSET_NAME(4),
	GPR_OFFSET_NAME(5),
	GPR_OFFSET_NAME(6),
	GPR_OFFSET_NAME(7),
	GPR_OFFSET_NAME(8),
	GPR_OFFSET_NAME(9),
	GPR_OFFSET_NAME(10),
	GPR_OFFSET_NAME(11),
	GPR_OFFSET_NAME(12),
	GPR_OFFSET_NAME(13),
	GPR_OFFSET_NAME(14),
	GPR_OFFSET_NAME(15),
	GPR_OFFSET_NAME(16),
	GPR_OFFSET_NAME(17),
	GPR_OFFSET_NAME(18),
	GPR_OFFSET_NAME(19),
	GPR_OFFSET_NAME(20),
	GPR_OFFSET_NAME(21),
	GPR_OFFSET_NAME(22),
	GPR_OFFSET_NAME(23),
	GPR_OFFSET_NAME(24),
	GPR_OFFSET_NAME(25),
	GPR_OFFSET_NAME(26),
	GPR_OFFSET_NAME(27),
	GPR_OFFSET_NAME(28),
	GPR_OFFSET_NAME(29),
	GPR_OFFSET_NAME(30),
	GPR_OFFSET_NAME(31),
	REG_OFFSET_NAME(nip),
	REG_OFFSET_NAME(msr),
	REG_OFFSET_NAME(ctr),
	REG_OFFSET_NAME(link),
	REG_OFFSET_NAME(xer),
	REG_OFFSET_NAME(ccr),
#ifdef CONFIG_PPC64
	REG_OFFSET_NAME(softe),
#else
	REG_OFFSET_NAME(mq),
#endif
	REG_OFFSET_NAME(trap),
	REG_OFFSET_NAME(dar),
	REG_OFFSET_NAME(dsisr),
	REG_OFFSET_END,
};

/**
 * regs_query_register_offset() - query register offset from its name
 * @name:	the name of a register
 *
 * regs_query_register_offset() returns the offset of a register in struct
 * pt_regs from its name. If the name is invalid, this returns -EINVAL;
 */
int regs_query_register_offset(const char *name)
{
	const struct pt_regs_offset *roff;
	for (roff = regoffset_table; roff->name != NULL; roff++)
		if (!strcmp(roff->name, name))
			return roff->offset;
	return -EINVAL;
}

/**
 * regs_query_register_name() - query register name from its offset
 * @offset:	the offset of a register in struct pt_regs.
 *
 * regs_query_register_name() returns the name of a register from its
 * offset in struct pt_regs. If the @offset is invalid, this returns NULL;
 */
const char *regs_query_register_name(unsigned int offset)
{
	const struct pt_regs_offset *roff;
	for (roff = regoffset_table; roff->name != NULL; roff++)
		if (roff->offset == offset)
			return roff->name;
	return NULL;
}

148 149 150 151 152 153 154 155
/*
 * does not yet catch signals sent when the child dies.
 * in exit.c or in signal.c.
 */

/*
 * Set of msr bits that gdb can change on behalf of a process.
 */
156
#ifdef CONFIG_PPC_ADV_DEBUG_REGS
157
#define MSR_DEBUGCHANGE	0
L
Linus Torvalds 已提交
158
#else
159
#define MSR_DEBUGCHANGE	(MSR_SE | MSR_BE)
L
Linus Torvalds 已提交
160
#endif
161

L
Linus Torvalds 已提交
162
/*
163
 * Max register writeable via put_reg
L
Linus Torvalds 已提交
164
 */
165 166 167 168 169
#ifdef CONFIG_PPC32
#define PT_MAX_PUT_REG	PT_MQ
#else
#define PT_MAX_PUT_REG	PT_CCR
#endif
L
Linus Torvalds 已提交
170

171 172 173 174 175 176 177 178 179 180 181 182
static unsigned long get_user_msr(struct task_struct *task)
{
	return task->thread.regs->msr | task->thread.fpexc_mode;
}

static int set_user_msr(struct task_struct *task, unsigned long msr)
{
	task->thread.regs->msr &= ~MSR_DEBUGCHANGE;
	task->thread.regs->msr |= msr & MSR_DEBUGCHANGE;
	return 0;
}

183
#ifdef CONFIG_PPC64
184
static int get_user_dscr(struct task_struct *task, unsigned long *data)
185
{
186 187
	*data = task->thread.dscr;
	return 0;
188 189 190 191 192 193 194 195 196
}

static int set_user_dscr(struct task_struct *task, unsigned long dscr)
{
	task->thread.dscr = dscr;
	task->thread.dscr_inherit = 1;
	return 0;
}
#else
197
static int get_user_dscr(struct task_struct *task, unsigned long *data)
198 199 200 201 202 203 204 205 206 207
{
	return -EIO;
}

static int set_user_dscr(struct task_struct *task, unsigned long dscr)
{
	return -EIO;
}
#endif

208 209 210 211 212 213 214 215 216 217
/*
 * We prevent mucking around with the reserved area of trap
 * which are used internally by the kernel.
 */
static int set_user_trap(struct task_struct *task, unsigned long trap)
{
	task->thread.regs->trap = trap & 0xfff0;
	return 0;
}

218 219 220
/*
 * Get contents of register REGNO in task TASK.
 */
221
int ptrace_get_reg(struct task_struct *task, int regno, unsigned long *data)
222
{
223
	if ((task->thread.regs == NULL) || !data)
224 225
		return -EIO;

226 227 228 229
	if (regno == PT_MSR) {
		*data = get_user_msr(task);
		return 0;
	}
230

231
	if (regno == PT_DSCR)
232
		return get_user_dscr(task, data);
233

234 235 236 237
	if (regno < (sizeof(struct pt_regs) / sizeof(unsigned long))) {
		*data = ((unsigned long *)task->thread.regs)[regno];
		return 0;
	}
238 239 240 241 242 243 244 245 246 247 248 249

	return -EIO;
}

/*
 * Write contents of register REGNO in task TASK.
 */
int ptrace_put_reg(struct task_struct *task, int regno, unsigned long data)
{
	if (task->thread.regs == NULL)
		return -EIO;

250 251 252 253
	if (regno == PT_MSR)
		return set_user_msr(task, data);
	if (regno == PT_TRAP)
		return set_user_trap(task, data);
254 255
	if (regno == PT_DSCR)
		return set_user_dscr(task, data);
256 257

	if (regno <= PT_MAX_PUT_REG) {
258 259 260 261 262 263
		((unsigned long *)task->thread.regs)[regno] = data;
		return 0;
	}
	return -EIO;
}

264 265 266 267
static int gpr_get(struct task_struct *target, const struct user_regset *regset,
		   unsigned int pos, unsigned int count,
		   void *kbuf, void __user *ubuf)
{
268
	int i, ret;
269 270 271 272

	if (target->thread.regs == NULL)
		return -EIO;

273 274 275 276 277
	if (!FULL_REGS(target->thread.regs)) {
		/* We have a partial register set.  Fill 14-31 with bogus values */
		for (i = 14; i < 32; i++)
			target->thread.regs->gpr[i] = NV_REG_POISON;
	}
278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358

	ret = user_regset_copyout(&pos, &count, &kbuf, &ubuf,
				  target->thread.regs,
				  0, offsetof(struct pt_regs, msr));
	if (!ret) {
		unsigned long msr = get_user_msr(target);
		ret = user_regset_copyout(&pos, &count, &kbuf, &ubuf, &msr,
					  offsetof(struct pt_regs, msr),
					  offsetof(struct pt_regs, msr) +
					  sizeof(msr));
	}

	BUILD_BUG_ON(offsetof(struct pt_regs, orig_gpr3) !=
		     offsetof(struct pt_regs, msr) + sizeof(long));

	if (!ret)
		ret = user_regset_copyout(&pos, &count, &kbuf, &ubuf,
					  &target->thread.regs->orig_gpr3,
					  offsetof(struct pt_regs, orig_gpr3),
					  sizeof(struct pt_regs));
	if (!ret)
		ret = user_regset_copyout_zero(&pos, &count, &kbuf, &ubuf,
					       sizeof(struct pt_regs), -1);

	return ret;
}

static int gpr_set(struct task_struct *target, const struct user_regset *regset,
		   unsigned int pos, unsigned int count,
		   const void *kbuf, const void __user *ubuf)
{
	unsigned long reg;
	int ret;

	if (target->thread.regs == NULL)
		return -EIO;

	CHECK_FULL_REGS(target->thread.regs);

	ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf,
				 target->thread.regs,
				 0, PT_MSR * sizeof(reg));

	if (!ret && count > 0) {
		ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf, &reg,
					 PT_MSR * sizeof(reg),
					 (PT_MSR + 1) * sizeof(reg));
		if (!ret)
			ret = set_user_msr(target, reg);
	}

	BUILD_BUG_ON(offsetof(struct pt_regs, orig_gpr3) !=
		     offsetof(struct pt_regs, msr) + sizeof(long));

	if (!ret)
		ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf,
					 &target->thread.regs->orig_gpr3,
					 PT_ORIG_R3 * sizeof(reg),
					 (PT_MAX_PUT_REG + 1) * sizeof(reg));

	if (PT_MAX_PUT_REG + 1 < PT_TRAP && !ret)
		ret = user_regset_copyin_ignore(
			&pos, &count, &kbuf, &ubuf,
			(PT_MAX_PUT_REG + 1) * sizeof(reg),
			PT_TRAP * sizeof(reg));

	if (!ret && count > 0) {
		ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf, &reg,
					 PT_TRAP * sizeof(reg),
					 (PT_TRAP + 1) * sizeof(reg));
		if (!ret)
			ret = set_user_trap(target, reg);
	}

	if (!ret)
		ret = user_regset_copyin_ignore(
			&pos, &count, &kbuf, &ubuf,
			(PT_TRAP + 1) * sizeof(reg), -1);

	return ret;
}
359

360 361 362 363
static int fpr_get(struct task_struct *target, const struct user_regset *regset,
		   unsigned int pos, unsigned int count,
		   void *kbuf, void __user *ubuf)
{
364
#ifdef CONFIG_VSX
365
	u64 buf[33];
366 367
	int i;
#endif
368 369
	flush_fp_to_thread(target);

370 371 372 373
#ifdef CONFIG_VSX
	/* copy to local buffer then write that out */
	for (i = 0; i < 32 ; i++)
		buf[i] = target->thread.TS_FPR(i);
374
	buf[32] = target->thread.fp_state.fpscr;
375 376 377
	return user_regset_copyout(&pos, &count, &kbuf, &ubuf, buf, 0, -1);

#else
378 379
	BUILD_BUG_ON(offsetof(struct thread_fp_state, fpscr) !=
		     offsetof(struct thread_fp_state, fpr[32][0]));
380 381

	return user_regset_copyout(&pos, &count, &kbuf, &ubuf,
382
				   &target->thread.fp_state, 0, -1);
383
#endif
384 385 386 387 388 389
}

static int fpr_set(struct task_struct *target, const struct user_regset *regset,
		   unsigned int pos, unsigned int count,
		   const void *kbuf, const void __user *ubuf)
{
390
#ifdef CONFIG_VSX
391
	u64 buf[33];
392 393
	int i;
#endif
394 395
	flush_fp_to_thread(target);

396 397 398 399 400 401 402
#ifdef CONFIG_VSX
	/* copy to local buffer then write that out */
	i = user_regset_copyin(&pos, &count, &kbuf, &ubuf, buf, 0, -1);
	if (i)
		return i;
	for (i = 0; i < 32 ; i++)
		target->thread.TS_FPR(i) = buf[i];
403
	target->thread.fp_state.fpscr = buf[32];
404 405
	return 0;
#else
406 407
	BUILD_BUG_ON(offsetof(struct thread_fp_state, fpscr) !=
		     offsetof(struct thread_fp_state, fpr[32][0]));
408 409

	return user_regset_copyin(&pos, &count, &kbuf, &ubuf,
410
				  &target->thread.fp_state, 0, -1);
411
#endif
412 413
}

414 415 416 417 418 419 420 421 422 423 424 425 426 427
#ifdef CONFIG_ALTIVEC
/*
 * Get/set all the altivec registers vr0..vr31, vscr, vrsave, in one go.
 * The transfer totals 34 quadword.  Quadwords 0-31 contain the
 * corresponding vector registers.  Quadword 32 contains the vscr as the
 * last word (offset 12) within that quadword.  Quadword 33 contains the
 * vrsave as the first word (offset 0) within the quadword.
 *
 * This definition of the VMX state is compatible with the current PPC32
 * ptrace interface.  This allows signal handling and ptrace to use the
 * same structures.  This also simplifies the implementation of a bi-arch
 * (combined (32- and 64-bit) gdb.
 */

428 429 430 431 432 433 434 435 436 437 438 439 440 441 442
static int vr_active(struct task_struct *target,
		     const struct user_regset *regset)
{
	flush_altivec_to_thread(target);
	return target->thread.used_vr ? regset->n : 0;
}

static int vr_get(struct task_struct *target, const struct user_regset *regset,
		  unsigned int pos, unsigned int count,
		  void *kbuf, void __user *ubuf)
{
	int ret;

	flush_altivec_to_thread(target);

443 444
	BUILD_BUG_ON(offsetof(struct thread_vr_state, vscr) !=
		     offsetof(struct thread_vr_state, vr[32]));
445 446

	ret = user_regset_copyout(&pos, &count, &kbuf, &ubuf,
447
				  &target->thread.vr_state, 0,
448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473
				  33 * sizeof(vector128));
	if (!ret) {
		/*
		 * Copy out only the low-order word of vrsave.
		 */
		union {
			elf_vrreg_t reg;
			u32 word;
		} vrsave;
		memset(&vrsave, 0, sizeof(vrsave));
		vrsave.word = target->thread.vrsave;
		ret = user_regset_copyout(&pos, &count, &kbuf, &ubuf, &vrsave,
					  33 * sizeof(vector128), -1);
	}

	return ret;
}

static int vr_set(struct task_struct *target, const struct user_regset *regset,
		  unsigned int pos, unsigned int count,
		  const void *kbuf, const void __user *ubuf)
{
	int ret;

	flush_altivec_to_thread(target);

474 475
	BUILD_BUG_ON(offsetof(struct thread_vr_state, vscr) !=
		     offsetof(struct thread_vr_state, vr[32]));
476 477

	ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf,
478 479
				 &target->thread.vr_state, 0,
				 33 * sizeof(vector128));
480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497
	if (!ret && count > 0) {
		/*
		 * We use only the first word of vrsave.
		 */
		union {
			elf_vrreg_t reg;
			u32 word;
		} vrsave;
		memset(&vrsave, 0, sizeof(vrsave));
		vrsave.word = target->thread.vrsave;
		ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf, &vrsave,
					 33 * sizeof(vector128), -1);
		if (!ret)
			target->thread.vrsave = vrsave.word;
	}

	return ret;
}
498 499
#endif /* CONFIG_ALTIVEC */

500 501 502
#ifdef CONFIG_VSX
/*
 * Currently to set and and get all the vsx state, you need to call
L
Lucas De Marchi 已提交
503
 * the fp and VMX calls as well.  This only get/sets the lower 32
504 505 506 507 508 509 510 511 512 513 514 515 516 517
 * 128bit VSX registers.
 */

static int vsr_active(struct task_struct *target,
		      const struct user_regset *regset)
{
	flush_vsx_to_thread(target);
	return target->thread.used_vsr ? regset->n : 0;
}

static int vsr_get(struct task_struct *target, const struct user_regset *regset,
		   unsigned int pos, unsigned int count,
		   void *kbuf, void __user *ubuf)
{
518
	u64 buf[32];
519
	int ret, i;
520 521 522

	flush_vsx_to_thread(target);

523
	for (i = 0; i < 32 ; i++)
524
		buf[i] = target->thread.fp_state.fpr[i][TS_VSRLOWOFFSET];
525
	ret = user_regset_copyout(&pos, &count, &kbuf, &ubuf,
526
				  buf, 0, 32 * sizeof(double));
527 528 529 530 531 532 533 534

	return ret;
}

static int vsr_set(struct task_struct *target, const struct user_regset *regset,
		   unsigned int pos, unsigned int count,
		   const void *kbuf, const void __user *ubuf)
{
535
	u64 buf[32];
536
	int ret,i;
537 538 539 540

	flush_vsx_to_thread(target);

	ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf,
541 542
				 buf, 0, 32 * sizeof(double));
	for (i = 0; i < 32 ; i++)
543
		target->thread.fp_state.fpr[i][TS_VSRLOWOFFSET] = buf[i];
544

545 546 547 548 549

	return ret;
}
#endif /* CONFIG_VSX */

550 551 552 553 554 555 556 557 558 559 560 561
#ifdef CONFIG_SPE

/*
 * For get_evrregs/set_evrregs functions 'data' has the following layout:
 *
 * struct {
 *   u32 evr[32];
 *   u64 acc;
 *   u32 spefscr;
 * }
 */

562 563
static int evr_active(struct task_struct *target,
		      const struct user_regset *regset)
564
{
565 566 567
	flush_spe_to_thread(target);
	return target->thread.used_spe ? regset->n : 0;
}
568

569 570 571 572 573
static int evr_get(struct task_struct *target, const struct user_regset *regset,
		   unsigned int pos, unsigned int count,
		   void *kbuf, void __user *ubuf)
{
	int ret;
574

575
	flush_spe_to_thread(target);
576

577 578 579
	ret = user_regset_copyout(&pos, &count, &kbuf, &ubuf,
				  &target->thread.evr,
				  0, sizeof(target->thread.evr));
580

581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602
	BUILD_BUG_ON(offsetof(struct thread_struct, acc) + sizeof(u64) !=
		     offsetof(struct thread_struct, spefscr));

	if (!ret)
		ret = user_regset_copyout(&pos, &count, &kbuf, &ubuf,
					  &target->thread.acc,
					  sizeof(target->thread.evr), -1);

	return ret;
}

static int evr_set(struct task_struct *target, const struct user_regset *regset,
		   unsigned int pos, unsigned int count,
		   const void *kbuf, const void __user *ubuf)
{
	int ret;

	flush_spe_to_thread(target);

	ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf,
				 &target->thread.evr,
				 0, sizeof(target->thread.evr));
603

604 605 606 607 608 609 610 611 612
	BUILD_BUG_ON(offsetof(struct thread_struct, acc) + sizeof(u64) !=
		     offsetof(struct thread_struct, spefscr));

	if (!ret)
		ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf,
					 &target->thread.acc,
					 sizeof(target->thread.evr), -1);

	return ret;
613 614 615 616
}
#endif /* CONFIG_SPE */


617 618 619 620 621 622 623 624 625
/*
 * These are our native regset flavors.
 */
enum powerpc_regset {
	REGSET_GPR,
	REGSET_FPR,
#ifdef CONFIG_ALTIVEC
	REGSET_VMX,
#endif
626 627 628
#ifdef CONFIG_VSX
	REGSET_VSX,
#endif
629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651
#ifdef CONFIG_SPE
	REGSET_SPE,
#endif
};

static const struct user_regset native_regsets[] = {
	[REGSET_GPR] = {
		.core_note_type = NT_PRSTATUS, .n = ELF_NGREG,
		.size = sizeof(long), .align = sizeof(long),
		.get = gpr_get, .set = gpr_set
	},
	[REGSET_FPR] = {
		.core_note_type = NT_PRFPREG, .n = ELF_NFPREG,
		.size = sizeof(double), .align = sizeof(double),
		.get = fpr_get, .set = fpr_set
	},
#ifdef CONFIG_ALTIVEC
	[REGSET_VMX] = {
		.core_note_type = NT_PPC_VMX, .n = 34,
		.size = sizeof(vector128), .align = sizeof(vector128),
		.active = vr_active, .get = vr_get, .set = vr_set
	},
#endif
652 653
#ifdef CONFIG_VSX
	[REGSET_VSX] = {
654 655
		.core_note_type = NT_PPC_VSX, .n = 32,
		.size = sizeof(double), .align = sizeof(double),
656 657 658
		.active = vsr_active, .get = vsr_get, .set = vsr_set
	},
#endif
659 660 661 662 663 664 665 666 667 668 669 670 671 672
#ifdef CONFIG_SPE
	[REGSET_SPE] = {
		.n = 35,
		.size = sizeof(u32), .align = sizeof(u32),
		.active = evr_active, .get = evr_get, .set = evr_set
	},
#endif
};

static const struct user_regset_view user_ppc_native_view = {
	.name = UTS_MACHINE, .e_machine = ELF_ARCH, .ei_osabi = ELF_OSABI,
	.regsets = native_regsets, .n = ARRAY_SIZE(native_regsets)
};

673 674 675 676 677 678 679 680 681 682 683 684
#ifdef CONFIG_PPC64
#include <linux/compat.h>

static int gpr32_get(struct task_struct *target,
		     const struct user_regset *regset,
		     unsigned int pos, unsigned int count,
		     void *kbuf, void __user *ubuf)
{
	const unsigned long *regs = &target->thread.regs->gpr[0];
	compat_ulong_t *k = kbuf;
	compat_ulong_t __user *u = ubuf;
	compat_ulong_t reg;
685
	int i;
686 687 688 689

	if (target->thread.regs == NULL)
		return -EIO;

690 691 692 693 694
	if (!FULL_REGS(target->thread.regs)) {
		/* We have a partial register set.  Fill 14-31 with bogus values */
		for (i = 14; i < 32; i++)
			target->thread.regs->gpr[i] = NV_REG_POISON; 
	}
695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771

	pos /= sizeof(reg);
	count /= sizeof(reg);

	if (kbuf)
		for (; count > 0 && pos < PT_MSR; --count)
			*k++ = regs[pos++];
	else
		for (; count > 0 && pos < PT_MSR; --count)
			if (__put_user((compat_ulong_t) regs[pos++], u++))
				return -EFAULT;

	if (count > 0 && pos == PT_MSR) {
		reg = get_user_msr(target);
		if (kbuf)
			*k++ = reg;
		else if (__put_user(reg, u++))
			return -EFAULT;
		++pos;
		--count;
	}

	if (kbuf)
		for (; count > 0 && pos < PT_REGS_COUNT; --count)
			*k++ = regs[pos++];
	else
		for (; count > 0 && pos < PT_REGS_COUNT; --count)
			if (__put_user((compat_ulong_t) regs[pos++], u++))
				return -EFAULT;

	kbuf = k;
	ubuf = u;
	pos *= sizeof(reg);
	count *= sizeof(reg);
	return user_regset_copyout_zero(&pos, &count, &kbuf, &ubuf,
					PT_REGS_COUNT * sizeof(reg), -1);
}

static int gpr32_set(struct task_struct *target,
		     const struct user_regset *regset,
		     unsigned int pos, unsigned int count,
		     const void *kbuf, const void __user *ubuf)
{
	unsigned long *regs = &target->thread.regs->gpr[0];
	const compat_ulong_t *k = kbuf;
	const compat_ulong_t __user *u = ubuf;
	compat_ulong_t reg;

	if (target->thread.regs == NULL)
		return -EIO;

	CHECK_FULL_REGS(target->thread.regs);

	pos /= sizeof(reg);
	count /= sizeof(reg);

	if (kbuf)
		for (; count > 0 && pos < PT_MSR; --count)
			regs[pos++] = *k++;
	else
		for (; count > 0 && pos < PT_MSR; --count) {
			if (__get_user(reg, u++))
				return -EFAULT;
			regs[pos++] = reg;
		}


	if (count > 0 && pos == PT_MSR) {
		if (kbuf)
			reg = *k++;
		else if (__get_user(reg, u++))
			return -EFAULT;
		set_user_msr(target, reg);
		++pos;
		--count;
	}

772
	if (kbuf) {
773 774
		for (; count > 0 && pos <= PT_MAX_PUT_REG; --count)
			regs[pos++] = *k++;
775 776 777
		for (; count > 0 && pos < PT_TRAP; --count, ++pos)
			++k;
	} else {
778 779 780 781 782
		for (; count > 0 && pos <= PT_MAX_PUT_REG; --count) {
			if (__get_user(reg, u++))
				return -EFAULT;
			regs[pos++] = reg;
		}
783 784 785 786
		for (; count > 0 && pos < PT_TRAP; --count, ++pos)
			if (__get_user(reg, u++))
				return -EFAULT;
	}
787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828

	if (count > 0 && pos == PT_TRAP) {
		if (kbuf)
			reg = *k++;
		else if (__get_user(reg, u++))
			return -EFAULT;
		set_user_trap(target, reg);
		++pos;
		--count;
	}

	kbuf = k;
	ubuf = u;
	pos *= sizeof(reg);
	count *= sizeof(reg);
	return user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf,
					 (PT_TRAP + 1) * sizeof(reg), -1);
}

/*
 * These are the regset flavors matching the CONFIG_PPC32 native set.
 */
static const struct user_regset compat_regsets[] = {
	[REGSET_GPR] = {
		.core_note_type = NT_PRSTATUS, .n = ELF_NGREG,
		.size = sizeof(compat_long_t), .align = sizeof(compat_long_t),
		.get = gpr32_get, .set = gpr32_set
	},
	[REGSET_FPR] = {
		.core_note_type = NT_PRFPREG, .n = ELF_NFPREG,
		.size = sizeof(double), .align = sizeof(double),
		.get = fpr_get, .set = fpr_set
	},
#ifdef CONFIG_ALTIVEC
	[REGSET_VMX] = {
		.core_note_type = NT_PPC_VMX, .n = 34,
		.size = sizeof(vector128), .align = sizeof(vector128),
		.active = vr_active, .get = vr_get, .set = vr_set
	},
#endif
#ifdef CONFIG_SPE
	[REGSET_SPE] = {
829
		.core_note_type = NT_PPC_SPE, .n = 35,
830 831 832 833 834 835 836 837 838 839 840 841
		.size = sizeof(u32), .align = sizeof(u32),
		.active = evr_active, .get = evr_get, .set = evr_set
	},
#endif
};

static const struct user_regset_view user_ppc_compat_view = {
	.name = "ppc", .e_machine = EM_PPC, .ei_osabi = ELF_OSABI,
	.regsets = compat_regsets, .n = ARRAY_SIZE(compat_regsets)
};
#endif	/* CONFIG_PPC64 */

842 843
const struct user_regset_view *task_user_regset_view(struct task_struct *task)
{
844 845 846 847
#ifdef CONFIG_PPC64
	if (test_tsk_thread_flag(task, TIF_32BIT))
		return &user_ppc_compat_view;
#endif
848 849 850 851
	return &user_ppc_native_view;
}


R
Roland McGrath 已提交
852
void user_enable_single_step(struct task_struct *task)
853 854 855 856
{
	struct pt_regs *regs = task->thread.regs;

	if (regs != NULL) {
857
#ifdef CONFIG_PPC_ADV_DEBUG_REGS
858 859
		task->thread.debug.dbcr0 &= ~DBCR0_BT;
		task->thread.debug.dbcr0 |= DBCR0_IDM | DBCR0_IC;
860 861
		regs->msr |= MSR_DE;
#else
862
		regs->msr &= ~MSR_BE;
863 864 865 866 867 868
		regs->msr |= MSR_SE;
#endif
	}
	set_tsk_thread_flag(task, TIF_SINGLESTEP);
}

869 870 871 872 873
void user_enable_block_step(struct task_struct *task)
{
	struct pt_regs *regs = task->thread.regs;

	if (regs != NULL) {
874
#ifdef CONFIG_PPC_ADV_DEBUG_REGS
875 876
		task->thread.debug.dbcr0 &= ~DBCR0_IC;
		task->thread.debug.dbcr0 = DBCR0_IDM | DBCR0_BT;
877 878 879 880 881 882 883 884 885
		regs->msr |= MSR_DE;
#else
		regs->msr &= ~MSR_SE;
		regs->msr |= MSR_BE;
#endif
	}
	set_tsk_thread_flag(task, TIF_SINGLESTEP);
}

R
Roland McGrath 已提交
886
void user_disable_single_step(struct task_struct *task)
887 888 889 890
{
	struct pt_regs *regs = task->thread.regs;

	if (regs != NULL) {
891
#ifdef CONFIG_PPC_ADV_DEBUG_REGS
892 893 894 895 896 897
		/*
		 * The logic to disable single stepping should be as
		 * simple as turning off the Instruction Complete flag.
		 * And, after doing so, if all debug flags are off, turn
		 * off DBCR0(IDM) and MSR(DE) .... Torez
		 */
898
		task->thread.debug.dbcr0 &= ~(DBCR0_IC|DBCR0_BT);
899 900 901
		/*
		 * Test to see if any of the DBCR_ACTIVE_EVENTS bits are set.
		 */
902 903
		if (!DBCR_ACTIVE_EVENTS(task->thread.debug.dbcr0,
					task->thread.debug.dbcr1)) {
904 905 906
			/*
			 * All debug events were off.....
			 */
907
			task->thread.debug.dbcr0 &= ~DBCR0_IDM;
908 909
			regs->msr &= ~MSR_DE;
		}
910
#else
911
		regs->msr &= ~(MSR_SE | MSR_BE);
912 913 914 915 916
#endif
	}
	clear_tsk_thread_flag(task, TIF_SINGLESTEP);
}

917
#ifdef CONFIG_HAVE_HW_BREAKPOINT
918
void ptrace_triggered(struct perf_event *bp,
919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934
		      struct perf_sample_data *data, struct pt_regs *regs)
{
	struct perf_event_attr attr;

	/*
	 * Disable the breakpoint request here since ptrace has defined a
	 * one-shot behaviour for breakpoint exceptions in PPC64.
	 * The SIGTRAP signal is generated automatically for us in do_dabr().
	 * We don't have to do anything about that here
	 */
	attr = bp->attr;
	attr.disabled = true;
	modify_user_hw_breakpoint(bp, &attr);
}
#endif /* CONFIG_HAVE_HW_BREAKPOINT */

935
int ptrace_set_debugreg(struct task_struct *task, unsigned long addr,
936 937
			       unsigned long data)
{
938 939 940 941 942 943
#ifdef CONFIG_HAVE_HW_BREAKPOINT
	int ret;
	struct thread_struct *thread = &(task->thread);
	struct perf_event *bp;
	struct perf_event_attr attr;
#endif /* CONFIG_HAVE_HW_BREAKPOINT */
944 945 946
#ifndef CONFIG_PPC_ADV_DEBUG_REGS
	struct arch_hw_breakpoint hw_brk;
#endif
947

948 949 950 951
	/* For ppc64 we support one DABR and no IABR's at the moment (ppc64).
	 *  For embedded processors we support one DAC and no IAC's at the
	 *  moment.
	 */
952 953 954
	if (addr > 0)
		return -EINVAL;

955
	/* The bottom 3 bits in dabr are flags */
956 957 958
	if ((data & ~0x7UL) >= TASK_SIZE)
		return -EIO;

959
#ifndef CONFIG_PPC_ADV_DEBUG_REGS
960 961 962 963 964 965 966 967 968 969 970 971 972
	/* For processors using DABR (i.e. 970), the bottom 3 bits are flags.
	 *  It was assumed, on previous implementations, that 3 bits were
	 *  passed together with the data address, fitting the design of the
	 *  DABR register, as follows:
	 *
	 *  bit 0: Read flag
	 *  bit 1: Write flag
	 *  bit 2: Breakpoint translation
	 *
	 *  Thus, we use them here as so.
	 */

	/* Ensure breakpoint translation bit is set */
973
	if (data && !(data & HW_BRK_TYPE_TRANSLATE))
974
		return -EIO;
975 976 977
	hw_brk.address = data & (~HW_BRK_TYPE_DABR);
	hw_brk.type = (data & HW_BRK_TYPE_DABR) | HW_BRK_TYPE_PRIV_ALL;
	hw_brk.len = 8;
978 979
#ifdef CONFIG_HAVE_HW_BREAKPOINT
	bp = thread->ptrace_bps[0];
980
	if ((!data) || !(hw_brk.type & HW_BRK_TYPE_RDWR)) {
981 982 983 984 985 986 987 988
		if (bp) {
			unregister_hw_breakpoint(bp);
			thread->ptrace_bps[0] = NULL;
		}
		return 0;
	}
	if (bp) {
		attr = bp->attr;
989 990
		attr.bp_addr = hw_brk.address;
		arch_bp_generic_fields(hw_brk.type, &attr.bp_type);
991 992 993 994

		/* Enable breakpoint */
		attr.disabled = false;

995
		ret =  modify_user_hw_breakpoint(bp, &attr);
996
		if (ret) {
997
			return ret;
998
		}
999
		thread->ptrace_bps[0] = bp;
1000
		thread->hw_brk = hw_brk;
1001 1002 1003 1004 1005
		return 0;
	}

	/* Create a new breakpoint request if one doesn't exist already */
	hw_breakpoint_init(&attr);
1006 1007 1008
	attr.bp_addr = hw_brk.address;
	arch_bp_generic_fields(hw_brk.type,
			       &attr.bp_type);
1009 1010

	thread->ptrace_bps[0] = bp = register_user_hw_breakpoint(&attr,
1011
					       ptrace_triggered, NULL, task);
1012 1013 1014 1015 1016 1017
	if (IS_ERR(bp)) {
		thread->ptrace_bps[0] = NULL;
		return PTR_ERR(bp);
	}

#endif /* CONFIG_HAVE_HW_BREAKPOINT */
1018
	task->thread.hw_brk = hw_brk;
1019
#else /* CONFIG_PPC_ADV_DEBUG_REGS */
1020 1021 1022 1023 1024 1025
	/* As described above, it was assumed 3 bits were passed with the data
	 *  address, but we will assume only the mode bits will be passed
	 *  as to not cause alignment restrictions for DAC-based processors.
	 */

	/* DAC's hold the whole address without any mode flags */
1026
	task->thread.debug.dac1 = data & ~0x3UL;
1027

1028
	if (task->thread.debug.dac1 == 0) {
1029
		dbcr_dac(task) &= ~(DBCR_DAC1R | DBCR_DAC1W);
1030 1031
		if (!DBCR_ACTIVE_EVENTS(task->thread.debug.dbcr0,
					task->thread.debug.dbcr1)) {
1032
			task->thread.regs->msr &= ~MSR_DE;
1033
			task->thread.debug.dbcr0 &= ~DBCR0_IDM;
1034
		}
1035 1036 1037 1038 1039 1040 1041 1042 1043 1044
		return 0;
	}

	/* Read or Write bits must be set */

	if (!(data & 0x3UL))
		return -EINVAL;

	/* Set the Internal Debugging flag (IDM bit 1) for the DBCR0
	   register */
1045
	task->thread.debug.dbcr0 |= DBCR0_IDM;
1046 1047 1048

	/* Check for write and read flags and set DBCR0
	   accordingly */
1049
	dbcr_dac(task) &= ~(DBCR_DAC1R|DBCR_DAC1W);
1050
	if (data & 0x1UL)
1051
		dbcr_dac(task) |= DBCR_DAC1R;
1052
	if (data & 0x2UL)
1053
		dbcr_dac(task) |= DBCR_DAC1W;
1054
	task->thread.regs->msr |= MSR_DE;
1055
#endif /* CONFIG_PPC_ADV_DEBUG_REGS */
1056 1057 1058
	return 0;
}

L
Linus Torvalds 已提交
1059 1060 1061 1062 1063 1064 1065 1066
/*
 * Called by kernel/ptrace.c when detaching..
 *
 * Make sure single step bits etc are not set.
 */
void ptrace_disable(struct task_struct *child)
{
	/* make sure the single step bit is not set. */
R
Roland McGrath 已提交
1067
	user_disable_single_step(child);
L
Linus Torvalds 已提交
1068 1069
}

1070
#ifdef CONFIG_PPC_ADV_DEBUG_REGS
1071
static long set_instruction_bp(struct task_struct *child,
1072 1073 1074
			      struct ppc_hw_breakpoint *bp_info)
{
	int slot;
1075 1076 1077 1078
	int slot1_in_use = ((child->thread.debug.dbcr0 & DBCR0_IAC1) != 0);
	int slot2_in_use = ((child->thread.debug.dbcr0 & DBCR0_IAC2) != 0);
	int slot3_in_use = ((child->thread.debug.dbcr0 & DBCR0_IAC3) != 0);
	int slot4_in_use = ((child->thread.debug.dbcr0 & DBCR0_IAC4) != 0);
1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096

	if (dbcr_iac_range(child) & DBCR_IAC12MODE)
		slot2_in_use = 1;
	if (dbcr_iac_range(child) & DBCR_IAC34MODE)
		slot4_in_use = 1;

	if (bp_info->addr >= TASK_SIZE)
		return -EIO;

	if (bp_info->addr_mode != PPC_BREAKPOINT_MODE_EXACT) {

		/* Make sure range is valid. */
		if (bp_info->addr2 >= TASK_SIZE)
			return -EIO;

		/* We need a pair of IAC regsisters */
		if ((!slot1_in_use) && (!slot2_in_use)) {
			slot = 1;
1097 1098 1099
			child->thread.debug.iac1 = bp_info->addr;
			child->thread.debug.iac2 = bp_info->addr2;
			child->thread.debug.dbcr0 |= DBCR0_IAC1;
1100 1101 1102 1103 1104 1105 1106 1107
			if (bp_info->addr_mode ==
					PPC_BREAKPOINT_MODE_RANGE_EXCLUSIVE)
				dbcr_iac_range(child) |= DBCR_IAC12X;
			else
				dbcr_iac_range(child) |= DBCR_IAC12I;
#if CONFIG_PPC_ADV_DEBUG_IACS > 2
		} else if ((!slot3_in_use) && (!slot4_in_use)) {
			slot = 3;
1108 1109 1110
			child->thread.debug.iac3 = bp_info->addr;
			child->thread.debug.iac4 = bp_info->addr2;
			child->thread.debug.dbcr0 |= DBCR0_IAC3;
1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129
			if (bp_info->addr_mode ==
					PPC_BREAKPOINT_MODE_RANGE_EXCLUSIVE)
				dbcr_iac_range(child) |= DBCR_IAC34X;
			else
				dbcr_iac_range(child) |= DBCR_IAC34I;
#endif
		} else
			return -ENOSPC;
	} else {
		/* We only need one.  If possible leave a pair free in
		 * case a range is needed later
		 */
		if (!slot1_in_use) {
			/*
			 * Don't use iac1 if iac1-iac2 are free and either
			 * iac3 or iac4 (but not both) are free
			 */
			if (slot2_in_use || (slot3_in_use == slot4_in_use)) {
				slot = 1;
1130 1131
				child->thread.debug.iac1 = bp_info->addr;
				child->thread.debug.dbcr0 |= DBCR0_IAC1;
1132 1133 1134 1135 1136
				goto out;
			}
		}
		if (!slot2_in_use) {
			slot = 2;
1137 1138
			child->thread.debug.iac2 = bp_info->addr;
			child->thread.debug.dbcr0 |= DBCR0_IAC2;
1139 1140 1141
#if CONFIG_PPC_ADV_DEBUG_IACS > 2
		} else if (!slot3_in_use) {
			slot = 3;
1142 1143
			child->thread.debug.iac3 = bp_info->addr;
			child->thread.debug.dbcr0 |= DBCR0_IAC3;
1144 1145
		} else if (!slot4_in_use) {
			slot = 4;
1146 1147
			child->thread.debug.iac4 = bp_info->addr;
			child->thread.debug.dbcr0 |= DBCR0_IAC4;
1148 1149 1150 1151 1152
#endif
		} else
			return -ENOSPC;
	}
out:
1153
	child->thread.debug.dbcr0 |= DBCR0_IDM;
1154 1155 1156 1157 1158 1159 1160 1161 1162
	child->thread.regs->msr |= MSR_DE;

	return slot;
}

static int del_instruction_bp(struct task_struct *child, int slot)
{
	switch (slot) {
	case 1:
1163
		if ((child->thread.debug.dbcr0 & DBCR0_IAC1) == 0)
1164 1165 1166 1167
			return -ENOENT;

		if (dbcr_iac_range(child) & DBCR_IAC12MODE) {
			/* address range - clear slots 1 & 2 */
1168
			child->thread.debug.iac2 = 0;
1169 1170
			dbcr_iac_range(child) &= ~DBCR_IAC12MODE;
		}
1171 1172
		child->thread.debug.iac1 = 0;
		child->thread.debug.dbcr0 &= ~DBCR0_IAC1;
1173 1174
		break;
	case 2:
1175
		if ((child->thread.debug.dbcr0 & DBCR0_IAC2) == 0)
1176 1177 1178 1179 1180
			return -ENOENT;

		if (dbcr_iac_range(child) & DBCR_IAC12MODE)
			/* used in a range */
			return -EINVAL;
1181 1182
		child->thread.debug.iac2 = 0;
		child->thread.debug.dbcr0 &= ~DBCR0_IAC2;
1183 1184 1185
		break;
#if CONFIG_PPC_ADV_DEBUG_IACS > 2
	case 3:
1186
		if ((child->thread.debug.dbcr0 & DBCR0_IAC3) == 0)
1187 1188 1189 1190
			return -ENOENT;

		if (dbcr_iac_range(child) & DBCR_IAC34MODE) {
			/* address range - clear slots 3 & 4 */
1191
			child->thread.debug.iac4 = 0;
1192 1193
			dbcr_iac_range(child) &= ~DBCR_IAC34MODE;
		}
1194 1195
		child->thread.debug.iac3 = 0;
		child->thread.debug.dbcr0 &= ~DBCR0_IAC3;
1196 1197
		break;
	case 4:
1198
		if ((child->thread.debug.dbcr0 & DBCR0_IAC4) == 0)
1199 1200 1201 1202 1203
			return -ENOENT;

		if (dbcr_iac_range(child) & DBCR_IAC34MODE)
			/* Used in a range */
			return -EINVAL;
1204 1205
		child->thread.debug.iac4 = 0;
		child->thread.debug.dbcr0 &= ~DBCR0_IAC4;
1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234
		break;
#endif
	default:
		return -EINVAL;
	}
	return 0;
}

static int set_dac(struct task_struct *child, struct ppc_hw_breakpoint *bp_info)
{
	int byte_enable =
		(bp_info->condition_mode >> PPC_BREAKPOINT_CONDITION_BE_SHIFT)
		& 0xf;
	int condition_mode =
		bp_info->condition_mode & PPC_BREAKPOINT_CONDITION_MODE;
	int slot;

	if (byte_enable && (condition_mode == 0))
		return -EINVAL;

	if (bp_info->addr >= TASK_SIZE)
		return -EIO;

	if ((dbcr_dac(child) & (DBCR_DAC1R | DBCR_DAC1W)) == 0) {
		slot = 1;
		if (bp_info->trigger_type & PPC_BREAKPOINT_TRIGGER_READ)
			dbcr_dac(child) |= DBCR_DAC1R;
		if (bp_info->trigger_type & PPC_BREAKPOINT_TRIGGER_WRITE)
			dbcr_dac(child) |= DBCR_DAC1W;
1235
		child->thread.debug.dac1 = (unsigned long)bp_info->addr;
1236 1237
#if CONFIG_PPC_ADV_DEBUG_DVCS > 0
		if (byte_enable) {
1238
			child->thread.debug.dvc1 =
1239
				(unsigned long)bp_info->condition_value;
1240
			child->thread.debug.dbcr2 |=
1241 1242 1243 1244 1245
				((byte_enable << DBCR2_DVC1BE_SHIFT) |
				 (condition_mode << DBCR2_DVC1M_SHIFT));
		}
#endif
#ifdef CONFIG_PPC_ADV_DEBUG_DAC_RANGE
1246
	} else if (child->thread.debug.dbcr2 & DBCR2_DAC12MODE) {
1247 1248 1249 1250 1251 1252 1253 1254 1255
		/* Both dac1 and dac2 are part of a range */
		return -ENOSPC;
#endif
	} else if ((dbcr_dac(child) & (DBCR_DAC2R | DBCR_DAC2W)) == 0) {
		slot = 2;
		if (bp_info->trigger_type & PPC_BREAKPOINT_TRIGGER_READ)
			dbcr_dac(child) |= DBCR_DAC2R;
		if (bp_info->trigger_type & PPC_BREAKPOINT_TRIGGER_WRITE)
			dbcr_dac(child) |= DBCR_DAC2W;
1256
		child->thread.debug.dac2 = (unsigned long)bp_info->addr;
1257 1258
#if CONFIG_PPC_ADV_DEBUG_DVCS > 0
		if (byte_enable) {
1259
			child->thread.debug.dvc2 =
1260
				(unsigned long)bp_info->condition_value;
1261
			child->thread.debug.dbcr2 |=
1262 1263 1264 1265 1266 1267
				((byte_enable << DBCR2_DVC2BE_SHIFT) |
				 (condition_mode << DBCR2_DVC2M_SHIFT));
		}
#endif
	} else
		return -ENOSPC;
1268
	child->thread.debug.dbcr0 |= DBCR0_IDM;
1269 1270 1271 1272 1273 1274 1275 1276
	child->thread.regs->msr |= MSR_DE;

	return slot + 4;
}

static int del_dac(struct task_struct *child, int slot)
{
	if (slot == 1) {
1277
		if ((dbcr_dac(child) & (DBCR_DAC1R | DBCR_DAC1W)) == 0)
1278 1279
			return -ENOENT;

1280
		child->thread.debug.dac1 = 0;
1281 1282
		dbcr_dac(child) &= ~(DBCR_DAC1R | DBCR_DAC1W);
#ifdef CONFIG_PPC_ADV_DEBUG_DAC_RANGE
1283 1284 1285
		if (child->thread.debug.dbcr2 & DBCR2_DAC12MODE) {
			child->thread.debug.dac2 = 0;
			child->thread.debug.dbcr2 &= ~DBCR2_DAC12MODE;
1286
		}
1287
		child->thread.debug.dbcr2 &= ~(DBCR2_DVC1M | DBCR2_DVC1BE);
1288 1289
#endif
#if CONFIG_PPC_ADV_DEBUG_DVCS > 0
1290
		child->thread.debug.dvc1 = 0;
1291 1292
#endif
	} else if (slot == 2) {
1293
		if ((dbcr_dac(child) & (DBCR_DAC2R | DBCR_DAC2W)) == 0)
1294 1295 1296
			return -ENOENT;

#ifdef CONFIG_PPC_ADV_DEBUG_DAC_RANGE
1297
		if (child->thread.debug.dbcr2 & DBCR2_DAC12MODE)
1298 1299
			/* Part of a range */
			return -EINVAL;
1300
		child->thread.debug.dbcr2 &= ~(DBCR2_DVC2M | DBCR2_DVC2BE);
1301 1302
#endif
#if CONFIG_PPC_ADV_DEBUG_DVCS > 0
1303
		child->thread.debug.dvc2 = 0;
1304
#endif
1305
		child->thread.debug.dac2 = 0;
1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346
		dbcr_dac(child) &= ~(DBCR_DAC2R | DBCR_DAC2W);
	} else
		return -EINVAL;

	return 0;
}
#endif /* CONFIG_PPC_ADV_DEBUG_REGS */

#ifdef CONFIG_PPC_ADV_DEBUG_DAC_RANGE
static int set_dac_range(struct task_struct *child,
			 struct ppc_hw_breakpoint *bp_info)
{
	int mode = bp_info->addr_mode & PPC_BREAKPOINT_MODE_MASK;

	/* We don't allow range watchpoints to be used with DVC */
	if (bp_info->condition_mode)
		return -EINVAL;

	/*
	 * Best effort to verify the address range.  The user/supervisor bits
	 * prevent trapping in kernel space, but let's fail on an obvious bad
	 * range.  The simple test on the mask is not fool-proof, and any
	 * exclusive range will spill over into kernel space.
	 */
	if (bp_info->addr >= TASK_SIZE)
		return -EIO;
	if (mode == PPC_BREAKPOINT_MODE_MASK) {
		/*
		 * dac2 is a bitmask.  Don't allow a mask that makes a
		 * kernel space address from a valid dac1 value
		 */
		if (~((unsigned long)bp_info->addr2) >= TASK_SIZE)
			return -EIO;
	} else {
		/*
		 * For range breakpoints, addr2 must also be a valid address
		 */
		if (bp_info->addr2 >= TASK_SIZE)
			return -EIO;
	}

1347
	if (child->thread.debug.dbcr0 &
1348 1349 1350 1351
	    (DBCR0_DAC1R | DBCR0_DAC1W | DBCR0_DAC2R | DBCR0_DAC2W))
		return -ENOSPC;

	if (bp_info->trigger_type & PPC_BREAKPOINT_TRIGGER_READ)
1352
		child->thread.debug.dbcr0 |= (DBCR0_DAC1R | DBCR0_IDM);
1353
	if (bp_info->trigger_type & PPC_BREAKPOINT_TRIGGER_WRITE)
1354 1355 1356
		child->thread.debug.dbcr0 |= (DBCR0_DAC1W | DBCR0_IDM);
	child->thread.debug.dac1 = bp_info->addr;
	child->thread.debug.dac2 = bp_info->addr2;
1357
	if (mode == PPC_BREAKPOINT_MODE_RANGE_INCLUSIVE)
1358
		child->thread.debug.dbcr2  |= DBCR2_DAC12M;
1359
	else if (mode == PPC_BREAKPOINT_MODE_RANGE_EXCLUSIVE)
1360
		child->thread.debug.dbcr2  |= DBCR2_DAC12MX;
1361
	else	/* PPC_BREAKPOINT_MODE_MASK */
1362
		child->thread.debug.dbcr2  |= DBCR2_DAC12MM;
1363 1364 1365 1366 1367 1368
	child->thread.regs->msr |= MSR_DE;

	return 5;
}
#endif /* CONFIG_PPC_ADV_DEBUG_DAC_RANGE */

1369 1370 1371
static long ppc_set_hwdebug(struct task_struct *child,
		     struct ppc_hw_breakpoint *bp_info)
{
1372 1373 1374 1375 1376 1377
#ifdef CONFIG_HAVE_HW_BREAKPOINT
	int len = 0;
	struct thread_struct *thread = &(child->thread);
	struct perf_event *bp;
	struct perf_event_attr attr;
#endif /* CONFIG_HAVE_HW_BREAKPOINT */
1378
#ifndef CONFIG_PPC_ADV_DEBUG_REGS
1379
	struct arch_hw_breakpoint brk;
1380 1381
#endif

1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404
	if (bp_info->version != 1)
		return -ENOTSUPP;
#ifdef CONFIG_PPC_ADV_DEBUG_REGS
	/*
	 * Check for invalid flags and combinations
	 */
	if ((bp_info->trigger_type == 0) ||
	    (bp_info->trigger_type & ~(PPC_BREAKPOINT_TRIGGER_EXECUTE |
				       PPC_BREAKPOINT_TRIGGER_RW)) ||
	    (bp_info->addr_mode & ~PPC_BREAKPOINT_MODE_MASK) ||
	    (bp_info->condition_mode &
	     ~(PPC_BREAKPOINT_CONDITION_MODE |
	       PPC_BREAKPOINT_CONDITION_BE_ALL)))
		return -EINVAL;
#if CONFIG_PPC_ADV_DEBUG_DVCS == 0
	if (bp_info->condition_mode != PPC_BREAKPOINT_CONDITION_NONE)
		return -EINVAL;
#endif

	if (bp_info->trigger_type & PPC_BREAKPOINT_TRIGGER_EXECUTE) {
		if ((bp_info->trigger_type != PPC_BREAKPOINT_TRIGGER_EXECUTE) ||
		    (bp_info->condition_mode != PPC_BREAKPOINT_CONDITION_NONE))
			return -EINVAL;
1405
		return set_instruction_bp(child, bp_info);
1406 1407 1408 1409 1410 1411 1412 1413 1414 1415
	}
	if (bp_info->addr_mode == PPC_BREAKPOINT_MODE_EXACT)
		return set_dac(child, bp_info);

#ifdef CONFIG_PPC_ADV_DEBUG_DAC_RANGE
	return set_dac_range(child, bp_info);
#else
	return -EINVAL;
#endif
#else /* !CONFIG_PPC_ADV_DEBUG_DVCS */
1416
	/*
1417
	 * We only support one data breakpoint
1418
	 */
1419 1420 1421
	if ((bp_info->trigger_type & PPC_BREAKPOINT_TRIGGER_RW) == 0 ||
	    (bp_info->trigger_type & ~PPC_BREAKPOINT_TRIGGER_RW) != 0 ||
	    bp_info->condition_mode != PPC_BREAKPOINT_CONDITION_NONE)
1422 1423 1424 1425 1426
		return -EINVAL;

	if ((unsigned long)bp_info->addr >= TASK_SIZE)
		return -EIO;

1427 1428
	brk.address = bp_info->addr & ~7UL;
	brk.type = HW_BRK_TYPE_TRANSLATE;
1429
	brk.len = 8;
1430
	if (bp_info->trigger_type & PPC_BREAKPOINT_TRIGGER_READ)
1431
		brk.type |= HW_BRK_TYPE_READ;
1432
	if (bp_info->trigger_type & PPC_BREAKPOINT_TRIGGER_WRITE)
1433
		brk.type |= HW_BRK_TYPE_WRITE;
1434 1435 1436 1437 1438
#ifdef CONFIG_HAVE_HW_BREAKPOINT
	/*
	 * Check if the request is for 'range' breakpoints. We can
	 * support it if range < 8 bytes.
	 */
1439
	if (bp_info->addr_mode == PPC_BREAKPOINT_MODE_RANGE_INCLUSIVE)
1440
		len = bp_info->addr2 - bp_info->addr;
1441
	else if (bp_info->addr_mode == PPC_BREAKPOINT_MODE_EXACT)
1442
		len = 1;
1443
	else
1444 1445
		return -EINVAL;
	bp = thread->ptrace_bps[0];
1446
	if (bp)
1447 1448 1449 1450 1451 1452
		return -ENOSPC;

	/* Create a new breakpoint request if one doesn't exist already */
	hw_breakpoint_init(&attr);
	attr.bp_addr = (unsigned long)bp_info->addr & ~HW_BREAKPOINT_ALIGN;
	attr.bp_len = len;
1453
	arch_bp_generic_fields(brk.type, &attr.bp_type);
1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467

	thread->ptrace_bps[0] = bp = register_user_hw_breakpoint(&attr,
					       ptrace_triggered, NULL, child);
	if (IS_ERR(bp)) {
		thread->ptrace_bps[0] = NULL;
		return PTR_ERR(bp);
	}

	return 1;
#endif /* CONFIG_HAVE_HW_BREAKPOINT */

	if (bp_info->addr_mode != PPC_BREAKPOINT_MODE_EXACT)
		return -EINVAL;

1468
	if (child->thread.hw_brk.address)
1469
		return -ENOSPC;
1470

1471
	child->thread.hw_brk = brk;
1472

1473
	return 1;
1474
#endif /* !CONFIG_PPC_ADV_DEBUG_DVCS */
1475 1476
}

1477
static long ppc_del_hwdebug(struct task_struct *child, long data)
1478
{
1479 1480 1481 1482 1483
#ifdef CONFIG_HAVE_HW_BREAKPOINT
	int ret = 0;
	struct thread_struct *thread = &(child->thread);
	struct perf_event *bp;
#endif /* CONFIG_HAVE_HW_BREAKPOINT */
1484 1485 1486 1487 1488 1489 1490 1491 1492
#ifdef CONFIG_PPC_ADV_DEBUG_REGS
	int rc;

	if (data <= 4)
		rc = del_instruction_bp(child, (int)data);
	else
		rc = del_dac(child, (int)data - 4);

	if (!rc) {
1493 1494 1495
		if (!DBCR_ACTIVE_EVENTS(child->thread.debug.dbcr0,
					child->thread.debug.dbcr1)) {
			child->thread.debug.dbcr0 &= ~DBCR0_IDM;
1496 1497 1498 1499 1500
			child->thread.regs->msr &= ~MSR_DE;
		}
	}
	return rc;
#else
1501 1502
	if (data != 1)
		return -EINVAL;
1503 1504 1505 1506 1507 1508 1509 1510 1511 1512

#ifdef CONFIG_HAVE_HW_BREAKPOINT
	bp = thread->ptrace_bps[0];
	if (bp) {
		unregister_hw_breakpoint(bp);
		thread->ptrace_bps[0] = NULL;
	} else
		ret = -ENOENT;
	return ret;
#else /* CONFIG_HAVE_HW_BREAKPOINT */
1513
	if (child->thread.hw_brk.address == 0)
1514 1515
		return -ENOENT;

1516 1517
	child->thread.hw_brk.address = 0;
	child->thread.hw_brk.type = 0;
1518
#endif /* CONFIG_HAVE_HW_BREAKPOINT */
1519

1520
	return 0;
1521
#endif
1522 1523
}

1524 1525
long arch_ptrace(struct task_struct *child, long request,
		 unsigned long addr, unsigned long data)
L
Linus Torvalds 已提交
1526 1527
{
	int ret = -EPERM;
1528 1529
	void __user *datavp = (void __user *) data;
	unsigned long __user *datalp = datavp;
L
Linus Torvalds 已提交
1530 1531 1532 1533 1534 1535 1536 1537

	switch (request) {
	/* read the word at location addr in the USER area. */
	case PTRACE_PEEKUSR: {
		unsigned long index, tmp;

		ret = -EIO;
		/* convert to index and check */
S
Stephen Rothwell 已提交
1538
#ifdef CONFIG_PPC32
1539
		index = addr >> 2;
S
Stephen Rothwell 已提交
1540 1541 1542
		if ((addr & 3) || (index > PT_FPSCR)
		    || (child->thread.regs == NULL))
#else
1543
		index = addr >> 3;
S
Stephen Rothwell 已提交
1544 1545
		if ((addr & 7) || (index > PT_FPSCR))
#endif
L
Linus Torvalds 已提交
1546 1547 1548 1549
			break;

		CHECK_FULL_REGS(child->thread.regs);
		if (index < PT_FPR0) {
1550 1551 1552
			ret = ptrace_get_reg(child, (int) index, &tmp);
			if (ret)
				break;
L
Linus Torvalds 已提交
1553
		} else {
1554 1555
			unsigned int fpidx = index - PT_FPR0;

S
Stephen Rothwell 已提交
1556
			flush_fp_to_thread(child);
1557
			if (fpidx < (PT_FPSCR - PT_FPR0))
1558
				memcpy(&tmp, &child->thread.fp_state.fpr,
1559
				       sizeof(long));
1560
			else
1561
				tmp = child->thread.fp_state.fpscr;
L
Linus Torvalds 已提交
1562
		}
1563
		ret = put_user(tmp, datalp);
L
Linus Torvalds 已提交
1564 1565 1566 1567 1568 1569 1570 1571 1572
		break;
	}

	/* write the word at location addr in the USER area */
	case PTRACE_POKEUSR: {
		unsigned long index;

		ret = -EIO;
		/* convert to index and check */
S
Stephen Rothwell 已提交
1573
#ifdef CONFIG_PPC32
1574
		index = addr >> 2;
S
Stephen Rothwell 已提交
1575 1576 1577
		if ((addr & 3) || (index > PT_FPSCR)
		    || (child->thread.regs == NULL))
#else
1578
		index = addr >> 3;
S
Stephen Rothwell 已提交
1579 1580
		if ((addr & 7) || (index > PT_FPSCR))
#endif
L
Linus Torvalds 已提交
1581 1582 1583 1584
			break;

		CHECK_FULL_REGS(child->thread.regs);
		if (index < PT_FPR0) {
1585
			ret = ptrace_put_reg(child, index, data);
L
Linus Torvalds 已提交
1586
		} else {
1587 1588
			unsigned int fpidx = index - PT_FPR0;

S
Stephen Rothwell 已提交
1589
			flush_fp_to_thread(child);
1590
			if (fpidx < (PT_FPSCR - PT_FPR0))
1591
				memcpy(&child->thread.fp_state.fpr, &data,
1592
				       sizeof(long));
1593
			else
1594
				child->thread.fp_state.fpscr = data;
L
Linus Torvalds 已提交
1595 1596 1597 1598 1599
			ret = 0;
		}
		break;
	}

1600 1601 1602 1603
	case PPC_PTRACE_GETHWDBGINFO: {
		struct ppc_debug_info dbginfo;

		dbginfo.version = 1;
1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617
#ifdef CONFIG_PPC_ADV_DEBUG_REGS
		dbginfo.num_instruction_bps = CONFIG_PPC_ADV_DEBUG_IACS;
		dbginfo.num_data_bps = CONFIG_PPC_ADV_DEBUG_DACS;
		dbginfo.num_condition_regs = CONFIG_PPC_ADV_DEBUG_DVCS;
		dbginfo.data_bp_alignment = 4;
		dbginfo.sizeof_condition = 4;
		dbginfo.features = PPC_DEBUG_FEATURE_INSN_BP_RANGE |
				   PPC_DEBUG_FEATURE_INSN_BP_MASK;
#ifdef CONFIG_PPC_ADV_DEBUG_DAC_RANGE
		dbginfo.features |=
				   PPC_DEBUG_FEATURE_DATA_BP_RANGE |
				   PPC_DEBUG_FEATURE_DATA_BP_MASK;
#endif
#else /* !CONFIG_PPC_ADV_DEBUG_REGS */
1618 1619 1620 1621 1622 1623 1624 1625 1626
		dbginfo.num_instruction_bps = 0;
		dbginfo.num_data_bps = 1;
		dbginfo.num_condition_regs = 0;
#ifdef CONFIG_PPC64
		dbginfo.data_bp_alignment = 8;
#else
		dbginfo.data_bp_alignment = 4;
#endif
		dbginfo.sizeof_condition = 0;
1627 1628
#ifdef CONFIG_HAVE_HW_BREAKPOINT
		dbginfo.features = PPC_DEBUG_FEATURE_DATA_BP_RANGE;
1629 1630
		if (cpu_has_feature(CPU_FTR_DAWR))
			dbginfo.features |= PPC_DEBUG_FEATURE_DATA_BP_DAWR;
1631
#else
1632
		dbginfo.features = 0;
1633
#endif /* CONFIG_HAVE_HW_BREAKPOINT */
1634
#endif /* CONFIG_PPC_ADV_DEBUG_REGS */
1635

1636
		if (!access_ok(VERIFY_WRITE, datavp,
1637 1638
			       sizeof(struct ppc_debug_info)))
			return -EFAULT;
1639 1640
		ret = __copy_to_user(datavp, &dbginfo,
				     sizeof(struct ppc_debug_info)) ?
1641 1642 1643 1644 1645 1646 1647
		      -EFAULT : 0;
		break;
	}

	case PPC_PTRACE_SETHWDEBUG: {
		struct ppc_hw_breakpoint bp_info;

1648
		if (!access_ok(VERIFY_READ, datavp,
1649 1650
			       sizeof(struct ppc_hw_breakpoint)))
			return -EFAULT;
1651
		ret = __copy_from_user(&bp_info, datavp,
1652 1653 1654 1655 1656 1657 1658 1659
				       sizeof(struct ppc_hw_breakpoint)) ?
		      -EFAULT : 0;
		if (!ret)
			ret = ppc_set_hwdebug(child, &bp_info);
		break;
	}

	case PPC_PTRACE_DELHWDEBUG: {
1660
		ret = ppc_del_hwdebug(child, data);
1661 1662 1663
		break;
	}

S
Stephen Rothwell 已提交
1664
	case PTRACE_GET_DEBUGREG: {
1665 1666 1667
#ifndef CONFIG_PPC_ADV_DEBUG_REGS
		unsigned long dabr_fake;
#endif
S
Stephen Rothwell 已提交
1668 1669 1670 1671
		ret = -EINVAL;
		/* We only support one DABR and no IABRS at the moment */
		if (addr > 0)
			break;
1672
#ifdef CONFIG_PPC_ADV_DEBUG_REGS
1673
		ret = put_user(child->thread.debug.dac1, datalp);
1674
#else
1675 1676 1677
		dabr_fake = ((child->thread.hw_brk.address & (~HW_BRK_TYPE_DABR)) |
			     (child->thread.hw_brk.type & HW_BRK_TYPE_DABR));
		ret = put_user(dabr_fake, datalp);
1678
#endif
S
Stephen Rothwell 已提交
1679 1680 1681 1682 1683 1684 1685
		break;
	}

	case PTRACE_SET_DEBUGREG:
		ret = ptrace_set_debugreg(child, addr, data);
		break;

1686 1687 1688
#ifdef CONFIG_PPC64
	case PTRACE_GETREGS64:
#endif
1689 1690 1691 1692
	case PTRACE_GETREGS:	/* Get all pt_regs from the child. */
		return copy_regset_to_user(child, &user_ppc_native_view,
					   REGSET_GPR,
					   0, sizeof(struct pt_regs),
1693
					   datavp);
S
Stephen Rothwell 已提交
1694

1695 1696 1697
#ifdef CONFIG_PPC64
	case PTRACE_SETREGS64:
#endif
1698 1699 1700 1701
	case PTRACE_SETREGS:	/* Set all gp regs in the child. */
		return copy_regset_from_user(child, &user_ppc_native_view,
					     REGSET_GPR,
					     0, sizeof(struct pt_regs),
1702
					     datavp);
1703 1704 1705 1706 1707

	case PTRACE_GETFPREGS: /* Get the child FPU state (FPR0...31 + FPSCR) */
		return copy_regset_to_user(child, &user_ppc_native_view,
					   REGSET_FPR,
					   0, sizeof(elf_fpregset_t),
1708
					   datavp);
1709 1710 1711 1712 1713

	case PTRACE_SETFPREGS: /* Set the child FPU state (FPR0...31 + FPSCR) */
		return copy_regset_from_user(child, &user_ppc_native_view,
					     REGSET_FPR,
					     0, sizeof(elf_fpregset_t),
1714
					     datavp);
S
Stephen Rothwell 已提交
1715

L
Linus Torvalds 已提交
1716 1717
#ifdef CONFIG_ALTIVEC
	case PTRACE_GETVRREGS:
1718 1719 1720 1721
		return copy_regset_to_user(child, &user_ppc_native_view,
					   REGSET_VMX,
					   0, (33 * sizeof(vector128) +
					       sizeof(u32)),
1722
					   datavp);
L
Linus Torvalds 已提交
1723 1724

	case PTRACE_SETVRREGS:
1725 1726 1727 1728
		return copy_regset_from_user(child, &user_ppc_native_view,
					     REGSET_VMX,
					     0, (33 * sizeof(vector128) +
						 sizeof(u32)),
1729
					     datavp);
L
Linus Torvalds 已提交
1730
#endif
1731 1732 1733 1734
#ifdef CONFIG_VSX
	case PTRACE_GETVSRREGS:
		return copy_regset_to_user(child, &user_ppc_native_view,
					   REGSET_VSX,
1735
					   0, 32 * sizeof(double),
1736
					   datavp);
1737 1738 1739 1740

	case PTRACE_SETVSRREGS:
		return copy_regset_from_user(child, &user_ppc_native_view,
					     REGSET_VSX,
1741
					     0, 32 * sizeof(double),
1742
					     datavp);
1743
#endif
L
Linus Torvalds 已提交
1744 1745 1746
#ifdef CONFIG_SPE
	case PTRACE_GETEVRREGS:
		/* Get the child spe register state. */
1747 1748
		return copy_regset_to_user(child, &user_ppc_native_view,
					   REGSET_SPE, 0, 35 * sizeof(u32),
1749
					   datavp);
L
Linus Torvalds 已提交
1750 1751 1752

	case PTRACE_SETEVRREGS:
		/* Set the child spe register state. */
1753 1754
		return copy_regset_from_user(child, &user_ppc_native_view,
					     REGSET_SPE, 0, 35 * sizeof(u32),
1755
					     datavp);
L
Linus Torvalds 已提交
1756 1757 1758 1759 1760 1761 1762 1763 1764
#endif

	default:
		ret = ptrace_request(child, request, addr, data);
		break;
	}
	return ret;
}

1765 1766 1767 1768 1769
/*
 * We must return the syscall number to actually look up in the table.
 * This can be -1L to skip running any syscall at all.
 */
long do_syscall_trace_enter(struct pt_regs *regs)
L
Linus Torvalds 已提交
1770
{
1771
	long ret = 0;
1772

1773 1774
	user_exit();

1775
	secure_computing_strict(regs->gpr[0]);
S
Stephen Rothwell 已提交
1776

1777 1778 1779 1780 1781 1782 1783 1784
	if (test_thread_flag(TIF_SYSCALL_TRACE) &&
	    tracehook_report_syscall_entry(regs))
		/*
		 * Tracing decided this syscall should not happen.
		 * We'll return a bogus call number to get an ENOSYS
		 * error, but leave the original number in regs->gpr[0].
		 */
		ret = -1L;
1785

1786 1787 1788
	if (unlikely(test_thread_flag(TIF_SYSCALL_TRACEPOINT)))
		trace_sys_enter(regs, regs->gpr[0]);

1789
#ifdef CONFIG_PPC64
1790 1791 1792 1793 1794 1795
	if (!is_32bit_task())
		audit_syscall_entry(AUDIT_ARCH_PPC64,
				    regs->gpr[0],
				    regs->gpr[3], regs->gpr[4],
				    regs->gpr[5], regs->gpr[6]);
	else
S
Stephen Rothwell 已提交
1796
#endif
1797 1798 1799 1800 1801 1802
		audit_syscall_entry(AUDIT_ARCH_PPC,
				    regs->gpr[0],
				    regs->gpr[3] & 0xffffffff,
				    regs->gpr[4] & 0xffffffff,
				    regs->gpr[5] & 0xffffffff,
				    regs->gpr[6] & 0xffffffff);
1803 1804

	return ret ?: regs->gpr[0];
1805 1806 1807 1808
}

void do_syscall_trace_leave(struct pt_regs *regs)
{
1809 1810
	int step;

1811
	audit_syscall_exit(regs);
1812

1813 1814 1815
	if (unlikely(test_thread_flag(TIF_SYSCALL_TRACEPOINT)))
		trace_sys_exit(regs, regs->result);

1816 1817 1818
	step = test_thread_flag(TIF_SINGLESTEP);
	if (step || test_thread_flag(TIF_SYSCALL_TRACE))
		tracehook_report_syscall_exit(regs, step);
1819 1820

	user_enter();
1821
}