Commit QuarkTheAwesome's data breakpoints attempt (slightly modified)
This commit is contained in:
parent
83751fdd75
commit
9ce7af45d7
@ -125,11 +125,11 @@ static unsigned char exceptionCallback(void *c, unsigned char exception_type) {
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static unsigned char dsi_exception_cb(void *context) {
|
unsigned char dsi_exception_cb(void *context) {
|
||||||
return exceptionCallback(context, 0);
|
return exceptionCallback(context, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static unsigned char isi_exception_cb(void *context) {
|
unsigned char isi_exception_cb(void *context) {
|
||||||
return exceptionCallback(context, 1);
|
return exceptionCallback(context, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -78,6 +78,10 @@ typedef struct _framerec {
|
|||||||
|
|
||||||
void setup_os_exceptions(void);
|
void setup_os_exceptions(void);
|
||||||
|
|
||||||
|
unsigned char dsi_exception_cb(void *context);
|
||||||
|
unsigned char isi_exception_cb(void *context);
|
||||||
|
unsigned char program_exception_cb(void *context);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
17
src/tcpgecko/hardware_breakpoints.S
Normal file
17
src/tcpgecko/hardware_breakpoints.S
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
#include "../utils/ppc_asm.h"
|
||||||
|
|
||||||
|
.set dabr, 0x3F5
|
||||||
|
|
||||||
|
# .section text
|
||||||
|
|
||||||
|
.global KernelSetDABR
|
||||||
|
KernelSetDABR:
|
||||||
|
mtspr dabr, r3
|
||||||
|
blr
|
||||||
|
|
||||||
|
.global SC0x2D_KernelSetDABR
|
||||||
|
SC0x2D_KernelSetDABR:
|
||||||
|
li r0, 0x2D00
|
||||||
|
sc
|
||||||
|
nop
|
||||||
|
blr
|
@ -1,13 +1,105 @@
|
|||||||
#include "stringify.h"
|
#include <stdbool.h>
|
||||||
#include "../dynamic_libs/os_functions.h"
|
#include "../dynamic_libs/os_functions.h"
|
||||||
#include "threads.h"
|
#include "../system/exception_handler.h"
|
||||||
|
#include "../kernel/syscalls.h"
|
||||||
|
#include "../common/common.h"
|
||||||
#include "../utils/logger.h"
|
#include "../utils/logger.h"
|
||||||
#include "main.h"
|
|
||||||
#include "utilities.h"
|
|
||||||
#include "software_breakpoints.h"
|
#include "software_breakpoints.h"
|
||||||
|
|
||||||
#ifndef TCPGECKO_BREAKPOINTS_H
|
#ifndef TCPGECKO_HARDWARE_BREAKPOINTS_H
|
||||||
#define TCPGECKO_BREAKPOINTS_H
|
#define TCPGECKO_HARDWARE_BREAKPOINTS_H
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Fix a gap in exception_handler.h
|
||||||
|
Yes, this is the dsisr.
|
||||||
|
*/
|
||||||
|
#define dsisr exception_specific0
|
||||||
|
#define DSISR_DABR_MATCH 0x400000
|
||||||
|
|
||||||
|
extern /* kernelmode */ void KernelSetDABR(unsigned int dabr);
|
||||||
|
|
||||||
|
extern void SC0x2D_KernelSetDABR(unsigned int dabr);
|
||||||
|
|
||||||
|
static void RegisterDataBreakpointHandler(unsigned char (*breakpointHandler)(OSContext *ctx));
|
||||||
|
|
||||||
|
static void DataBreakpoints_Install();
|
||||||
|
|
||||||
|
static unsigned char DataBreakpoints_DSIHandler(void *ctx);
|
||||||
|
|
||||||
|
static unsigned char (*bHandler)(OSContext *ctx);
|
||||||
|
|
||||||
|
static void RegisterDataBreakpointHandler(unsigned char (*breakpointHandler)(OSContext *ctx)) {
|
||||||
|
bHandler = breakpointHandler;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int getDABRAddress(void *interruptedContext) {
|
||||||
|
OSContext *context = (OSContext *) interruptedContext;
|
||||||
|
return (int) context->srr0; // Offset 0xA4
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned char basicDABRBreakpointHandler(OSContext *context) {
|
||||||
|
log_print("Getting DABR address\n");
|
||||||
|
int address = getDABRAddress(context);
|
||||||
|
log_printf("Got DABR address: %08x\n", address);
|
||||||
|
|
||||||
|
if (OSIsAddressValid((const void *) address)) {
|
||||||
|
log_printf("Data breakpoint address: %x08\n", address);
|
||||||
|
} else {
|
||||||
|
log_printf("Data breakpoint invalid address: %x08\n", address);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void SetDataBreakpoint(unsigned int address, bool read, bool write) {
|
||||||
|
log_print("Before installing...\n");
|
||||||
|
DataBreakpoints_Install();
|
||||||
|
log_print("After installing...\n");
|
||||||
|
RegisterDataBreakpointHandler(basicDABRBreakpointHandler);
|
||||||
|
log_print("After registering...\n");
|
||||||
|
|
||||||
|
unsigned int dabr = address & ~0b00000111; //GCC \o/
|
||||||
|
log_printf("DABR 1: %08x\n", dabr);
|
||||||
|
dabr |= 0b00000100; //enable translation
|
||||||
|
log_printf("DABR 2: %08x\n", dabr);
|
||||||
|
if (read) {
|
||||||
|
dabr |= 0b00000001; //break on read
|
||||||
|
log_printf("DABR 3: %08x\n", dabr);
|
||||||
|
}
|
||||||
|
if (write) {
|
||||||
|
dabr |= 0b00000010; //break on write
|
||||||
|
log_printf("DABR 4: %08x\n", dabr);
|
||||||
|
}
|
||||||
|
|
||||||
|
log_print("Setting DABR...\n");
|
||||||
|
SC0x2D_KernelSetDABR(dabr);
|
||||||
|
log_print("DABR set!\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
static unsigned char DataBreakpoints_DSIHandler(void *ctx) {
|
||||||
|
log_print("DSI handler\n");
|
||||||
|
OSContext *context = (OSContext *) ctx;
|
||||||
|
if (context->dsisr & DSISR_DABR_MATCH) {
|
||||||
|
log_print("Running BP handler\n");
|
||||||
|
return bHandler(context);
|
||||||
|
}
|
||||||
|
|
||||||
|
log_print("DSI exception\n");
|
||||||
|
return dsi_exception_cb(ctx);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void DataBreakpoints_Install() {
|
||||||
|
kern_write((void *) (OS_SPECIFICS->addr_KernSyscallTbl1 + (0x2D * 4)), (unsigned int) &KernelSetDABR);
|
||||||
|
kern_write((void *) (OS_SPECIFICS->addr_KernSyscallTbl2 + (0x2D * 4)), (unsigned int) &KernelSetDABR);
|
||||||
|
kern_write((void *) (OS_SPECIFICS->addr_KernSyscallTbl3 + (0x2D * 4)), (unsigned int) &KernelSetDABR);
|
||||||
|
kern_write((void *) (OS_SPECIFICS->addr_KernSyscallTbl4 + (0x2D * 4)), (unsigned int) &KernelSetDABR);
|
||||||
|
kern_write((void *) (OS_SPECIFICS->addr_KernSyscallTbl5 + (0x2D * 4)), (unsigned int) &KernelSetDABR);
|
||||||
|
|
||||||
|
OSSetExceptionCallback((u8) OS_EXCEPTION_DSI, &DataBreakpoints_DSIHandler);
|
||||||
|
}
|
||||||
|
|
||||||
// Special purpose registers
|
// Special purpose registers
|
||||||
#define IABR 0x3F2
|
#define IABR 0x3F2
|
||||||
@ -44,11 +136,6 @@ static inline int getIABRAddress() {
|
|||||||
return mfspr(IABR);
|
return mfspr(IABR);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int getDABRAddress(void *interruptedContext) {
|
|
||||||
OSContext *context = (OSContext *) interruptedContext;
|
|
||||||
return (int) context->srr0; // Offset 0xA4
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int getIABRMatch(void *interruptedContext) {
|
static inline int getIABRMatch(void *interruptedContext) {
|
||||||
OSContext *context = (OSContext *) interruptedContext;
|
OSContext *context = (OSContext *) interruptedContext;
|
||||||
return (int) context->exception_specific1; // Offset 0x98
|
return (int) context->exception_specific1; // Offset 0x98
|
||||||
@ -145,4 +232,8 @@ unsigned char breakPointHandler(void *interruptedContext) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#ifdef __cplusplus
|
||||||
|
} //extern "C"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif //TCPGECKO_HARDWARE_BREAKPOINTS_H
|
@ -14,7 +14,7 @@
|
|||||||
#include "../dynamic_libs/gx2_functions.h"
|
#include "../dynamic_libs/gx2_functions.h"
|
||||||
#include "../dynamic_libs/fs_functions.h"
|
#include "../dynamic_libs/fs_functions.h"
|
||||||
#include "../utils/logger.h"
|
#include "../utils/logger.h"
|
||||||
#include "hardware_breakpoints.hpp"
|
#include "hardware_breakpoints.h"
|
||||||
#include "linked_list.h"
|
#include "linked_list.h"
|
||||||
#include "address.h"
|
#include "address.h"
|
||||||
#include "stack.h"
|
#include "stack.h"
|
||||||
@ -23,6 +23,8 @@
|
|||||||
#include "../patcher/function_patcher_gx2.h"
|
#include "../patcher/function_patcher_gx2.h"
|
||||||
#include "raw_assembly_cheats.h"
|
#include "raw_assembly_cheats.h"
|
||||||
#include "sd_cheats.h"
|
#include "sd_cheats.h"
|
||||||
|
#include "threads.h"
|
||||||
|
#include "software_breakpoints.h"
|
||||||
|
|
||||||
void *client;
|
void *client;
|
||||||
void *commandBlock;
|
void *commandBlock;
|
||||||
@ -199,6 +201,12 @@ unsigned int receiveString(struct pygecko_bss_t *bss,
|
|||||||
OSScreenFlipBuffersEx(1);
|
OSScreenFlipBuffersEx(1);
|
||||||
}*/
|
}*/
|
||||||
|
|
||||||
|
|
||||||
|
/* TODO
|
||||||
|
https://github.com/dimok789/ddd/blob/ca33ad1c759a0b67db33eedcf7fc4537198aad9c/src/discdumper.c#L667-L693
|
||||||
|
int ret = FSBindMount(pClient, pCmd, metaDir, "/vol/meta", -1);
|
||||||
|
FSBindUnmount(pClient, pCmd, metaDir, -1);
|
||||||
|
*/
|
||||||
void considerInitializingFileSystem() {
|
void considerInitializingFileSystem() {
|
||||||
if (!client) {
|
if (!client) {
|
||||||
// Initialize the file system
|
// Initialize the file system
|
||||||
@ -1324,7 +1332,8 @@ static int processCommands(struct pygecko_bss_t *bss, int clientfd) {
|
|||||||
bufferIndex += sizeof(bool);
|
bufferIndex += sizeof(bool);
|
||||||
bool write = buffer[bufferIndex];
|
bool write = buffer[bufferIndex];
|
||||||
bufferIndex += sizeof(bool);
|
bufferIndex += sizeof(bool);
|
||||||
setDataBreakpoint(address, read, write);
|
SetDataBreakpoint(address, read, write);
|
||||||
|
// setDataBreakpoint(address, read, write);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -1570,4 +1579,4 @@ void startTCPGecko() {
|
|||||||
OSResumeThread(thread);
|
OSResumeThread(thread);
|
||||||
|
|
||||||
log_print("TCP Gecko started...\n");
|
log_print("TCP Gecko started...\n");
|
||||||
}
|
}
|
||||||
|
62
src/utils/ppc_asm.h
Normal file
62
src/utils/ppc_asm.h
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
#ifndef PPC_ASM_H
|
||||||
|
#define PPC_ASM_H
|
||||||
|
/*
|
||||||
|
*
|
||||||
|
* Definitions used by various bits of low-level assembly code on PowerPC.
|
||||||
|
*
|
||||||
|
* Copyright (C) 1995-1999 Gary Thomas, Paul Mackerras, Cort Dougan.
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License
|
||||||
|
* as published by the Free Software Foundation; either version
|
||||||
|
* 2 of the License, or (at your option) any later version.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Condition Register Bit Fields */
|
||||||
|
|
||||||
|
#define cr0 0
|
||||||
|
#define cr1 1
|
||||||
|
#define cr2 2
|
||||||
|
#define cr3 3
|
||||||
|
#define cr4 4
|
||||||
|
#define cr5 5
|
||||||
|
#define cr6 6
|
||||||
|
#define cr7 7
|
||||||
|
|
||||||
|
|
||||||
|
/* General Purpose Registers (GPRs) */
|
||||||
|
|
||||||
|
#define r0 0
|
||||||
|
#define r1 1
|
||||||
|
#define r2 2
|
||||||
|
#define r3 3
|
||||||
|
#define r4 4
|
||||||
|
#define r5 5
|
||||||
|
#define r6 6
|
||||||
|
#define r7 7
|
||||||
|
#define r8 8
|
||||||
|
#define r9 9
|
||||||
|
#define r10 10
|
||||||
|
#define r11 11
|
||||||
|
#define r12 12
|
||||||
|
#define r13 13
|
||||||
|
#define r14 14
|
||||||
|
#define r15 15
|
||||||
|
#define r16 16
|
||||||
|
#define r17 17
|
||||||
|
#define r18 18
|
||||||
|
#define r19 19
|
||||||
|
#define r20 20
|
||||||
|
#define r21 21
|
||||||
|
#define r22 22
|
||||||
|
#define r23 23
|
||||||
|
#define r24 24
|
||||||
|
#define r25 25
|
||||||
|
#define r26 26
|
||||||
|
#define r27 27
|
||||||
|
#define r28 28
|
||||||
|
#define r29 29
|
||||||
|
#define r30 30
|
||||||
|
#define r31 31
|
||||||
|
|
||||||
|
#endif /* PPC_ASM_H */
|
BIN
tcpgecko.elf
BIN
tcpgecko.elf
Binary file not shown.
Loading…
Reference in New Issue
Block a user