summaryrefslogtreecommitdiff
path: root/3ds/3ds_utils.c
diff options
context:
space:
mode:
Diffstat (limited to '3ds/3ds_utils.c')
-rw-r--r--3ds/3ds_utils.c98
1 files changed, 98 insertions, 0 deletions
diff --git a/3ds/3ds_utils.c b/3ds/3ds_utils.c
new file mode 100644
index 0000000..a5a5846
--- /dev/null
+++ b/3ds/3ds_utils.c
@@ -0,0 +1,98 @@
+
+#include "3ds.h"
+#include "libkhax/khax.h"
+
+static int ninjhax_version = 0;
+
+typedef s32 (*ctr_callback_type)(void);
+
+static void ctr_enable_all_svc_kernel(void)
+{
+ __asm__ volatile("cpsid aif");
+
+ u32* svc_access_control = *(*(u32***)0xFFFF9000 + 0x22) - 0x6;
+
+ svc_access_control[0]=0xFFFFFFFE;
+ svc_access_control[1]=0xFFFFFFFF;
+ svc_access_control[2]=0xFFFFFFFF;
+ svc_access_control[3]=0x3FFFFFFF;
+}
+
+
+static void ctr_invalidate_ICache_kernel(void)
+{
+ __asm__ volatile(
+ "cpsid aif\n\t"
+ "mov r0, #0\n\t"
+ "mcr p15, 0, r0, c7, c5, 0\n\t");
+}
+
+static void ctr_flush_DCache_kernel(void)
+{
+ __asm__ volatile(
+ "cpsid aif\n\t"
+ "mov r0, #0\n\t"
+ "mcr p15, 0, r0, c7, c10, 0\n\t");
+
+}
+
+
+static void ctr_enable_all_svc(void)
+{
+ svcBackdoor((ctr_callback_type)ctr_enable_all_svc_kernel);
+}
+
+void ctr_invalidate_ICache(void)
+{
+// __asm__ volatile("svc 0x2E\n\t");
+ svcBackdoor((ctr_callback_type)ctr_invalidate_ICache_kernel);
+
+}
+
+void ctr_flush_DCache(void)
+{
+// __asm__ volatile("svc 0x4B\n\t");
+ svcBackdoor((ctr_callback_type)ctr_flush_DCache_kernel);
+}
+
+
+void ctr_flush_invalidate_cache(void)
+{
+ ctr_flush_DCache();
+ ctr_invalidate_ICache();
+}
+
+int ctr_svchack_init(void)
+{
+ Handle tempHandle;
+ Result res = srvGetServiceHandle(&tempHandle, "am:u");
+ if(res == 0)
+ {
+ /* CFW */
+ svcCloseHandle(tempHandle);
+ ninjhax_version = 0;
+ ctr_enable_all_svc();
+ return 1;
+ }
+ else if(hbInit() == 0)
+ {
+ /* ninjhax 1.0 */
+ ninjhax_version = 1;
+ hbExit();
+ khaxInit();
+ return 1;
+ }
+ else
+ {
+ /* ninjhax 2.0 */
+
+ return 0;
+ }
+}
+
+
+void ctr_svchack_exit(void)
+{
+ if (ninjhax_version == 1)
+ khaxExit();
+}