mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-06 09:13:55 -06:00
accel/tcg: Implement translator_ld*_end
Add a new family of translator load functions which take an absolute endianness value in the form of MO_BE/MO_LE. Expand the other translator_ld* functions on top of this. Remove exec/tswap.h from translator.c. Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
parent
028119c8ba
commit
5c43a750b6
2 changed files with 49 additions and 26 deletions
|
@ -8,6 +8,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "qemu/osdep.h"
|
#include "qemu/osdep.h"
|
||||||
|
#include "qemu/bswap.h"
|
||||||
#include "qemu/log.h"
|
#include "qemu/log.h"
|
||||||
#include "qemu/error-report.h"
|
#include "qemu/error-report.h"
|
||||||
#include "exec/exec-all.h"
|
#include "exec/exec-all.h"
|
||||||
|
@ -15,7 +16,6 @@
|
||||||
#include "accel/tcg/cpu-mmu-index.h"
|
#include "accel/tcg/cpu-mmu-index.h"
|
||||||
#include "exec/translator.h"
|
#include "exec/translator.h"
|
||||||
#include "exec/plugin-gen.h"
|
#include "exec/plugin-gen.h"
|
||||||
#include "exec/tswap.h"
|
|
||||||
#include "tcg/tcg-op-common.h"
|
#include "tcg/tcg-op-common.h"
|
||||||
#include "internal-target.h"
|
#include "internal-target.h"
|
||||||
#include "disas/disas.h"
|
#include "disas/disas.h"
|
||||||
|
@ -468,7 +468,8 @@ uint8_t translator_ldub(CPUArchState *env, DisasContextBase *db, vaddr pc)
|
||||||
return val;
|
return val;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint16_t translator_lduw(CPUArchState *env, DisasContextBase *db, vaddr pc)
|
uint16_t translator_lduw_end(CPUArchState *env, DisasContextBase *db,
|
||||||
|
vaddr pc, MemOp endian)
|
||||||
{
|
{
|
||||||
uint16_t val;
|
uint16_t val;
|
||||||
|
|
||||||
|
@ -477,10 +478,14 @@ uint16_t translator_lduw(CPUArchState *env, DisasContextBase *db, vaddr pc)
|
||||||
val = cpu_ldw_code_mmu(env, pc, oi, 0);
|
val = cpu_ldw_code_mmu(env, pc, oi, 0);
|
||||||
record_save(db, pc, &val, sizeof(val));
|
record_save(db, pc, &val, sizeof(val));
|
||||||
}
|
}
|
||||||
return tswap16(val);
|
if (endian & MO_BSWAP) {
|
||||||
|
val = bswap16(val);
|
||||||
|
}
|
||||||
|
return val;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t translator_ldl(CPUArchState *env, DisasContextBase *db, vaddr pc)
|
uint32_t translator_ldl_end(CPUArchState *env, DisasContextBase *db,
|
||||||
|
vaddr pc, MemOp endian)
|
||||||
{
|
{
|
||||||
uint32_t val;
|
uint32_t val;
|
||||||
|
|
||||||
|
@ -489,10 +494,14 @@ uint32_t translator_ldl(CPUArchState *env, DisasContextBase *db, vaddr pc)
|
||||||
val = cpu_ldl_code_mmu(env, pc, oi, 0);
|
val = cpu_ldl_code_mmu(env, pc, oi, 0);
|
||||||
record_save(db, pc, &val, sizeof(val));
|
record_save(db, pc, &val, sizeof(val));
|
||||||
}
|
}
|
||||||
return tswap32(val);
|
if (endian & MO_BSWAP) {
|
||||||
|
val = bswap32(val);
|
||||||
|
}
|
||||||
|
return val;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint64_t translator_ldq(CPUArchState *env, DisasContextBase *db, vaddr pc)
|
uint64_t translator_ldq_end(CPUArchState *env, DisasContextBase *db,
|
||||||
|
vaddr pc, MemOp endian)
|
||||||
{
|
{
|
||||||
uint64_t val;
|
uint64_t val;
|
||||||
|
|
||||||
|
@ -501,7 +510,10 @@ uint64_t translator_ldq(CPUArchState *env, DisasContextBase *db, vaddr pc)
|
||||||
val = cpu_ldq_code_mmu(env, pc, oi, 0);
|
val = cpu_ldq_code_mmu(env, pc, oi, 0);
|
||||||
record_save(db, pc, &val, sizeof(val));
|
record_save(db, pc, &val, sizeof(val));
|
||||||
}
|
}
|
||||||
return tswap64(val);
|
if (endian & MO_BSWAP) {
|
||||||
|
val = bswap64(val);
|
||||||
|
}
|
||||||
|
return val;
|
||||||
}
|
}
|
||||||
|
|
||||||
void translator_fake_ld(DisasContextBase *db, const void *data, size_t len)
|
void translator_fake_ld(DisasContextBase *db, const void *data, size_t len)
|
||||||
|
|
|
@ -18,7 +18,7 @@
|
||||||
* member in your target-specific DisasContext.
|
* member in your target-specific DisasContext.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "qemu/bswap.h"
|
#include "exec/memop.h"
|
||||||
#include "exec/vaddr.h"
|
#include "exec/vaddr.h"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -181,42 +181,53 @@ bool translator_io_start(DisasContextBase *db);
|
||||||
*/
|
*/
|
||||||
|
|
||||||
uint8_t translator_ldub(CPUArchState *env, DisasContextBase *db, vaddr pc);
|
uint8_t translator_ldub(CPUArchState *env, DisasContextBase *db, vaddr pc);
|
||||||
uint16_t translator_lduw(CPUArchState *env, DisasContextBase *db, vaddr pc);
|
uint16_t translator_lduw_end(CPUArchState *env, DisasContextBase *db,
|
||||||
uint32_t translator_ldl(CPUArchState *env, DisasContextBase *db, vaddr pc);
|
vaddr pc, MemOp endian);
|
||||||
uint64_t translator_ldq(CPUArchState *env, DisasContextBase *db, vaddr pc);
|
uint32_t translator_ldl_end(CPUArchState *env, DisasContextBase *db,
|
||||||
|
vaddr pc, MemOp endian);
|
||||||
|
uint64_t translator_ldq_end(CPUArchState *env, DisasContextBase *db,
|
||||||
|
vaddr pc, MemOp endian);
|
||||||
|
|
||||||
|
#ifdef COMPILING_PER_TARGET
|
||||||
|
static inline uint16_t
|
||||||
|
translator_lduw(CPUArchState *env, DisasContextBase *db, vaddr pc)
|
||||||
|
{
|
||||||
|
return translator_lduw_end(env, db, pc, MO_TE);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline uint32_t
|
||||||
|
translator_ldl(CPUArchState *env, DisasContextBase *db, vaddr pc)
|
||||||
|
{
|
||||||
|
return translator_ldl_end(env, db, pc, MO_TE);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline uint64_t
|
||||||
|
translator_ldq(CPUArchState *env, DisasContextBase *db, vaddr pc)
|
||||||
|
{
|
||||||
|
return translator_ldq_end(env, db, pc, MO_TE);
|
||||||
|
}
|
||||||
|
|
||||||
static inline uint16_t
|
static inline uint16_t
|
||||||
translator_lduw_swap(CPUArchState *env, DisasContextBase *db,
|
translator_lduw_swap(CPUArchState *env, DisasContextBase *db,
|
||||||
vaddr pc, bool do_swap)
|
vaddr pc, bool do_swap)
|
||||||
{
|
{
|
||||||
uint16_t ret = translator_lduw(env, db, pc);
|
return translator_lduw_end(env, db, pc, MO_TE ^ (do_swap * MO_BSWAP));
|
||||||
if (do_swap) {
|
|
||||||
ret = bswap16(ret);
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline uint32_t
|
static inline uint32_t
|
||||||
translator_ldl_swap(CPUArchState *env, DisasContextBase *db,
|
translator_ldl_swap(CPUArchState *env, DisasContextBase *db,
|
||||||
vaddr pc, bool do_swap)
|
vaddr pc, bool do_swap)
|
||||||
{
|
{
|
||||||
uint32_t ret = translator_ldl(env, db, pc);
|
return translator_ldl_end(env, db, pc, MO_TE ^ (do_swap * MO_BSWAP));
|
||||||
if (do_swap) {
|
|
||||||
ret = bswap32(ret);
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline uint64_t
|
static inline uint64_t
|
||||||
translator_ldq_swap(CPUArchState *env, DisasContextBase *db,
|
translator_ldq_swap(CPUArchState *env, DisasContextBase *db,
|
||||||
vaddr pc, bool do_swap)
|
vaddr pc, bool do_swap)
|
||||||
{
|
{
|
||||||
uint64_t ret = translator_ldq(env, db, pc);
|
return translator_ldq_end(env, db, pc, MO_TE ^ (do_swap * MO_BSWAP));
|
||||||
if (do_swap) {
|
|
||||||
ret = bswap64(ret);
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
#endif /* COMPILING_PER_TARGET */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* translator_fake_ld - fake instruction load
|
* translator_fake_ld - fake instruction load
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue