kprobes.c 26.8 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
/*
 *  Kernel Probes (KProbes)
 *  arch/ia64/kernel/kprobes.c
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 *
 * Copyright (C) IBM Corporation, 2002, 2004
 * Copyright (C) Intel Corporation, 2005
 *
 * 2005-Apr     Rusty Lynch <rusty.lynch@intel.com> and Anil S Keshavamurthy
 *              <anil.s.keshavamurthy@intel.com> adapted from i386
 */

#include <linux/kprobes.h>
#include <linux/ptrace.h>
#include <linux/string.h>
#include <linux/slab.h>
#include <linux/preempt.h>
#include <linux/moduleloader.h>
32
#include <linux/kdebug.h>
33 34

#include <asm/pgtable.h>
35
#include <asm/sections.h>
36
#include <asm/uaccess.h>
37

38 39
extern void jprobe_inst_return(void);

40 41
DEFINE_PER_CPU(struct kprobe *, current_kprobe) = NULL;
DEFINE_PER_CPU(struct kprobe_ctlblk, kprobe_ctlblk);
42

43 44
struct kretprobe_blackpoint kretprobe_blacklist[] = {{NULL, NULL}};

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
enum instruction_type {A, I, M, F, B, L, X, u};
static enum instruction_type bundle_encoding[32][3] = {
  { M, I, I },				/* 00 */
  { M, I, I },				/* 01 */
  { M, I, I },				/* 02 */
  { M, I, I },				/* 03 */
  { M, L, X },				/* 04 */
  { M, L, X },				/* 05 */
  { u, u, u },  			/* 06 */
  { u, u, u },  			/* 07 */
  { M, M, I },				/* 08 */
  { M, M, I },				/* 09 */
  { M, M, I },				/* 0A */
  { M, M, I },				/* 0B */
  { M, F, I },				/* 0C */
  { M, F, I },				/* 0D */
  { M, M, F },				/* 0E */
  { M, M, F },				/* 0F */
  { M, I, B },				/* 10 */
  { M, I, B },				/* 11 */
  { M, B, B },				/* 12 */
  { M, B, B },				/* 13 */
  { u, u, u },  			/* 14 */
  { u, u, u },  			/* 15 */
  { B, B, B },				/* 16 */
  { B, B, B },				/* 17 */
  { M, M, B },				/* 18 */
  { M, M, B },				/* 19 */
  { u, u, u },  			/* 1A */
  { u, u, u },  			/* 1B */
  { M, F, B },				/* 1C */
  { M, F, B },				/* 1D */
  { u, u, u },  			/* 1E */
  { u, u, u },  			/* 1F */
};

81 82 83 84 85
/*
 * In this function we check to see if the instruction
 * is IP relative instruction and update the kprobe
 * inst flag accordingly
 */
86 87 88 89
static void __kprobes update_kprobe_inst_flag(uint template, uint  slot,
					      uint major_opcode,
					      unsigned long kprobe_inst,
					      struct kprobe *p)
90
{
R
Rusty Lynch 已提交
91 92
	p->ainsn.inst_flag = 0;
	p->ainsn.target_br_reg = 0;
T
Tony Luck 已提交
93
	p->ainsn.slot = slot;
94

95
	/* Check for Break instruction
B
bibo,mao 已提交
96
	 * Bits 37:40 Major opcode to be zero
97 98 99 100 101 102 103 104 105
	 * Bits 27:32 X6 to be zero
	 * Bits 32:35 X3 to be zero
	 */
	if ((!major_opcode) && (!((kprobe_inst >> 27) & 0x1FF)) ) {
		/* is a break instruction */
	 	p->ainsn.inst_flag |= INST_FLAG_BREAK_INST;
		return;
	}

106 107 108 109
	if (bundle_encoding[template][slot] == B) {
		switch (major_opcode) {
		  case INDIRECT_CALL_OPCODE:
	 		p->ainsn.inst_flag |= INST_FLAG_FIX_BRANCH_REG;
B
bibo,mao 已提交
110 111
			p->ainsn.target_br_reg = ((kprobe_inst >> 6) & 0x7);
			break;
112 113 114
		  case IP_RELATIVE_PREDICT_OPCODE:
		  case IP_RELATIVE_BRANCH_OPCODE:
			p->ainsn.inst_flag |= INST_FLAG_FIX_RELATIVE_IP_ADDR;
B
bibo,mao 已提交
115
			break;
116
		  case IP_RELATIVE_CALL_OPCODE:
B
bibo,mao 已提交
117 118 119 120
			p->ainsn.inst_flag |= INST_FLAG_FIX_RELATIVE_IP_ADDR;
			p->ainsn.inst_flag |= INST_FLAG_FIX_BRANCH_REG;
			p->ainsn.target_br_reg = ((kprobe_inst >> 6) & 0x7);
			break;
121
		}
B
bibo,mao 已提交
122
	} else if (bundle_encoding[template][slot] == X) {
123 124 125 126 127 128 129 130 131
		switch (major_opcode) {
		  case LONG_CALL_OPCODE:
			p->ainsn.inst_flag |= INST_FLAG_FIX_BRANCH_REG;
			p->ainsn.target_br_reg = ((kprobe_inst >> 6) & 0x7);
		  break;
		}
	}
	return;
}
132

133 134 135 136 137 138
/*
 * In this function we check to see if the instruction
 * (qp) cmpx.crel.ctype p1,p2=r2,r3
 * on which we are inserting kprobe is cmp instruction
 * with ctype as unc.
 */
139 140 141
static uint __kprobes is_cmp_ctype_unc_inst(uint template, uint slot,
					    uint major_opcode,
					    unsigned long kprobe_inst)
142 143 144 145 146 147 148 149 150 151 152 153 154 155
{
	cmp_inst_t cmp_inst;
	uint ctype_unc = 0;

	if (!((bundle_encoding[template][slot] == I) ||
		(bundle_encoding[template][slot] == M)))
		goto out;

	if (!((major_opcode == 0xC) || (major_opcode == 0xD) ||
		(major_opcode == 0xE)))
		goto out;

	cmp_inst.l = kprobe_inst;
	if ((cmp_inst.f.x2 == 0) || (cmp_inst.f.x2 == 1)) {
S
Simon Arlott 已提交
156
		/* Integer compare - Register Register (A6 type)*/
157 158 159 160
		if ((cmp_inst.f.tb == 0) && (cmp_inst.f.ta == 0)
				&&(cmp_inst.f.c == 1))
			ctype_unc = 1;
	} else if ((cmp_inst.f.x2 == 2)||(cmp_inst.f.x2 == 3)) {
S
Simon Arlott 已提交
161
		/* Integer compare - Immediate Register (A8 type)*/
162 163 164 165 166 167 168
		if ((cmp_inst.f.ta == 0) &&(cmp_inst.f.c == 1))
			ctype_unc = 1;
	}
out:
	return ctype_unc;
}

169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281
/*
 * In this function we check to see if the instruction
 * on which we are inserting kprobe is supported.
 * Returns qp value if supported
 * Returns -EINVAL if unsupported
 */
static int __kprobes unsupported_inst(uint template, uint  slot,
				      uint major_opcode,
				      unsigned long kprobe_inst,
				      unsigned long addr)
{
	int qp;

	qp = kprobe_inst & 0x3f;
	if (is_cmp_ctype_unc_inst(template, slot, major_opcode, kprobe_inst)) {
		if (slot == 1 && qp)  {
			printk(KERN_WARNING "Kprobes on cmp unc"
					"instruction on slot 1 at <0x%lx>"
					"is not supported\n", addr);
			return -EINVAL;

		}
		qp = 0;
	}
	else if (bundle_encoding[template][slot] == I) {
		if (major_opcode == 0) {
			/*
			 * Check for Integer speculation instruction
			 * - Bit 33-35 to be equal to 0x1
			 */
			if (((kprobe_inst >> 33) & 0x7) == 1) {
				printk(KERN_WARNING
					"Kprobes on speculation inst at <0x%lx> not supported\n",
						addr);
				return -EINVAL;
			}
			/*
			 * IP relative mov instruction
			 *  - Bit 27-35 to be equal to 0x30
			 */
			if (((kprobe_inst >> 27) & 0x1FF) == 0x30) {
				printk(KERN_WARNING
					"Kprobes on \"mov r1=ip\" at <0x%lx> not supported\n",
						addr);
				return -EINVAL;

			}
		}
		else if ((major_opcode == 5) &&	!(kprobe_inst & (0xFUl << 33)) &&
				(kprobe_inst & (0x1UL << 12))) {
			/* test bit instructions, tbit,tnat,tf
			 * bit 33-36 to be equal to 0
			 * bit 12 to be equal to 1
			 */
			if (slot == 1 && qp) {
				printk(KERN_WARNING "Kprobes on test bit"
						"instruction on slot at <0x%lx>"
						"is not supported\n", addr);
				return -EINVAL;
			}
			qp = 0;
		}
	}
	else if (bundle_encoding[template][slot] == B) {
		if (major_opcode == 7) {
			/* IP-Relative Predict major code is 7 */
			printk(KERN_WARNING "Kprobes on IP-Relative"
					"Predict is not supported\n");
			return -EINVAL;
		}
		else if (major_opcode == 2) {
			/* Indirect Predict, major code is 2
			 * bit 27-32 to be equal to 10 or 11
			 */
			int x6=(kprobe_inst >> 27) & 0x3F;
			if ((x6 == 0x10) || (x6 == 0x11)) {
				printk(KERN_WARNING "Kprobes on"
					"Indirect Predict is not supported\n");
				return -EINVAL;
			}
		}
	}
	/* kernel does not use float instruction, here for safety kprobe
	 * will judge whether it is fcmp/flass/float approximation instruction
	 */
	else if (unlikely(bundle_encoding[template][slot] == F)) {
		if ((major_opcode == 4 || major_opcode == 5) &&
				(kprobe_inst  & (0x1 << 12))) {
			/* fcmp/fclass unc instruction */
			if (slot == 1 && qp) {
				printk(KERN_WARNING "Kprobes on fcmp/fclass "
					"instruction on slot at <0x%lx> "
					"is not supported\n", addr);
				return -EINVAL;

			}
			qp = 0;
		}
		if ((major_opcode == 0 || major_opcode == 1) &&
			(kprobe_inst & (0x1UL << 33))) {
			/* float Approximation instruction */
			if (slot == 1 && qp) {
				printk(KERN_WARNING "Kprobes on float Approx "
					"instr at <0x%lx> is not supported\n",
						addr);
				return -EINVAL;
			}
			qp = 0;
		}
	}
	return qp;
}

282 283 284 285
/*
 * In this function we override the bundle with
 * the break instruction at the given slot.
 */
286 287 288
static void __kprobes prepare_break_inst(uint template, uint  slot,
					 uint major_opcode,
					 unsigned long kprobe_inst,
289 290
					 struct kprobe *p,
					 int qp)
291 292
{
	unsigned long break_inst = BREAK_INST;
293
	bundle_t *bundle = &p->opcode.bundle;
294 295 296

	/*
	 * Copy the original kprobe_inst qualifying predicate(qp)
297
	 * to the break instruction
298
	 */
299
	break_inst |= qp;
300 301 302 303 304 305 306 307 308 309 310 311

	switch (slot) {
	  case 0:
		bundle->quad0.slot0 = break_inst;
		break;
	  case 1:
		bundle->quad0.slot1_p0 = break_inst;
		bundle->quad1.slot1_p1 = break_inst >> (64-46);
		break;
	  case 2:
		bundle->quad1.slot2 = break_inst;
		break;
R
Rusty Lynch 已提交
312
	}
313

314 315 316 317 318 319 320 321
	/*
	 * Update the instruction flag, so that we can
	 * emulate the instruction properly after we
	 * single step on original instruction
	 */
	update_kprobe_inst_flag(template, slot, major_opcode, kprobe_inst, p);
}

322
static void __kprobes get_kprobe_inst(bundle_t *bundle, uint slot,
323 324 325 326 327 328
	       	unsigned long *kprobe_inst, uint *major_opcode)
{
	unsigned long kprobe_inst_p0, kprobe_inst_p1;
	unsigned int template;

	template = bundle->quad0.template;
329 330

	switch (slot) {
331
	  case 0:
B
bibo,mao 已提交
332 333 334
		*major_opcode = (bundle->quad0.slot0 >> SLOT0_OPCODE_SHIFT);
		*kprobe_inst = bundle->quad0.slot0;
		  break;
335
	  case 1:
B
bibo,mao 已提交
336 337 338 339
		*major_opcode = (bundle->quad1.slot1_p1 >> SLOT1_p1_OPCODE_SHIFT);
		kprobe_inst_p0 = bundle->quad0.slot1_p0;
		kprobe_inst_p1 = bundle->quad1.slot1_p1;
		*kprobe_inst = kprobe_inst_p0 | (kprobe_inst_p1 << (64-46));
340
		break;
341
	  case 2:
B
bibo,mao 已提交
342 343
		*major_opcode = (bundle->quad1.slot2 >> SLOT2_OPCODE_SHIFT);
		*kprobe_inst = bundle->quad1.slot2;
344 345
		break;
	}
346
}
347

348
/* Returns non-zero if the addr is in the Interrupt Vector Table */
349
static int __kprobes in_ivt_functions(unsigned long addr)
350 351 352 353 354
{
	return (addr >= (unsigned long)__start_ivt_text
		&& addr < (unsigned long)__end_ivt_text);
}

355 356
static int __kprobes valid_kprobe_addr(int template, int slot,
				       unsigned long addr)
357 358
{
	if ((slot > 2) || ((bundle_encoding[template][1] == L) && slot > 1)) {
359 360
		printk(KERN_WARNING "Attempting to insert unaligned kprobe "
				"at 0x%lx\n", addr);
361
		return -EINVAL;
R
Rusty Lynch 已提交
362
	}
363

B
bibo,mao 已提交
364 365
	if (in_ivt_functions(addr)) {
		printk(KERN_WARNING "Kprobes can't be inserted inside "
366
				"IVT functions at 0x%lx\n", addr);
B
bibo,mao 已提交
367 368
		return -EINVAL;
	}
369

370 371 372
	return 0;
}

373
static void __kprobes save_previous_kprobe(struct kprobe_ctlblk *kcb)
374
{
375 376 377 378
	unsigned int i;
	i = atomic_add_return(1, &kcb->prev_kprobe_index);
	kcb->prev_kprobe[i-1].kp = kprobe_running();
	kcb->prev_kprobe[i-1].status = kcb->kprobe_status;
379 380
}

381
static void __kprobes restore_previous_kprobe(struct kprobe_ctlblk *kcb)
382
{
383 384 385 386
	unsigned int i;
	i = atomic_sub_return(1, &kcb->prev_kprobe_index);
	__get_cpu_var(current_kprobe) = kcb->prev_kprobe[i].kp;
	kcb->kprobe_status = kcb->prev_kprobe[i].status;
387 388
}

389
static void __kprobes set_current_kprobe(struct kprobe *p,
390
			struct kprobe_ctlblk *kcb)
391
{
392
	__get_cpu_var(current_kprobe) = p;
393 394
}

395 396 397 398 399 400 401 402 403 404 405 406
static void kretprobe_trampoline(void)
{
}

/*
 * At this point the target function has been tricked into
 * returning into our trampoline.  Lookup the associated instance
 * and then:
 *    - call the handler function
 *    - cleanup by marking the instance as unused
 *    - long jump back to the original return address
 */
407
int __kprobes trampoline_probe_handler(struct kprobe *p, struct pt_regs *regs)
408 409
{
	struct kretprobe_instance *ri = NULL;
410
	struct hlist_head *head, empty_rp;
411
	struct hlist_node *node, *tmp;
412
	unsigned long flags, orig_ret_address = 0;
413 414 415
	unsigned long trampoline_address =
		((struct fnptr *)kretprobe_trampoline)->ip;

416
	INIT_HLIST_HEAD(&empty_rp);
417
	spin_lock_irqsave(&kretprobe_lock, flags);
418
	head = kretprobe_inst_table_head(current);
419 420 421 422 423 424 425 426 427 428 429 430 431 432 433

	/*
	 * It is possible to have multiple instances associated with a given
	 * task either because an multiple functions in the call path
	 * have a return probe installed on them, and/or more then one return
	 * return probe was registered for a target function.
	 *
	 * We can handle this because:
	 *     - instances are always inserted at the head of the list
	 *     - when multiple return probes are registered for the same
	 *       function, the first instance's ret_addr will point to the
	 *       real return address, and all the rest will point to
	 *       kretprobe_trampoline
	 */
	hlist_for_each_entry_safe(ri, node, tmp, head, hlist) {
434
		if (ri->task != current)
435
			/* another task is sharing our hash bucket */
436
			continue;
437 438 439 440 441

		if (ri->rp && ri->rp->handler)
			ri->rp->handler(ri, regs);

		orig_ret_address = (unsigned long)ri->ret_addr;
442
		recycle_rp_inst(ri, &empty_rp);
443 444 445 446 447 448 449 450 451 452

		if (orig_ret_address != trampoline_address)
			/*
			 * This is the real return address. Any other
			 * instances associated with this task are for
			 * other calls deeper on the call stack
			 */
			break;
	}

453 454
	kretprobe_assert(ri, orig_ret_address, trampoline_address);

455 456
	regs->cr_iip = orig_ret_address;

457
	reset_current_kprobe();
458
	spin_unlock_irqrestore(&kretprobe_lock, flags);
459 460
	preempt_enable_no_resched();

461 462 463 464
	hlist_for_each_entry_safe(ri, node, tmp, &empty_rp, hlist) {
		hlist_del(&ri->hlist);
		kfree(ri);
	}
465 466 467 468 469
	/*
	 * By returning a non-zero value, we are telling
	 * kprobe_handler() that we don't want the post_handler
	 * to run (and have re-enabled preemption)
	 */
470
	return 1;
471 472
}

473
/* Called with kretprobe_lock held */
474
void __kprobes arch_prepare_kretprobe(struct kretprobe_instance *ri,
475
				      struct pt_regs *regs)
476
{
477
	ri->ret_addr = (kprobe_opcode_t *)regs->b0;
478

479 480
	/* Replace the return addr with trampoline addr */
	regs->b0 = ((struct fnptr *)kretprobe_trampoline)->ip;
481 482
}

483
int __kprobes arch_prepare_kprobe(struct kprobe *p)
484 485 486 487 488
{
	unsigned long addr = (unsigned long) p->addr;
	unsigned long *kprobe_addr = (unsigned long *)(addr & ~0xFULL);
	unsigned long kprobe_inst=0;
	unsigned int slot = addr & 0xf, template, major_opcode = 0;
489
	bundle_t *bundle;
490
	int qp;
491

492
	bundle = &((kprobe_opcode_t *)kprobe_addr)->bundle;
B
bibo,mao 已提交
493
	template = bundle->quad0.template;
494 495 496 497 498

	if(valid_kprobe_addr(template, slot, addr))
		return -EINVAL;

	/* Move to slot 2, if bundle is MLX type and kprobe slot is 1 */
B
bibo,mao 已提交
499 500
	if (slot == 1 && bundle_encoding[template][1] == L)
		slot++;
501 502 503 504

	/* Get kprobe_inst and major_opcode from the bundle */
	get_kprobe_inst(bundle, slot, &kprobe_inst, &major_opcode);

505 506 507
	qp = unsupported_inst(template, slot, major_opcode, kprobe_inst, addr);
	if (qp < 0)
		return -EINVAL;
R
Rusty Lynch 已提交
508

509 510 511 512 513
	p->ainsn.insn = get_insn_slot();
	if (!p->ainsn.insn)
		return -ENOMEM;
	memcpy(&p->opcode, kprobe_addr, sizeof(kprobe_opcode_t));
	memcpy(p->ainsn.insn, kprobe_addr, sizeof(kprobe_opcode_t));
R
Rusty Lynch 已提交
514

515
	prepare_break_inst(template, slot, major_opcode, kprobe_inst, p, qp);
516

517
	return 0;
518 519
}

520
void __kprobes arch_arm_kprobe(struct kprobe *p)
R
Rusty Lynch 已提交
521
{
T
Tony Luck 已提交
522 523 524 525 526 527
	unsigned long arm_addr;
	bundle_t *src, *dest;

	arm_addr = ((unsigned long)p->addr) & ~0xFUL;
	dest = &((kprobe_opcode_t *)arm_addr)->bundle;
	src = &p->opcode.bundle;
R
Rusty Lynch 已提交
528

529 530
	flush_icache_range((unsigned long)p->ainsn.insn,
			(unsigned long)p->ainsn.insn + sizeof(kprobe_opcode_t));
T
Tony Luck 已提交
531 532 533 534 535 536 537 538 539 540 541
	switch (p->ainsn.slot) {
		case 0:
			dest->quad0.slot0 = src->quad0.slot0;
			break;
		case 1:
			dest->quad1.slot1_p1 = src->quad1.slot1_p1;
			break;
		case 2:
			dest->quad1.slot2 = src->quad1.slot2;
			break;
	}
542
	flush_icache_range(arm_addr, arm_addr + sizeof(kprobe_opcode_t));
543 544
}

545
void __kprobes arch_disarm_kprobe(struct kprobe *p)
546
{
T
Tony Luck 已提交
547 548
	unsigned long arm_addr;
	bundle_t *src, *dest;
549

T
Tony Luck 已提交
550 551
	arm_addr = ((unsigned long)p->addr) & ~0xFUL;
	dest = &((kprobe_opcode_t *)arm_addr)->bundle;
552
	/* p->ainsn.insn contains the original unaltered kprobe_opcode_t */
T
Tony Luck 已提交
553 554 555 556 557 558 559 560 561 562 563 564
	src = &p->ainsn.insn->bundle;
	switch (p->ainsn.slot) {
		case 0:
			dest->quad0.slot0 = src->quad0.slot0;
			break;
		case 1:
			dest->quad1.slot1_p1 = src->quad1.slot1_p1;
			break;
		case 2:
			dest->quad1.slot2 = src->quad1.slot2;
			break;
	}
565
	flush_icache_range(arm_addr, arm_addr + sizeof(kprobe_opcode_t));
566 567
}

568 569 570
void __kprobes arch_remove_kprobe(struct kprobe *p)
{
	mutex_lock(&kprobe_mutex);
571
	free_insn_slot(p->ainsn.insn, 0);
572 573
	mutex_unlock(&kprobe_mutex);
}
574 575 576 577
/*
 * We are resuming execution after a single step fault, so the pt_regs
 * structure reflects the register state after we executed the instruction
 * located in the kprobe (p->ainsn.insn.bundle).  We still need to adjust
578 579 580
 * the ip to point back to the original stack address. To set the IP address
 * to original stack address, handle the case where we need to fixup the
 * relative IP address and/or fixup branch register.
581
 */
582
static void __kprobes resume_execution(struct kprobe *p, struct pt_regs *regs)
583
{
B
bibo,mao 已提交
584 585 586 587
	unsigned long bundle_addr = (unsigned long) (&p->ainsn.insn->bundle);
	unsigned long resume_addr = (unsigned long)p->addr & ~0xFULL;
	unsigned long template;
	int slot = ((unsigned long)p->addr & 0xf);
588

589
	template = p->ainsn.insn->bundle.quad0.template;
590

B
bibo,mao 已提交
591 592
	if (slot == 1 && bundle_encoding[template][1] == L)
		slot = 2;
593 594 595 596 597

	if (p->ainsn.inst_flag) {

		if (p->ainsn.inst_flag & INST_FLAG_FIX_RELATIVE_IP_ADDR) {
			/* Fix relative IP address */
B
bibo,mao 已提交
598 599
			regs->cr_iip = (regs->cr_iip - bundle_addr) +
					resume_addr;
600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633
		}

		if (p->ainsn.inst_flag & INST_FLAG_FIX_BRANCH_REG) {
		/*
		 * Fix target branch register, software convention is
		 * to use either b0 or b6 or b7, so just checking
		 * only those registers
		 */
			switch (p->ainsn.target_br_reg) {
			case 0:
				if ((regs->b0 == bundle_addr) ||
					(regs->b0 == bundle_addr + 0x10)) {
					regs->b0 = (regs->b0 - bundle_addr) +
						resume_addr;
				}
				break;
			case 6:
				if ((regs->b6 == bundle_addr) ||
					(regs->b6 == bundle_addr + 0x10)) {
					regs->b6 = (regs->b6 - bundle_addr) +
						resume_addr;
				}
				break;
			case 7:
				if ((regs->b7 == bundle_addr) ||
					(regs->b7 == bundle_addr + 0x10)) {
					regs->b7 = (regs->b7 - bundle_addr) +
						resume_addr;
				}
				break;
			} /* end switch */
		}
		goto turn_ss_off;
	}
634

635
	if (slot == 2) {
B
bibo,mao 已提交
636 637 638 639 640 641 642
		if (regs->cr_iip == bundle_addr + 0x10) {
			regs->cr_iip = resume_addr + 0x10;
		}
	} else {
		if (regs->cr_iip == bundle_addr) {
			regs->cr_iip = resume_addr;
		}
643
	}
644

645
turn_ss_off:
B
bibo,mao 已提交
646 647
	/* Turn off Single Step bit */
	ia64_psr(regs)->ss = 0;
648 649
}

650
static void __kprobes prepare_ss(struct kprobe *p, struct pt_regs *regs)
651
{
652
	unsigned long bundle_addr = (unsigned long) &p->ainsn.insn->bundle;
653 654
	unsigned long slot = (unsigned long)p->addr & 0xf;

655 656 657 658 659
	/* single step inline if break instruction */
	if (p->ainsn.inst_flag == INST_FLAG_BREAK_INST)
		regs->cr_iip = (unsigned long)p->addr & ~0xFULL;
	else
		regs->cr_iip = bundle_addr & ~0xFULL;
660 661 662 663 664 665 666 667 668 669

	if (slot > 2)
		slot = 0;

	ia64_psr(regs)->ri = slot;

	/* turn on single stepping */
	ia64_psr(regs)->ss = 1;
}

670 671 672 673 674 675 676 677 678 679 680 681 682
static int __kprobes is_ia64_break_inst(struct pt_regs *regs)
{
	unsigned int slot = ia64_psr(regs)->ri;
	unsigned int template, major_opcode;
	unsigned long kprobe_inst;
	unsigned long *kprobe_addr = (unsigned long *)regs->cr_iip;
	bundle_t bundle;

	memcpy(&bundle, kprobe_addr, sizeof(bundle_t));
	template = bundle.quad0.template;

	/* Move to slot 2, if bundle is MLX type and kprobe slot is 1 */
	if (slot == 1 && bundle_encoding[template][1] == L)
B
bibo,mao 已提交
683
		slot++;
684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701

	/* Get Kprobe probe instruction at given slot*/
	get_kprobe_inst(&bundle, slot, &kprobe_inst, &major_opcode);

	/* For break instruction,
	 * Bits 37:40 Major opcode to be zero
	 * Bits 27:32 X6 to be zero
	 * Bits 32:35 X3 to be zero
	 */
	if (major_opcode || ((kprobe_inst >> 27) & 0x1FF) ) {
		/* Not a break instruction */
		return 0;
	}

	/* Is a break instruction */
	return 1;
}

702
static int __kprobes pre_kprobes_handler(struct die_args *args)
703 704 705
{
	struct kprobe *p;
	int ret = 0;
706
	struct pt_regs *regs = args->regs;
707
	kprobe_opcode_t *addr = (kprobe_opcode_t *)instruction_pointer(regs);
708 709 710 711 712 713 714 715
	struct kprobe_ctlblk *kcb;

	/*
	 * We don't want to be preempted for the entire
	 * duration of kprobe processing
	 */
	preempt_disable();
	kcb = get_kprobe_ctlblk();
716 717 718 719 720

	/* Handle recursion cases */
	if (kprobe_running()) {
		p = get_kprobe(addr);
		if (p) {
721
			if ((kcb->kprobe_status == KPROBE_HIT_SS) &&
722
	 		     (p->ainsn.inst_flag == INST_FLAG_BREAK_INST)) {
B
bibo,mao 已提交
723
				ia64_psr(regs)->ss = 0;
724 725
				goto no_kprobe;
			}
726 727 728 729 730 731
			/* We have reentered the pre_kprobe_handler(), since
			 * another probe was hit while within the handler.
			 * We here save the original kprobes variables and
			 * just single step on the instruction of the new probe
			 * without calling any user handlers.
			 */
732 733
			save_previous_kprobe(kcb);
			set_current_kprobe(p, kcb);
734
			kprobes_inc_nmissed_count(p);
735
			prepare_ss(p, regs);
736
			kcb->kprobe_status = KPROBE_REENTER;
737
			return 1;
738
		} else if (args->err == __IA64_BREAK_JPROBE) {
739 740 741
			/*
			 * jprobe instrumented function just completed
			 */
742
			p = __get_cpu_var(current_kprobe);
743 744 745
			if (p->break_handler && p->break_handler(p, regs)) {
				goto ss_probe;
			}
746 747 748 749 750 751 752
		} else if (!is_ia64_break_inst(regs)) {
			/* The breakpoint instruction was removed by
			 * another cpu right after we hit, no further
			 * handling of this interrupt is appropriate
			 */
			ret = 1;
			goto no_kprobe;
753 754 755
		} else {
			/* Not our break */
			goto no_kprobe;
756 757 758 759 760
		}
	}

	p = get_kprobe(addr);
	if (!p) {
761 762 763 764 765 766 767 768 769 770 771 772 773
		if (!is_ia64_break_inst(regs)) {
			/*
			 * The breakpoint instruction was removed right
			 * after we hit it.  Another cpu has removed
			 * either a probepoint or a debugger breakpoint
			 * at this address.  In either case, no further
			 * handling of this interrupt is appropriate.
			 */
			ret = 1;

		}

		/* Not one of our break, let kernel handle it */
774 775 776
		goto no_kprobe;
	}

777 778
	set_current_kprobe(p, kcb);
	kcb->kprobe_status = KPROBE_HIT_ACTIVE;
779 780 781 782

	if (p->pre_handler && p->pre_handler(p, regs))
		/*
		 * Our pre-handler is specifically requesting that we just
783 784
		 * do a return.  This is used for both the jprobe pre-handler
		 * and the kretprobe trampoline
785 786 787 788 789
		 */
		return 1;

ss_probe:
	prepare_ss(p, regs);
790
	kcb->kprobe_status = KPROBE_HIT_SS;
791 792 793
	return 1;

no_kprobe:
794
	preempt_enable_no_resched();
795 796 797
	return ret;
}

798
static int __kprobes post_kprobes_handler(struct pt_regs *regs)
799
{
800 801 802 803
	struct kprobe *cur = kprobe_running();
	struct kprobe_ctlblk *kcb = get_kprobe_ctlblk();

	if (!cur)
804 805
		return 0;

806 807 808
	if ((kcb->kprobe_status != KPROBE_REENTER) && cur->post_handler) {
		kcb->kprobe_status = KPROBE_HIT_SSDONE;
		cur->post_handler(cur, regs, 0);
809
	}
810

811
	resume_execution(cur, regs);
812

813
	/*Restore back the original saved kprobes variables and continue. */
814 815
	if (kcb->kprobe_status == KPROBE_REENTER) {
		restore_previous_kprobe(kcb);
816 817
		goto out;
	}
818
	reset_current_kprobe();
819 820

out:
821 822 823 824
	preempt_enable_no_resched();
	return 1;
}

825
int __kprobes kprobes_fault_handler(struct pt_regs *regs, int trapnr)
826
{
827 828 829
	struct kprobe *cur = kprobe_running();
	struct kprobe_ctlblk *kcb = get_kprobe_ctlblk();

830

831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846
	switch(kcb->kprobe_status) {
	case KPROBE_HIT_SS:
	case KPROBE_REENTER:
		/*
		 * We are here because the instruction being single
		 * stepped caused a page fault. We reset the current
		 * kprobe and the instruction pointer points back to
		 * the probe address and allow the page fault handler
		 * to continue as a normal page fault.
		 */
		regs->cr_iip = ((unsigned long)cur->addr) & ~0xFULL;
		ia64_psr(regs)->ri = ((unsigned long)cur->addr) & 0xf;
		if (kcb->kprobe_status == KPROBE_REENTER)
			restore_previous_kprobe(kcb);
		else
			reset_current_kprobe();
847
		preempt_enable_no_resched();
848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866
		break;
	case KPROBE_HIT_ACTIVE:
	case KPROBE_HIT_SSDONE:
		/*
		 * We increment the nmissed count for accounting,
		 * we can also use npre/npostfault count for accouting
		 * these specific fault cases.
		 */
		kprobes_inc_nmissed_count(cur);

		/*
		 * We come here because instructions in the pre/post
		 * handler caused the page_fault, this could happen
		 * if handler tries to access user space by
		 * copy_from_user(), get_user() etc. Let the
		 * user-specified handler try to fix it first.
		 */
		if (cur->fault_handler && cur->fault_handler(cur, regs, trapnr))
			return 1;
867 868 869 870 871 872
		/*
		 * In case the user-specified fault handler returned
		 * zero, try to fix up.
		 */
		if (ia64_done_with_exception(regs))
			return 1;
873 874 875 876 877 878 879

		/*
		 * Let ia64_do_page_fault() fix it.
		 */
		break;
	default:
		break;
880 881 882 883 884
	}

	return 0;
}

885 886
int __kprobes kprobe_exceptions_notify(struct notifier_block *self,
				       unsigned long val, void *data)
887 888
{
	struct die_args *args = (struct die_args *)data;
889 890
	int ret = NOTIFY_DONE;

891 892 893
	if (args->regs && user_mode(args->regs))
		return ret;

894 895
	switch(val) {
	case DIE_BREAK:
896
		/* err is break number from ia64_bad_break() */
T
Tony Luck 已提交
897 898 899
		if ((args->err >> 12) == (__IA64_BREAK_KPROBE >> 12)
			|| args->err == __IA64_BREAK_JPROBE
			|| args->err == 0)
900 901
			if (pre_kprobes_handler(args))
				ret = NOTIFY_STOP;
902
		break;
903 904 905 906 907
	case DIE_FAULT:
		/* err is vector number from ia64_fault() */
		if (args->err == 36)
			if (post_kprobes_handler(args->regs))
				ret = NOTIFY_STOP;
908 909 910 911
		break;
	default:
		break;
	}
912
	return ret;
913 914
}

915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935
struct param_bsp_cfm {
	unsigned long ip;
	unsigned long *bsp;
	unsigned long cfm;
};

static void ia64_get_bsp_cfm(struct unw_frame_info *info, void *arg)
{
	unsigned long ip;
	struct param_bsp_cfm *lp = arg;

	do {
		unw_get_ip(info, &ip);
		if (ip == 0)
			break;
		if (ip == lp->ip) {
			unw_get_bsp(info, (unsigned long*)&lp->bsp);
			unw_get_cfm(info, (unsigned long*)&lp->cfm);
			return;
		}
	} while (unw_unwind(info) >= 0);
M
Matthew Wilcox 已提交
936
	lp->bsp = NULL;
937 938 939 940
	lp->cfm = 0;
	return;
}

941 942 943 944 945
unsigned long arch_deref_entry_point(void *entry)
{
	return ((struct fnptr *)entry)->ip;
}

946
int __kprobes setjmp_pre_handler(struct kprobe *p, struct pt_regs *regs)
947
{
948
	struct jprobe *jp = container_of(p, struct jprobe, kp);
949
	unsigned long addr = arch_deref_entry_point(jp->entry);
950
	struct kprobe_ctlblk *kcb = get_kprobe_ctlblk();
951 952 953 954 955 956
	struct param_bsp_cfm pa;
	int bytes;

	/*
	 * Callee owns the argument space and could overwrite it, eg
	 * tail call optimization. So to be absolutely safe
S
Simon Arlott 已提交
957
	 * we save the argument space before transferring the control
958 959 960 961 962 963 964 965 966 967 968 969
	 * to instrumented jprobe function which runs in
	 * the process context
	 */
	pa.ip = regs->cr_iip;
	unw_init_running(ia64_get_bsp_cfm, &pa);
	bytes = (char *)ia64_rse_skip_regs(pa.bsp, pa.cfm & 0x3f)
				- (char *)pa.bsp;
	memcpy( kcb->jprobes_saved_stacked_regs,
		pa.bsp,
		bytes );
	kcb->bsp = pa.bsp;
	kcb->cfm = pa.cfm;
970

971
	/* save architectural state */
972
	kcb->jprobe_saved_regs = *regs;
973 974 975 976 977 978 979 980 981 982

	/* after rfi, execute the jprobe instrumented function */
	regs->cr_iip = addr & ~0xFULL;
	ia64_psr(regs)->ri = addr & 0xf;
	regs->r1 = ((struct fnptr *)(jp->entry))->gp;

	/*
	 * fix the return address to our jprobe_inst_return() function
	 * in the jprobes.S file
	 */
B
bibo,mao 已提交
983
	regs->b0 = ((struct fnptr *)(jprobe_inst_return))->ip;
984 985

	return 1;
986 987
}

988
int __kprobes longjmp_break_handler(struct kprobe *p, struct pt_regs *regs)
989
{
990
	struct kprobe_ctlblk *kcb = get_kprobe_ctlblk();
991
	int bytes;
992

993
	/* restoring architectural state */
994
	*regs = kcb->jprobe_saved_regs;
995 996 997 998 999 1000 1001 1002 1003 1004

	/* restoring the original argument space */
	flush_register_stack();
	bytes = (char *)ia64_rse_skip_regs(kcb->bsp, kcb->cfm & 0x3f)
				- (char *)kcb->bsp;
	memcpy( kcb->bsp,
		kcb->jprobes_saved_stacked_regs,
		bytes );
	invalidate_stacked_regs();

1005
	preempt_enable_no_resched();
1006
	return 1;
1007
}
1008 1009 1010 1011 1012

static struct kprobe trampoline_p = {
	.pre_handler = trampoline_probe_handler
};

1013
int __init arch_init_kprobes(void)
1014 1015 1016 1017 1018
{
	trampoline_p.addr =
		(kprobe_opcode_t *)((struct fnptr *)kretprobe_trampoline)->ip;
	return register_kprobe(&trampoline_p);
}
1019 1020 1021 1022 1023 1024 1025 1026 1027

int __kprobes arch_trampoline_kprobe(struct kprobe *p)
{
	if (p->addr ==
		(kprobe_opcode_t *)((struct fnptr *)kretprobe_trampoline)->ip)
		return 1;

	return 0;
}