summaryrefslogtreecommitdiffstats
path: root/src/core/hle/coprocessor.cpp
diff options
context:
space:
mode:
authorbunnei <ericbunnie@gmail.com>2014-05-02 01:20:44 +0200
committerbunnei <ericbunnie@gmail.com>2014-05-02 01:20:44 +0200
commitf0434249150f27d7921a57f70d6af11c12c4e08f (patch)
tree4f1d4e40eb57f729f2533b1acd50c1b8efc903f3 /src/core/hle/coprocessor.cpp
parent- added some function wrappers for HLE (diff)
downloadyuzu-f0434249150f27d7921a57f70d6af11c12c4e08f.tar
yuzu-f0434249150f27d7921a57f70d6af11c12c4e08f.tar.gz
yuzu-f0434249150f27d7921a57f70d6af11c12c4e08f.tar.bz2
yuzu-f0434249150f27d7921a57f70d6af11c12c4e08f.tar.lz
yuzu-f0434249150f27d7921a57f70d6af11c12c4e08f.tar.xz
yuzu-f0434249150f27d7921a57f70d6af11c12c4e08f.tar.zst
yuzu-f0434249150f27d7921a57f70d6af11c12c4e08f.zip
Diffstat (limited to 'src/core/hle/coprocessor.cpp')
-rw-r--r--src/core/hle/coprocessor.cpp64
1 files changed, 64 insertions, 0 deletions
diff --git a/src/core/hle/coprocessor.cpp b/src/core/hle/coprocessor.cpp
new file mode 100644
index 000000000..5223be7c9
--- /dev/null
+++ b/src/core/hle/coprocessor.cpp
@@ -0,0 +1,64 @@
+// Copyright 2014 Citra Emulator Project
+// Licensed under GPLv2
+// Refer to the license.txt file included.
+
+#include "core/hle/mrc.h"
+#include "core/hle/hle.h"
+#include "core/mem_map.h"
+#include "core/core.h"
+
+namespace HLE {
+
+enum {
+ CMD_GX_REQUEST_DMA = 0x00000000,
+};
+
+/// Data synchronization barrier
+u32 DataSynchronizationBarrier(u32* command_buffer) {
+ u32 command = command_buffer[0];
+
+ switch (command) {
+
+ case CMD_GX_REQUEST_DMA:
+ {
+ u32* src = (u32*)Memory::GetPointer(command_buffer[1]);
+ u32* dst = (u32*)Memory::GetPointer(command_buffer[2]);
+ u32 size = command_buffer[3];
+ memcpy(dst, src, size);
+ }
+ break;
+
+ default:
+ ERROR_LOG(OSHLE, "MRC::DataSynchronizationBarrier unknown command 0x%08X", command);
+ return -1;
+ }
+
+ return 0;
+}
+
+/// Returns the coprocessor (in this case, syscore) command buffer pointer
+Addr GetThreadCommandBuffer() {
+ // Called on insruction: mrc p15, 0, r0, c13, c0, 3
+ // Returns an address in OSHLE memory for the CPU to read/write to
+ RETURN(CMD_BUFFER_ADDR);
+ return CMD_BUFFER_ADDR;
+}
+
+/// Call an MRC operation in HLE
+u32 CallMRC(ARM11_MRC_OPERATION operation) {
+ switch (operation) {
+
+ case DATA_SYNCHRONIZATION_BARRIER:
+ return DataSynchronizationBarrier((u32*)Memory::GetPointer(PARAM(0)));
+
+ case CALL_GET_THREAD_COMMAND_BUFFER:
+ return GetThreadCommandBuffer();
+
+ default:
+ ERROR_LOG(OSHLE, "unimplemented MRC operation 0x%02X", operation);
+ break;
+ }
+ return -1;
+}
+
+} // namespace