diff --git a/Applications/Debugger/main.cpp b/Applications/Debugger/main.cpp index fd76270957..dae194388f 100644 --- a/Applications/Debugger/main.cpp +++ b/Applications/Debugger/main.cpp @@ -108,9 +108,17 @@ int main(int argc, char** argv) return 1; } - printf("hit breakpoint\n"); + PtraceRegisters regs; + if (ptrace(PT_GETREGS, g_pid, ®s, 0) == -1) { + perror("getregs"); + return 1; + } - sleep(1); + printf("hit breakpoint\n"); + printf("eip:0x%x\n", regs.eip); + + uint32_t data = ptrace(PT_PEEK, g_pid, (void*)regs.eip, 0); + printf("data: 0x%x\n", data); if (ptrace(PT_CONTINUE, g_pid, 0, 0) == -1) { perror("continue"); diff --git a/Kernel/Process.cpp b/Kernel/Process.cpp index b786f92258..d3ccd13b87 100644 --- a/Kernel/Process.cpp +++ b/Kernel/Process.cpp @@ -69,6 +69,7 @@ #include #include #include +#include #include #include #include @@ -4973,6 +4974,21 @@ int Process::sys$ptrace(const Syscall::SC_ptrace_params* user_params) } break; } + case PT_PEEK: { + uint32_t* addr = reinterpret_cast(params.addr); + if (!MM.validate_user_read(peer->process(), VirtualAddress(addr), sizeof(uint32_t))) { + return -EFAULT; + } + + uint32_t result; + + SmapDisabler dis; + ProcessPagingScope scope(peer->process()); + result = *addr; + + return result; + break; + } default: return -EINVAL; diff --git a/Kernel/UnixTypes.h b/Kernel/UnixTypes.h index c890befbf7..4448de7f00 100644 --- a/Kernel/UnixTypes.h +++ b/Kernel/UnixTypes.h @@ -554,3 +554,4 @@ struct rtentry { #define PT_SYSCALL 4 #define PT_GETREGS 5 #define PT_DETACH 6 +#define PT_PEEK 7 diff --git a/Libraries/LibC/sys/ptrace.h b/Libraries/LibC/sys/ptrace.h index 9f385d4787..11559bcc9f 100644 --- a/Libraries/LibC/sys/ptrace.h +++ b/Libraries/LibC/sys/ptrace.h @@ -36,6 +36,7 @@ __BEGIN_DECLS #define PT_SYSCALL 4 #define PT_GETREGS 5 #define PT_DETACH 6 +#define PT_PEEK 7 int ptrace(int request, pid_t pid, void* addr, int data);