aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar bunnei <ericbunnie@gmail.com>2014-04-26 01:47:52 -0400
committerGravatar bunnei <ericbunnie@gmail.com>2014-04-26 01:47:52 -0400
commita272803dcb5fdd6b0b5181cbdeff9ad68c9db934 (patch)
treefb3adb5aa75e57b87b4c5e1176e96600d68cfe25 /src
parent25d595d86912b079ab4d013cc2c0bd078a7276b3 (diff)
added preliminary DataSynchronizationBarrier support with simple DMA copy
Diffstat (limited to 'src')
-rw-r--r--src/core/hle/mrc.cpp46
1 files changed, 39 insertions, 7 deletions
diff --git a/src/core/hle/mrc.cpp b/src/core/hle/mrc.cpp
index 04d6cb5a..5223be7c 100644
--- a/src/core/hle/mrc.cpp
+++ b/src/core/hle/mrc.cpp
@@ -1,10 +1,43 @@
-#include "mrc.h"
-#include "hle.h"
+// 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 CallGetThreadCommandBuffer() {
+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);
@@ -16,14 +49,13 @@ u32 CallMRC(ARM11_MRC_OPERATION operation) {
switch (operation) {
case DATA_SYNCHRONIZATION_BARRIER:
- ERROR_LOG(OSHLE, "Unimplemented MRC operation DATA_SYNCHRONIZATION_BARRIER");
- break;
+ return DataSynchronizationBarrier((u32*)Memory::GetPointer(PARAM(0)));
case CALL_GET_THREAD_COMMAND_BUFFER:
- return CallGetThreadCommandBuffer();
+ return GetThreadCommandBuffer();
default:
- ERROR_LOG(OSHLE, "Unimplemented MRC operation 0x%02X", operation);
+ ERROR_LOG(OSHLE, "unimplemented MRC operation 0x%02X", operation);
break;
}
return -1;