summaryrefslogtreecommitdiff
path: root/libs/dolphin/src/db/db.c
blob: 3e16342bc346feacee9cc55807d88c32b299dcc6 (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
57
58
59
#include <dolphin/base/PPCArch.h>
#include <dolphin/db.h>
#include <dolphin/os.h>

u8 DBStack[0x1000];
u8* DBStackEnd = DBStack + (sizeof(DBStack) - 8);
BOOL DBVerbose;
DBInterface* __DBInterface;

void DBInit(void) {
    __DBInterface = OSPhysicalToCached(0x40);
    __DBInterface->ExceptionDestination = (void *)OSCachedToPhysical(__DBExceptionDestination);
    DBVerbose = TRUE;
}

BOOL DBIsDebuggerPresent(void) {
    if (__DBInterface == NULL)
        return FALSE;
    return __DBInterface->bPresent;
}

void __DBExceptionDestinationAux(void) {
    u32* contextAddr;
    OSContext* context;

    contextAddr = (void*)0xC0;
    context = OSPhysicalToCached(*contextAddr);
    OSReport("DBExceptionDestination\n");
    OSDumpContext(context);
    PPCHalt();
}

asm void __DBExceptionDestination(void) {
    nofralloc
    mfmsr r3
    ori r3, r3, 0x30
    mtmsr r3
    b __DBExceptionDestinationAux
}

BOOL __DBIsExceptionMarked(__OSException exception) {
    u32 mask = (1 << exception);
    return __DBInterface->exceptionMask & mask;
}

void __DBMarkException(__OSException exception, int value) {
    u32 mask = (1 << exception);

    if (value != 0)
        __DBInterface->exceptionMask = __DBInterface->exceptionMask | mask;
    else
        __DBInterface->exceptionMask = __DBInterface->exceptionMask & ~mask;
}

void __DBSetPresent(u32 value) {
    __DBInterface->bPresent = value;
}

void DBPrintf(char* str, ...) {}