Lines Matching +full:only +full:- +full:1 +full:- +full:8 +full:v

1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /* align.c - handle alignment exceptions for the Power PC.
5 * Copyright (c) 1998-1999 TiVo, Inc.
9 * Copyright (c) 2001-2002 PPC64 team, IBM Corp
10 * 64-bit and Power4 support
39 #define ST 1 /* store */
40 #define SE 2 /* sign-extend value, or FP ld/st as word */
48 { 8, LD+E8 }, /* 0 00 00: evldd[x] */
49 { 8, LD+E4 }, /* 0 00 01: evldw[x] */
50 { 8, LD }, /* 0 00 10: evldh[x] */
65 { 8, ST+E8 }, /* 1 00 00: evstdd[x] */
66 { 8, ST+E4 }, /* 1 00 01: evstdw[x] */
67 { 8, ST }, /* 1 00 10: evstdh[x] */
68 INVALID, /* 1 00 11 */
69 INVALID, /* 1 01 00 */
70 INVALID, /* 1 01 01 */
71 INVALID, /* 1 01 10 */
72 INVALID, /* 1 01 11 */
73 { 4, ST }, /* 1 10 00: evstwhe[x] */
74 INVALID, /* 1 10 01 */
75 { 4, ST }, /* 1 10 10: evstwho[x] */
76 INVALID, /* 1 10 11 */
77 { 4, ST+E4 }, /* 1 11 00: evstwwe[x] */
78 INVALID, /* 1 11 01 */
79 { 4, ST+E4 }, /* 1 11 10: evstwwo[x] */
80 INVALID, /* 1 11 11 */
104 * Only Book-E has these instructions, and it does true little-endian,
114 u8 v[8]; in emulate_spe() member
117 unsigned long *evr = &current->thread.evr[reg]; in emulate_spe()
121 instr = (instr >> 1) & 0x1f; in emulate_spe()
124 addr = (unsigned char __user *)regs->dar; in emulate_spe()
129 /* userland only */ in emulate_spe()
145 data.w[1] = regs->gpr[reg]; in emulate_spe()
149 data.h[3] = regs->gpr[reg] >> 16; in emulate_spe()
153 data.h[3] = regs->gpr[reg] & 0xffff; in emulate_spe()
156 data.w[1] = *evr; in emulate_spe()
159 data.w[1] = regs->gpr[reg]; in emulate_spe()
162 return -EINVAL; in emulate_spe()
169 return -EFAULT; in emulate_spe()
172 case 8: in emulate_spe()
173 unsafe_get_user(temp.v[0], p++, Efault_read); in emulate_spe()
174 unsafe_get_user(temp.v[1], p++, Efault_read); in emulate_spe()
175 unsafe_get_user(temp.v[2], p++, Efault_read); in emulate_spe()
176 unsafe_get_user(temp.v[3], p++, Efault_read); in emulate_spe()
179 unsafe_get_user(temp.v[4], p++, Efault_read); in emulate_spe()
180 unsafe_get_user(temp.v[5], p++, Efault_read); in emulate_spe()
183 unsafe_get_user(temp.v[6], p++, Efault_read); in emulate_spe()
184 unsafe_get_user(temp.v[7], p++, Efault_read); in emulate_spe()
200 data.h[1] = temp.h[3]; in emulate_spe()
209 data.h[1] = temp.h[2]; in emulate_spe()
213 data.w[0] = temp.w[1]; in emulate_spe()
214 data.w[1] = temp.w[1]; in emulate_spe()
218 data.h[1] = temp.h[2]; in emulate_spe()
223 return -EINVAL; in emulate_spe()
234 data.w[1] = swab32(data.w[1]); in emulate_spe()
239 data.h[1] = swab16(data.h[1]); in emulate_spe()
247 data.w[0] = (s16)data.h[1]; in emulate_spe()
248 data.w[1] = (s16)data.h[3]; in emulate_spe()
256 return -EFAULT; in emulate_spe()
259 case 8: in emulate_spe()
260 unsafe_put_user(data.v[0], p++, Efault_write); in emulate_spe()
261 unsafe_put_user(data.v[1], p++, Efault_write); in emulate_spe()
262 unsafe_put_user(data.v[2], p++, Efault_write); in emulate_spe()
263 unsafe_put_user(data.v[3], p++, Efault_write); in emulate_spe()
266 unsafe_put_user(data.v[4], p++, Efault_write); in emulate_spe()
267 unsafe_put_user(data.v[5], p++, Efault_write); in emulate_spe()
270 unsafe_put_user(data.v[6], p++, Efault_write); in emulate_spe()
271 unsafe_put_user(data.v[7], p++, Efault_write); in emulate_spe()
276 regs->gpr[reg] = data.w[1]; in emulate_spe()
279 return 1; in emulate_spe()
283 return -EFAULT; in emulate_spe()
287 return -EFAULT; in emulate_spe()
294 * Return 1 on success
296 * Return -EFAULT if data address is bad
307 if (is_kernel_addr(regs->nip)) in fix_alignment()
308 r = copy_inst_from_kernel_nofault(&instr, (void *)regs->nip); in fix_alignment()
310 r = __get_user_instr(instr, (void __user *)regs->nip); in fix_alignment()
313 return -EFAULT; in fix_alignment()
314 if ((regs->msr & MSR_LE) != (MSR_KERNEL & MSR_LE)) { in fix_alignment()
315 /* We don't handle PPC little-endian any more... */ in fix_alignment()
317 return -EIO; in fix_alignment()
337 * when pasting to a co-processor. Furthermore, paste_last is the in fix_alignment()
341 return -EIO; in fix_alignment()
345 return -EINVAL; in fix_alignment()
350 return -EINVAL; in fix_alignment()
356 return -EIO; in fix_alignment()
362 return 1; in fix_alignment()