Fixed bug of memory read method

This commit is contained in:
rkx1209 2018-03-11 15:05:49 +09:00
parent 4659837b5e
commit cadf55e7f1
2 changed files with 10 additions and 7 deletions

View file

@ -5,7 +5,7 @@ Interpreter *Interpreter::inst = nullptr;
IntprCallback *Interpreter::disas_cb = nullptr;
int Interpreter::SingleStep() {
uint32_t inst = byte_swap32_uint (ARMv8::ReadInst (PC));
uint32_t inst = ARMv8::ReadInst (PC);
debug_print ("Run Code: 0x%lx: 0x%08lx\n", PC, inst);
//ns_print ("Run Code: 0x%lx: 0x%08lx\n", PC, inst);
Disassembler::DisasA64 (inst, disas_cb);
@ -389,6 +389,7 @@ static void _LoadReg(unsigned int rd_idx, uint64_t addr, int size, bool extend)
/* 128-bit Qt */
VREG(rd_idx).d[0] = ARMv8::ReadU64 (addr + 8);
VREG(rd_idx).d[1] = ARMv8::ReadU64 (addr);
//ns_debug("Read: Q = 0x%lx, 0x%lx\n", VREG(rd_idx).d[0], VREG(rd_idx).d[1]);
}
/* TODO: if (extend)
@ -405,6 +406,7 @@ static void _StoreReg(unsigned int rd_idx, uint64_t addr, int size, bool extend)
/* 128-bit Qt */
ARMv8::WriteU64 (addr + 8, VREG(rd_idx).d[0]);
ARMv8::WriteU64 (addr, VREG(rd_idx).d[1]);
//ns_debug("Write: Q = 0x%lx, 0x%lx\n", VREG(rd_idx).d[0], VREG(rd_idx).d[1]);
}
/* TODO: if (extend)
ExtendReg(rd_idx, rd_idx, type, true); */

View file

@ -10,25 +10,26 @@ uint32_t ReadInst(uint64_t gva) {
template<typename T>
static T ReadFromRAM(const uint64_t gpa) {
T value = 0;
//ns_print("ReadFromRAM: 0x%lx, (%d)\n", gpa, sizeof(T));
for (uint64_t addr = gpa; addr < gpa + sizeof(T); addr++) {
uint8_t byte;
std::memcpy (&byte, &Memory::pRAM[addr], sizeof(uint8_t));
value = (value << 8) | byte;
value = value | ((uint64_t)byte << (8 * (addr - gpa)));
}
// uint8_t *ptr = &Memory::pRAM[gpa];
// bindump (ptr, 2 * sizeof(T));
uint8_t *ptr = &Memory::pRAM[gpa];
bindump (ptr, sizeof(T));
return value;
}
template<typename T>
static void WriteToRAM(const uint64_t gpa, T value) {
for (uint64_t addr = gpa + sizeof(T) - 1; addr >= gpa; addr--) {
for (uint64_t addr = gpa; addr < gpa + sizeof(T); addr++) {
uint8_t byte = value & 0xff;
std::memcpy (&Memory::pRAM[addr], &byte, sizeof(uint8_t));
value >>= 8;
}
// uint8_t *ptr = &Memory::pRAM[gpa];
// bindump (ptr, 2 * sizeof(T));
uint8_t *ptr = &Memory::pRAM[gpa];
bindump (ptr, sizeof(T));
}
uint8_t ReadU8(const uint64_t gva) {