blob: 04ffab970aeced7af721d5e19f79b874f885dfc0 [file] [log] [blame]
Paul Mackerras14cf11a2005-09-26 16:04:21 +10001/*
2 * Single-step support.
3 *
4 * Copyright (C) 2004 Paul Mackerras <paulus@au.ibm.com>, IBM
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License
8 * as published by the Free Software Foundation; either version
9 * 2 of the License, or (at your option) any later version.
10 */
11#include <linux/kernel.h>
Gui,Jian0d69a052006-11-01 10:50:15 +080012#include <linux/kprobes.h>
Paul Mackerras14cf11a2005-09-26 16:04:21 +100013#include <linux/ptrace.h>
Linus Torvalds268bb0c2011-05-20 12:50:29 -070014#include <linux/prefetch.h>
Paul Mackerras14cf11a2005-09-26 16:04:21 +100015#include <asm/sstep.h>
16#include <asm/processor.h>
Linus Torvalds7c0f6ba2016-12-24 11:46:01 -080017#include <linux/uaccess.h>
Michael Ellerman5e9d0e32016-11-18 11:51:14 +110018#include <asm/cpu_has_feature.h>
Paul Mackerras0016a4c2010-06-15 14:48:58 +100019#include <asm/cputable.h>
Paul Mackerras14cf11a2005-09-26 16:04:21 +100020
21extern char system_call_common[];
22
Paul Mackerrasc0325242005-10-28 22:48:08 +100023#ifdef CONFIG_PPC64
Paul Mackerras14cf11a2005-09-26 16:04:21 +100024/* Bits in SRR1 that are copied from MSR */
Stephen Rothwellaf308372006-03-23 17:38:10 +110025#define MSR_MASK 0xffffffff87c0ffffUL
Paul Mackerrasc0325242005-10-28 22:48:08 +100026#else
27#define MSR_MASK 0x87c0ffff
28#endif
Paul Mackerras14cf11a2005-09-26 16:04:21 +100029
Paul Mackerras0016a4c2010-06-15 14:48:58 +100030/* Bits in XER */
31#define XER_SO 0x80000000U
32#define XER_OV 0x40000000U
33#define XER_CA 0x20000000U
34
Sean MacLennancd64d162010-09-01 07:21:21 +000035#ifdef CONFIG_PPC_FPU
Paul Mackerras0016a4c2010-06-15 14:48:58 +100036/*
37 * Functions in ldstfp.S
38 */
Paul Mackerrasc22435a52017-08-30 14:12:33 +100039extern void get_fpr(int rn, double *p);
40extern void put_fpr(int rn, const double *p);
41extern void get_vr(int rn, __vector128 *p);
42extern void put_vr(int rn, __vector128 *p);
Paul Mackerras350779a2017-08-30 14:12:27 +100043extern void load_vsrn(int vsr, const void *p);
44extern void store_vsrn(int vsr, void *p);
45extern void conv_sp_to_dp(const float *sp, double *dp);
46extern void conv_dp_to_sp(const double *dp, float *sp);
47#endif
48
49#ifdef __powerpc64__
50/*
51 * Functions in quad.S
52 */
53extern int do_lq(unsigned long ea, unsigned long *regs);
54extern int do_stq(unsigned long ea, unsigned long val0, unsigned long val1);
55extern int do_lqarx(unsigned long ea, unsigned long *regs);
56extern int do_stqcx(unsigned long ea, unsigned long val0, unsigned long val1,
57 unsigned int *crp);
58#endif
59
60#ifdef __LITTLE_ENDIAN__
61#define IS_LE 1
62#define IS_BE 0
63#else
64#define IS_LE 0
65#define IS_BE 1
Sean MacLennancd64d162010-09-01 07:21:21 +000066#endif
Paul Mackerras0016a4c2010-06-15 14:48:58 +100067
Paul Mackerras14cf11a2005-09-26 16:04:21 +100068/*
Michael Ellermanb91e1362011-04-07 21:56:04 +000069 * Emulate the truncation of 64 bit values in 32-bit mode.
70 */
Naveen N. Rao71f6e582017-04-12 16:48:51 +053071static nokprobe_inline unsigned long truncate_if_32bit(unsigned long msr,
72 unsigned long val)
Michael Ellermanb91e1362011-04-07 21:56:04 +000073{
74#ifdef __powerpc64__
75 if ((msr & MSR_64BIT) == 0)
76 val &= 0xffffffffUL;
77#endif
78 return val;
79}
80
81/*
Paul Mackerras14cf11a2005-09-26 16:04:21 +100082 * Determine whether a conditional branch instruction would branch.
83 */
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +100084static nokprobe_inline int branch_taken(unsigned int instr,
85 const struct pt_regs *regs,
86 struct instruction_op *op)
Paul Mackerras14cf11a2005-09-26 16:04:21 +100087{
88 unsigned int bo = (instr >> 21) & 0x1f;
89 unsigned int bi;
90
91 if ((bo & 4) == 0) {
92 /* decrement counter */
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +100093 op->type |= DECCTR;
94 if (((bo >> 1) & 1) ^ (regs->ctr == 1))
Paul Mackerras14cf11a2005-09-26 16:04:21 +100095 return 0;
96 }
97 if ((bo & 0x10) == 0) {
98 /* check bit from CR */
99 bi = (instr >> 16) & 0x1f;
100 if (((regs->ccr >> (31 - bi)) & 1) != ((bo >> 3) & 1))
101 return 0;
102 }
103 return 1;
104}
105
Paul Mackerrasb9da9c82017-08-30 14:12:37 +1000106static nokprobe_inline long address_ok(struct pt_regs *regs,
107 unsigned long ea, int nb)
Paul Mackerras0016a4c2010-06-15 14:48:58 +1000108{
109 if (!user_mode(regs))
110 return 1;
Paul Mackerrasb9da9c82017-08-30 14:12:37 +1000111 if (__access_ok(ea, nb, USER_DS))
112 return 1;
113 if (__access_ok(ea, 1, USER_DS))
114 /* Access overlaps the end of the user region */
115 regs->dar = USER_DS.seg;
116 else
117 regs->dar = ea;
118 return 0;
Paul Mackerras0016a4c2010-06-15 14:48:58 +1000119}
120
Paul Mackerras14cf11a2005-09-26 16:04:21 +1000121/*
Paul Mackerras0016a4c2010-06-15 14:48:58 +1000122 * Calculate effective address for a D-form instruction
123 */
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +1000124static nokprobe_inline unsigned long dform_ea(unsigned int instr,
125 const struct pt_regs *regs)
Paul Mackerras0016a4c2010-06-15 14:48:58 +1000126{
127 int ra;
128 unsigned long ea;
129
130 ra = (instr >> 16) & 0x1f;
131 ea = (signed short) instr; /* sign-extend */
Paul Mackerrasbe96f632014-09-02 14:35:07 +1000132 if (ra)
Paul Mackerras0016a4c2010-06-15 14:48:58 +1000133 ea += regs->gpr[ra];
Michael Ellermanb91e1362011-04-07 21:56:04 +0000134
Paul Mackerrasd120cdb2017-08-30 14:12:28 +1000135 return ea;
Paul Mackerras0016a4c2010-06-15 14:48:58 +1000136}
137
138#ifdef __powerpc64__
139/*
140 * Calculate effective address for a DS-form instruction
141 */
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +1000142static nokprobe_inline unsigned long dsform_ea(unsigned int instr,
143 const struct pt_regs *regs)
Paul Mackerras0016a4c2010-06-15 14:48:58 +1000144{
145 int ra;
146 unsigned long ea;
147
148 ra = (instr >> 16) & 0x1f;
149 ea = (signed short) (instr & ~3); /* sign-extend */
Paul Mackerrasbe96f632014-09-02 14:35:07 +1000150 if (ra)
Paul Mackerras0016a4c2010-06-15 14:48:58 +1000151 ea += regs->gpr[ra];
Michael Ellermanb91e1362011-04-07 21:56:04 +0000152
Paul Mackerrasd120cdb2017-08-30 14:12:28 +1000153 return ea;
Paul Mackerras0016a4c2010-06-15 14:48:58 +1000154}
Paul Mackerras350779a2017-08-30 14:12:27 +1000155
156/*
157 * Calculate effective address for a DQ-form instruction
158 */
159static nokprobe_inline unsigned long dqform_ea(unsigned int instr,
160 const struct pt_regs *regs)
161{
162 int ra;
163 unsigned long ea;
164
165 ra = (instr >> 16) & 0x1f;
166 ea = (signed short) (instr & ~0xf); /* sign-extend */
167 if (ra)
168 ea += regs->gpr[ra];
169
Paul Mackerrasd120cdb2017-08-30 14:12:28 +1000170 return ea;
Paul Mackerras350779a2017-08-30 14:12:27 +1000171}
Paul Mackerras0016a4c2010-06-15 14:48:58 +1000172#endif /* __powerpc64 */
173
174/*
175 * Calculate effective address for an X-form instruction
176 */
Naveen N. Rao71f6e582017-04-12 16:48:51 +0530177static nokprobe_inline unsigned long xform_ea(unsigned int instr,
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +1000178 const struct pt_regs *regs)
Paul Mackerras0016a4c2010-06-15 14:48:58 +1000179{
180 int ra, rb;
181 unsigned long ea;
182
183 ra = (instr >> 16) & 0x1f;
184 rb = (instr >> 11) & 0x1f;
185 ea = regs->gpr[rb];
Paul Mackerrasbe96f632014-09-02 14:35:07 +1000186 if (ra)
Paul Mackerras0016a4c2010-06-15 14:48:58 +1000187 ea += regs->gpr[ra];
Michael Ellermanb91e1362011-04-07 21:56:04 +0000188
Paul Mackerrasd120cdb2017-08-30 14:12:28 +1000189 return ea;
Paul Mackerras0016a4c2010-06-15 14:48:58 +1000190}
191
192/*
193 * Return the largest power of 2, not greater than sizeof(unsigned long),
194 * such that x is a multiple of it.
195 */
Naveen N. Rao71f6e582017-04-12 16:48:51 +0530196static nokprobe_inline unsigned long max_align(unsigned long x)
Paul Mackerras0016a4c2010-06-15 14:48:58 +1000197{
198 x |= sizeof(unsigned long);
199 return x & -x; /* isolates rightmost bit */
200}
201
Naveen N. Rao71f6e582017-04-12 16:48:51 +0530202static nokprobe_inline unsigned long byterev_2(unsigned long x)
Paul Mackerras0016a4c2010-06-15 14:48:58 +1000203{
204 return ((x >> 8) & 0xff) | ((x & 0xff) << 8);
205}
206
Naveen N. Rao71f6e582017-04-12 16:48:51 +0530207static nokprobe_inline unsigned long byterev_4(unsigned long x)
Paul Mackerras0016a4c2010-06-15 14:48:58 +1000208{
209 return ((x >> 24) & 0xff) | ((x >> 8) & 0xff00) |
210 ((x & 0xff00) << 8) | ((x & 0xff) << 24);
211}
212
213#ifdef __powerpc64__
Naveen N. Rao71f6e582017-04-12 16:48:51 +0530214static nokprobe_inline unsigned long byterev_8(unsigned long x)
Paul Mackerras0016a4c2010-06-15 14:48:58 +1000215{
216 return (byterev_4(x) << 32) | byterev_4(x >> 32);
217}
218#endif
219
Naveen N. Rao71f6e582017-04-12 16:48:51 +0530220static nokprobe_inline int read_mem_aligned(unsigned long *dest,
Paul Mackerrasb9da9c82017-08-30 14:12:37 +1000221 unsigned long ea, int nb,
222 struct pt_regs *regs)
Paul Mackerras0016a4c2010-06-15 14:48:58 +1000223{
224 int err = 0;
225 unsigned long x = 0;
226
227 switch (nb) {
228 case 1:
229 err = __get_user(x, (unsigned char __user *) ea);
230 break;
231 case 2:
232 err = __get_user(x, (unsigned short __user *) ea);
233 break;
234 case 4:
235 err = __get_user(x, (unsigned int __user *) ea);
236 break;
237#ifdef __powerpc64__
238 case 8:
239 err = __get_user(x, (unsigned long __user *) ea);
240 break;
241#endif
242 }
243 if (!err)
244 *dest = x;
Paul Mackerrasb9da9c82017-08-30 14:12:37 +1000245 else
246 regs->dar = ea;
Paul Mackerras0016a4c2010-06-15 14:48:58 +1000247 return err;
248}
249
Paul Mackerrase0a09862017-08-30 14:12:32 +1000250/*
251 * Copy from userspace to a buffer, using the largest possible
252 * aligned accesses, up to sizeof(long).
253 */
Paul Mackerrasb9da9c82017-08-30 14:12:37 +1000254static int nokprobe_inline copy_mem_in(u8 *dest, unsigned long ea, int nb,
255 struct pt_regs *regs)
Paul Mackerras0016a4c2010-06-15 14:48:58 +1000256{
Paul Mackerrase0a09862017-08-30 14:12:32 +1000257 int err = 0;
258 int c;
Paul Mackerras0016a4c2010-06-15 14:48:58 +1000259
Paul Mackerras0016a4c2010-06-15 14:48:58 +1000260 for (; nb > 0; nb -= c) {
261 c = max_align(ea);
262 if (c > nb)
263 c = max_align(nb);
Paul Mackerrase0a09862017-08-30 14:12:32 +1000264 switch (c) {
265 case 1:
266 err = __get_user(*dest, (unsigned char __user *) ea);
267 break;
268 case 2:
269 err = __get_user(*(u16 *)dest,
270 (unsigned short __user *) ea);
271 break;
272 case 4:
273 err = __get_user(*(u32 *)dest,
274 (unsigned int __user *) ea);
275 break;
276#ifdef __powerpc64__
277 case 8:
278 err = __get_user(*(unsigned long *)dest,
279 (unsigned long __user *) ea);
280 break;
281#endif
282 }
Paul Mackerrasb9da9c82017-08-30 14:12:37 +1000283 if (err) {
284 regs->dar = ea;
Paul Mackerras0016a4c2010-06-15 14:48:58 +1000285 return err;
Paul Mackerrasb9da9c82017-08-30 14:12:37 +1000286 }
Paul Mackerrase0a09862017-08-30 14:12:32 +1000287 dest += c;
Paul Mackerras0016a4c2010-06-15 14:48:58 +1000288 ea += c;
289 }
Paul Mackerras0016a4c2010-06-15 14:48:58 +1000290 return 0;
291}
292
Paul Mackerrase0a09862017-08-30 14:12:32 +1000293static nokprobe_inline int read_mem_unaligned(unsigned long *dest,
294 unsigned long ea, int nb,
295 struct pt_regs *regs)
296{
297 union {
298 unsigned long ul;
299 u8 b[sizeof(unsigned long)];
300 } u;
301 int i;
302 int err;
303
304 u.ul = 0;
305 i = IS_BE ? sizeof(unsigned long) - nb : 0;
Paul Mackerrasb9da9c82017-08-30 14:12:37 +1000306 err = copy_mem_in(&u.b[i], ea, nb, regs);
Paul Mackerrase0a09862017-08-30 14:12:32 +1000307 if (!err)
308 *dest = u.ul;
309 return err;
310}
311
Paul Mackerras0016a4c2010-06-15 14:48:58 +1000312/*
313 * Read memory at address ea for nb bytes, return 0 for success
Paul Mackerrase0a09862017-08-30 14:12:32 +1000314 * or -EFAULT if an error occurred. N.B. nb must be 1, 2, 4 or 8.
315 * If nb < sizeof(long), the result is right-justified on BE systems.
Paul Mackerras0016a4c2010-06-15 14:48:58 +1000316 */
Naveen N. Rao71f6e582017-04-12 16:48:51 +0530317static int read_mem(unsigned long *dest, unsigned long ea, int nb,
Paul Mackerras0016a4c2010-06-15 14:48:58 +1000318 struct pt_regs *regs)
319{
320 if (!address_ok(regs, ea, nb))
321 return -EFAULT;
322 if ((ea & (nb - 1)) == 0)
Paul Mackerrasb9da9c82017-08-30 14:12:37 +1000323 return read_mem_aligned(dest, ea, nb, regs);
Paul Mackerras0016a4c2010-06-15 14:48:58 +1000324 return read_mem_unaligned(dest, ea, nb, regs);
325}
Naveen N. Rao71f6e582017-04-12 16:48:51 +0530326NOKPROBE_SYMBOL(read_mem);
Paul Mackerras0016a4c2010-06-15 14:48:58 +1000327
Naveen N. Rao71f6e582017-04-12 16:48:51 +0530328static nokprobe_inline int write_mem_aligned(unsigned long val,
Paul Mackerrasb9da9c82017-08-30 14:12:37 +1000329 unsigned long ea, int nb,
330 struct pt_regs *regs)
Paul Mackerras0016a4c2010-06-15 14:48:58 +1000331{
332 int err = 0;
333
334 switch (nb) {
335 case 1:
336 err = __put_user(val, (unsigned char __user *) ea);
337 break;
338 case 2:
339 err = __put_user(val, (unsigned short __user *) ea);
340 break;
341 case 4:
342 err = __put_user(val, (unsigned int __user *) ea);
343 break;
344#ifdef __powerpc64__
345 case 8:
346 err = __put_user(val, (unsigned long __user *) ea);
347 break;
348#endif
349 }
Paul Mackerrasb9da9c82017-08-30 14:12:37 +1000350 if (err)
351 regs->dar = ea;
Paul Mackerras0016a4c2010-06-15 14:48:58 +1000352 return err;
353}
354
Paul Mackerrase0a09862017-08-30 14:12:32 +1000355/*
356 * Copy from a buffer to userspace, using the largest possible
357 * aligned accesses, up to sizeof(long).
358 */
Paul Mackerrasb9da9c82017-08-30 14:12:37 +1000359static int nokprobe_inline copy_mem_out(u8 *dest, unsigned long ea, int nb,
360 struct pt_regs *regs)
Paul Mackerras0016a4c2010-06-15 14:48:58 +1000361{
Paul Mackerrase0a09862017-08-30 14:12:32 +1000362 int err = 0;
363 int c;
Paul Mackerras0016a4c2010-06-15 14:48:58 +1000364
Paul Mackerras0016a4c2010-06-15 14:48:58 +1000365 for (; nb > 0; nb -= c) {
366 c = max_align(ea);
367 if (c > nb)
368 c = max_align(nb);
Paul Mackerrase0a09862017-08-30 14:12:32 +1000369 switch (c) {
370 case 1:
371 err = __put_user(*dest, (unsigned char __user *) ea);
372 break;
373 case 2:
374 err = __put_user(*(u16 *)dest,
375 (unsigned short __user *) ea);
376 break;
377 case 4:
378 err = __put_user(*(u32 *)dest,
379 (unsigned int __user *) ea);
380 break;
381#ifdef __powerpc64__
382 case 8:
383 err = __put_user(*(unsigned long *)dest,
384 (unsigned long __user *) ea);
385 break;
386#endif
387 }
Paul Mackerrasb9da9c82017-08-30 14:12:37 +1000388 if (err) {
389 regs->dar = ea;
Paul Mackerras0016a4c2010-06-15 14:48:58 +1000390 return err;
Paul Mackerrasb9da9c82017-08-30 14:12:37 +1000391 }
Paul Mackerrase0a09862017-08-30 14:12:32 +1000392 dest += c;
Tom Musta17e8de72013-08-22 09:25:28 -0500393 ea += c;
Paul Mackerras0016a4c2010-06-15 14:48:58 +1000394 }
395 return 0;
396}
397
Paul Mackerrase0a09862017-08-30 14:12:32 +1000398static nokprobe_inline int write_mem_unaligned(unsigned long val,
399 unsigned long ea, int nb,
400 struct pt_regs *regs)
401{
402 union {
403 unsigned long ul;
404 u8 b[sizeof(unsigned long)];
405 } u;
406 int i;
407
408 u.ul = val;
409 i = IS_BE ? sizeof(unsigned long) - nb : 0;
Paul Mackerrasb9da9c82017-08-30 14:12:37 +1000410 return copy_mem_out(&u.b[i], ea, nb, regs);
Paul Mackerrase0a09862017-08-30 14:12:32 +1000411}
412
Paul Mackerras0016a4c2010-06-15 14:48:58 +1000413/*
414 * Write memory at address ea for nb bytes, return 0 for success
Paul Mackerrase0a09862017-08-30 14:12:32 +1000415 * or -EFAULT if an error occurred. N.B. nb must be 1, 2, 4 or 8.
Paul Mackerras0016a4c2010-06-15 14:48:58 +1000416 */
Naveen N. Rao71f6e582017-04-12 16:48:51 +0530417static int write_mem(unsigned long val, unsigned long ea, int nb,
Paul Mackerras0016a4c2010-06-15 14:48:58 +1000418 struct pt_regs *regs)
419{
420 if (!address_ok(regs, ea, nb))
421 return -EFAULT;
422 if ((ea & (nb - 1)) == 0)
Paul Mackerrasb9da9c82017-08-30 14:12:37 +1000423 return write_mem_aligned(val, ea, nb, regs);
Paul Mackerras0016a4c2010-06-15 14:48:58 +1000424 return write_mem_unaligned(val, ea, nb, regs);
425}
Naveen N. Rao71f6e582017-04-12 16:48:51 +0530426NOKPROBE_SYMBOL(write_mem);
Paul Mackerras0016a4c2010-06-15 14:48:58 +1000427
Sean MacLennancd64d162010-09-01 07:21:21 +0000428#ifdef CONFIG_PPC_FPU
Paul Mackerras0016a4c2010-06-15 14:48:58 +1000429/*
Paul Mackerrasc22435a52017-08-30 14:12:33 +1000430 * These access either the real FP register or the image in the
431 * thread_struct, depending on regs->msr & MSR_FP.
Paul Mackerras0016a4c2010-06-15 14:48:58 +1000432 */
Paul Mackerrasc22435a52017-08-30 14:12:33 +1000433static int do_fp_load(int rn, unsigned long ea, int nb, struct pt_regs *regs)
Paul Mackerras0016a4c2010-06-15 14:48:58 +1000434{
435 int err;
Paul Mackerrasc22435a52017-08-30 14:12:33 +1000436 union {
437 float f;
Paul Mackerras1f41fb72017-08-30 14:12:35 +1000438 double d[2];
439 unsigned long l[2];
440 u8 b[2 * sizeof(double)];
Paul Mackerrasc22435a52017-08-30 14:12:33 +1000441 } u;
Paul Mackerras0016a4c2010-06-15 14:48:58 +1000442
443 if (!address_ok(regs, ea, nb))
444 return -EFAULT;
Paul Mackerrasb9da9c82017-08-30 14:12:37 +1000445 err = copy_mem_in(u.b, ea, nb, regs);
Paul Mackerrasc22435a52017-08-30 14:12:33 +1000446 if (err)
447 return err;
448 preempt_disable();
449 if (nb == 4)
Paul Mackerras1f41fb72017-08-30 14:12:35 +1000450 conv_sp_to_dp(&u.f, &u.d[0]);
Paul Mackerrasc22435a52017-08-30 14:12:33 +1000451 if (regs->msr & MSR_FP)
Paul Mackerras1f41fb72017-08-30 14:12:35 +1000452 put_fpr(rn, &u.d[0]);
Paul Mackerrasc22435a52017-08-30 14:12:33 +1000453 else
Paul Mackerras1f41fb72017-08-30 14:12:35 +1000454 current->thread.TS_FPR(rn) = u.l[0];
455 if (nb == 16) {
456 /* lfdp */
457 rn |= 1;
458 if (regs->msr & MSR_FP)
459 put_fpr(rn, &u.d[1]);
460 else
461 current->thread.TS_FPR(rn) = u.l[1];
462 }
Paul Mackerrasc22435a52017-08-30 14:12:33 +1000463 preempt_enable();
464 return 0;
Paul Mackerras0016a4c2010-06-15 14:48:58 +1000465}
Naveen N. Rao71f6e582017-04-12 16:48:51 +0530466NOKPROBE_SYMBOL(do_fp_load);
Paul Mackerras0016a4c2010-06-15 14:48:58 +1000467
Paul Mackerrasc22435a52017-08-30 14:12:33 +1000468static int do_fp_store(int rn, unsigned long ea, int nb, struct pt_regs *regs)
Paul Mackerras0016a4c2010-06-15 14:48:58 +1000469{
Paul Mackerrasc22435a52017-08-30 14:12:33 +1000470 union {
471 float f;
Paul Mackerras1f41fb72017-08-30 14:12:35 +1000472 double d[2];
473 unsigned long l[2];
474 u8 b[2 * sizeof(double)];
Paul Mackerrasc22435a52017-08-30 14:12:33 +1000475 } u;
Paul Mackerras0016a4c2010-06-15 14:48:58 +1000476
477 if (!address_ok(regs, ea, nb))
478 return -EFAULT;
Paul Mackerrasc22435a52017-08-30 14:12:33 +1000479 preempt_disable();
480 if (regs->msr & MSR_FP)
Paul Mackerras1f41fb72017-08-30 14:12:35 +1000481 get_fpr(rn, &u.d[0]);
Paul Mackerrasc22435a52017-08-30 14:12:33 +1000482 else
Paul Mackerras1f41fb72017-08-30 14:12:35 +1000483 u.l[0] = current->thread.TS_FPR(rn);
Paul Mackerrasc22435a52017-08-30 14:12:33 +1000484 if (nb == 4)
Paul Mackerras1f41fb72017-08-30 14:12:35 +1000485 conv_dp_to_sp(&u.d[0], &u.f);
486 if (nb == 16) {
487 rn |= 1;
488 if (regs->msr & MSR_FP)
489 get_fpr(rn, &u.d[1]);
490 else
491 u.l[1] = current->thread.TS_FPR(rn);
492 }
Paul Mackerrasc22435a52017-08-30 14:12:33 +1000493 preempt_enable();
Paul Mackerrasb9da9c82017-08-30 14:12:37 +1000494 return copy_mem_out(u.b, ea, nb, regs);
Paul Mackerras0016a4c2010-06-15 14:48:58 +1000495}
Naveen N. Rao71f6e582017-04-12 16:48:51 +0530496NOKPROBE_SYMBOL(do_fp_store);
Sean MacLennancd64d162010-09-01 07:21:21 +0000497#endif
Paul Mackerras0016a4c2010-06-15 14:48:58 +1000498
499#ifdef CONFIG_ALTIVEC
500/* For Altivec/VMX, no need to worry about alignment */
Paul Mackerrasc22435a52017-08-30 14:12:33 +1000501static nokprobe_inline int do_vec_load(int rn, unsigned long ea,
502 int size, struct pt_regs *regs)
Paul Mackerras0016a4c2010-06-15 14:48:58 +1000503{
Paul Mackerrasc22435a52017-08-30 14:12:33 +1000504 int err;
505 union {
506 __vector128 v;
507 u8 b[sizeof(__vector128)];
508 } u = {};
509
Paul Mackerras0016a4c2010-06-15 14:48:58 +1000510 if (!address_ok(regs, ea & ~0xfUL, 16))
511 return -EFAULT;
Paul Mackerrasc22435a52017-08-30 14:12:33 +1000512 /* align to multiple of size */
513 ea &= ~(size - 1);
Paul Mackerrasb9da9c82017-08-30 14:12:37 +1000514 err = copy_mem_in(&u.b[ea & 0xf], ea, size, regs);
Paul Mackerrasc22435a52017-08-30 14:12:33 +1000515 if (err)
516 return err;
517
518 preempt_disable();
519 if (regs->msr & MSR_VEC)
520 put_vr(rn, &u.v);
521 else
522 current->thread.vr_state.vr[rn] = u.v;
523 preempt_enable();
524 return 0;
Paul Mackerras0016a4c2010-06-15 14:48:58 +1000525}
526
Paul Mackerrasc22435a52017-08-30 14:12:33 +1000527static nokprobe_inline int do_vec_store(int rn, unsigned long ea,
528 int size, struct pt_regs *regs)
Paul Mackerras0016a4c2010-06-15 14:48:58 +1000529{
Paul Mackerrasc22435a52017-08-30 14:12:33 +1000530 union {
531 __vector128 v;
532 u8 b[sizeof(__vector128)];
533 } u;
534
Paul Mackerras0016a4c2010-06-15 14:48:58 +1000535 if (!address_ok(regs, ea & ~0xfUL, 16))
536 return -EFAULT;
Paul Mackerrasc22435a52017-08-30 14:12:33 +1000537 /* align to multiple of size */
538 ea &= ~(size - 1);
539
540 preempt_disable();
541 if (regs->msr & MSR_VEC)
542 get_vr(rn, &u.v);
543 else
544 u.v = current->thread.vr_state.vr[rn];
545 preempt_enable();
Paul Mackerrasb9da9c82017-08-30 14:12:37 +1000546 return copy_mem_out(&u.b[ea & 0xf], ea, size, regs);
Paul Mackerras0016a4c2010-06-15 14:48:58 +1000547}
548#endif /* CONFIG_ALTIVEC */
549
Paul Mackerras350779a2017-08-30 14:12:27 +1000550#ifdef __powerpc64__
551static nokprobe_inline int emulate_lq(struct pt_regs *regs, unsigned long ea,
552 int reg)
553{
554 int err;
555
556 if (!address_ok(regs, ea, 16))
557 return -EFAULT;
558 /* if aligned, should be atomic */
559 if ((ea & 0xf) == 0)
560 return do_lq(ea, &regs->gpr[reg]);
561
562 err = read_mem(&regs->gpr[reg + IS_LE], ea, 8, regs);
563 if (!err)
564 err = read_mem(&regs->gpr[reg + IS_BE], ea + 8, 8, regs);
565 return err;
566}
567
568static nokprobe_inline int emulate_stq(struct pt_regs *regs, unsigned long ea,
569 int reg)
570{
571 int err;
572
573 if (!address_ok(regs, ea, 16))
574 return -EFAULT;
575 /* if aligned, should be atomic */
576 if ((ea & 0xf) == 0)
577 return do_stq(ea, regs->gpr[reg], regs->gpr[reg + 1]);
578
579 err = write_mem(regs->gpr[reg + IS_LE], ea, 8, regs);
580 if (!err)
581 err = write_mem(regs->gpr[reg + IS_BE], ea + 8, 8, regs);
582 return err;
583}
584#endif /* __powerpc64 */
585
Paul Mackerras0016a4c2010-06-15 14:48:58 +1000586#ifdef CONFIG_VSX
Paul Mackerras350779a2017-08-30 14:12:27 +1000587void emulate_vsx_load(struct instruction_op *op, union vsx_reg *reg,
588 const void *mem)
Paul Mackerras0016a4c2010-06-15 14:48:58 +1000589{
Paul Mackerras350779a2017-08-30 14:12:27 +1000590 int size, read_size;
591 int i, j;
592 const unsigned int *wp;
593 const unsigned short *hp;
594 const unsigned char *bp;
Paul Mackerras0016a4c2010-06-15 14:48:58 +1000595
Paul Mackerras350779a2017-08-30 14:12:27 +1000596 size = GETSIZE(op->type);
597 reg->d[0] = reg->d[1] = 0;
598
599 switch (op->element_size) {
600 case 16:
601 /* whole vector; lxv[x] or lxvl[l] */
602 if (size == 0)
603 break;
604 memcpy(reg, mem, size);
605 if (IS_LE && (op->vsx_flags & VSX_LDLEFT)) {
606 /* reverse 16 bytes */
607 unsigned long tmp;
608 tmp = byterev_8(reg->d[0]);
609 reg->d[0] = byterev_8(reg->d[1]);
610 reg->d[1] = tmp;
611 }
612 break;
613 case 8:
614 /* scalar loads, lxvd2x, lxvdsx */
615 read_size = (size >= 8) ? 8 : size;
616 i = IS_LE ? 8 : 8 - read_size;
617 memcpy(&reg->b[i], mem, read_size);
618 if (size < 8) {
619 if (op->type & SIGNEXT) {
620 /* size == 4 is the only case here */
621 reg->d[IS_LE] = (signed int) reg->d[IS_LE];
622 } else if (op->vsx_flags & VSX_FPCONV) {
623 preempt_disable();
624 conv_sp_to_dp(&reg->fp[1 + IS_LE],
625 &reg->dp[IS_LE]);
626 preempt_enable();
627 }
628 } else {
629 if (size == 16)
630 reg->d[IS_BE] = *(unsigned long *)(mem + 8);
631 else if (op->vsx_flags & VSX_SPLAT)
632 reg->d[IS_BE] = reg->d[IS_LE];
633 }
634 break;
635 case 4:
636 /* lxvw4x, lxvwsx */
637 wp = mem;
638 for (j = 0; j < size / 4; ++j) {
639 i = IS_LE ? 3 - j : j;
640 reg->w[i] = *wp++;
641 }
642 if (op->vsx_flags & VSX_SPLAT) {
643 u32 val = reg->w[IS_LE ? 3 : 0];
644 for (; j < 4; ++j) {
645 i = IS_LE ? 3 - j : j;
646 reg->w[i] = val;
647 }
648 }
649 break;
650 case 2:
651 /* lxvh8x */
652 hp = mem;
653 for (j = 0; j < size / 2; ++j) {
654 i = IS_LE ? 7 - j : j;
655 reg->h[i] = *hp++;
656 }
657 break;
658 case 1:
659 /* lxvb16x */
660 bp = mem;
661 for (j = 0; j < size; ++j) {
662 i = IS_LE ? 15 - j : j;
663 reg->b[i] = *bp++;
664 }
665 break;
666 }
Paul Mackerras0016a4c2010-06-15 14:48:58 +1000667}
Paul Mackerras350779a2017-08-30 14:12:27 +1000668EXPORT_SYMBOL_GPL(emulate_vsx_load);
669NOKPROBE_SYMBOL(emulate_vsx_load);
Paul Mackerras0016a4c2010-06-15 14:48:58 +1000670
Paul Mackerras350779a2017-08-30 14:12:27 +1000671void emulate_vsx_store(struct instruction_op *op, const union vsx_reg *reg,
672 void *mem)
Paul Mackerras0016a4c2010-06-15 14:48:58 +1000673{
Paul Mackerras350779a2017-08-30 14:12:27 +1000674 int size, write_size;
675 int i, j;
676 union vsx_reg buf;
677 unsigned int *wp;
678 unsigned short *hp;
679 unsigned char *bp;
Paul Mackerras0016a4c2010-06-15 14:48:58 +1000680
Paul Mackerras350779a2017-08-30 14:12:27 +1000681 size = GETSIZE(op->type);
682
683 switch (op->element_size) {
684 case 16:
685 /* stxv, stxvx, stxvl, stxvll */
686 if (size == 0)
687 break;
688 if (IS_LE && (op->vsx_flags & VSX_LDLEFT)) {
689 /* reverse 16 bytes */
690 buf.d[0] = byterev_8(reg->d[1]);
691 buf.d[1] = byterev_8(reg->d[0]);
692 reg = &buf;
693 }
694 memcpy(mem, reg, size);
695 break;
696 case 8:
697 /* scalar stores, stxvd2x */
698 write_size = (size >= 8) ? 8 : size;
699 i = IS_LE ? 8 : 8 - write_size;
700 if (size < 8 && op->vsx_flags & VSX_FPCONV) {
701 buf.d[0] = buf.d[1] = 0;
702 preempt_disable();
703 conv_dp_to_sp(&reg->dp[IS_LE], &buf.fp[1 + IS_LE]);
704 preempt_enable();
705 reg = &buf;
706 }
707 memcpy(mem, &reg->b[i], write_size);
708 if (size == 16)
709 memcpy(mem + 8, &reg->d[IS_BE], 8);
710 break;
711 case 4:
712 /* stxvw4x */
713 wp = mem;
714 for (j = 0; j < size / 4; ++j) {
715 i = IS_LE ? 3 - j : j;
716 *wp++ = reg->w[i];
717 }
718 break;
719 case 2:
720 /* stxvh8x */
721 hp = mem;
722 for (j = 0; j < size / 2; ++j) {
723 i = IS_LE ? 7 - j : j;
724 *hp++ = reg->h[i];
725 }
726 break;
727 case 1:
728 /* stvxb16x */
729 bp = mem;
730 for (j = 0; j < size; ++j) {
731 i = IS_LE ? 15 - j : j;
732 *bp++ = reg->b[i];
733 }
734 break;
735 }
Paul Mackerras0016a4c2010-06-15 14:48:58 +1000736}
Paul Mackerras350779a2017-08-30 14:12:27 +1000737EXPORT_SYMBOL_GPL(emulate_vsx_store);
738NOKPROBE_SYMBOL(emulate_vsx_store);
Paul Mackerrasc22435a52017-08-30 14:12:33 +1000739
740static nokprobe_inline int do_vsx_load(struct instruction_op *op,
741 unsigned long ea, struct pt_regs *regs)
742{
743 int reg = op->reg;
744 u8 mem[16];
745 union vsx_reg buf;
746 int size = GETSIZE(op->type);
747
Paul Mackerrasb9da9c82017-08-30 14:12:37 +1000748 if (!address_ok(regs, ea, size) || copy_mem_in(mem, ea, size, regs))
Paul Mackerrasc22435a52017-08-30 14:12:33 +1000749 return -EFAULT;
750
751 emulate_vsx_load(op, &buf, mem);
752 preempt_disable();
753 if (reg < 32) {
754 /* FP regs + extensions */
755 if (regs->msr & MSR_FP) {
756 load_vsrn(reg, &buf);
757 } else {
758 current->thread.fp_state.fpr[reg][0] = buf.d[0];
759 current->thread.fp_state.fpr[reg][1] = buf.d[1];
760 }
761 } else {
762 if (regs->msr & MSR_VEC)
763 load_vsrn(reg, &buf);
764 else
765 current->thread.vr_state.vr[reg - 32] = buf.v;
766 }
767 preempt_enable();
768 return 0;
769}
770
771static nokprobe_inline int do_vsx_store(struct instruction_op *op,
772 unsigned long ea, struct pt_regs *regs)
773{
774 int reg = op->reg;
775 u8 mem[16];
776 union vsx_reg buf;
777 int size = GETSIZE(op->type);
778
779 if (!address_ok(regs, ea, size))
780 return -EFAULT;
781
782 preempt_disable();
783 if (reg < 32) {
784 /* FP regs + extensions */
785 if (regs->msr & MSR_FP) {
786 store_vsrn(reg, &buf);
787 } else {
788 buf.d[0] = current->thread.fp_state.fpr[reg][0];
789 buf.d[1] = current->thread.fp_state.fpr[reg][1];
790 }
791 } else {
792 if (regs->msr & MSR_VEC)
793 store_vsrn(reg, &buf);
794 else
795 buf.v = current->thread.vr_state.vr[reg - 32];
796 }
797 preempt_enable();
798 emulate_vsx_store(op, &buf, mem);
Paul Mackerrasb9da9c82017-08-30 14:12:37 +1000799 return copy_mem_out(mem, ea, size, regs);
Paul Mackerrasc22435a52017-08-30 14:12:33 +1000800}
Paul Mackerras0016a4c2010-06-15 14:48:58 +1000801#endif /* CONFIG_VSX */
802
Paul Mackerrasb2543f72017-08-30 14:12:36 +1000803int emulate_dcbz(unsigned long ea, struct pt_regs *regs)
804{
805 int err;
806 unsigned long i, size;
807
808#ifdef __powerpc64__
809 size = ppc64_caches.l1d.block_size;
810 if (!(regs->msr & MSR_64BIT))
811 ea &= 0xffffffffUL;
812#else
813 size = L1_CACHE_BYTES;
814#endif
815 ea &= ~(size - 1);
816 if (!address_ok(regs, ea, size))
817 return -EFAULT;
818 for (i = 0; i < size; i += sizeof(long)) {
819 err = __put_user(0, (unsigned long __user *) (ea + i));
Paul Mackerrasb9da9c82017-08-30 14:12:37 +1000820 if (err) {
821 regs->dar = ea;
Paul Mackerrasb2543f72017-08-30 14:12:36 +1000822 return err;
Paul Mackerrasb9da9c82017-08-30 14:12:37 +1000823 }
Paul Mackerrasb2543f72017-08-30 14:12:36 +1000824 }
825 return 0;
826}
827NOKPROBE_SYMBOL(emulate_dcbz);
828
Paul Mackerras0016a4c2010-06-15 14:48:58 +1000829#define __put_user_asmx(x, addr, err, op, cr) \
830 __asm__ __volatile__( \
831 "1: " op " %2,0,%3\n" \
832 " mfcr %1\n" \
833 "2:\n" \
834 ".section .fixup,\"ax\"\n" \
835 "3: li %0,%4\n" \
836 " b 2b\n" \
837 ".previous\n" \
Nicholas Piggin24bfa6a2016-10-13 16:42:53 +1100838 EX_TABLE(1b, 3b) \
Paul Mackerras0016a4c2010-06-15 14:48:58 +1000839 : "=r" (err), "=r" (cr) \
840 : "r" (x), "r" (addr), "i" (-EFAULT), "0" (err))
841
842#define __get_user_asmx(x, addr, err, op) \
843 __asm__ __volatile__( \
844 "1: "op" %1,0,%2\n" \
845 "2:\n" \
846 ".section .fixup,\"ax\"\n" \
847 "3: li %0,%3\n" \
848 " b 2b\n" \
849 ".previous\n" \
Nicholas Piggin24bfa6a2016-10-13 16:42:53 +1100850 EX_TABLE(1b, 3b) \
Paul Mackerras0016a4c2010-06-15 14:48:58 +1000851 : "=r" (err), "=r" (x) \
852 : "r" (addr), "i" (-EFAULT), "0" (err))
853
854#define __cacheop_user_asmx(addr, err, op) \
855 __asm__ __volatile__( \
856 "1: "op" 0,%1\n" \
857 "2:\n" \
858 ".section .fixup,\"ax\"\n" \
859 "3: li %0,%3\n" \
860 " b 2b\n" \
861 ".previous\n" \
Nicholas Piggin24bfa6a2016-10-13 16:42:53 +1100862 EX_TABLE(1b, 3b) \
Paul Mackerras0016a4c2010-06-15 14:48:58 +1000863 : "=r" (err) \
864 : "r" (addr), "i" (-EFAULT), "0" (err))
865
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +1000866static nokprobe_inline void set_cr0(const struct pt_regs *regs,
867 struct instruction_op *op, int rd)
Paul Mackerras0016a4c2010-06-15 14:48:58 +1000868{
869 long val = regs->gpr[rd];
870
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +1000871 op->type |= SETCC;
872 op->ccval = (regs->ccr & 0x0fffffff) | ((regs->xer >> 3) & 0x10000000);
Paul Mackerras0016a4c2010-06-15 14:48:58 +1000873#ifdef __powerpc64__
Michael Ellermanb91e1362011-04-07 21:56:04 +0000874 if (!(regs->msr & MSR_64BIT))
Paul Mackerras0016a4c2010-06-15 14:48:58 +1000875 val = (int) val;
876#endif
877 if (val < 0)
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +1000878 op->ccval |= 0x80000000;
Paul Mackerras0016a4c2010-06-15 14:48:58 +1000879 else if (val > 0)
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +1000880 op->ccval |= 0x40000000;
Paul Mackerras0016a4c2010-06-15 14:48:58 +1000881 else
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +1000882 op->ccval |= 0x20000000;
Paul Mackerras0016a4c2010-06-15 14:48:58 +1000883}
884
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +1000885static nokprobe_inline void add_with_carry(const struct pt_regs *regs,
886 struct instruction_op *op, int rd,
Paul Mackerras0016a4c2010-06-15 14:48:58 +1000887 unsigned long val1, unsigned long val2,
888 unsigned long carry_in)
889{
890 unsigned long val = val1 + val2;
891
892 if (carry_in)
893 ++val;
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +1000894 op->type = COMPUTE + SETREG + SETXER;
895 op->reg = rd;
896 op->val = val;
Paul Mackerras0016a4c2010-06-15 14:48:58 +1000897#ifdef __powerpc64__
Michael Ellermanb91e1362011-04-07 21:56:04 +0000898 if (!(regs->msr & MSR_64BIT)) {
Paul Mackerras0016a4c2010-06-15 14:48:58 +1000899 val = (unsigned int) val;
900 val1 = (unsigned int) val1;
901 }
902#endif
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +1000903 op->xerval = regs->xer;
Paul Mackerras0016a4c2010-06-15 14:48:58 +1000904 if (val < val1 || (carry_in && val == val1))
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +1000905 op->xerval |= XER_CA;
Paul Mackerras0016a4c2010-06-15 14:48:58 +1000906 else
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +1000907 op->xerval &= ~XER_CA;
Paul Mackerras0016a4c2010-06-15 14:48:58 +1000908}
909
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +1000910static nokprobe_inline void do_cmp_signed(const struct pt_regs *regs,
911 struct instruction_op *op,
912 long v1, long v2, int crfld)
Paul Mackerras0016a4c2010-06-15 14:48:58 +1000913{
914 unsigned int crval, shift;
915
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +1000916 op->type = COMPUTE + SETCC;
Paul Mackerras0016a4c2010-06-15 14:48:58 +1000917 crval = (regs->xer >> 31) & 1; /* get SO bit */
918 if (v1 < v2)
919 crval |= 8;
920 else if (v1 > v2)
921 crval |= 4;
922 else
923 crval |= 2;
924 shift = (7 - crfld) * 4;
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +1000925 op->ccval = (regs->ccr & ~(0xf << shift)) | (crval << shift);
Paul Mackerras0016a4c2010-06-15 14:48:58 +1000926}
927
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +1000928static nokprobe_inline void do_cmp_unsigned(const struct pt_regs *regs,
929 struct instruction_op *op,
930 unsigned long v1,
931 unsigned long v2, int crfld)
Paul Mackerras0016a4c2010-06-15 14:48:58 +1000932{
933 unsigned int crval, shift;
934
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +1000935 op->type = COMPUTE + SETCC;
Paul Mackerras0016a4c2010-06-15 14:48:58 +1000936 crval = (regs->xer >> 31) & 1; /* get SO bit */
937 if (v1 < v2)
938 crval |= 8;
939 else if (v1 > v2)
940 crval |= 4;
941 else
942 crval |= 2;
943 shift = (7 - crfld) * 4;
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +1000944 op->ccval = (regs->ccr & ~(0xf << shift)) | (crval << shift);
Paul Mackerras0016a4c2010-06-15 14:48:58 +1000945}
946
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +1000947static nokprobe_inline void do_cmpb(const struct pt_regs *regs,
948 struct instruction_op *op,
949 unsigned long v1, unsigned long v2)
Matt Brown02c0f622017-07-31 10:58:22 +1000950{
951 unsigned long long out_val, mask;
952 int i;
953
954 out_val = 0;
955 for (i = 0; i < 8; i++) {
956 mask = 0xffUL << (i * 8);
957 if ((v1 & mask) == (v2 & mask))
958 out_val |= mask;
959 }
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +1000960 op->val = out_val;
Matt Brown02c0f622017-07-31 10:58:22 +1000961}
962
Matt Browndcbd19b2017-07-31 10:58:23 +1000963/*
964 * The size parameter is used to adjust the equivalent popcnt instruction.
965 * popcntb = 8, popcntw = 32, popcntd = 64
966 */
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +1000967static nokprobe_inline void do_popcnt(const struct pt_regs *regs,
968 struct instruction_op *op,
969 unsigned long v1, int size)
Matt Browndcbd19b2017-07-31 10:58:23 +1000970{
971 unsigned long long out = v1;
972
973 out -= (out >> 1) & 0x5555555555555555;
974 out = (0x3333333333333333 & out) + (0x3333333333333333 & (out >> 2));
975 out = (out + (out >> 4)) & 0x0f0f0f0f0f0f0f0f;
976
977 if (size == 8) { /* popcntb */
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +1000978 op->val = out;
Matt Browndcbd19b2017-07-31 10:58:23 +1000979 return;
980 }
981 out += out >> 8;
982 out += out >> 16;
983 if (size == 32) { /* popcntw */
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +1000984 op->val = out & 0x0000003f0000003f;
Matt Browndcbd19b2017-07-31 10:58:23 +1000985 return;
986 }
987
988 out = (out + (out >> 32)) & 0x7f;
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +1000989 op->val = out; /* popcntd */
Matt Browndcbd19b2017-07-31 10:58:23 +1000990}
991
Matt Brownf3127932017-07-31 10:58:24 +1000992#ifdef CONFIG_PPC64
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +1000993static nokprobe_inline void do_bpermd(const struct pt_regs *regs,
994 struct instruction_op *op,
995 unsigned long v1, unsigned long v2)
Matt Brownf3127932017-07-31 10:58:24 +1000996{
997 unsigned char perm, idx;
998 unsigned int i;
999
1000 perm = 0;
1001 for (i = 0; i < 8; i++) {
1002 idx = (v1 >> (i * 8)) & 0xff;
1003 if (idx < 64)
1004 if (v2 & PPC_BIT(idx))
1005 perm |= 1 << i;
1006 }
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001007 op->val = perm;
Matt Brownf3127932017-07-31 10:58:24 +10001008}
1009#endif /* CONFIG_PPC64 */
Matt Brown2c979c42017-07-31 10:58:25 +10001010/*
1011 * The size parameter adjusts the equivalent prty instruction.
1012 * prtyw = 32, prtyd = 64
1013 */
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001014static nokprobe_inline void do_prty(const struct pt_regs *regs,
1015 struct instruction_op *op,
1016 unsigned long v, int size)
Matt Brown2c979c42017-07-31 10:58:25 +10001017{
1018 unsigned long long res = v ^ (v >> 8);
1019
1020 res ^= res >> 16;
1021 if (size == 32) { /* prtyw */
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001022 op->val = res & 0x0000000100000001;
Matt Brown2c979c42017-07-31 10:58:25 +10001023 return;
1024 }
1025
1026 res ^= res >> 32;
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001027 op->val = res & 1; /*prtyd */
Matt Brown2c979c42017-07-31 10:58:25 +10001028}
Matt Brownf3127932017-07-31 10:58:24 +10001029
Naveen N. Rao71f6e582017-04-12 16:48:51 +05301030static nokprobe_inline int trap_compare(long v1, long v2)
Paul Mackerrascf87c3f2014-09-02 14:35:08 +10001031{
1032 int ret = 0;
1033
1034 if (v1 < v2)
1035 ret |= 0x10;
1036 else if (v1 > v2)
1037 ret |= 0x08;
1038 else
1039 ret |= 0x04;
1040 if ((unsigned long)v1 < (unsigned long)v2)
1041 ret |= 0x02;
1042 else if ((unsigned long)v1 > (unsigned long)v2)
1043 ret |= 0x01;
1044 return ret;
1045}
1046
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001047/*
1048 * Elements of 32-bit rotate and mask instructions.
1049 */
1050#define MASK32(mb, me) ((0xffffffffUL >> (mb)) + \
1051 ((signed long)-0x80000000L >> (me)) + ((me) >= (mb)))
1052#ifdef __powerpc64__
1053#define MASK64_L(mb) (~0UL >> (mb))
1054#define MASK64_R(me) ((signed long)-0x8000000000000000L >> (me))
1055#define MASK64(mb, me) (MASK64_L(mb) + MASK64_R(me) + ((me) >= (mb)))
1056#define DATA32(x) (((x) & 0xffffffffUL) | (((x) & 0xffffffffUL) << 32))
1057#else
1058#define DATA32(x) (x)
1059#endif
1060#define ROTATE(x, n) ((n) ? (((x) << (n)) | ((x) >> (8 * sizeof(long) - (n)))) : (x))
1061
1062/*
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001063 * Decode an instruction, and return information about it in *op
1064 * without changing *regs.
1065 * Integer arithmetic and logical instructions, branches, and barrier
1066 * instructions can be emulated just using the information in *op.
1067 *
1068 * Return value is 1 if the instruction can be emulated just by
1069 * updating *regs with the information in *op, -1 if we need the
1070 * GPRs but *regs doesn't contain the full register set, or 0
1071 * otherwise.
Paul Mackerras14cf11a2005-09-26 16:04:21 +10001072 */
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001073int analyse_instr(struct instruction_op *op, const struct pt_regs *regs,
1074 unsigned int instr)
Paul Mackerras14cf11a2005-09-26 16:04:21 +10001075{
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001076 unsigned int opcode, ra, rb, rd, spr, u;
Paul Mackerras14cf11a2005-09-26 16:04:21 +10001077 unsigned long int imm;
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001078 unsigned long int val, val2;
Paul Mackerrasbe96f632014-09-02 14:35:07 +10001079 unsigned int mb, me, sh;
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001080 long ival;
Paul Mackerras14cf11a2005-09-26 16:04:21 +10001081
Paul Mackerrasbe96f632014-09-02 14:35:07 +10001082 op->type = COMPUTE;
1083
Paul Mackerras14cf11a2005-09-26 16:04:21 +10001084 opcode = instr >> 26;
1085 switch (opcode) {
1086 case 16: /* bc */
Paul Mackerrasbe96f632014-09-02 14:35:07 +10001087 op->type = BRANCH;
Paul Mackerras14cf11a2005-09-26 16:04:21 +10001088 imm = (signed short)(instr & 0xfffc);
1089 if ((instr & 2) == 0)
1090 imm += regs->nip;
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001091 op->val = truncate_if_32bit(regs->msr, imm);
Paul Mackerras14cf11a2005-09-26 16:04:21 +10001092 if (instr & 1)
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001093 op->type |= SETLK;
1094 if (branch_taken(instr, regs, op))
1095 op->type |= BRTAKEN;
Paul Mackerras14cf11a2005-09-26 16:04:21 +10001096 return 1;
Paul Mackerrasc0325242005-10-28 22:48:08 +10001097#ifdef CONFIG_PPC64
Paul Mackerras14cf11a2005-09-26 16:04:21 +10001098 case 17: /* sc */
Paul Mackerrasbe96f632014-09-02 14:35:07 +10001099 if ((instr & 0xfe2) == 2)
1100 op->type = SYSCALL;
1101 else
1102 op->type = UNKNOWN;
1103 return 0;
Paul Mackerrasc0325242005-10-28 22:48:08 +10001104#endif
Paul Mackerras14cf11a2005-09-26 16:04:21 +10001105 case 18: /* b */
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001106 op->type = BRANCH | BRTAKEN;
Paul Mackerras14cf11a2005-09-26 16:04:21 +10001107 imm = instr & 0x03fffffc;
1108 if (imm & 0x02000000)
1109 imm -= 0x04000000;
1110 if ((instr & 2) == 0)
1111 imm += regs->nip;
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001112 op->val = truncate_if_32bit(regs->msr, imm);
Michael Ellermanb91e1362011-04-07 21:56:04 +00001113 if (instr & 1)
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001114 op->type |= SETLK;
Paul Mackerras14cf11a2005-09-26 16:04:21 +10001115 return 1;
1116 case 19:
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001117 switch ((instr >> 1) & 0x3ff) {
Paul Mackerrascf87c3f2014-09-02 14:35:08 +10001118 case 0: /* mcrf */
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001119 op->type = COMPUTE + SETCC;
Anton Blanchard87c4b83e2017-06-15 09:46:38 +10001120 rd = 7 - ((instr >> 23) & 0x7);
1121 ra = 7 - ((instr >> 18) & 0x7);
1122 rd *= 4;
1123 ra *= 4;
Paul Mackerrascf87c3f2014-09-02 14:35:08 +10001124 val = (regs->ccr >> ra) & 0xf;
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001125 op->ccval = (regs->ccr & ~(0xfUL << rd)) | (val << rd);
1126 return 1;
Paul Mackerrascf87c3f2014-09-02 14:35:08 +10001127
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001128 case 16: /* bclr */
1129 case 528: /* bcctr */
Paul Mackerrasbe96f632014-09-02 14:35:07 +10001130 op->type = BRANCH;
Paul Mackerras14cf11a2005-09-26 16:04:21 +10001131 imm = (instr & 0x400)? regs->ctr: regs->link;
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001132 op->val = truncate_if_32bit(regs->msr, imm);
Paul Mackerras14cf11a2005-09-26 16:04:21 +10001133 if (instr & 1)
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001134 op->type |= SETLK;
1135 if (branch_taken(instr, regs, op))
1136 op->type |= BRTAKEN;
Paul Mackerras14cf11a2005-09-26 16:04:21 +10001137 return 1;
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001138
1139 case 18: /* rfid, scary */
Paul Mackerrasbe96f632014-09-02 14:35:07 +10001140 if (regs->msr & MSR_PR)
1141 goto priv;
1142 op->type = RFI;
1143 return 0;
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001144
1145 case 150: /* isync */
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001146 op->type = BARRIER | BARRIER_ISYNC;
1147 return 1;
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001148
1149 case 33: /* crnor */
1150 case 129: /* crandc */
1151 case 193: /* crxor */
1152 case 225: /* crnand */
1153 case 257: /* crand */
1154 case 289: /* creqv */
1155 case 417: /* crorc */
1156 case 449: /* cror */
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001157 op->type = COMPUTE + SETCC;
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001158 ra = (instr >> 16) & 0x1f;
1159 rb = (instr >> 11) & 0x1f;
1160 rd = (instr >> 21) & 0x1f;
1161 ra = (regs->ccr >> (31 - ra)) & 1;
1162 rb = (regs->ccr >> (31 - rb)) & 1;
1163 val = (instr >> (6 + ra * 2 + rb)) & 1;
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001164 op->ccval = (regs->ccr & ~(1UL << (31 - rd))) |
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001165 (val << (31 - rd));
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001166 return 1;
Paul Mackerras14cf11a2005-09-26 16:04:21 +10001167 }
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001168 break;
Paul Mackerras14cf11a2005-09-26 16:04:21 +10001169 case 31:
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001170 switch ((instr >> 1) & 0x3ff) {
1171 case 598: /* sync */
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001172 op->type = BARRIER + BARRIER_SYNC;
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001173#ifdef __powerpc64__
1174 switch ((instr >> 21) & 3) {
1175 case 1: /* lwsync */
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001176 op->type = BARRIER + BARRIER_LWSYNC;
1177 break;
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001178 case 2: /* ptesync */
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001179 op->type = BARRIER + BARRIER_PTESYNC;
1180 break;
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001181 }
1182#endif
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001183 return 1;
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001184
1185 case 854: /* eieio */
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001186 op->type = BARRIER + BARRIER_EIEIO;
1187 return 1;
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001188 }
1189 break;
1190 }
1191
1192 /* Following cases refer to regs->gpr[], so we need all regs */
1193 if (!FULL_REGS(regs))
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001194 return -1;
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001195
1196 rd = (instr >> 21) & 0x1f;
1197 ra = (instr >> 16) & 0x1f;
1198 rb = (instr >> 11) & 0x1f;
1199
1200 switch (opcode) {
Paul Mackerrascf87c3f2014-09-02 14:35:08 +10001201#ifdef __powerpc64__
1202 case 2: /* tdi */
1203 if (rd & trap_compare(regs->gpr[ra], (short) instr))
1204 goto trap;
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001205 return 1;
Paul Mackerrascf87c3f2014-09-02 14:35:08 +10001206#endif
1207 case 3: /* twi */
1208 if (rd & trap_compare((int)regs->gpr[ra], (short) instr))
1209 goto trap;
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001210 return 1;
Paul Mackerrascf87c3f2014-09-02 14:35:08 +10001211
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001212 case 7: /* mulli */
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001213 op->val = regs->gpr[ra] * (short) instr;
1214 goto compute_done;
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001215
1216 case 8: /* subfic */
1217 imm = (short) instr;
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001218 add_with_carry(regs, op, rd, ~regs->gpr[ra], imm, 1);
1219 return 1;
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001220
1221 case 10: /* cmpli */
1222 imm = (unsigned short) instr;
1223 val = regs->gpr[ra];
1224#ifdef __powerpc64__
1225 if ((rd & 1) == 0)
1226 val = (unsigned int) val;
1227#endif
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001228 do_cmp_unsigned(regs, op, val, imm, rd >> 2);
1229 return 1;
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001230
1231 case 11: /* cmpi */
1232 imm = (short) instr;
1233 val = regs->gpr[ra];
1234#ifdef __powerpc64__
1235 if ((rd & 1) == 0)
1236 val = (int) val;
1237#endif
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001238 do_cmp_signed(regs, op, val, imm, rd >> 2);
1239 return 1;
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001240
1241 case 12: /* addic */
1242 imm = (short) instr;
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001243 add_with_carry(regs, op, rd, regs->gpr[ra], imm, 0);
1244 return 1;
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001245
1246 case 13: /* addic. */
1247 imm = (short) instr;
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001248 add_with_carry(regs, op, rd, regs->gpr[ra], imm, 0);
1249 set_cr0(regs, op, rd);
1250 return 1;
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001251
1252 case 14: /* addi */
1253 imm = (short) instr;
1254 if (ra)
1255 imm += regs->gpr[ra];
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001256 op->val = imm;
1257 goto compute_done;
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001258
1259 case 15: /* addis */
1260 imm = ((short) instr) << 16;
1261 if (ra)
1262 imm += regs->gpr[ra];
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001263 op->val = imm;
1264 goto compute_done;
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001265
Paul Mackerras958465e2017-08-30 14:12:31 +10001266 case 19:
1267 if (((instr >> 1) & 0x1f) == 2) {
1268 /* addpcis */
1269 imm = (short) (instr & 0xffc1); /* d0 + d2 fields */
1270 imm |= (instr >> 15) & 0x3e; /* d1 field */
1271 op->val = regs->nip + (imm << 16) + 4;
1272 goto compute_done;
1273 }
1274 op->type = UNKNOWN;
1275 return 0;
1276
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001277 case 20: /* rlwimi */
1278 mb = (instr >> 6) & 0x1f;
1279 me = (instr >> 1) & 0x1f;
1280 val = DATA32(regs->gpr[rd]);
1281 imm = MASK32(mb, me);
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001282 op->val = (regs->gpr[ra] & ~imm) | (ROTATE(val, rb) & imm);
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001283 goto logical_done;
1284
1285 case 21: /* rlwinm */
1286 mb = (instr >> 6) & 0x1f;
1287 me = (instr >> 1) & 0x1f;
1288 val = DATA32(regs->gpr[rd]);
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001289 op->val = ROTATE(val, rb) & MASK32(mb, me);
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001290 goto logical_done;
1291
1292 case 23: /* rlwnm */
1293 mb = (instr >> 6) & 0x1f;
1294 me = (instr >> 1) & 0x1f;
1295 rb = regs->gpr[rb] & 0x1f;
1296 val = DATA32(regs->gpr[rd]);
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001297 op->val = ROTATE(val, rb) & MASK32(mb, me);
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001298 goto logical_done;
1299
1300 case 24: /* ori */
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001301 op->val = regs->gpr[rd] | (unsigned short) instr;
1302 goto logical_done_nocc;
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001303
1304 case 25: /* oris */
1305 imm = (unsigned short) instr;
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001306 op->val = regs->gpr[rd] | (imm << 16);
1307 goto logical_done_nocc;
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001308
1309 case 26: /* xori */
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001310 op->val = regs->gpr[rd] ^ (unsigned short) instr;
1311 goto logical_done_nocc;
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001312
1313 case 27: /* xoris */
1314 imm = (unsigned short) instr;
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001315 op->val = regs->gpr[rd] ^ (imm << 16);
1316 goto logical_done_nocc;
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001317
1318 case 28: /* andi. */
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001319 op->val = regs->gpr[rd] & (unsigned short) instr;
1320 set_cr0(regs, op, ra);
1321 goto logical_done_nocc;
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001322
1323 case 29: /* andis. */
1324 imm = (unsigned short) instr;
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001325 op->val = regs->gpr[rd] & (imm << 16);
1326 set_cr0(regs, op, ra);
1327 goto logical_done_nocc;
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001328
1329#ifdef __powerpc64__
1330 case 30: /* rld* */
1331 mb = ((instr >> 6) & 0x1f) | (instr & 0x20);
1332 val = regs->gpr[rd];
1333 if ((instr & 0x10) == 0) {
1334 sh = rb | ((instr & 2) << 4);
1335 val = ROTATE(val, sh);
1336 switch ((instr >> 2) & 3) {
1337 case 0: /* rldicl */
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001338 val &= MASK64_L(mb);
1339 break;
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001340 case 1: /* rldicr */
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001341 val &= MASK64_R(mb);
1342 break;
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001343 case 2: /* rldic */
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001344 val &= MASK64(mb, 63 - sh);
1345 break;
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001346 case 3: /* rldimi */
1347 imm = MASK64(mb, 63 - sh);
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001348 val = (regs->gpr[ra] & ~imm) |
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001349 (val & imm);
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001350 }
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001351 op->val = val;
1352 goto logical_done;
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001353 } else {
1354 sh = regs->gpr[rb] & 0x3f;
1355 val = ROTATE(val, sh);
1356 switch ((instr >> 1) & 7) {
1357 case 0: /* rldcl */
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001358 op->val = val & MASK64_L(mb);
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001359 goto logical_done;
1360 case 1: /* rldcr */
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001361 op->val = val & MASK64_R(mb);
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001362 goto logical_done;
1363 }
1364 }
1365#endif
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001366 op->type = UNKNOWN; /* illegal instruction */
1367 return 0;
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001368
1369 case 31:
Paul Mackerrasf1bbb992017-08-30 14:12:29 +10001370 /* isel occupies 32 minor opcodes */
1371 if (((instr >> 1) & 0x1f) == 15) {
1372 mb = (instr >> 6) & 0x1f; /* bc field */
1373 val = (regs->ccr >> (31 - mb)) & 1;
1374 val2 = (ra) ? regs->gpr[ra] : 0;
1375
1376 op->val = (val) ? val2 : regs->gpr[rb];
1377 goto compute_done;
1378 }
1379
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001380 switch ((instr >> 1) & 0x3ff) {
Paul Mackerrascf87c3f2014-09-02 14:35:08 +10001381 case 4: /* tw */
1382 if (rd == 0x1f ||
1383 (rd & trap_compare((int)regs->gpr[ra],
1384 (int)regs->gpr[rb])))
1385 goto trap;
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001386 return 1;
Paul Mackerrascf87c3f2014-09-02 14:35:08 +10001387#ifdef __powerpc64__
1388 case 68: /* td */
1389 if (rd & trap_compare(regs->gpr[ra], regs->gpr[rb]))
1390 goto trap;
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001391 return 1;
Paul Mackerrascf87c3f2014-09-02 14:35:08 +10001392#endif
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001393 case 83: /* mfmsr */
1394 if (regs->msr & MSR_PR)
Paul Mackerrasbe96f632014-09-02 14:35:07 +10001395 goto priv;
1396 op->type = MFMSR;
1397 op->reg = rd;
1398 return 0;
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001399 case 146: /* mtmsr */
1400 if (regs->msr & MSR_PR)
Paul Mackerrasbe96f632014-09-02 14:35:07 +10001401 goto priv;
1402 op->type = MTMSR;
1403 op->reg = rd;
1404 op->val = 0xffffffff & ~(MSR_ME | MSR_LE);
1405 return 0;
Paul Mackerrasc0325242005-10-28 22:48:08 +10001406#ifdef CONFIG_PPC64
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001407 case 178: /* mtmsrd */
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001408 if (regs->msr & MSR_PR)
Paul Mackerrasbe96f632014-09-02 14:35:07 +10001409 goto priv;
1410 op->type = MTMSR;
1411 op->reg = rd;
1412 /* only MSR_EE and MSR_RI get changed if bit 15 set */
1413 /* mtmsrd doesn't change MSR_HV, MSR_ME or MSR_LE */
1414 imm = (instr & 0x10000)? 0x8002: 0xefffffffffffeffeUL;
1415 op->val = imm;
1416 return 0;
Paul Mackerrasc0325242005-10-28 22:48:08 +10001417#endif
Paul Mackerrasbe96f632014-09-02 14:35:07 +10001418
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001419 case 19: /* mfcr */
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001420 imm = 0xffffffffUL;
Anton Blanchard64e756c2017-06-15 09:46:39 +10001421 if ((instr >> 20) & 1) {
1422 imm = 0xf0000000UL;
1423 for (sh = 0; sh < 8; ++sh) {
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001424 if (instr & (0x80000 >> sh))
Anton Blanchard64e756c2017-06-15 09:46:39 +10001425 break;
Anton Blanchard64e756c2017-06-15 09:46:39 +10001426 imm >>= 4;
1427 }
Anton Blanchard64e756c2017-06-15 09:46:39 +10001428 }
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001429 op->val = regs->ccr & imm;
1430 goto compute_done;
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001431
1432 case 144: /* mtcrf */
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001433 op->type = COMPUTE + SETCC;
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001434 imm = 0xf0000000UL;
1435 val = regs->gpr[rd];
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001436 op->val = regs->ccr;
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001437 for (sh = 0; sh < 8; ++sh) {
1438 if (instr & (0x80000 >> sh))
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001439 op->val = (op->val & ~imm) |
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001440 (val & imm);
1441 imm >>= 4;
1442 }
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001443 return 1;
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001444
1445 case 339: /* mfspr */
Paul Mackerrasbe96f632014-09-02 14:35:07 +10001446 spr = ((instr >> 16) & 0x1f) | ((instr >> 6) & 0x3e0);
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001447 op->type = MFSPR;
1448 op->reg = rd;
1449 op->spr = spr;
1450 if (spr == SPRN_XER || spr == SPRN_LR ||
1451 spr == SPRN_CTR)
1452 return 1;
1453 return 0;
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001454
1455 case 467: /* mtspr */
Paul Mackerrasbe96f632014-09-02 14:35:07 +10001456 spr = ((instr >> 16) & 0x1f) | ((instr >> 6) & 0x3e0);
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001457 op->type = MTSPR;
1458 op->val = regs->gpr[rd];
1459 op->spr = spr;
1460 if (spr == SPRN_XER || spr == SPRN_LR ||
1461 spr == SPRN_CTR)
1462 return 1;
1463 return 0;
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001464
1465/*
1466 * Compare instructions
1467 */
1468 case 0: /* cmp */
1469 val = regs->gpr[ra];
1470 val2 = regs->gpr[rb];
1471#ifdef __powerpc64__
1472 if ((rd & 1) == 0) {
1473 /* word (32-bit) compare */
1474 val = (int) val;
1475 val2 = (int) val2;
1476 }
1477#endif
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001478 do_cmp_signed(regs, op, val, val2, rd >> 2);
1479 return 1;
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001480
1481 case 32: /* cmpl */
1482 val = regs->gpr[ra];
1483 val2 = regs->gpr[rb];
1484#ifdef __powerpc64__
1485 if ((rd & 1) == 0) {
1486 /* word (32-bit) compare */
1487 val = (unsigned int) val;
1488 val2 = (unsigned int) val2;
1489 }
1490#endif
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001491 do_cmp_unsigned(regs, op, val, val2, rd >> 2);
1492 return 1;
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001493
Matt Brown02c0f622017-07-31 10:58:22 +10001494 case 508: /* cmpb */
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001495 do_cmpb(regs, op, regs->gpr[rd], regs->gpr[rb]);
1496 goto logical_done_nocc;
Matt Brown02c0f622017-07-31 10:58:22 +10001497
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001498/*
1499 * Arithmetic instructions
1500 */
1501 case 8: /* subfc */
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001502 add_with_carry(regs, op, rd, ~regs->gpr[ra],
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001503 regs->gpr[rb], 1);
1504 goto arith_done;
1505#ifdef __powerpc64__
1506 case 9: /* mulhdu */
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001507 asm("mulhdu %0,%1,%2" : "=r" (op->val) :
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001508 "r" (regs->gpr[ra]), "r" (regs->gpr[rb]));
1509 goto arith_done;
1510#endif
1511 case 10: /* addc */
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001512 add_with_carry(regs, op, rd, regs->gpr[ra],
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001513 regs->gpr[rb], 0);
1514 goto arith_done;
1515
1516 case 11: /* mulhwu */
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001517 asm("mulhwu %0,%1,%2" : "=r" (op->val) :
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001518 "r" (regs->gpr[ra]), "r" (regs->gpr[rb]));
1519 goto arith_done;
1520
1521 case 40: /* subf */
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001522 op->val = regs->gpr[rb] - regs->gpr[ra];
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001523 goto arith_done;
1524#ifdef __powerpc64__
1525 case 73: /* mulhd */
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001526 asm("mulhd %0,%1,%2" : "=r" (op->val) :
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001527 "r" (regs->gpr[ra]), "r" (regs->gpr[rb]));
1528 goto arith_done;
1529#endif
1530 case 75: /* mulhw */
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001531 asm("mulhw %0,%1,%2" : "=r" (op->val) :
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001532 "r" (regs->gpr[ra]), "r" (regs->gpr[rb]));
1533 goto arith_done;
1534
1535 case 104: /* neg */
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001536 op->val = -regs->gpr[ra];
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001537 goto arith_done;
1538
1539 case 136: /* subfe */
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001540 add_with_carry(regs, op, rd, ~regs->gpr[ra],
1541 regs->gpr[rb], regs->xer & XER_CA);
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001542 goto arith_done;
1543
1544 case 138: /* adde */
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001545 add_with_carry(regs, op, rd, regs->gpr[ra],
1546 regs->gpr[rb], regs->xer & XER_CA);
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001547 goto arith_done;
1548
1549 case 200: /* subfze */
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001550 add_with_carry(regs, op, rd, ~regs->gpr[ra], 0L,
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001551 regs->xer & XER_CA);
1552 goto arith_done;
1553
1554 case 202: /* addze */
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001555 add_with_carry(regs, op, rd, regs->gpr[ra], 0L,
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001556 regs->xer & XER_CA);
1557 goto arith_done;
1558
1559 case 232: /* subfme */
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001560 add_with_carry(regs, op, rd, ~regs->gpr[ra], -1L,
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001561 regs->xer & XER_CA);
1562 goto arith_done;
1563#ifdef __powerpc64__
1564 case 233: /* mulld */
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001565 op->val = regs->gpr[ra] * regs->gpr[rb];
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001566 goto arith_done;
1567#endif
1568 case 234: /* addme */
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001569 add_with_carry(regs, op, rd, regs->gpr[ra], -1L,
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001570 regs->xer & XER_CA);
1571 goto arith_done;
1572
1573 case 235: /* mullw */
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001574 op->val = (unsigned int) regs->gpr[ra] *
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001575 (unsigned int) regs->gpr[rb];
1576 goto arith_done;
1577
1578 case 266: /* add */
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001579 op->val = regs->gpr[ra] + regs->gpr[rb];
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001580 goto arith_done;
1581#ifdef __powerpc64__
1582 case 457: /* divdu */
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001583 op->val = regs->gpr[ra] / regs->gpr[rb];
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001584 goto arith_done;
1585#endif
1586 case 459: /* divwu */
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001587 op->val = (unsigned int) regs->gpr[ra] /
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001588 (unsigned int) regs->gpr[rb];
1589 goto arith_done;
1590#ifdef __powerpc64__
1591 case 489: /* divd */
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001592 op->val = (long int) regs->gpr[ra] /
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001593 (long int) regs->gpr[rb];
1594 goto arith_done;
1595#endif
1596 case 491: /* divw */
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001597 op->val = (int) regs->gpr[ra] /
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001598 (int) regs->gpr[rb];
1599 goto arith_done;
1600
1601
1602/*
1603 * Logical instructions
1604 */
1605 case 26: /* cntlzw */
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001606 op->val = __builtin_clz((unsigned int) regs->gpr[rd]);
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001607 goto logical_done;
1608#ifdef __powerpc64__
1609 case 58: /* cntlzd */
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001610 op->val = __builtin_clzl(regs->gpr[rd]);
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001611 goto logical_done;
1612#endif
1613 case 28: /* and */
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001614 op->val = regs->gpr[rd] & regs->gpr[rb];
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001615 goto logical_done;
1616
1617 case 60: /* andc */
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001618 op->val = regs->gpr[rd] & ~regs->gpr[rb];
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001619 goto logical_done;
1620
Matt Browndcbd19b2017-07-31 10:58:23 +10001621 case 122: /* popcntb */
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001622 do_popcnt(regs, op, regs->gpr[rd], 8);
Paul Mackerras5762e082017-08-30 14:12:30 +10001623 goto logical_done_nocc;
Matt Browndcbd19b2017-07-31 10:58:23 +10001624
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001625 case 124: /* nor */
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001626 op->val = ~(regs->gpr[rd] | regs->gpr[rb]);
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001627 goto logical_done;
Matt Brown2c979c42017-07-31 10:58:25 +10001628
1629 case 154: /* prtyw */
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001630 do_prty(regs, op, regs->gpr[rd], 32);
Paul Mackerras5762e082017-08-30 14:12:30 +10001631 goto logical_done_nocc;
Matt Brown2c979c42017-07-31 10:58:25 +10001632
1633 case 186: /* prtyd */
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001634 do_prty(regs, op, regs->gpr[rd], 64);
Paul Mackerras5762e082017-08-30 14:12:30 +10001635 goto logical_done_nocc;
Matt Brownf3127932017-07-31 10:58:24 +10001636#ifdef CONFIG_PPC64
1637 case 252: /* bpermd */
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001638 do_bpermd(regs, op, regs->gpr[rd], regs->gpr[rb]);
Paul Mackerras5762e082017-08-30 14:12:30 +10001639 goto logical_done_nocc;
Matt Brownf3127932017-07-31 10:58:24 +10001640#endif
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001641 case 284: /* xor */
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001642 op->val = ~(regs->gpr[rd] ^ regs->gpr[rb]);
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001643 goto logical_done;
1644
1645 case 316: /* xor */
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001646 op->val = regs->gpr[rd] ^ regs->gpr[rb];
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001647 goto logical_done;
1648
Matt Browndcbd19b2017-07-31 10:58:23 +10001649 case 378: /* popcntw */
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001650 do_popcnt(regs, op, regs->gpr[rd], 32);
Paul Mackerras5762e082017-08-30 14:12:30 +10001651 goto logical_done_nocc;
Matt Browndcbd19b2017-07-31 10:58:23 +10001652
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001653 case 412: /* orc */
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001654 op->val = regs->gpr[rd] | ~regs->gpr[rb];
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001655 goto logical_done;
1656
1657 case 444: /* or */
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001658 op->val = regs->gpr[rd] | regs->gpr[rb];
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001659 goto logical_done;
1660
1661 case 476: /* nand */
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001662 op->val = ~(regs->gpr[rd] & regs->gpr[rb]);
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001663 goto logical_done;
Matt Browndcbd19b2017-07-31 10:58:23 +10001664#ifdef CONFIG_PPC64
1665 case 506: /* popcntd */
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001666 do_popcnt(regs, op, regs->gpr[rd], 64);
Paul Mackerras5762e082017-08-30 14:12:30 +10001667 goto logical_done_nocc;
Matt Browndcbd19b2017-07-31 10:58:23 +10001668#endif
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001669 case 922: /* extsh */
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001670 op->val = (signed short) regs->gpr[rd];
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001671 goto logical_done;
1672
1673 case 954: /* extsb */
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001674 op->val = (signed char) regs->gpr[rd];
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001675 goto logical_done;
1676#ifdef __powerpc64__
1677 case 986: /* extsw */
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001678 op->val = (signed int) regs->gpr[rd];
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001679 goto logical_done;
1680#endif
1681
1682/*
1683 * Shift instructions
1684 */
1685 case 24: /* slw */
1686 sh = regs->gpr[rb] & 0x3f;
1687 if (sh < 32)
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001688 op->val = (regs->gpr[rd] << sh) & 0xffffffffUL;
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001689 else
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001690 op->val = 0;
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001691 goto logical_done;
1692
1693 case 536: /* srw */
1694 sh = regs->gpr[rb] & 0x3f;
1695 if (sh < 32)
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001696 op->val = (regs->gpr[rd] & 0xffffffffUL) >> sh;
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001697 else
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001698 op->val = 0;
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001699 goto logical_done;
1700
1701 case 792: /* sraw */
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001702 op->type = COMPUTE + SETREG + SETXER;
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001703 sh = regs->gpr[rb] & 0x3f;
1704 ival = (signed int) regs->gpr[rd];
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001705 op->val = ival >> (sh < 32 ? sh : 31);
1706 op->xerval = regs->xer;
Paul Mackerrase698b962014-07-19 17:47:57 +10001707 if (ival < 0 && (sh >= 32 || (ival & ((1ul << sh) - 1)) != 0))
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001708 op->xerval |= XER_CA;
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001709 else
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001710 op->xerval &= ~XER_CA;
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001711 goto logical_done;
1712
1713 case 824: /* srawi */
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001714 op->type = COMPUTE + SETREG + SETXER;
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001715 sh = rb;
1716 ival = (signed int) regs->gpr[rd];
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001717 op->val = ival >> sh;
1718 op->xerval = regs->xer;
Paul Mackerrase698b962014-07-19 17:47:57 +10001719 if (ival < 0 && (ival & ((1ul << sh) - 1)) != 0)
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001720 op->xerval |= XER_CA;
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001721 else
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001722 op->xerval &= ~XER_CA;
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001723 goto logical_done;
1724
1725#ifdef __powerpc64__
1726 case 27: /* sld */
Paul Mackerrase698b962014-07-19 17:47:57 +10001727 sh = regs->gpr[rb] & 0x7f;
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001728 if (sh < 64)
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001729 op->val = regs->gpr[rd] << sh;
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001730 else
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001731 op->val = 0;
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001732 goto logical_done;
1733
1734 case 539: /* srd */
1735 sh = regs->gpr[rb] & 0x7f;
1736 if (sh < 64)
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001737 op->val = regs->gpr[rd] >> sh;
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001738 else
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001739 op->val = 0;
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001740 goto logical_done;
1741
1742 case 794: /* srad */
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001743 op->type = COMPUTE + SETREG + SETXER;
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001744 sh = regs->gpr[rb] & 0x7f;
1745 ival = (signed long int) regs->gpr[rd];
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001746 op->val = ival >> (sh < 64 ? sh : 63);
1747 op->xerval = regs->xer;
Paul Mackerrase698b962014-07-19 17:47:57 +10001748 if (ival < 0 && (sh >= 64 || (ival & ((1ul << sh) - 1)) != 0))
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001749 op->xerval |= XER_CA;
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001750 else
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001751 op->xerval &= ~XER_CA;
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001752 goto logical_done;
1753
1754 case 826: /* sradi with sh_5 = 0 */
1755 case 827: /* sradi with sh_5 = 1 */
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001756 op->type = COMPUTE + SETREG + SETXER;
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001757 sh = rb | ((instr & 2) << 4);
1758 ival = (signed long int) regs->gpr[rd];
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001759 op->val = ival >> sh;
1760 op->xerval = regs->xer;
Paul Mackerrase698b962014-07-19 17:47:57 +10001761 if (ival < 0 && (ival & ((1ul << sh) - 1)) != 0)
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001762 op->xerval |= XER_CA;
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001763 else
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10001764 op->xerval &= ~XER_CA;
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001765 goto logical_done;
1766#endif /* __powerpc64__ */
1767
1768/*
1769 * Cache instructions
1770 */
1771 case 54: /* dcbst */
Paul Mackerrasbe96f632014-09-02 14:35:07 +10001772 op->type = MKOP(CACHEOP, DCBST, 0);
1773 op->ea = xform_ea(instr, regs);
1774 return 0;
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001775
1776 case 86: /* dcbf */
Paul Mackerrasbe96f632014-09-02 14:35:07 +10001777 op->type = MKOP(CACHEOP, DCBF, 0);
1778 op->ea = xform_ea(instr, regs);
1779 return 0;
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001780
1781 case 246: /* dcbtst */
Paul Mackerrasbe96f632014-09-02 14:35:07 +10001782 op->type = MKOP(CACHEOP, DCBTST, 0);
1783 op->ea = xform_ea(instr, regs);
1784 op->reg = rd;
1785 return 0;
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001786
1787 case 278: /* dcbt */
Paul Mackerrasbe96f632014-09-02 14:35:07 +10001788 op->type = MKOP(CACHEOP, DCBTST, 0);
1789 op->ea = xform_ea(instr, regs);
1790 op->reg = rd;
1791 return 0;
Paul Mackerrascf87c3f2014-09-02 14:35:08 +10001792
1793 case 982: /* icbi */
1794 op->type = MKOP(CACHEOP, ICBI, 0);
1795 op->ea = xform_ea(instr, regs);
1796 return 0;
Paul Mackerrasb2543f72017-08-30 14:12:36 +10001797
1798 case 1014: /* dcbz */
1799 op->type = MKOP(CACHEOP, DCBZ, 0);
1800 op->ea = xform_ea(instr, regs);
1801 return 0;
Paul Mackerras14cf11a2005-09-26 16:04:21 +10001802 }
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001803 break;
Paul Mackerras14cf11a2005-09-26 16:04:21 +10001804 }
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001805
Paul Mackerras350779a2017-08-30 14:12:27 +10001806/*
1807 * Loads and stores.
1808 */
Paul Mackerrasbe96f632014-09-02 14:35:07 +10001809 op->type = UNKNOWN;
1810 op->update_reg = ra;
1811 op->reg = rd;
1812 op->val = regs->gpr[rd];
1813 u = (instr >> 20) & UPDATE;
Paul Mackerras350779a2017-08-30 14:12:27 +10001814 op->vsx_flags = 0;
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001815
1816 switch (opcode) {
1817 case 31:
Paul Mackerrasbe96f632014-09-02 14:35:07 +10001818 u = instr & UPDATE;
1819 op->ea = xform_ea(instr, regs);
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001820 switch ((instr >> 1) & 0x3ff) {
1821 case 20: /* lwarx */
Paul Mackerrasbe96f632014-09-02 14:35:07 +10001822 op->type = MKOP(LARX, 0, 4);
1823 break;
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001824
1825 case 150: /* stwcx. */
Paul Mackerrasbe96f632014-09-02 14:35:07 +10001826 op->type = MKOP(STCX, 0, 4);
1827 break;
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001828
1829#ifdef __powerpc64__
1830 case 84: /* ldarx */
Paul Mackerrasbe96f632014-09-02 14:35:07 +10001831 op->type = MKOP(LARX, 0, 8);
1832 break;
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001833
1834 case 214: /* stdcx. */
Paul Mackerrasbe96f632014-09-02 14:35:07 +10001835 op->type = MKOP(STCX, 0, 8);
1836 break;
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001837
Paul Mackerras350779a2017-08-30 14:12:27 +10001838 case 52: /* lbarx */
1839 op->type = MKOP(LARX, 0, 1);
1840 break;
1841
1842 case 694: /* stbcx. */
1843 op->type = MKOP(STCX, 0, 1);
1844 break;
1845
1846 case 116: /* lharx */
1847 op->type = MKOP(LARX, 0, 2);
1848 break;
1849
1850 case 726: /* sthcx. */
1851 op->type = MKOP(STCX, 0, 2);
1852 break;
1853
1854 case 276: /* lqarx */
1855 if (!((rd & 1) || rd == ra || rd == rb))
1856 op->type = MKOP(LARX, 0, 16);
1857 break;
1858
1859 case 182: /* stqcx. */
1860 if (!(rd & 1))
1861 op->type = MKOP(STCX, 0, 16);
Paul Mackerrasbe96f632014-09-02 14:35:07 +10001862 break;
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001863#endif
1864
1865 case 23: /* lwzx */
1866 case 55: /* lwzux */
Paul Mackerrasbe96f632014-09-02 14:35:07 +10001867 op->type = MKOP(LOAD, u, 4);
1868 break;
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001869
1870 case 87: /* lbzx */
1871 case 119: /* lbzux */
Paul Mackerrasbe96f632014-09-02 14:35:07 +10001872 op->type = MKOP(LOAD, u, 1);
1873 break;
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001874
1875#ifdef CONFIG_ALTIVEC
Paul Mackerrase61ccc72017-08-30 14:12:34 +10001876 /*
1877 * Note: for the load/store vector element instructions,
1878 * bits of the EA say which field of the VMX register to use.
1879 */
1880 case 7: /* lvebx */
1881 op->type = MKOP(LOAD_VMX, 0, 1);
1882 op->element_size = 1;
1883 break;
1884
1885 case 39: /* lvehx */
1886 op->type = MKOP(LOAD_VMX, 0, 2);
1887 op->element_size = 2;
1888 break;
1889
1890 case 71: /* lvewx */
1891 op->type = MKOP(LOAD_VMX, 0, 4);
1892 op->element_size = 4;
1893 break;
1894
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001895 case 103: /* lvx */
1896 case 359: /* lvxl */
Paul Mackerrasbe96f632014-09-02 14:35:07 +10001897 op->type = MKOP(LOAD_VMX, 0, 16);
Paul Mackerras350779a2017-08-30 14:12:27 +10001898 op->element_size = 16;
Paul Mackerrasbe96f632014-09-02 14:35:07 +10001899 break;
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001900
Paul Mackerrase61ccc72017-08-30 14:12:34 +10001901 case 135: /* stvebx */
1902 op->type = MKOP(STORE_VMX, 0, 1);
1903 op->element_size = 1;
1904 break;
1905
1906 case 167: /* stvehx */
1907 op->type = MKOP(STORE_VMX, 0, 2);
1908 op->element_size = 2;
1909 break;
1910
1911 case 199: /* stvewx */
1912 op->type = MKOP(STORE_VMX, 0, 4);
1913 op->element_size = 4;
1914 break;
1915
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001916 case 231: /* stvx */
1917 case 487: /* stvxl */
Paul Mackerrasbe96f632014-09-02 14:35:07 +10001918 op->type = MKOP(STORE_VMX, 0, 16);
1919 break;
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001920#endif /* CONFIG_ALTIVEC */
1921
1922#ifdef __powerpc64__
Paul Mackerras350779a2017-08-30 14:12:27 +10001923 case 21: /* ldx */
1924 case 53: /* ldux */
1925 op->type = MKOP(LOAD, u, 8);
1926 break;
1927
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001928 case 149: /* stdx */
1929 case 181: /* stdux */
Paul Mackerrasbe96f632014-09-02 14:35:07 +10001930 op->type = MKOP(STORE, u, 8);
1931 break;
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001932#endif
1933
1934 case 151: /* stwx */
1935 case 183: /* stwux */
Paul Mackerrasbe96f632014-09-02 14:35:07 +10001936 op->type = MKOP(STORE, u, 4);
1937 break;
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001938
1939 case 215: /* stbx */
1940 case 247: /* stbux */
Paul Mackerrasbe96f632014-09-02 14:35:07 +10001941 op->type = MKOP(STORE, u, 1);
1942 break;
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001943
1944 case 279: /* lhzx */
1945 case 311: /* lhzux */
Paul Mackerrasbe96f632014-09-02 14:35:07 +10001946 op->type = MKOP(LOAD, u, 2);
1947 break;
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001948
1949#ifdef __powerpc64__
1950 case 341: /* lwax */
1951 case 373: /* lwaux */
Paul Mackerrasbe96f632014-09-02 14:35:07 +10001952 op->type = MKOP(LOAD, SIGNEXT | u, 4);
1953 break;
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001954#endif
1955
1956 case 343: /* lhax */
1957 case 375: /* lhaux */
Paul Mackerrasbe96f632014-09-02 14:35:07 +10001958 op->type = MKOP(LOAD, SIGNEXT | u, 2);
1959 break;
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001960
1961 case 407: /* sthx */
1962 case 439: /* sthux */
Paul Mackerrasbe96f632014-09-02 14:35:07 +10001963 op->type = MKOP(STORE, u, 2);
1964 break;
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001965
1966#ifdef __powerpc64__
1967 case 532: /* ldbrx */
Paul Mackerrasbe96f632014-09-02 14:35:07 +10001968 op->type = MKOP(LOAD, BYTEREV, 8);
1969 break;
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001970
1971#endif
Paul Mackerrasc9f6f4e2014-09-02 14:35:09 +10001972 case 533: /* lswx */
1973 op->type = MKOP(LOAD_MULTI, 0, regs->xer & 0x7f);
1974 break;
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001975
1976 case 534: /* lwbrx */
Paul Mackerrasbe96f632014-09-02 14:35:07 +10001977 op->type = MKOP(LOAD, BYTEREV, 4);
1978 break;
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001979
Paul Mackerrasc9f6f4e2014-09-02 14:35:09 +10001980 case 597: /* lswi */
1981 if (rb == 0)
1982 rb = 32; /* # bytes to load */
1983 op->type = MKOP(LOAD_MULTI, 0, rb);
Paul Mackerrasd120cdb2017-08-30 14:12:28 +10001984 op->ea = ra ? regs->gpr[ra] : 0;
Paul Mackerrasc9f6f4e2014-09-02 14:35:09 +10001985 break;
1986
Paul Bolleb69a1da2014-05-20 21:59:42 +02001987#ifdef CONFIG_PPC_FPU
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001988 case 535: /* lfsx */
1989 case 567: /* lfsux */
Paul Mackerrasbe96f632014-09-02 14:35:07 +10001990 op->type = MKOP(LOAD_FP, u, 4);
1991 break;
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001992
1993 case 599: /* lfdx */
1994 case 631: /* lfdux */
Paul Mackerrasbe96f632014-09-02 14:35:07 +10001995 op->type = MKOP(LOAD_FP, u, 8);
1996 break;
Paul Mackerras0016a4c2010-06-15 14:48:58 +10001997
1998 case 663: /* stfsx */
1999 case 695: /* stfsux */
Paul Mackerrasbe96f632014-09-02 14:35:07 +10002000 op->type = MKOP(STORE_FP, u, 4);
2001 break;
Paul Mackerras0016a4c2010-06-15 14:48:58 +10002002
2003 case 727: /* stfdx */
2004 case 759: /* stfdux */
Paul Mackerrasbe96f632014-09-02 14:35:07 +10002005 op->type = MKOP(STORE_FP, u, 8);
2006 break;
Paul Mackerras1f41fb72017-08-30 14:12:35 +10002007
2008#ifdef __powerpc64__
2009 case 791: /* lfdpx */
2010 op->type = MKOP(LOAD_FP, 0, 16);
2011 break;
2012
2013 case 919: /* stfdpx */
2014 op->type = MKOP(STORE_FP, 0, 16);
2015 break;
2016#endif /* __powerpc64 */
2017#endif /* CONFIG_PPC_FPU */
Paul Mackerras0016a4c2010-06-15 14:48:58 +10002018
2019#ifdef __powerpc64__
2020 case 660: /* stdbrx */
Paul Mackerrasbe96f632014-09-02 14:35:07 +10002021 op->type = MKOP(STORE, BYTEREV, 8);
2022 op->val = byterev_8(regs->gpr[rd]);
2023 break;
Paul Mackerras0016a4c2010-06-15 14:48:58 +10002024
2025#endif
Paul Mackerrasc9f6f4e2014-09-02 14:35:09 +10002026 case 661: /* stswx */
2027 op->type = MKOP(STORE_MULTI, 0, regs->xer & 0x7f);
2028 break;
2029
Paul Mackerras0016a4c2010-06-15 14:48:58 +10002030 case 662: /* stwbrx */
Paul Mackerrasbe96f632014-09-02 14:35:07 +10002031 op->type = MKOP(STORE, BYTEREV, 4);
2032 op->val = byterev_4(regs->gpr[rd]);
2033 break;
Paul Mackerras0016a4c2010-06-15 14:48:58 +10002034
Paul Mackerras1f41fb72017-08-30 14:12:35 +10002035 case 725: /* stswi */
Paul Mackerrasc9f6f4e2014-09-02 14:35:09 +10002036 if (rb == 0)
2037 rb = 32; /* # bytes to store */
2038 op->type = MKOP(STORE_MULTI, 0, rb);
Paul Mackerrasd120cdb2017-08-30 14:12:28 +10002039 op->ea = ra ? regs->gpr[ra] : 0;
Paul Mackerrasc9f6f4e2014-09-02 14:35:09 +10002040 break;
2041
Paul Mackerras0016a4c2010-06-15 14:48:58 +10002042 case 790: /* lhbrx */
Paul Mackerrasbe96f632014-09-02 14:35:07 +10002043 op->type = MKOP(LOAD, BYTEREV, 2);
2044 break;
Paul Mackerras0016a4c2010-06-15 14:48:58 +10002045
2046 case 918: /* sthbrx */
Paul Mackerrasbe96f632014-09-02 14:35:07 +10002047 op->type = MKOP(STORE, BYTEREV, 2);
2048 op->val = byterev_2(regs->gpr[rd]);
2049 break;
Paul Mackerras0016a4c2010-06-15 14:48:58 +10002050
2051#ifdef CONFIG_VSX
Paul Mackerras350779a2017-08-30 14:12:27 +10002052 case 12: /* lxsiwzx */
Paul Mackerrasbe96f632014-09-02 14:35:07 +10002053 op->reg = rd | ((instr & 1) << 5);
Paul Mackerras350779a2017-08-30 14:12:27 +10002054 op->type = MKOP(LOAD_VSX, 0, 4);
2055 op->element_size = 8;
2056 break;
2057
2058 case 76: /* lxsiwax */
2059 op->reg = rd | ((instr & 1) << 5);
2060 op->type = MKOP(LOAD_VSX, SIGNEXT, 4);
2061 op->element_size = 8;
2062 break;
2063
2064 case 140: /* stxsiwx */
2065 op->reg = rd | ((instr & 1) << 5);
2066 op->type = MKOP(STORE_VSX, 0, 4);
2067 op->element_size = 8;
2068 break;
2069
2070 case 268: /* lxvx */
2071 op->reg = rd | ((instr & 1) << 5);
2072 op->type = MKOP(LOAD_VSX, 0, 16);
2073 op->element_size = 16;
2074 op->vsx_flags = VSX_CHECK_VEC;
2075 break;
2076
2077 case 269: /* lxvl */
2078 case 301: { /* lxvll */
2079 int nb;
2080 op->reg = rd | ((instr & 1) << 5);
2081 op->ea = ra ? regs->gpr[ra] : 0;
2082 nb = regs->gpr[rb] & 0xff;
2083 if (nb > 16)
2084 nb = 16;
2085 op->type = MKOP(LOAD_VSX, 0, nb);
2086 op->element_size = 16;
2087 op->vsx_flags = ((instr & 0x20) ? VSX_LDLEFT : 0) |
2088 VSX_CHECK_VEC;
2089 break;
2090 }
2091 case 332: /* lxvdsx */
2092 op->reg = rd | ((instr & 1) << 5);
2093 op->type = MKOP(LOAD_VSX, 0, 8);
2094 op->element_size = 8;
2095 op->vsx_flags = VSX_SPLAT;
2096 break;
2097
2098 case 364: /* lxvwsx */
2099 op->reg = rd | ((instr & 1) << 5);
2100 op->type = MKOP(LOAD_VSX, 0, 4);
2101 op->element_size = 4;
2102 op->vsx_flags = VSX_SPLAT | VSX_CHECK_VEC;
2103 break;
2104
2105 case 396: /* stxvx */
2106 op->reg = rd | ((instr & 1) << 5);
2107 op->type = MKOP(STORE_VSX, 0, 16);
2108 op->element_size = 16;
2109 op->vsx_flags = VSX_CHECK_VEC;
2110 break;
2111
2112 case 397: /* stxvl */
2113 case 429: { /* stxvll */
2114 int nb;
2115 op->reg = rd | ((instr & 1) << 5);
2116 op->ea = ra ? regs->gpr[ra] : 0;
2117 nb = regs->gpr[rb] & 0xff;
2118 if (nb > 16)
2119 nb = 16;
2120 op->type = MKOP(STORE_VSX, 0, nb);
2121 op->element_size = 16;
2122 op->vsx_flags = ((instr & 0x20) ? VSX_LDLEFT : 0) |
2123 VSX_CHECK_VEC;
2124 break;
2125 }
2126 case 524: /* lxsspx */
2127 op->reg = rd | ((instr & 1) << 5);
2128 op->type = MKOP(LOAD_VSX, 0, 4);
2129 op->element_size = 8;
2130 op->vsx_flags = VSX_FPCONV;
2131 break;
2132
2133 case 588: /* lxsdx */
2134 op->reg = rd | ((instr & 1) << 5);
2135 op->type = MKOP(LOAD_VSX, 0, 8);
2136 op->element_size = 8;
2137 break;
2138
2139 case 652: /* stxsspx */
2140 op->reg = rd | ((instr & 1) << 5);
2141 op->type = MKOP(STORE_VSX, 0, 4);
2142 op->element_size = 8;
2143 op->vsx_flags = VSX_FPCONV;
2144 break;
2145
2146 case 716: /* stxsdx */
2147 op->reg = rd | ((instr & 1) << 5);
2148 op->type = MKOP(STORE_VSX, 0, 8);
2149 op->element_size = 8;
2150 break;
2151
2152 case 780: /* lxvw4x */
2153 op->reg = rd | ((instr & 1) << 5);
2154 op->type = MKOP(LOAD_VSX, 0, 16);
2155 op->element_size = 4;
2156 break;
2157
2158 case 781: /* lxsibzx */
2159 op->reg = rd | ((instr & 1) << 5);
2160 op->type = MKOP(LOAD_VSX, 0, 1);
2161 op->element_size = 8;
2162 op->vsx_flags = VSX_CHECK_VEC;
2163 break;
2164
2165 case 812: /* lxvh8x */
2166 op->reg = rd | ((instr & 1) << 5);
2167 op->type = MKOP(LOAD_VSX, 0, 16);
2168 op->element_size = 2;
2169 op->vsx_flags = VSX_CHECK_VEC;
2170 break;
2171
2172 case 813: /* lxsihzx */
2173 op->reg = rd | ((instr & 1) << 5);
2174 op->type = MKOP(LOAD_VSX, 0, 2);
2175 op->element_size = 8;
2176 op->vsx_flags = VSX_CHECK_VEC;
2177 break;
2178
2179 case 844: /* lxvd2x */
2180 op->reg = rd | ((instr & 1) << 5);
2181 op->type = MKOP(LOAD_VSX, 0, 16);
2182 op->element_size = 8;
2183 break;
2184
2185 case 876: /* lxvb16x */
2186 op->reg = rd | ((instr & 1) << 5);
2187 op->type = MKOP(LOAD_VSX, 0, 16);
2188 op->element_size = 1;
2189 op->vsx_flags = VSX_CHECK_VEC;
2190 break;
2191
2192 case 908: /* stxvw4x */
2193 op->reg = rd | ((instr & 1) << 5);
2194 op->type = MKOP(STORE_VSX, 0, 16);
2195 op->element_size = 4;
2196 break;
2197
2198 case 909: /* stxsibx */
2199 op->reg = rd | ((instr & 1) << 5);
2200 op->type = MKOP(STORE_VSX, 0, 1);
2201 op->element_size = 8;
2202 op->vsx_flags = VSX_CHECK_VEC;
2203 break;
2204
2205 case 940: /* stxvh8x */
2206 op->reg = rd | ((instr & 1) << 5);
2207 op->type = MKOP(STORE_VSX, 0, 16);
2208 op->element_size = 2;
2209 op->vsx_flags = VSX_CHECK_VEC;
2210 break;
2211
2212 case 941: /* stxsihx */
2213 op->reg = rd | ((instr & 1) << 5);
2214 op->type = MKOP(STORE_VSX, 0, 2);
2215 op->element_size = 8;
2216 op->vsx_flags = VSX_CHECK_VEC;
Paul Mackerrasbe96f632014-09-02 14:35:07 +10002217 break;
Paul Mackerras0016a4c2010-06-15 14:48:58 +10002218
2219 case 972: /* stxvd2x */
Paul Mackerrasbe96f632014-09-02 14:35:07 +10002220 op->reg = rd | ((instr & 1) << 5);
Paul Mackerras350779a2017-08-30 14:12:27 +10002221 op->type = MKOP(STORE_VSX, 0, 16);
2222 op->element_size = 8;
2223 break;
2224
2225 case 1004: /* stxvb16x */
2226 op->reg = rd | ((instr & 1) << 5);
2227 op->type = MKOP(STORE_VSX, 0, 16);
2228 op->element_size = 1;
2229 op->vsx_flags = VSX_CHECK_VEC;
Paul Mackerrasbe96f632014-09-02 14:35:07 +10002230 break;
Paul Mackerras0016a4c2010-06-15 14:48:58 +10002231
2232#endif /* CONFIG_VSX */
2233 }
2234 break;
2235
2236 case 32: /* lwz */
2237 case 33: /* lwzu */
Paul Mackerrasbe96f632014-09-02 14:35:07 +10002238 op->type = MKOP(LOAD, u, 4);
2239 op->ea = dform_ea(instr, regs);
2240 break;
Paul Mackerras0016a4c2010-06-15 14:48:58 +10002241
2242 case 34: /* lbz */
2243 case 35: /* lbzu */
Paul Mackerrasbe96f632014-09-02 14:35:07 +10002244 op->type = MKOP(LOAD, u, 1);
2245 op->ea = dform_ea(instr, regs);
2246 break;
Paul Mackerras0016a4c2010-06-15 14:48:58 +10002247
2248 case 36: /* stw */
Tiejun Chen8e9f6932012-09-16 23:54:31 +00002249 case 37: /* stwu */
Paul Mackerrasbe96f632014-09-02 14:35:07 +10002250 op->type = MKOP(STORE, u, 4);
2251 op->ea = dform_ea(instr, regs);
2252 break;
Tiejun Chen8e9f6932012-09-16 23:54:31 +00002253
Paul Mackerras0016a4c2010-06-15 14:48:58 +10002254 case 38: /* stb */
2255 case 39: /* stbu */
Paul Mackerrasbe96f632014-09-02 14:35:07 +10002256 op->type = MKOP(STORE, u, 1);
2257 op->ea = dform_ea(instr, regs);
2258 break;
Paul Mackerras0016a4c2010-06-15 14:48:58 +10002259
2260 case 40: /* lhz */
2261 case 41: /* lhzu */
Paul Mackerrasbe96f632014-09-02 14:35:07 +10002262 op->type = MKOP(LOAD, u, 2);
2263 op->ea = dform_ea(instr, regs);
2264 break;
Paul Mackerras0016a4c2010-06-15 14:48:58 +10002265
2266 case 42: /* lha */
2267 case 43: /* lhau */
Paul Mackerrasbe96f632014-09-02 14:35:07 +10002268 op->type = MKOP(LOAD, SIGNEXT | u, 2);
2269 op->ea = dform_ea(instr, regs);
2270 break;
Paul Mackerras0016a4c2010-06-15 14:48:58 +10002271
2272 case 44: /* sth */
2273 case 45: /* sthu */
Paul Mackerrasbe96f632014-09-02 14:35:07 +10002274 op->type = MKOP(STORE, u, 2);
2275 op->ea = dform_ea(instr, regs);
2276 break;
Paul Mackerras0016a4c2010-06-15 14:48:58 +10002277
2278 case 46: /* lmw */
Paul Mackerras0016a4c2010-06-15 14:48:58 +10002279 if (ra >= rd)
2280 break; /* invalid form, ra in range to load */
Paul Mackerrasc9f6f4e2014-09-02 14:35:09 +10002281 op->type = MKOP(LOAD_MULTI, 0, 4 * (32 - rd));
Paul Mackerrasbe96f632014-09-02 14:35:07 +10002282 op->ea = dform_ea(instr, regs);
2283 break;
Paul Mackerras0016a4c2010-06-15 14:48:58 +10002284
2285 case 47: /* stmw */
Paul Mackerrasc9f6f4e2014-09-02 14:35:09 +10002286 op->type = MKOP(STORE_MULTI, 0, 4 * (32 - rd));
Paul Mackerrasbe96f632014-09-02 14:35:07 +10002287 op->ea = dform_ea(instr, regs);
2288 break;
Paul Mackerras0016a4c2010-06-15 14:48:58 +10002289
Sean MacLennancd64d162010-09-01 07:21:21 +00002290#ifdef CONFIG_PPC_FPU
Paul Mackerras0016a4c2010-06-15 14:48:58 +10002291 case 48: /* lfs */
2292 case 49: /* lfsu */
Paul Mackerrasbe96f632014-09-02 14:35:07 +10002293 op->type = MKOP(LOAD_FP, u, 4);
2294 op->ea = dform_ea(instr, regs);
2295 break;
Paul Mackerras0016a4c2010-06-15 14:48:58 +10002296
2297 case 50: /* lfd */
2298 case 51: /* lfdu */
Paul Mackerrasbe96f632014-09-02 14:35:07 +10002299 op->type = MKOP(LOAD_FP, u, 8);
2300 op->ea = dform_ea(instr, regs);
2301 break;
Paul Mackerras0016a4c2010-06-15 14:48:58 +10002302
2303 case 52: /* stfs */
2304 case 53: /* stfsu */
Paul Mackerrasbe96f632014-09-02 14:35:07 +10002305 op->type = MKOP(STORE_FP, u, 4);
2306 op->ea = dform_ea(instr, regs);
2307 break;
Paul Mackerras0016a4c2010-06-15 14:48:58 +10002308
2309 case 54: /* stfd */
2310 case 55: /* stfdu */
Paul Mackerrasbe96f632014-09-02 14:35:07 +10002311 op->type = MKOP(STORE_FP, u, 8);
2312 op->ea = dform_ea(instr, regs);
2313 break;
Sean MacLennancd64d162010-09-01 07:21:21 +00002314#endif
Paul Mackerras0016a4c2010-06-15 14:48:58 +10002315
2316#ifdef __powerpc64__
Paul Mackerras350779a2017-08-30 14:12:27 +10002317 case 56: /* lq */
2318 if (!((rd & 1) || (rd == ra)))
2319 op->type = MKOP(LOAD, 0, 16);
2320 op->ea = dqform_ea(instr, regs);
2321 break;
2322#endif
2323
2324#ifdef CONFIG_VSX
Paul Mackerras1f41fb72017-08-30 14:12:35 +10002325 case 57: /* lfdp, lxsd, lxssp */
Paul Mackerras350779a2017-08-30 14:12:27 +10002326 op->ea = dsform_ea(instr, regs);
2327 switch (instr & 3) {
Paul Mackerras1f41fb72017-08-30 14:12:35 +10002328 case 0: /* lfdp */
2329 if (rd & 1)
2330 break; /* reg must be even */
2331 op->type = MKOP(LOAD_FP, 0, 16);
2332 break;
Paul Mackerras350779a2017-08-30 14:12:27 +10002333 case 2: /* lxsd */
2334 op->reg = rd + 32;
2335 op->type = MKOP(LOAD_VSX, 0, 8);
2336 op->element_size = 8;
2337 op->vsx_flags = VSX_CHECK_VEC;
2338 break;
2339 case 3: /* lxssp */
2340 op->reg = rd + 32;
2341 op->type = MKOP(LOAD_VSX, 0, 4);
2342 op->element_size = 8;
2343 op->vsx_flags = VSX_FPCONV | VSX_CHECK_VEC;
2344 break;
2345 }
2346 break;
2347#endif /* CONFIG_VSX */
2348
2349#ifdef __powerpc64__
Paul Mackerras0016a4c2010-06-15 14:48:58 +10002350 case 58: /* ld[u], lwa */
Paul Mackerrasbe96f632014-09-02 14:35:07 +10002351 op->ea = dsform_ea(instr, regs);
Paul Mackerras0016a4c2010-06-15 14:48:58 +10002352 switch (instr & 3) {
2353 case 0: /* ld */
Paul Mackerrasbe96f632014-09-02 14:35:07 +10002354 op->type = MKOP(LOAD, 0, 8);
2355 break;
Paul Mackerras0016a4c2010-06-15 14:48:58 +10002356 case 1: /* ldu */
Paul Mackerrasbe96f632014-09-02 14:35:07 +10002357 op->type = MKOP(LOAD, UPDATE, 8);
2358 break;
Paul Mackerras0016a4c2010-06-15 14:48:58 +10002359 case 2: /* lwa */
Paul Mackerrasbe96f632014-09-02 14:35:07 +10002360 op->type = MKOP(LOAD, SIGNEXT, 4);
2361 break;
Paul Mackerras0016a4c2010-06-15 14:48:58 +10002362 }
2363 break;
Paul Mackerras350779a2017-08-30 14:12:27 +10002364#endif
Paul Mackerras0016a4c2010-06-15 14:48:58 +10002365
Paul Mackerras350779a2017-08-30 14:12:27 +10002366#ifdef CONFIG_VSX
Paul Mackerras1f41fb72017-08-30 14:12:35 +10002367 case 61: /* stfdp, lxv, stxsd, stxssp, stxv */
Paul Mackerras350779a2017-08-30 14:12:27 +10002368 switch (instr & 7) {
Paul Mackerras1f41fb72017-08-30 14:12:35 +10002369 case 0: /* stfdp with LSB of DS field = 0 */
2370 case 4: /* stfdp with LSB of DS field = 1 */
2371 op->ea = dsform_ea(instr, regs);
2372 op->type = MKOP(STORE_FP, 0, 16);
2373 break;
2374
Paul Mackerras350779a2017-08-30 14:12:27 +10002375 case 1: /* lxv */
2376 op->ea = dqform_ea(instr, regs);
2377 if (instr & 8)
2378 op->reg = rd + 32;
2379 op->type = MKOP(LOAD_VSX, 0, 16);
2380 op->element_size = 16;
2381 op->vsx_flags = VSX_CHECK_VEC;
2382 break;
2383
2384 case 2: /* stxsd with LSB of DS field = 0 */
2385 case 6: /* stxsd with LSB of DS field = 1 */
2386 op->ea = dsform_ea(instr, regs);
2387 op->reg = rd + 32;
2388 op->type = MKOP(STORE_VSX, 0, 8);
2389 op->element_size = 8;
2390 op->vsx_flags = VSX_CHECK_VEC;
2391 break;
2392
2393 case 3: /* stxssp with LSB of DS field = 0 */
2394 case 7: /* stxssp with LSB of DS field = 1 */
2395 op->ea = dsform_ea(instr, regs);
2396 op->reg = rd + 32;
2397 op->type = MKOP(STORE_VSX, 0, 4);
2398 op->element_size = 8;
2399 op->vsx_flags = VSX_FPCONV | VSX_CHECK_VEC;
2400 break;
2401
2402 case 5: /* stxv */
2403 op->ea = dqform_ea(instr, regs);
2404 if (instr & 8)
2405 op->reg = rd + 32;
2406 op->type = MKOP(STORE_VSX, 0, 16);
2407 op->element_size = 16;
2408 op->vsx_flags = VSX_CHECK_VEC;
2409 break;
2410 }
2411 break;
2412#endif /* CONFIG_VSX */
2413
2414#ifdef __powerpc64__
Paul Mackerras0016a4c2010-06-15 14:48:58 +10002415 case 62: /* std[u] */
Paul Mackerrasbe96f632014-09-02 14:35:07 +10002416 op->ea = dsform_ea(instr, regs);
Paul Mackerras0016a4c2010-06-15 14:48:58 +10002417 switch (instr & 3) {
2418 case 0: /* std */
Paul Mackerrasbe96f632014-09-02 14:35:07 +10002419 op->type = MKOP(STORE, 0, 8);
2420 break;
Paul Mackerras0016a4c2010-06-15 14:48:58 +10002421 case 1: /* stdu */
Paul Mackerrasbe96f632014-09-02 14:35:07 +10002422 op->type = MKOP(STORE, UPDATE, 8);
2423 break;
Paul Mackerras350779a2017-08-30 14:12:27 +10002424 case 2: /* stq */
2425 if (!(rd & 1))
2426 op->type = MKOP(STORE, 0, 16);
2427 break;
Paul Mackerras0016a4c2010-06-15 14:48:58 +10002428 }
2429 break;
2430#endif /* __powerpc64__ */
2431
2432 }
Paul Mackerrasbe96f632014-09-02 14:35:07 +10002433 return 0;
Paul Mackerras0016a4c2010-06-15 14:48:58 +10002434
2435 logical_done:
2436 if (instr & 1)
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10002437 set_cr0(regs, op, ra);
2438 logical_done_nocc:
2439 op->reg = ra;
2440 op->type |= SETREG;
2441 return 1;
Paul Mackerras0016a4c2010-06-15 14:48:58 +10002442
2443 arith_done:
2444 if (instr & 1)
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10002445 set_cr0(regs, op, rd);
2446 compute_done:
2447 op->reg = rd;
2448 op->type |= SETREG;
Paul Mackerrasbe96f632014-09-02 14:35:07 +10002449 return 1;
2450
2451 priv:
2452 op->type = INTERRUPT | 0x700;
2453 op->val = SRR1_PROGPRIV;
2454 return 0;
2455
Paul Mackerrascf87c3f2014-09-02 14:35:08 +10002456 trap:
2457 op->type = INTERRUPT | 0x700;
2458 op->val = SRR1_PROGTRAP;
2459 return 0;
Paul Mackerrasbe96f632014-09-02 14:35:07 +10002460}
2461EXPORT_SYMBOL_GPL(analyse_instr);
Naveen N. Rao71f6e582017-04-12 16:48:51 +05302462NOKPROBE_SYMBOL(analyse_instr);
Paul Mackerrasbe96f632014-09-02 14:35:07 +10002463
2464/*
2465 * For PPC32 we always use stwu with r1 to change the stack pointer.
2466 * So this emulated store may corrupt the exception frame, now we
2467 * have to provide the exception frame trampoline, which is pushed
2468 * below the kprobed function stack. So we only update gpr[1] but
2469 * don't emulate the real store operation. We will do real store
2470 * operation safely in exception return code by checking this flag.
2471 */
Naveen N. Rao71f6e582017-04-12 16:48:51 +05302472static nokprobe_inline int handle_stack_update(unsigned long ea, struct pt_regs *regs)
Paul Mackerrasbe96f632014-09-02 14:35:07 +10002473{
2474#ifdef CONFIG_PPC32
2475 /*
2476 * Check if we will touch kernel stack overflow
2477 */
2478 if (ea - STACK_INT_FRAME_SIZE <= current->thread.ksp_limit) {
2479 printk(KERN_CRIT "Can't kprobe this since kernel stack would overflow.\n");
2480 return -EINVAL;
2481 }
2482#endif /* CONFIG_PPC32 */
2483 /*
2484 * Check if we already set since that means we'll
2485 * lose the previous value.
2486 */
2487 WARN_ON(test_thread_flag(TIF_EMULATE_STACK_STORE));
2488 set_thread_flag(TIF_EMULATE_STACK_STORE);
2489 return 0;
2490}
2491
Naveen N. Rao71f6e582017-04-12 16:48:51 +05302492static nokprobe_inline void do_signext(unsigned long *valp, int size)
Paul Mackerrasbe96f632014-09-02 14:35:07 +10002493{
2494 switch (size) {
2495 case 2:
2496 *valp = (signed short) *valp;
2497 break;
2498 case 4:
2499 *valp = (signed int) *valp;
2500 break;
2501 }
2502}
2503
Naveen N. Rao71f6e582017-04-12 16:48:51 +05302504static nokprobe_inline void do_byterev(unsigned long *valp, int size)
Paul Mackerrasbe96f632014-09-02 14:35:07 +10002505{
2506 switch (size) {
2507 case 2:
2508 *valp = byterev_2(*valp);
2509 break;
2510 case 4:
2511 *valp = byterev_4(*valp);
2512 break;
2513#ifdef __powerpc64__
2514 case 8:
2515 *valp = byterev_8(*valp);
2516 break;
2517#endif
2518 }
2519}
2520
2521/*
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10002522 * Emulate an instruction that can be executed just by updating
2523 * fields in *regs.
2524 */
2525void emulate_update_regs(struct pt_regs *regs, struct instruction_op *op)
2526{
2527 unsigned long next_pc;
2528
2529 next_pc = truncate_if_32bit(regs->msr, regs->nip + 4);
2530 switch (op->type & INSTR_TYPE_MASK) {
2531 case COMPUTE:
2532 if (op->type & SETREG)
2533 regs->gpr[op->reg] = op->val;
2534 if (op->type & SETCC)
2535 regs->ccr = op->ccval;
2536 if (op->type & SETXER)
2537 regs->xer = op->xerval;
2538 break;
2539
2540 case BRANCH:
2541 if (op->type & SETLK)
2542 regs->link = next_pc;
2543 if (op->type & BRTAKEN)
2544 next_pc = op->val;
2545 if (op->type & DECCTR)
2546 --regs->ctr;
2547 break;
2548
2549 case BARRIER:
2550 switch (op->type & BARRIER_MASK) {
2551 case BARRIER_SYNC:
2552 mb();
2553 break;
2554 case BARRIER_ISYNC:
2555 isync();
2556 break;
2557 case BARRIER_EIEIO:
2558 eieio();
2559 break;
2560 case BARRIER_LWSYNC:
2561 asm volatile("lwsync" : : : "memory");
2562 break;
2563 case BARRIER_PTESYNC:
2564 asm volatile("ptesync" : : : "memory");
2565 break;
2566 }
2567 break;
2568
2569 case MFSPR:
2570 switch (op->spr) {
2571 case SPRN_XER:
2572 regs->gpr[op->reg] = regs->xer & 0xffffffffUL;
2573 break;
2574 case SPRN_LR:
2575 regs->gpr[op->reg] = regs->link;
2576 break;
2577 case SPRN_CTR:
2578 regs->gpr[op->reg] = regs->ctr;
2579 break;
2580 default:
2581 WARN_ON_ONCE(1);
2582 }
2583 break;
2584
2585 case MTSPR:
2586 switch (op->spr) {
2587 case SPRN_XER:
2588 regs->xer = op->val & 0xffffffffUL;
2589 break;
2590 case SPRN_LR:
2591 regs->link = op->val;
2592 break;
2593 case SPRN_CTR:
2594 regs->ctr = op->val;
2595 break;
2596 default:
2597 WARN_ON_ONCE(1);
2598 }
2599 break;
2600
2601 default:
2602 WARN_ON_ONCE(1);
2603 }
2604 regs->nip = next_pc;
2605}
2606
2607/*
Paul Mackerrasbe96f632014-09-02 14:35:07 +10002608 * Emulate instructions that cause a transfer of control,
2609 * loads and stores, and a few other instructions.
2610 * Returns 1 if the step was emulated, 0 if not,
2611 * or -1 if the instruction is one that should not be stepped,
2612 * such as an rfid, or a mtmsrd that would clear MSR_RI.
2613 */
Naveen N. Rao71f6e582017-04-12 16:48:51 +05302614int emulate_step(struct pt_regs *regs, unsigned int instr)
Paul Mackerrasbe96f632014-09-02 14:35:07 +10002615{
2616 struct instruction_op op;
Paul Mackerrasd120cdb2017-08-30 14:12:28 +10002617 int r, err, size, type;
Paul Mackerrasbe96f632014-09-02 14:35:07 +10002618 unsigned long val;
2619 unsigned int cr;
Paul Mackerrasc9f6f4e2014-09-02 14:35:09 +10002620 int i, rd, nb;
Paul Mackerrasd120cdb2017-08-30 14:12:28 +10002621 unsigned long ea;
Paul Mackerrasbe96f632014-09-02 14:35:07 +10002622
2623 r = analyse_instr(&op, regs, instr);
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10002624 if (r < 0)
Paul Mackerrasbe96f632014-09-02 14:35:07 +10002625 return r;
Paul Mackerras3cdfcbf2017-08-30 14:12:25 +10002626 if (r > 0) {
2627 emulate_update_regs(regs, &op);
2628 return 1;
2629 }
Paul Mackerrasbe96f632014-09-02 14:35:07 +10002630
2631 err = 0;
2632 size = GETSIZE(op.type);
Paul Mackerrasd120cdb2017-08-30 14:12:28 +10002633 type = op.type & INSTR_TYPE_MASK;
2634
2635 ea = op.ea;
2636 if (OP_IS_LOAD_STORE(type) || type == CACHEOP)
2637 ea = truncate_if_32bit(regs->msr, op.ea);
2638
2639 switch (type) {
Paul Mackerrasbe96f632014-09-02 14:35:07 +10002640 case CACHEOP:
Paul Mackerrasd120cdb2017-08-30 14:12:28 +10002641 if (!address_ok(regs, ea, 8))
Paul Mackerrasbe96f632014-09-02 14:35:07 +10002642 return 0;
2643 switch (op.type & CACHEOP_MASK) {
2644 case DCBST:
Paul Mackerrasd120cdb2017-08-30 14:12:28 +10002645 __cacheop_user_asmx(ea, err, "dcbst");
Paul Mackerrasbe96f632014-09-02 14:35:07 +10002646 break;
2647 case DCBF:
Paul Mackerrasd120cdb2017-08-30 14:12:28 +10002648 __cacheop_user_asmx(ea, err, "dcbf");
Paul Mackerrasbe96f632014-09-02 14:35:07 +10002649 break;
2650 case DCBTST:
2651 if (op.reg == 0)
Paul Mackerrasd120cdb2017-08-30 14:12:28 +10002652 prefetchw((void *) ea);
Paul Mackerrasbe96f632014-09-02 14:35:07 +10002653 break;
2654 case DCBT:
2655 if (op.reg == 0)
Paul Mackerrasd120cdb2017-08-30 14:12:28 +10002656 prefetch((void *) ea);
Paul Mackerrasbe96f632014-09-02 14:35:07 +10002657 break;
Paul Mackerrascf87c3f2014-09-02 14:35:08 +10002658 case ICBI:
Paul Mackerrasd120cdb2017-08-30 14:12:28 +10002659 __cacheop_user_asmx(ea, err, "icbi");
Paul Mackerrascf87c3f2014-09-02 14:35:08 +10002660 break;
Paul Mackerrasb2543f72017-08-30 14:12:36 +10002661 case DCBZ:
2662 err = emulate_dcbz(ea, regs);
2663 break;
Paul Mackerrasbe96f632014-09-02 14:35:07 +10002664 }
Paul Mackerrasb9da9c82017-08-30 14:12:37 +10002665 if (err) {
2666 regs->dar = ea;
Paul Mackerrasbe96f632014-09-02 14:35:07 +10002667 return 0;
Paul Mackerrasb9da9c82017-08-30 14:12:37 +10002668 }
Paul Mackerrasbe96f632014-09-02 14:35:07 +10002669 goto instr_done;
2670
2671 case LARX:
Paul Mackerrasd120cdb2017-08-30 14:12:28 +10002672 if (ea & (size - 1))
Paul Mackerrasbe96f632014-09-02 14:35:07 +10002673 break; /* can't handle misaligned */
Paul Mackerrasd120cdb2017-08-30 14:12:28 +10002674 if (!address_ok(regs, ea, size))
Markus Elfring3c4b66a2017-01-21 15:30:15 +01002675 return 0;
Paul Mackerrasbe96f632014-09-02 14:35:07 +10002676 err = 0;
2677 switch (size) {
Paul Mackerras350779a2017-08-30 14:12:27 +10002678#ifdef __powerpc64__
2679 case 1:
Paul Mackerrasd120cdb2017-08-30 14:12:28 +10002680 __get_user_asmx(val, ea, err, "lbarx");
Paul Mackerras350779a2017-08-30 14:12:27 +10002681 break;
2682 case 2:
Paul Mackerrasd120cdb2017-08-30 14:12:28 +10002683 __get_user_asmx(val, ea, err, "lharx");
Paul Mackerras350779a2017-08-30 14:12:27 +10002684 break;
2685#endif
Paul Mackerrasbe96f632014-09-02 14:35:07 +10002686 case 4:
Paul Mackerrasd120cdb2017-08-30 14:12:28 +10002687 __get_user_asmx(val, ea, err, "lwarx");
Paul Mackerrasbe96f632014-09-02 14:35:07 +10002688 break;
Lennart Sorensendd217312016-05-05 16:44:44 -04002689#ifdef __powerpc64__
Paul Mackerrasbe96f632014-09-02 14:35:07 +10002690 case 8:
Paul Mackerrasd120cdb2017-08-30 14:12:28 +10002691 __get_user_asmx(val, ea, err, "ldarx");
Paul Mackerrasbe96f632014-09-02 14:35:07 +10002692 break;
Paul Mackerras350779a2017-08-30 14:12:27 +10002693 case 16:
Paul Mackerrasd120cdb2017-08-30 14:12:28 +10002694 err = do_lqarx(ea, &regs->gpr[op.reg]);
Paul Mackerrasb9da9c82017-08-30 14:12:37 +10002695 break;
Lennart Sorensendd217312016-05-05 16:44:44 -04002696#endif
Paul Mackerrasbe96f632014-09-02 14:35:07 +10002697 default:
2698 return 0;
2699 }
Paul Mackerrasb9da9c82017-08-30 14:12:37 +10002700 if (err) {
2701 regs->dar = ea;
2702 return 0;
2703 }
2704 if (size < 16)
Paul Mackerrasbe96f632014-09-02 14:35:07 +10002705 regs->gpr[op.reg] = val;
2706 goto ldst_done;
2707
2708 case STCX:
Paul Mackerrasd120cdb2017-08-30 14:12:28 +10002709 if (ea & (size - 1))
Paul Mackerrasbe96f632014-09-02 14:35:07 +10002710 break; /* can't handle misaligned */
Paul Mackerrasd120cdb2017-08-30 14:12:28 +10002711 if (!address_ok(regs, ea, size))
Markus Elfring3c4b66a2017-01-21 15:30:15 +01002712 return 0;
Paul Mackerrasbe96f632014-09-02 14:35:07 +10002713 err = 0;
2714 switch (size) {
Paul Mackerras350779a2017-08-30 14:12:27 +10002715#ifdef __powerpc64__
2716 case 1:
Paul Mackerrasd120cdb2017-08-30 14:12:28 +10002717 __put_user_asmx(op.val, ea, err, "stbcx.", cr);
Paul Mackerras350779a2017-08-30 14:12:27 +10002718 break;
2719 case 2:
Paul Mackerrasd120cdb2017-08-30 14:12:28 +10002720 __put_user_asmx(op.val, ea, err, "stbcx.", cr);
Paul Mackerras350779a2017-08-30 14:12:27 +10002721 break;
2722#endif
Paul Mackerrasbe96f632014-09-02 14:35:07 +10002723 case 4:
Paul Mackerrasd120cdb2017-08-30 14:12:28 +10002724 __put_user_asmx(op.val, ea, err, "stwcx.", cr);
Paul Mackerrasbe96f632014-09-02 14:35:07 +10002725 break;
Lennart Sorensendd217312016-05-05 16:44:44 -04002726#ifdef __powerpc64__
Paul Mackerrasbe96f632014-09-02 14:35:07 +10002727 case 8:
Paul Mackerrasd120cdb2017-08-30 14:12:28 +10002728 __put_user_asmx(op.val, ea, err, "stdcx.", cr);
Paul Mackerrasbe96f632014-09-02 14:35:07 +10002729 break;
Paul Mackerras350779a2017-08-30 14:12:27 +10002730 case 16:
Paul Mackerrasd120cdb2017-08-30 14:12:28 +10002731 err = do_stqcx(ea, regs->gpr[op.reg],
Paul Mackerras350779a2017-08-30 14:12:27 +10002732 regs->gpr[op.reg + 1], &cr);
2733 break;
Lennart Sorensendd217312016-05-05 16:44:44 -04002734#endif
Paul Mackerrasbe96f632014-09-02 14:35:07 +10002735 default:
2736 return 0;
2737 }
2738 if (!err)
2739 regs->ccr = (regs->ccr & 0x0fffffff) |
2740 (cr & 0xe0000000) |
2741 ((regs->xer >> 3) & 0x10000000);
Paul Mackerrasb9da9c82017-08-30 14:12:37 +10002742 else
2743 regs->dar = ea;
Paul Mackerrasbe96f632014-09-02 14:35:07 +10002744 goto ldst_done;
2745
2746 case LOAD:
Paul Mackerras350779a2017-08-30 14:12:27 +10002747#ifdef __powerpc64__
2748 if (size == 16) {
Paul Mackerrasd120cdb2017-08-30 14:12:28 +10002749 err = emulate_lq(regs, ea, op.reg);
Paul Mackerras350779a2017-08-30 14:12:27 +10002750 goto ldst_done;
2751 }
2752#endif
Paul Mackerrasd120cdb2017-08-30 14:12:28 +10002753 err = read_mem(&regs->gpr[op.reg], ea, size, regs);
Paul Mackerrasbe96f632014-09-02 14:35:07 +10002754 if (!err) {
2755 if (op.type & SIGNEXT)
2756 do_signext(&regs->gpr[op.reg], size);
2757 if (op.type & BYTEREV)
2758 do_byterev(&regs->gpr[op.reg], size);
2759 }
2760 goto ldst_done;
2761
Paul Mackerras7048c842014-11-03 15:46:43 +11002762#ifdef CONFIG_PPC_FPU
Paul Mackerrasbe96f632014-09-02 14:35:07 +10002763 case LOAD_FP:
Paul Mackerrasc22435a52017-08-30 14:12:33 +10002764 /*
2765 * If the instruction is in userspace, we can emulate it even
2766 * if the VMX state is not live, because we have the state
2767 * stored in the thread_struct. If the instruction is in
2768 * the kernel, we must not touch the state in the thread_struct.
2769 */
2770 if (!(regs->msr & MSR_PR) && !(regs->msr & MSR_FP))
Paul Mackerrasee0a54d2017-08-30 14:12:26 +10002771 return 0;
Paul Mackerrasc22435a52017-08-30 14:12:33 +10002772 err = do_fp_load(op.reg, ea, size, regs);
Paul Mackerrasbe96f632014-09-02 14:35:07 +10002773 goto ldst_done;
Paul Mackerras7048c842014-11-03 15:46:43 +11002774#endif
Paul Mackerrasbe96f632014-09-02 14:35:07 +10002775#ifdef CONFIG_ALTIVEC
2776 case LOAD_VMX:
Paul Mackerrasc22435a52017-08-30 14:12:33 +10002777 if (!(regs->msr & MSR_PR) && !(regs->msr & MSR_VEC))
Paul Mackerrasee0a54d2017-08-30 14:12:26 +10002778 return 0;
Paul Mackerrasc22435a52017-08-30 14:12:33 +10002779 err = do_vec_load(op.reg, ea, size, regs);
Paul Mackerrasbe96f632014-09-02 14:35:07 +10002780 goto ldst_done;
2781#endif
2782#ifdef CONFIG_VSX
Paul Mackerras350779a2017-08-30 14:12:27 +10002783 case LOAD_VSX: {
Paul Mackerras350779a2017-08-30 14:12:27 +10002784 unsigned long msrbit = MSR_VSX;
2785
2786 /*
2787 * Some VSX instructions check the MSR_VEC bit rather than MSR_VSX
2788 * when the target of the instruction is a vector register.
2789 */
2790 if (op.reg >= 32 && (op.vsx_flags & VSX_CHECK_VEC))
2791 msrbit = MSR_VEC;
Paul Mackerrasc22435a52017-08-30 14:12:33 +10002792 if (!(regs->msr & MSR_PR) && !(regs->msr & msrbit))
Paul Mackerrasee0a54d2017-08-30 14:12:26 +10002793 return 0;
Paul Mackerrasc22435a52017-08-30 14:12:33 +10002794 err = do_vsx_load(&op, ea, regs);
Paul Mackerrasbe96f632014-09-02 14:35:07 +10002795 goto ldst_done;
Paul Mackerras350779a2017-08-30 14:12:27 +10002796 }
Paul Mackerrasbe96f632014-09-02 14:35:07 +10002797#endif
2798 case LOAD_MULTI:
2799 if (regs->msr & MSR_LE)
2800 return 0;
2801 rd = op.reg;
Paul Mackerrasc9f6f4e2014-09-02 14:35:09 +10002802 for (i = 0; i < size; i += 4) {
2803 nb = size - i;
2804 if (nb > 4)
2805 nb = 4;
Paul Mackerrasd120cdb2017-08-30 14:12:28 +10002806 err = read_mem(&regs->gpr[rd], ea, nb, regs);
Paul Mackerrasbe96f632014-09-02 14:35:07 +10002807 if (err)
2808 return 0;
Paul Mackerrasc9f6f4e2014-09-02 14:35:09 +10002809 if (nb < 4) /* left-justify last bytes */
2810 regs->gpr[rd] <<= 32 - 8 * nb;
Paul Mackerrasd120cdb2017-08-30 14:12:28 +10002811 ea += 4;
Paul Mackerrasc9f6f4e2014-09-02 14:35:09 +10002812 ++rd;
2813 }
Paul Mackerrasbe96f632014-09-02 14:35:07 +10002814 goto instr_done;
2815
2816 case STORE:
Paul Mackerras350779a2017-08-30 14:12:27 +10002817#ifdef __powerpc64__
2818 if (size == 16) {
Paul Mackerrasd120cdb2017-08-30 14:12:28 +10002819 err = emulate_stq(regs, ea, op.reg);
Paul Mackerras350779a2017-08-30 14:12:27 +10002820 goto ldst_done;
2821 }
2822#endif
Paul Mackerrasbe96f632014-09-02 14:35:07 +10002823 if ((op.type & UPDATE) && size == sizeof(long) &&
2824 op.reg == 1 && op.update_reg == 1 &&
2825 !(regs->msr & MSR_PR) &&
Paul Mackerrasd120cdb2017-08-30 14:12:28 +10002826 ea >= regs->gpr[1] - STACK_INT_FRAME_SIZE) {
2827 err = handle_stack_update(ea, regs);
Paul Mackerrasbe96f632014-09-02 14:35:07 +10002828 goto ldst_done;
2829 }
Paul Mackerrasd120cdb2017-08-30 14:12:28 +10002830 err = write_mem(op.val, ea, size, regs);
Paul Mackerrasbe96f632014-09-02 14:35:07 +10002831 goto ldst_done;
2832
Paul Mackerras7048c842014-11-03 15:46:43 +11002833#ifdef CONFIG_PPC_FPU
Paul Mackerrasbe96f632014-09-02 14:35:07 +10002834 case STORE_FP:
Paul Mackerrasc22435a52017-08-30 14:12:33 +10002835 if (!(regs->msr & MSR_PR) && !(regs->msr & MSR_FP))
Paul Mackerrasee0a54d2017-08-30 14:12:26 +10002836 return 0;
Paul Mackerrasc22435a52017-08-30 14:12:33 +10002837 err = do_fp_store(op.reg, ea, size, regs);
Paul Mackerrasbe96f632014-09-02 14:35:07 +10002838 goto ldst_done;
Paul Mackerras7048c842014-11-03 15:46:43 +11002839#endif
Paul Mackerrasbe96f632014-09-02 14:35:07 +10002840#ifdef CONFIG_ALTIVEC
2841 case STORE_VMX:
Paul Mackerrasc22435a52017-08-30 14:12:33 +10002842 if (!(regs->msr & MSR_PR) && !(regs->msr & MSR_VEC))
Paul Mackerrasee0a54d2017-08-30 14:12:26 +10002843 return 0;
Paul Mackerrasc22435a52017-08-30 14:12:33 +10002844 err = do_vec_store(op.reg, ea, size, regs);
Paul Mackerrasbe96f632014-09-02 14:35:07 +10002845 goto ldst_done;
2846#endif
2847#ifdef CONFIG_VSX
Paul Mackerras350779a2017-08-30 14:12:27 +10002848 case STORE_VSX: {
Paul Mackerras350779a2017-08-30 14:12:27 +10002849 unsigned long msrbit = MSR_VSX;
2850
2851 /*
2852 * Some VSX instructions check the MSR_VEC bit rather than MSR_VSX
2853 * when the target of the instruction is a vector register.
2854 */
2855 if (op.reg >= 32 && (op.vsx_flags & VSX_CHECK_VEC))
2856 msrbit = MSR_VEC;
Paul Mackerrasc22435a52017-08-30 14:12:33 +10002857 if (!(regs->msr & MSR_PR) && !(regs->msr & msrbit))
Paul Mackerrasee0a54d2017-08-30 14:12:26 +10002858 return 0;
Paul Mackerrasc22435a52017-08-30 14:12:33 +10002859 err = do_vsx_store(&op, ea, regs);
Paul Mackerrasbe96f632014-09-02 14:35:07 +10002860 goto ldst_done;
Paul Mackerras350779a2017-08-30 14:12:27 +10002861 }
Paul Mackerrasbe96f632014-09-02 14:35:07 +10002862#endif
2863 case STORE_MULTI:
2864 if (regs->msr & MSR_LE)
2865 return 0;
2866 rd = op.reg;
Paul Mackerrasc9f6f4e2014-09-02 14:35:09 +10002867 for (i = 0; i < size; i += 4) {
2868 val = regs->gpr[rd];
2869 nb = size - i;
2870 if (nb > 4)
2871 nb = 4;
2872 else
2873 val >>= 32 - 8 * nb;
Paul Mackerrasd120cdb2017-08-30 14:12:28 +10002874 err = write_mem(val, ea, nb, regs);
Paul Mackerrasbe96f632014-09-02 14:35:07 +10002875 if (err)
2876 return 0;
Paul Mackerrasd120cdb2017-08-30 14:12:28 +10002877 ea += 4;
Paul Mackerrasc9f6f4e2014-09-02 14:35:09 +10002878 ++rd;
2879 }
Paul Mackerrasbe96f632014-09-02 14:35:07 +10002880 goto instr_done;
2881
2882 case MFMSR:
2883 regs->gpr[op.reg] = regs->msr & MSR_MASK;
2884 goto instr_done;
2885
2886 case MTMSR:
2887 val = regs->gpr[op.reg];
2888 if ((val & MSR_RI) == 0)
2889 /* can't step mtmsr[d] that would clear MSR_RI */
2890 return -1;
2891 /* here op.val is the mask of bits to change */
2892 regs->msr = (regs->msr & ~op.val) | (val & op.val);
2893 goto instr_done;
2894
2895#ifdef CONFIG_PPC64
2896 case SYSCALL: /* sc */
2897 /*
2898 * N.B. this uses knowledge about how the syscall
2899 * entry code works. If that is changed, this will
2900 * need to be changed also.
2901 */
2902 if (regs->gpr[0] == 0x1ebe &&
2903 cpu_has_feature(CPU_FTR_REAL_LE)) {
2904 regs->msr ^= MSR_LE;
2905 goto instr_done;
2906 }
2907 regs->gpr[9] = regs->gpr[13];
2908 regs->gpr[10] = MSR_KERNEL;
2909 regs->gpr[11] = regs->nip + 4;
2910 regs->gpr[12] = regs->msr & MSR_MASK;
2911 regs->gpr[13] = (unsigned long) get_paca();
2912 regs->nip = (unsigned long) &system_call_common;
2913 regs->msr = MSR_KERNEL;
2914 return 1;
2915
2916 case RFI:
2917 return -1;
2918#endif
2919 }
2920 return 0;
2921
2922 ldst_done:
2923 if (err)
2924 return 0;
2925 if (op.type & UPDATE)
2926 regs->gpr[op.update_reg] = op.ea;
2927
2928 instr_done:
2929 regs->nip = truncate_if_32bit(regs->msr, regs->nip + 4);
2930 return 1;
Paul Mackerras14cf11a2005-09-26 16:04:21 +10002931}
Naveen N. Rao71f6e582017-04-12 16:48:51 +05302932NOKPROBE_SYMBOL(emulate_step);