diff --git a/src/dynarmic/src/dynarmic/backend/arm64/a64_address_space.cpp b/src/dynarmic/src/dynarmic/backend/arm64/a64_address_space.cpp index efb9fc538c..1787c62857 100644 --- a/src/dynarmic/src/dynarmic/backend/arm64/a64_address_space.cpp +++ b/src/dynarmic/src/dynarmic/backend/arm64/a64_address_space.cpp @@ -23,7 +23,7 @@ namespace Dynarmic::Backend::Arm64 { template -static void* EmitCallTrampoline(oaknut::CodeGenerator& code, T* this_) { +static void* EmitCallTrampoline(oaknut::CodeGenerator& code, T* this_, size_t bitsize = 0) { using namespace oaknut::util; const auto info = Devirtualize(this_); @@ -32,6 +32,9 @@ static void* EmitCallTrampoline(oaknut::CodeGenerator& code, T* this_) { void* target = code.xptr(); code.LDR(X0, l_this); + if (bitsize) { + code.MOV(X1, bitsize); + } code.LDR(Xscratch0, l_addr); code.BR(Xscratch0); @@ -45,7 +48,7 @@ static void* EmitCallTrampoline(oaknut::CodeGenerator& code, T* this_) { } template -static void* EmitWrappedReadCallTrampoline(oaknut::CodeGenerator& code, T* this_) { +static void* EmitWrappedReadCallTrampoline(oaknut::CodeGenerator& code, T* this_, size_t bitsize) { using namespace oaknut::util; const auto info = Devirtualize(this_); @@ -58,6 +61,7 @@ static void* EmitWrappedReadCallTrampoline(oaknut::CodeGenerator& code, T* this_ ABI_PushRegisters(code, save_regs, 0); code.LDR(X0, l_this); code.MOV(X1, Xscratch0); + code.MOV(X2, bitsize); code.LDR(Xscratch0, l_addr); code.BLR(Xscratch0); code.MOV(Xscratch0, X0); @@ -100,7 +104,7 @@ static void* EmitExclusiveReadCallTrampoline(oaknut::CodeGenerator& code, const } template -static void* EmitWrappedWriteCallTrampoline(oaknut::CodeGenerator& code, T* this_) { +static void* EmitWrappedWriteCallTrampoline(oaknut::CodeGenerator& code, T* this_, size_t bitsize) { using namespace oaknut::util; const auto info = Devirtualize(this_); @@ -114,6 +118,7 @@ static void* EmitWrappedWriteCallTrampoline(oaknut::CodeGenerator& code, T* this code.LDR(X0, l_this); code.MOV(X1, Xscratch0); code.MOV(X2, Xscratch1); + code.MOV(X3, bitsize); code.LDR(Xscratch0, l_addr); code.BLR(Xscratch0); ABI_PopRegisters(code, save_regs, 0); @@ -342,18 +347,30 @@ void A64AddressSpace::EmitPrelude() { UnprotectCodeMemory(); - prelude_info.read_memory = EmitCallTrampoline<&A64::UserCallbacks::MemoryRead>(code, conf.callbacks); + prelude_info.read_memory_8 = EmitCallTrampoline<&A64::UserCallbacks::MemoryRead>(code, conf.callbacks, sizeof(u8)); + prelude_info.read_memory_16 = EmitCallTrampoline<&A64::UserCallbacks::MemoryRead>(code, conf.callbacks, sizeof(u16)); + prelude_info.read_memory_32 = EmitCallTrampoline<&A64::UserCallbacks::MemoryRead>(code, conf.callbacks, sizeof(u32)); + prelude_info.read_memory_64 = EmitCallTrampoline<&A64::UserCallbacks::MemoryRead>(code, conf.callbacks, sizeof(u64)); prelude_info.read_memory_128 = EmitRead128CallTrampoline(code, conf.callbacks); - prelude_info.wrapped_read_memory = EmitWrappedReadCallTrampoline<&A64::UserCallbacks::MemoryRead>(code, conf.callbacks); + prelude_info.wrapped_read_memory_8 = EmitWrappedReadCallTrampoline<&A64::UserCallbacks::MemoryRead>(code, conf.callbacks, sizeof(u8)); + prelude_info.wrapped_read_memory_16 = EmitWrappedReadCallTrampoline<&A64::UserCallbacks::MemoryRead>(code, conf.callbacks, sizeof(u16)); + prelude_info.wrapped_read_memory_32 = EmitWrappedReadCallTrampoline<&A64::UserCallbacks::MemoryRead>(code, conf.callbacks, sizeof(u32)); + prelude_info.wrapped_read_memory_64 = EmitWrappedReadCallTrampoline<&A64::UserCallbacks::MemoryRead>(code, conf.callbacks, sizeof(u64)); prelude_info.wrapped_read_memory_128 = EmitWrappedRead128CallTrampoline(code, conf.callbacks); prelude_info.exclusive_read_memory_8 = EmitExclusiveReadCallTrampoline<&A64::UserCallbacks::MemoryRead, u8>(code, conf); prelude_info.exclusive_read_memory_16 = EmitExclusiveReadCallTrampoline<&A64::UserCallbacks::MemoryRead, u16>(code, conf); prelude_info.exclusive_read_memory_32 = EmitExclusiveReadCallTrampoline<&A64::UserCallbacks::MemoryRead, u32>(code, conf); prelude_info.exclusive_read_memory_64 = EmitExclusiveReadCallTrampoline<&A64::UserCallbacks::MemoryRead, u64>(code, conf); prelude_info.exclusive_read_memory_128 = EmitExclusiveRead128CallTrampoline(code, conf); - prelude_info.write_memory = EmitCallTrampoline<&A64::UserCallbacks::MemoryWrite>(code, conf.callbacks); + prelude_info.write_memory_8 = EmitCallTrampoline<&A64::UserCallbacks::MemoryWrite>(code, conf.callbacks, sizeof(u8)); + prelude_info.write_memory_16 = EmitCallTrampoline<&A64::UserCallbacks::MemoryWrite>(code, conf.callbacks, sizeof(u16)); + prelude_info.write_memory_32 = EmitCallTrampoline<&A64::UserCallbacks::MemoryWrite>(code, conf.callbacks, sizeof(u32)); + prelude_info.write_memory_64 = EmitCallTrampoline<&A64::UserCallbacks::MemoryWrite>(code, conf.callbacks, sizeof(u64)); prelude_info.write_memory_128 = EmitWrite128CallTrampoline(code, conf.callbacks); - prelude_info.wrapped_write_memory = EmitWrappedWriteCallTrampoline<&A64::UserCallbacks::MemoryWrite>(code, conf.callbacks); + prelude_info.wrapped_write_memory_8 = EmitWrappedWriteCallTrampoline<&A64::UserCallbacks::MemoryWrite>(code, conf.callbacks, sizeof(u8)); + prelude_info.wrapped_write_memory_16 = EmitWrappedWriteCallTrampoline<&A64::UserCallbacks::MemoryWrite>(code, conf.callbacks, sizeof(u16)); + prelude_info.wrapped_write_memory_32 = EmitWrappedWriteCallTrampoline<&A64::UserCallbacks::MemoryWrite>(code, conf.callbacks, sizeof(u32)); + prelude_info.wrapped_write_memory_64 = EmitWrappedWriteCallTrampoline<&A64::UserCallbacks::MemoryWrite>(code, conf.callbacks, sizeof(u64)); prelude_info.wrapped_write_memory_128 = EmitWrappedWrite128CallTrampoline(code, conf.callbacks); prelude_info.exclusive_write_memory_8 = EmitExclusiveWriteCallTrampoline<&A64::UserCallbacks::MemoryWriteExclusive8, u8>(code, conf); prelude_info.exclusive_write_memory_16 = EmitExclusiveWriteCallTrampoline<&A64::UserCallbacks::MemoryWriteExclusive16, u16>(code, conf); diff --git a/src/dynarmic/src/dynarmic/backend/arm64/address_space.cpp b/src/dynarmic/src/dynarmic/backend/arm64/address_space.cpp index 7b83e372e6..e761b10362 100644 --- a/src/dynarmic/src/dynarmic/backend/arm64/address_space.cpp +++ b/src/dynarmic/src/dynarmic/backend/arm64/address_space.cpp @@ -147,40 +147,32 @@ void AddressSpace::Link(EmittedBlockInfo& block_info) { break; // { this, vaddr, size } case LinkTarget::ReadMemory8: - c.LDR(X2, 1); - c.BL(prelude_info.read_memory); + c.BL(prelude_info.read_memory_8); break; case LinkTarget::ReadMemory16: - c.LDR(X2, 2); - c.BL(prelude_info.read_memory); + c.BL(prelude_info.read_memory_16); break; case LinkTarget::ReadMemory32: - c.LDR(X2, 4); - c.BL(prelude_info.read_memory); + c.BL(prelude_info.read_memory_32); break; case LinkTarget::ReadMemory64: - c.LDR(X2, 8); - c.BL(prelude_info.read_memory); + c.BL(prelude_info.read_memory_64); break; case LinkTarget::ReadMemory128: c.BL(prelude_info.read_memory_128); break; // { this, vaddr, size } case LinkTarget::WrappedReadMemory8: - c.LDR(X2, 1); - c.BL(prelude_info.wrapped_read_memory); + c.BL(prelude_info.wrapped_read_memory_8); break; case LinkTarget::WrappedReadMemory16: - c.LDR(X2, 2); - c.BL(prelude_info.wrapped_read_memory); + c.BL(prelude_info.wrapped_read_memory_16); break; case LinkTarget::WrappedReadMemory32: - c.LDR(X2, 4); - c.BL(prelude_info.wrapped_read_memory); + c.BL(prelude_info.wrapped_read_memory_32); break; case LinkTarget::WrappedReadMemory64: - c.LDR(X2, 8); - c.BL(prelude_info.wrapped_read_memory); + c.BL(prelude_info.wrapped_read_memory_64); break; case LinkTarget::WrappedReadMemory128: c.BL(prelude_info.wrapped_read_memory_128); @@ -202,39 +194,31 @@ void AddressSpace::Link(EmittedBlockInfo& block_info) { break; // { this, vaddr, value, size } case LinkTarget::WriteMemory8: - c.LDR(X3, 1); - c.BL(prelude_info.write_memory); + c.BL(prelude_info.write_memory_8); break; case LinkTarget::WriteMemory16: - c.LDR(X3, 2); - c.BL(prelude_info.write_memory); + c.BL(prelude_info.write_memory_16); break; case LinkTarget::WriteMemory32: - c.LDR(X3, 4); - c.BL(prelude_info.write_memory); + c.BL(prelude_info.write_memory_32); break; case LinkTarget::WriteMemory64: - c.LDR(X3, 8); - c.BL(prelude_info.write_memory); + c.BL(prelude_info.write_memory_64); break; case LinkTarget::WriteMemory128: c.BL(prelude_info.write_memory_128); break; case LinkTarget::WrappedWriteMemory8: - c.LDR(X3, 1); - c.BL(prelude_info.wrapped_write_memory); + c.BL(prelude_info.wrapped_write_memory_8); break; case LinkTarget::WrappedWriteMemory16: - c.LDR(X3, 2); - c.BL(prelude_info.wrapped_write_memory); + c.BL(prelude_info.wrapped_write_memory_16); break; case LinkTarget::WrappedWriteMemory32: - c.LDR(X3, 4); - c.BL(prelude_info.wrapped_write_memory); + c.BL(prelude_info.wrapped_write_memory_32); break; case LinkTarget::WrappedWriteMemory64: - c.LDR(X3, 8); - c.BL(prelude_info.wrapped_write_memory); + c.BL(prelude_info.wrapped_write_memory_64); break; case LinkTarget::WrappedWriteMemory128: c.BL(prelude_info.wrapped_write_memory_128); diff --git a/src/dynarmic/src/dynarmic/backend/arm64/address_space.h b/src/dynarmic/src/dynarmic/backend/arm64/address_space.h index 73e2c94a19..755b05bd02 100644 --- a/src/dynarmic/src/dynarmic/backend/arm64/address_space.h +++ b/src/dynarmic/src/dynarmic/backend/arm64/address_space.h @@ -93,18 +93,30 @@ protected: void* return_to_dispatcher; void* return_from_run_code; - void* read_memory; + void* read_memory_8; + void* read_memory_16; + void* read_memory_32; + void* read_memory_64; void* read_memory_128; - void* wrapped_read_memory; + void* wrapped_read_memory_8; + void* wrapped_read_memory_16; + void* wrapped_read_memory_32; + void* wrapped_read_memory_64; void* wrapped_read_memory_128; void* exclusive_read_memory_8; void* exclusive_read_memory_16; void* exclusive_read_memory_32; void* exclusive_read_memory_64; void* exclusive_read_memory_128; - void* write_memory; + void* write_memory_8; + void* write_memory_16; + void* write_memory_32; + void* write_memory_64; void* write_memory_128; - void* wrapped_write_memory; + void* wrapped_write_memory_8; + void* wrapped_write_memory_16; + void* wrapped_write_memory_32; + void* wrapped_write_memory_64; void* wrapped_write_memory_128; void* exclusive_write_memory_8; void* exclusive_write_memory_16;