1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
|
#include <3ds.h>
#include "utils.h"
#include "vb_set.h"
s32 k_patchSVC() {
__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;
return 0;
}
s32 k_flushCaches() {
__asm__ volatile(
"cpsid aif\n\t"
"mov r0, #0\n\t"
"mcr p15, 0, r0, c7, c5, 0\n\t"
"mov r0, #0\n\t"
"mcr p15, 0, r0, c7, c10, 0\n\t"
);
return 0;
}
void hbHaxInit() {
Handle tempHandle;
if (tVBOpt.DYNAREC) {
if (!srvGetServiceHandle(&tempHandle, "am:u")) {
svcCloseHandle(tempHandle);
svcBackdoor(k_patchSVC);
}
}
}
void hbHaxExit() {
}
void FlushInvalidateCache() {
if (tVBOpt.DYNAREC)
svcBackdoor(k_flushCaches);
}
Result ReprotectMemory(u32* addr, u32 pages, u32 mode) {
if (!tVBOpt.DYNAREC)
return 0xFFFFFFFF;
Handle processHandle;
svcDuplicateHandle(&processHandle, 0xFFFF8001);
return svcControlProcessMemory(processHandle, (u32)addr, 0x0, pages*0x1000, MEMOP_PROT, mode);
}
|