Skip to content

Commit

Permalink
powerpc: Emulate vector element load/store instructions
Browse files Browse the repository at this point in the history
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: Paul Mackerras <paulus@ozlabs.org>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
  • Loading branch information
Paul Mackerras authored and Michael Ellerman committed Sep 1, 2017
1 parent c22435a commit e61ccc7
Showing 1 changed file with 36 additions and 2 deletions.
38 changes: 36 additions & 2 deletions arch/powerpc/lib/sstep.c
Original file line number Diff line number Diff line change
Expand Up @@ -476,7 +476,7 @@ static nokprobe_inline int do_vec_load(int rn, unsigned long ea,
return -EFAULT;
/* align to multiple of size */
ea &= ~(size - 1);
err = copy_mem_in(u.b, ea, size);
err = copy_mem_in(&u.b[ea & 0xf], ea, size);
if (err)
return err;

Expand Down Expand Up @@ -508,7 +508,7 @@ static nokprobe_inline int do_vec_store(int rn, unsigned long ea,
else
u.v = current->thread.vr_state.vr[rn];
preempt_enable();
return copy_mem_out(u.b, ea, size);
return copy_mem_out(&u.b[ea & 0xf], ea, size);
}
#endif /* CONFIG_ALTIVEC */

Expand Down Expand Up @@ -1807,12 +1807,46 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs,
break;

#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 359: /* lvxl */
op->type = MKOP(LOAD_VMX, 0, 16);
op->element_size = 16;
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 487: /* stvxl */
op->type = MKOP(STORE_VMX, 0, 16);
Expand Down

0 comments on commit e61ccc7

Please sign in to comment.