mirror of
https://github.com/torvalds/linux
synced 2024-11-05 18:23:50 +00:00
350779a29f
This extends the instruction emulation infrastructure in sstep.c to handle all the load and store instructions defined in the Power ISA v3.0, except for the atomic memory operations, ldmx (which was never implemented), lfdp/stfdp, and the vector element load/stores. The instructions added are: Integer loads and stores: lbarx, lharx, lqarx, stbcx., sthcx., stqcx., lq, stq. VSX loads and stores: lxsiwzx, lxsiwax, stxsiwx, lxvx, lxvl, lxvll, lxvdsx, lxvwsx, stxvx, stxvl, stxvll, lxsspx, lxsdx, stxsspx, stxsdx, lxvw4x, lxsibzx, lxvh8x, lxsihzx, lxvb16x, stxvw4x, stxsibx, stxvh8x, stxsihx, stxvb16x, lxsd, lxssp, lxv, stxsd, stxssp, stxv. These instructions are handled both in the analyse_instr phase and in the emulate_step phase. The code for lxvd2ux and stxvd2ux has been taken out, as those instructions were never implemented in any processor and have been taken out of the architecture, and their opcodes have been reused for other instructions in POWER9 (lxvb16x and stxvb16x). The emulation for the VSX loads and stores uses helper functions which don't access registers or memory directly, which can hopefully be reused by KVM later. Signed-off-by: Paul Mackerras <paulus@ozlabs.org> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
62 lines
1.3 KiB
ArmAsm
62 lines
1.3 KiB
ArmAsm
/*
|
|
* Quadword loads and stores
|
|
* for use in instruction emulation.
|
|
*
|
|
* Copyright 2017 Paul Mackerras, IBM Corp. <paulus@au1.ibm.com>
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License
|
|
* as published by the Free Software Foundation; either version
|
|
* 2 of the License, or (at your option) any later version.
|
|
*/
|
|
|
|
#include <asm/processor.h>
|
|
#include <asm/ppc_asm.h>
|
|
#include <asm/ppc-opcode.h>
|
|
#include <asm/reg.h>
|
|
#include <asm/asm-offsets.h>
|
|
#include <linux/errno.h>
|
|
|
|
/* do_lq(unsigned long ea, unsigned long *regs) */
|
|
_GLOBAL(do_lq)
|
|
1: lq r6, 0(r3)
|
|
std r6, 0(r4)
|
|
std r7, 8(r4)
|
|
li r3, 0
|
|
blr
|
|
2: li r3, -EFAULT
|
|
blr
|
|
EX_TABLE(1b, 2b)
|
|
|
|
/* do_stq(unsigned long ea, unsigned long val0, unsigned long val1) */
|
|
_GLOBAL(do_stq)
|
|
1: stq r4, 0(r3)
|
|
li r3, 0
|
|
blr
|
|
2: li r3, -EFAULT
|
|
blr
|
|
EX_TABLE(1b, 2b)
|
|
|
|
/* do_lqarx(unsigned long ea, unsigned long *regs) */
|
|
_GLOBAL(do_lqarx)
|
|
1: PPC_LQARX(6, 0, 3, 0)
|
|
std r6, 0(r4)
|
|
std r7, 8(r4)
|
|
li r3, 0
|
|
blr
|
|
2: li r3, -EFAULT
|
|
blr
|
|
EX_TABLE(1b, 2b)
|
|
|
|
/* do_stqcx(unsigned long ea, unsigned long val0, unsigned long val1,
|
|
unsigned int *crp) */
|
|
|
|
_GLOBAL(do_stqcx)
|
|
1: PPC_STQCX(4, 0, 3)
|
|
mfcr r5
|
|
stw r5, 0(r6)
|
|
li r3, 0
|
|
blr
|
|
2: li r3, -EFAULT
|
|
blr
|
|
EX_TABLE(1b, 2b)
|