diff options
Diffstat (limited to 'src/libmach/Linux.c')
-rw-r--r-- | src/libmach/Linux.c | 191 |
1 files changed, 1 insertions, 190 deletions
diff --git a/src/libmach/Linux.c b/src/libmach/Linux.c index 9127434f..ff727409 100644 --- a/src/libmach/Linux.c +++ b/src/libmach/Linux.c @@ -168,7 +168,7 @@ ptracerw(int type, int xtype, int isr, int pid, ulong addr, void *v, uint n) memmove(buf, (char*)v+i, n-i); u = *(u32int*)buf; } - if(ptrace(type, pid, addr+i, &u) < 0) + if(ptrace(type, pid, addr+i, u) < 0) goto ptraceerr; } } @@ -501,192 +501,3 @@ proctextfile(int pid) } Bterm(b); #endif - -/* - * bottom-end functions for libthread_db to call - */ -enum -{ - PS_OK, - PS_ERR, - PS_BADPID, - PS_BADLWPID, - PS_BADADDR, - PS_NOSYM, - PS_NOFPREGS, -}; - -pid_t -ps_getpid(struct ps_prochandle *ph) -{ - return ph->pid; -} - -int -ps_pstop(const struct ps_prochandle *ph) -{ - return PS_ERR; -} - -int -ps_pcontinue(const struct ps_prochandle *ph) -{ - return PS_ERR; -} - -int -ps_lstop(const struct ps_prochandle *ph) -{ - return PS_ERR; -} - -int -ps_lcontinue(const struct ps_prochandle *ph) -{ - return PS_ERR; -} - -/* read/write data or text memory */ -int -ps_pdread(struct ps_prochandle *ph, psaddr_t addr, void *v, size_t sz) -{ -//print("read %d %p %d\n", ph->pid, addr, sz); - if(ptracerw(PTRACE_PEEKDATA, 0, 1, ph->pid, (ulong)addr, v, sz) < 0) - return PS_ERR; -//print(" => 0x%lux\n", *(ulong*)v); - return PS_OK; -} - -int -ps_pdwrite(struct ps_prochandle *ph, psaddr_t addr, void *v, size_t sz) -{ -//print("write %d %p\n", ph->pid, addr); - if(ptracerw(PTRACE_POKEDATA, PTRACE_PEEKDATA, 0, ph->pid, (ulong)addr, v, sz) < 0) - return PS_ERR; - return PS_OK; -} - -int -ps_ptread(struct ps_prochandle *ph, psaddr_t addr, void *v, size_t sz) -{ -//print("read %d %p\n", ph->pid, addr); - if(ptracerw(PTRACE_PEEKTEXT, 0, 1, ph->pid, (ulong)addr, v, sz) < 0) - return PS_ERR; - return PS_OK; -} - -int -ps_ptwrite(struct ps_prochandle *ph, psaddr_t addr, void *v, size_t sz) -{ -//print("write %d %p\n", ph->pid, addr); - if(ptracerw(PTRACE_POKETEXT, PTRACE_PEEKTEXT, 0, ph->pid, (ulong)addr, v, sz) < 0) - return PS_ERR; - return PS_OK; -} - -int -ps_lgetregs(struct ps_prochandle *ph, lwpid_t lwp, prgregset_t regs) -{ - if(lwp == 0){ - memset(regs, 0xfe, sizeof(regs[0])*nelem(linuxregs)); - return PS_OK; - } -//print("getregs %d %p (%d)\n", lwp, regs, sizeof(regs[0])*nelem(linuxregs)); - - if(ptraceattach(lwp) < 0){ - fprint(2, "ptrace attach: %r\n"); - return PS_ERR; - } - - if(ptracerw(PTRACE_PEEKUSER, 0, 1, lwp, 0, regs, sizeof(regs[0])*nelem(linuxregs)) < 0){ - fprint(2, "ptrace: %r\n"); - return PS_ERR; - } - return PS_OK; -} - -int -ps_lsetregs(struct ps_prochandle *ph, lwpid_t lwp, prgregset_t regs) -{ -print("setregs %d\n", lwp); - if(ptracerw(PTRACE_POKEUSER, PTRACE_PEEKUSER, 1, lwp, 0, regs, sizeof(regs[0])*nelem(linuxregs)) < 0) - return PS_ERR; - return PS_OK; -} - -int -ps_lgetfpregs(struct ps_prochandle *ph, lwpid_t lwp, prfpregset_t *fpregs) -{ - if(ptracerw(PTRACE_PEEKUSER, 0, 1, lwp, 18*4, fpregs, sizeof *fpregs) < 0) - return PS_ERR; - return PS_OK; -} - -int -ps_lsetfpregs(struct ps_prochandle *ph, lwpid_t lwp, prfpregset_t *fpregs) -{ - if(ptracerw(PTRACE_POKEUSER, PTRACE_PEEKUSER, 1, lwp, 18*4, fpregs, sizeof *fpregs) < 0) - return PS_ERR; - return PS_OK; -} - -/* Fetch the special per-thread address associated with the given LWP. - This call is only used on a few platforms (most use a normal register). - The meaning of the `int' parameter is machine-dependent. */ -int -ps_get_thread_area(struct ps_prochandle *ph, lwpid_t lwp, int xxx, psaddr_t *addr) -{ - return PS_NOSYM; -} - -/* Look up the named symbol in the named DSO in the symbol tables - associated with the process being debugged, filling in *SYM_ADDR - with the corresponding run-time address. */ -int -ps_pglobal_lookup(struct ps_prochandle *ph, char *object_name, char *sym_name, psaddr_t *sym_addr) -{ - Fhdr *fp; - ulong addr; - - if((fp = findhdr(object_name)) == nil){ -print("lookup %d %s %s => no such hdr\n", ph->pid, object_name, sym_name); - return PS_NOSYM; - } - if(elfsymlookup(fp->elf, sym_name, &addr) < 0){ -print("lookup %d %s %s => name not found\n", ph->pid, object_name, sym_name); - return PS_NOSYM; - } -print("lookup %d %s %s => 0x%lux\n", ph->pid, object_name, sym_name, addr); - *sym_addr = (void*)(addr+fp->base); - return PS_OK; -} - -Ureg* -_linux2ureg386(UregLinux386 *l) -{ - Ureg *u; - - u = malloc(sizeof(Ureg)); - if(u == nil) - return nil; - u->di = l->edi; - u->si = l->esi; - u->bp = l->ebp; - u->nsp = l->esp; - u->bx = l->ebx; - u->dx = l->edx; - u->cx = l->ecx; - u->ax = l->eax; - u->gs = l->xgs; - u->fs = l->xfs; - u->es = l->xes; - u->ds = l->xds; - u->trap = ~0; // l->trapno; - u->ecode = ~0; // l->err; - u->pc = l->eip; - u->cs = l->xcs; - u->flags = l->eflags; - u->sp = l->esp; - u->ss = l->xss; - return u; -} |