Commit e61ccc7b authored by Paul Mackerras's avatar Paul Mackerras Committed by Michael Ellerman

powerpc: Emulate vector element load/store instructions

This adds code to analyse_instr() and emulate_step() to handle the
vector element loads and stores:

lvebx, lvehx, lvewx, stvebx, stvehx, stvewx.
Signed-off-by: default avatarPaul Mackerras <paulus@ozlabs.org>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
parent c22435a5
...@@ -476,7 +476,7 @@ static nokprobe_inline int do_vec_load(int rn, unsigned long ea, ...@@ -476,7 +476,7 @@ static nokprobe_inline int do_vec_load(int rn, unsigned long ea,
return -EFAULT; return -EFAULT;
/* align to multiple of size */ /* align to multiple of size */
ea &= ~(size - 1); ea &= ~(size - 1);
err = copy_mem_in(u.b, ea, size); err = copy_mem_in(&u.b[ea & 0xf], ea, size);
if (err) if (err)
return err; return err;
...@@ -508,7 +508,7 @@ static nokprobe_inline int do_vec_store(int rn, unsigned long ea, ...@@ -508,7 +508,7 @@ static nokprobe_inline int do_vec_store(int rn, unsigned long ea,
else else
u.v = current->thread.vr_state.vr[rn]; u.v = current->thread.vr_state.vr[rn];
preempt_enable(); preempt_enable();
return copy_mem_out(u.b, ea, size); return copy_mem_out(&u.b[ea & 0xf], ea, size);
} }
#endif /* CONFIG_ALTIVEC */ #endif /* CONFIG_ALTIVEC */
...@@ -1807,12 +1807,46 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs, ...@@ -1807,12 +1807,46 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs,
break; break;
#ifdef CONFIG_ALTIVEC #ifdef CONFIG_ALTIVEC
/*
* Note: for the load/store vector element instructions,
* bits of the EA say which field of the VMX register to use.
*/
case 7: /* lvebx */
op->type = MKOP(LOAD_VMX, 0, 1);
op->element_size = 1;
break;
case 39: /* lvehx */
op->type = MKOP(LOAD_VMX, 0, 2);
op->element_size = 2;
break;
case 71: /* lvewx */
op->type = MKOP(LOAD_VMX, 0, 4);
op->element_size = 4;
break;
case 103: /* lvx */ case 103: /* lvx */
case 359: /* lvxl */ case 359: /* lvxl */
op->type = MKOP(LOAD_VMX, 0, 16); op->type = MKOP(LOAD_VMX, 0, 16);
op->element_size = 16; op->element_size = 16;
break; break;
case 135: /* stvebx */
op->type = MKOP(STORE_VMX, 0, 1);
op->element_size = 1;
break;
case 167: /* stvehx */
op->type = MKOP(STORE_VMX, 0, 2);
op->element_size = 2;
break;
case 199: /* stvewx */
op->type = MKOP(STORE_VMX, 0, 4);
op->element_size = 4;
break;
case 231: /* stvx */ case 231: /* stvx */
case 487: /* stvxl */ case 487: /* stvxl */
op->type = MKOP(STORE_VMX, 0, 16); op->type = MKOP(STORE_VMX, 0, 16);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment