xref: /openbmc/linux/arch/mips/kernel/branch.c (revision c4ee0af3)
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) 1996, 97, 2000, 2001 by Ralf Baechle
7  * Copyright (C) 2001 MIPS Technologies, Inc.
8  */
9 #include <linux/kernel.h>
10 #include <linux/sched.h>
11 #include <linux/signal.h>
12 #include <linux/module.h>
13 #include <asm/branch.h>
14 #include <asm/cpu.h>
15 #include <asm/cpu-features.h>
16 #include <asm/fpu.h>
17 #include <asm/fpu_emulator.h>
18 #include <asm/inst.h>
19 #include <asm/ptrace.h>
20 #include <asm/uaccess.h>
21 
22 /*
23  * Calculate and return exception PC in case of branch delay slot
24  * for microMIPS and MIPS16e. It does not clear the ISA mode bit.
25  */
26 int __isa_exception_epc(struct pt_regs *regs)
27 {
28 	unsigned short inst;
29 	long epc = regs->cp0_epc;
30 
31 	/* Calculate exception PC in branch delay slot. */
32 	if (__get_user(inst, (u16 __user *) msk_isa16_mode(epc))) {
33 		/* This should never happen because delay slot was checked. */
34 		force_sig(SIGSEGV, current);
35 		return epc;
36 	}
37 	if (cpu_has_mips16) {
38 		if (((union mips16e_instruction)inst).ri.opcode
39 				== MIPS16e_jal_op)
40 			epc += 4;
41 		else
42 			epc += 2;
43 	} else if (mm_insn_16bit(inst))
44 		epc += 2;
45 	else
46 		epc += 4;
47 
48 	return epc;
49 }
50 
51 /*
52  * Compute return address and emulate branch in microMIPS mode after an
53  * exception only. It does not handle compact branches/jumps and cannot
54  * be used in interrupt context. (Compact branches/jumps do not cause
55  * exceptions.)
56  */
57 int __microMIPS_compute_return_epc(struct pt_regs *regs)
58 {
59 	u16 __user *pc16;
60 	u16 halfword;
61 	unsigned int word;
62 	unsigned long contpc;
63 	struct mm_decoded_insn mminsn = { 0 };
64 
65 	mminsn.micro_mips_mode = 1;
66 
67 	/* This load never faults. */
68 	pc16 = (unsigned short __user *)msk_isa16_mode(regs->cp0_epc);
69 	__get_user(halfword, pc16);
70 	pc16++;
71 	contpc = regs->cp0_epc + 2;
72 	word = ((unsigned int)halfword << 16);
73 	mminsn.pc_inc = 2;
74 
75 	if (!mm_insn_16bit(halfword)) {
76 		__get_user(halfword, pc16);
77 		pc16++;
78 		contpc = regs->cp0_epc + 4;
79 		mminsn.pc_inc = 4;
80 		word |= halfword;
81 	}
82 	mminsn.insn = word;
83 
84 	if (get_user(halfword, pc16))
85 		goto sigsegv;
86 	mminsn.next_pc_inc = 2;
87 	word = ((unsigned int)halfword << 16);
88 
89 	if (!mm_insn_16bit(halfword)) {
90 		pc16++;
91 		if (get_user(halfword, pc16))
92 			goto sigsegv;
93 		mminsn.next_pc_inc = 4;
94 		word |= halfword;
95 	}
96 	mminsn.next_insn = word;
97 
98 	mm_isBranchInstr(regs, mminsn, &contpc);
99 
100 	regs->cp0_epc = contpc;
101 
102 	return 0;
103 
104 sigsegv:
105 	force_sig(SIGSEGV, current);
106 	return -EFAULT;
107 }
108 
109 /*
110  * Compute return address and emulate branch in MIPS16e mode after an
111  * exception only. It does not handle compact branches/jumps and cannot
112  * be used in interrupt context. (Compact branches/jumps do not cause
113  * exceptions.)
114  */
115 int __MIPS16e_compute_return_epc(struct pt_regs *regs)
116 {
117 	u16 __user *addr;
118 	union mips16e_instruction inst;
119 	u16 inst2;
120 	u32 fullinst;
121 	long epc;
122 
123 	epc = regs->cp0_epc;
124 
125 	/* Read the instruction. */
126 	addr = (u16 __user *)msk_isa16_mode(epc);
127 	if (__get_user(inst.full, addr)) {
128 		force_sig(SIGSEGV, current);
129 		return -EFAULT;
130 	}
131 
132 	switch (inst.ri.opcode) {
133 	case MIPS16e_extend_op:
134 		regs->cp0_epc += 4;
135 		return 0;
136 
137 		/*
138 		 *  JAL and JALX in MIPS16e mode
139 		 */
140 	case MIPS16e_jal_op:
141 		addr += 1;
142 		if (__get_user(inst2, addr)) {
143 			force_sig(SIGSEGV, current);
144 			return -EFAULT;
145 		}
146 		fullinst = ((unsigned)inst.full << 16) | inst2;
147 		regs->regs[31] = epc + 6;
148 		epc += 4;
149 		epc >>= 28;
150 		epc <<= 28;
151 		/*
152 		 * JAL:5 X:1 TARGET[20-16]:5 TARGET[25:21]:5 TARGET[15:0]:16
153 		 *
154 		 * ......TARGET[15:0].................TARGET[20:16]...........
155 		 * ......TARGET[25:21]
156 		 */
157 		epc |=
158 		    ((fullinst & 0xffff) << 2) | ((fullinst & 0x3e00000) >> 3) |
159 		    ((fullinst & 0x1f0000) << 7);
160 		if (!inst.jal.x)
161 			set_isa16_mode(epc);	/* Set ISA mode bit. */
162 		regs->cp0_epc = epc;
163 		return 0;
164 
165 		/*
166 		 *  J(AL)R(C)
167 		 */
168 	case MIPS16e_rr_op:
169 		if (inst.rr.func == MIPS16e_jr_func) {
170 
171 			if (inst.rr.ra)
172 				regs->cp0_epc = regs->regs[31];
173 			else
174 				regs->cp0_epc =
175 				    regs->regs[reg16to32[inst.rr.rx]];
176 
177 			if (inst.rr.l) {
178 				if (inst.rr.nd)
179 					regs->regs[31] = epc + 2;
180 				else
181 					regs->regs[31] = epc + 4;
182 			}
183 			return 0;
184 		}
185 		break;
186 	}
187 
188 	/*
189 	 * All other cases have no branch delay slot and are 16-bits.
190 	 * Branches do not cause an exception.
191 	 */
192 	regs->cp0_epc += 2;
193 
194 	return 0;
195 }
196 
197 /**
198  * __compute_return_epc_for_insn - Computes the return address and do emulate
199  *				    branch simulation, if required.
200  *
201  * @regs:	Pointer to pt_regs
202  * @insn:	branch instruction to decode
203  * @returns:	-EFAULT on error and forces SIGBUS, and on success
204  *		returns 0 or BRANCH_LIKELY_TAKEN as appropriate after
205  *		evaluating the branch.
206  */
207 int __compute_return_epc_for_insn(struct pt_regs *regs,
208 				   union mips_instruction insn)
209 {
210 	unsigned int bit, fcr31, dspcontrol;
211 	long epc = regs->cp0_epc;
212 	int ret = 0;
213 
214 	switch (insn.i_format.opcode) {
215 	/*
216 	 * jr and jalr are in r_format format.
217 	 */
218 	case spec_op:
219 		switch (insn.r_format.func) {
220 		case jalr_op:
221 			regs->regs[insn.r_format.rd] = epc + 8;
222 			/* Fall through */
223 		case jr_op:
224 			regs->cp0_epc = regs->regs[insn.r_format.rs];
225 			break;
226 		}
227 		break;
228 
229 	/*
230 	 * This group contains:
231 	 * bltz_op, bgez_op, bltzl_op, bgezl_op,
232 	 * bltzal_op, bgezal_op, bltzall_op, bgezall_op.
233 	 */
234 	case bcond_op:
235 		switch (insn.i_format.rt) {
236 		case bltz_op:
237 		case bltzl_op:
238 			if ((long)regs->regs[insn.i_format.rs] < 0) {
239 				epc = epc + 4 + (insn.i_format.simmediate << 2);
240 				if (insn.i_format.rt == bltzl_op)
241 					ret = BRANCH_LIKELY_TAKEN;
242 			} else
243 				epc += 8;
244 			regs->cp0_epc = epc;
245 			break;
246 
247 		case bgez_op:
248 		case bgezl_op:
249 			if ((long)regs->regs[insn.i_format.rs] >= 0) {
250 				epc = epc + 4 + (insn.i_format.simmediate << 2);
251 				if (insn.i_format.rt == bgezl_op)
252 					ret = BRANCH_LIKELY_TAKEN;
253 			} else
254 				epc += 8;
255 			regs->cp0_epc = epc;
256 			break;
257 
258 		case bltzal_op:
259 		case bltzall_op:
260 			regs->regs[31] = epc + 8;
261 			if ((long)regs->regs[insn.i_format.rs] < 0) {
262 				epc = epc + 4 + (insn.i_format.simmediate << 2);
263 				if (insn.i_format.rt == bltzall_op)
264 					ret = BRANCH_LIKELY_TAKEN;
265 			} else
266 				epc += 8;
267 			regs->cp0_epc = epc;
268 			break;
269 
270 		case bgezal_op:
271 		case bgezall_op:
272 			regs->regs[31] = epc + 8;
273 			if ((long)regs->regs[insn.i_format.rs] >= 0) {
274 				epc = epc + 4 + (insn.i_format.simmediate << 2);
275 				if (insn.i_format.rt == bgezall_op)
276 					ret = BRANCH_LIKELY_TAKEN;
277 			} else
278 				epc += 8;
279 			regs->cp0_epc = epc;
280 			break;
281 
282 		case bposge32_op:
283 			if (!cpu_has_dsp)
284 				goto sigill;
285 
286 			dspcontrol = rddsp(0x01);
287 
288 			if (dspcontrol >= 32) {
289 				epc = epc + 4 + (insn.i_format.simmediate << 2);
290 			} else
291 				epc += 8;
292 			regs->cp0_epc = epc;
293 			break;
294 		}
295 		break;
296 
297 	/*
298 	 * These are unconditional and in j_format.
299 	 */
300 	case jal_op:
301 		regs->regs[31] = regs->cp0_epc + 8;
302 	case j_op:
303 		epc += 4;
304 		epc >>= 28;
305 		epc <<= 28;
306 		epc |= (insn.j_format.target << 2);
307 		regs->cp0_epc = epc;
308 		if (insn.i_format.opcode == jalx_op)
309 			set_isa16_mode(regs->cp0_epc);
310 		break;
311 
312 	/*
313 	 * These are conditional and in i_format.
314 	 */
315 	case beq_op:
316 	case beql_op:
317 		if (regs->regs[insn.i_format.rs] ==
318 		    regs->regs[insn.i_format.rt]) {
319 			epc = epc + 4 + (insn.i_format.simmediate << 2);
320 			if (insn.i_format.rt == beql_op)
321 				ret = BRANCH_LIKELY_TAKEN;
322 		} else
323 			epc += 8;
324 		regs->cp0_epc = epc;
325 		break;
326 
327 	case bne_op:
328 	case bnel_op:
329 		if (regs->regs[insn.i_format.rs] !=
330 		    regs->regs[insn.i_format.rt]) {
331 			epc = epc + 4 + (insn.i_format.simmediate << 2);
332 			if (insn.i_format.rt == bnel_op)
333 				ret = BRANCH_LIKELY_TAKEN;
334 		} else
335 			epc += 8;
336 		regs->cp0_epc = epc;
337 		break;
338 
339 	case blez_op: /* not really i_format */
340 	case blezl_op:
341 		/* rt field assumed to be zero */
342 		if ((long)regs->regs[insn.i_format.rs] <= 0) {
343 			epc = epc + 4 + (insn.i_format.simmediate << 2);
344 			if (insn.i_format.rt == bnel_op)
345 				ret = BRANCH_LIKELY_TAKEN;
346 		} else
347 			epc += 8;
348 		regs->cp0_epc = epc;
349 		break;
350 
351 	case bgtz_op:
352 	case bgtzl_op:
353 		/* rt field assumed to be zero */
354 		if ((long)regs->regs[insn.i_format.rs] > 0) {
355 			epc = epc + 4 + (insn.i_format.simmediate << 2);
356 			if (insn.i_format.rt == bnel_op)
357 				ret = BRANCH_LIKELY_TAKEN;
358 		} else
359 			epc += 8;
360 		regs->cp0_epc = epc;
361 		break;
362 
363 	/*
364 	 * And now the FPA/cp1 branch instructions.
365 	 */
366 	case cop1_op:
367 		preempt_disable();
368 		if (is_fpu_owner())
369 			asm volatile("cfc1\t%0,$31" : "=r" (fcr31));
370 		else
371 			fcr31 = current->thread.fpu.fcr31;
372 		preempt_enable();
373 
374 		bit = (insn.i_format.rt >> 2);
375 		bit += (bit != 0);
376 		bit += 23;
377 		switch (insn.i_format.rt & 3) {
378 		case 0: /* bc1f */
379 		case 2: /* bc1fl */
380 			if (~fcr31 & (1 << bit)) {
381 				epc = epc + 4 + (insn.i_format.simmediate << 2);
382 				if (insn.i_format.rt == 2)
383 					ret = BRANCH_LIKELY_TAKEN;
384 			} else
385 				epc += 8;
386 			regs->cp0_epc = epc;
387 			break;
388 
389 		case 1: /* bc1t */
390 		case 3: /* bc1tl */
391 			if (fcr31 & (1 << bit)) {
392 				epc = epc + 4 + (insn.i_format.simmediate << 2);
393 				if (insn.i_format.rt == 3)
394 					ret = BRANCH_LIKELY_TAKEN;
395 			} else
396 				epc += 8;
397 			regs->cp0_epc = epc;
398 			break;
399 		}
400 		break;
401 #ifdef CONFIG_CPU_CAVIUM_OCTEON
402 	case lwc2_op: /* This is bbit0 on Octeon */
403 		if ((regs->regs[insn.i_format.rs] & (1ull<<insn.i_format.rt))
404 		     == 0)
405 			epc = epc + 4 + (insn.i_format.simmediate << 2);
406 		else
407 			epc += 8;
408 		regs->cp0_epc = epc;
409 		break;
410 	case ldc2_op: /* This is bbit032 on Octeon */
411 		if ((regs->regs[insn.i_format.rs] &
412 		    (1ull<<(insn.i_format.rt+32))) == 0)
413 			epc = epc + 4 + (insn.i_format.simmediate << 2);
414 		else
415 			epc += 8;
416 		regs->cp0_epc = epc;
417 		break;
418 	case swc2_op: /* This is bbit1 on Octeon */
419 		if (regs->regs[insn.i_format.rs] & (1ull<<insn.i_format.rt))
420 			epc = epc + 4 + (insn.i_format.simmediate << 2);
421 		else
422 			epc += 8;
423 		regs->cp0_epc = epc;
424 		break;
425 	case sdc2_op: /* This is bbit132 on Octeon */
426 		if (regs->regs[insn.i_format.rs] &
427 		    (1ull<<(insn.i_format.rt+32)))
428 			epc = epc + 4 + (insn.i_format.simmediate << 2);
429 		else
430 			epc += 8;
431 		regs->cp0_epc = epc;
432 		break;
433 #endif
434 	}
435 
436 	return ret;
437 
438 sigill:
439 	printk("%s: DSP branch but not DSP ASE - sending SIGBUS.\n", current->comm);
440 	force_sig(SIGBUS, current);
441 	return -EFAULT;
442 }
443 EXPORT_SYMBOL_GPL(__compute_return_epc_for_insn);
444 
445 int __compute_return_epc(struct pt_regs *regs)
446 {
447 	unsigned int __user *addr;
448 	long epc;
449 	union mips_instruction insn;
450 
451 	epc = regs->cp0_epc;
452 	if (epc & 3)
453 		goto unaligned;
454 
455 	/*
456 	 * Read the instruction
457 	 */
458 	addr = (unsigned int __user *) epc;
459 	if (__get_user(insn.word, addr)) {
460 		force_sig(SIGSEGV, current);
461 		return -EFAULT;
462 	}
463 
464 	return __compute_return_epc_for_insn(regs, insn);
465 
466 unaligned:
467 	printk("%s: unaligned epc - sending SIGBUS.\n", current->comm);
468 	force_sig(SIGBUS, current);
469 	return -EFAULT;
470 }
471