blob: d7ee1141d99e363b3a19149034c4426c807ff0bf [file] [log] [blame]
Juan Cespedes5c3fe062004-06-14 18:08:37 +02001#include "config.h"
Juan Cespedes5c3fe062004-06-14 18:08:37 +02002
3#include <sys/types.h>
4#include "ptrace.h"
Petr Machata366c2f42012-02-09 19:34:36 +01005#include "proc.h"
Juan Cespedesf7281232009-06-25 16:11:21 +02006#include "common.h"
Juan Cespedes5c3fe062004-06-14 18:08:37 +02007
Juan Cespedesf1350522008-12-16 18:19:58 +01008void *
Juan Cespedesa8909f72009-04-28 20:02:41 +02009get_instruction_pointer(Process *proc) {
Ian Wienand2d45b1a2006-02-20 22:48:07 +010010 proc_archdep *a = (proc_archdep *) (proc->arch_ptr);
Juan Cespedes5c3fe062004-06-14 18:08:37 +020011 if (a->valid)
Juan Cespedes34584562009-07-25 16:10:39 +020012 return (void *)a->regs.pc;
Juan Cespedes5c3fe062004-06-14 18:08:37 +020013 return (void *)-1;
14}
15
Juan Cespedesf1350522008-12-16 18:19:58 +010016void
Juan Cespedesa8909f72009-04-28 20:02:41 +020017set_instruction_pointer(Process *proc, void *addr) {
Ian Wienand2d45b1a2006-02-20 22:48:07 +010018 proc_archdep *a = (proc_archdep *) (proc->arch_ptr);
Juan Cespedes5c3fe062004-06-14 18:08:37 +020019 if (a->valid)
Juan Cespedes34584562009-07-25 16:10:39 +020020 a->regs.pc = (long)addr;
Juan Cespedes5c3fe062004-06-14 18:08:37 +020021}
22
Juan Cespedesf1350522008-12-16 18:19:58 +010023void *
Juan Cespedesa8909f72009-04-28 20:02:41 +020024get_stack_pointer(Process *proc) {
Ian Wienand2d45b1a2006-02-20 22:48:07 +010025 proc_archdep *a = (proc_archdep *) (proc->arch_ptr);
Juan Cespedes5c3fe062004-06-14 18:08:37 +020026 if (a->valid)
Juan Cespedes34584562009-07-25 16:10:39 +020027 return (void *)a->regs.u_regs[UREG_I5];
Juan Cespedes5c3fe062004-06-14 18:08:37 +020028 return (void *)-1;
29}
30
Juan Cespedesf1350522008-12-16 18:19:58 +010031void *
Juan Cespedesa8909f72009-04-28 20:02:41 +020032get_return_addr(Process *proc, void *stack_pointer) {
Ian Wienand2d45b1a2006-02-20 22:48:07 +010033 proc_archdep *a = (proc_archdep *) (proc->arch_ptr);
Juan Cespedes5c3fe062004-06-14 18:08:37 +020034 unsigned int t;
35 if (!a->valid)
36 return (void *)-1;
37 /* Work around structure returns */
Juan Cespedes34584562009-07-25 16:10:39 +020038 t = ptrace(PTRACE_PEEKTEXT, proc->pid, a->regs.u_regs[UREG_I6] + 8, 0);
Juan Cespedes5c3fe062004-06-14 18:08:37 +020039 if (t < 0x400000)
Juan Cespedes34584562009-07-25 16:10:39 +020040 return (void *)a->regs.u_regs[UREG_I6] + 12;
41 return (void *)a->regs.u_regs[UREG_I6] + 8;
Juan Cespedes5c3fe062004-06-14 18:08:37 +020042}
Juan Cespedes2a61d192009-07-04 11:29:27 +020043
44void
45set_return_addr(Process *proc, void *addr) {
46 proc_archdep *a = (proc_archdep *) (proc->arch_ptr);
Juan Cespedes2a61d192009-07-04 11:29:27 +020047 if (!a->valid)
48 return;
Juan Cespedes34584562009-07-25 16:10:39 +020049 ptrace(PTRACE_POKETEXT, proc->pid, a->regs.u_regs[UREG_I6] + 8, addr);
Juan Cespedes2a61d192009-07-04 11:29:27 +020050}