summaryrefslogtreecommitdiff
path: root/source/3ds/3ds_utils.c
blob: 25b4d87de367912eab8f4be6f9f39556a16ff605 (plain)
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);
}