From: Alexey Kardashevskiy <aik@ozlabs.ru>
To: Linuxppc-dev@lists.ozlabs.org
Subject: Re: ptrace and emulated mfspr/mtspr on DSCR
Date: Fri, 06 Jul 2012 18:12:10 +1000 [thread overview]
Message-ID: <4FF69DDA.6030306@ozlabs.ru> (raw)
In-Reply-To: <4FF69404.6090408@ozlabs.ru>
ha, forget it, it is all correct actually :)
On 06/07/12 17:30, Alexey Kardashevskiy wrote:
> Hi!
>
> I am trying to change DSCR's value of a specific process with pid=XXX. For this, I attach by ptrace() to XXX, inject a piece of code which does mfspr/mtspr, "continue" XXX and see how it is changing. So far so good.
>
> The problem is with "continue". The XXX process does not wake up until I press a key (if XXX is waiting on something like scanf() or gets()) OR it exits from sleep() if I change it to run sleep() in a loop.
>
> Not sure if it matters but mfspr/mtspr are privileged instructions and are emulated by the kernel.
>
> How to wake XXX up?
>
>
>
> #include <sys/ptrace.h>
> #include <sys/types.h>
> #include <sys/wait.h>
> #include <string.h>
> #include <unistd.h>
> #include <sys/user.h>
> #include <stdio.h>
> #include <stdlib.h>
>
> void getdata(pid_t child, long addr, void *str)
> {
> unsigned long *ptr = (unsigned long *) str;
> ptr[0] = ptrace(PTRACE_PEEKDATA, child, addr, NULL);
> }
>
> void putdata(pid_t child, long addr, void *str)
> {
> unsigned long *ptr = (unsigned long *) str;
> ptrace(PTRACE_POKEDATA, child, addr, ptr[0]);
> }
>
> int main(int argc, char *argv[])
> {
> pid_t traced_process;
> struct pt_regs regs, backup_regs;
> unsigned long dscr = -1;
> /*.set_dscr:
> * 7f d1 03 a6 mtspr 17,r30
> 7d 82 10 08 twge r2,r2 <- set breakpoint */
> unsigned int insert_set[] = { 0x7fd103a6, 0x7d821008 };
> /*.get_dscr:
> 7f d1 02 a6 mfspr r30,17
> 7d 82 10 08 twge r2,r2 <- set breakpoint */
> unsigned int insert_get[] = { 0x7fd102a6, 0x7d821008 };
> char backup[8];
> int len = 8;
>
> if((argc < 2)||(sizeof(unsigned int)!=4)) {
> printf("Usage: %s <pid to be traced> [dscr value]\n", argv[0], argv[1]);
> exit(1);
> }
> if (argc > 2) {
> dscr = atoi(argv[2]);
> }
>
> traced_process = atoi(argv[1]);
> ptrace(PTRACE_ATTACH, traced_process, NULL, NULL);
> wait(NULL);
>
> printf("Attached to pid=%u\n", traced_process);
> ptrace(PTRACE_GETREGS, traced_process, NULL, ®s);
> backup_regs = regs;
> getdata(traced_process, regs.nip, backup);
>
> if (dscr != -1) {
> regs.gpr[30] = dscr;
> putdata(traced_process, regs.nip, insert_set);
> ptrace(PTRACE_SETREGS, traced_process, NULL, ®s);
> printf("Setting DSCR = %x to gpr0\n", regs.gpr[30]);
> } else {
> putdata(traced_process, regs.nip, insert_get);
> printf("Reading DSCR\n");
> }
>
> printf("Continued pid=%u\n", traced_process);
> ptrace(PTRACE_CONT, traced_process, NULL, SIGCONT);
>
> printf("waiting...\n");
> wait(NULL); // <---------------- HERE IS THE PROBLEM
>
> if (dscr == -1) {
> printf("DSCR has been read\n");
> ptrace(PTRACE_GETREGS, traced_process, NULL, ®s);
> printf("Reading DSCR from gpr30 = %x\n", regs.gpr[30]);
> }
>
> printf("The process stopped, Putting back the original instructions\n");
> putdata(traced_process, backup_regs.nip, backup);
> ptrace(PTRACE_SETREGS, traced_process, NULL, &backup_regs);
> printf("Letting it continue with original flow\n");
> ptrace(PTRACE_DETACH, traced_process, NULL, NULL);
>
> return 0;
> }
>
--
Alexey
prev parent reply other threads:[~2012-07-06 8:12 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-07-06 7:30 ptrace and emulated mfspr/mtspr on DSCR Alexey Kardashevskiy
2012-07-06 8:12 ` Alexey Kardashevskiy [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4FF69DDA.6030306@ozlabs.ru \
--to=aik@ozlabs.ru \
--cc=Linuxppc-dev@lists.ozlabs.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).