Commit QuarkTheAwesome's data breakpoints attempt (slightly modified)

This commit is contained in:
BullyWiiPlaza 2017-12-16 13:57:34 +01:00
parent 83751fdd75
commit 9ce7af45d7
7 changed files with 200 additions and 17 deletions

View File

@ -125,11 +125,11 @@ static unsigned char exceptionCallback(void *c, unsigned char exception_type) {
return 1;
}
static unsigned char dsi_exception_cb(void *context) {
unsigned char dsi_exception_cb(void *context) {
return exceptionCallback(context, 0);
}
static unsigned char isi_exception_cb(void *context) {
unsigned char isi_exception_cb(void *context) {
return exceptionCallback(context, 1);
}

View File

@ -78,6 +78,10 @@ typedef struct _framerec {
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
}
#endif

View 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

View File

@ -1,13 +1,105 @@
#include "stringify.h"
#include <stdbool.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 "main.h"
#include "utilities.h"
#include "software_breakpoints.h"
#ifndef TCPGECKO_BREAKPOINTS_H
#define TCPGECKO_BREAKPOINTS_H
#ifndef TCPGECKO_HARDWARE_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
#define IABR 0x3F2
@ -44,11 +136,6 @@ static inline int getIABRAddress() {
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) {
OSContext *context = (OSContext *) interruptedContext;
return (int) context->exception_specific1; // Offset 0x98
@ -145,4 +232,8 @@ unsigned char breakPointHandler(void *interruptedContext) {
return 0;
}
#endif
#ifdef __cplusplus
} //extern "C"
#endif
#endif //TCPGECKO_HARDWARE_BREAKPOINTS_H

View File

@ -14,7 +14,7 @@
#include "../dynamic_libs/gx2_functions.h"
#include "../dynamic_libs/fs_functions.h"
#include "../utils/logger.h"
#include "hardware_breakpoints.hpp"
#include "hardware_breakpoints.h"
#include "linked_list.h"
#include "address.h"
#include "stack.h"
@ -23,6 +23,8 @@
#include "../patcher/function_patcher_gx2.h"
#include "raw_assembly_cheats.h"
#include "sd_cheats.h"
#include "threads.h"
#include "software_breakpoints.h"
void *client;
void *commandBlock;
@ -199,6 +201,12 @@ unsigned int receiveString(struct pygecko_bss_t *bss,
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() {
if (!client) {
// Initialize the file system
@ -1324,7 +1332,8 @@ static int processCommands(struct pygecko_bss_t *bss, int clientfd) {
bufferIndex += sizeof(bool);
bool write = buffer[bufferIndex];
bufferIndex += sizeof(bool);
setDataBreakpoint(address, read, write);
SetDataBreakpoint(address, read, write);
// setDataBreakpoint(address, read, write);
break;
}
@ -1570,4 +1579,4 @@ void startTCPGecko() {
OSResumeThread(thread);
log_print("TCP Gecko started...\n");
}
}

62
src/utils/ppc_asm.h Normal file
View 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 */

Binary file not shown.