extern int umoven(struct tcb *, long, unsigned int, void *);
#define umove(pid, addr, objp) \
umoven((pid), (addr), sizeof(*(objp)), (void *) (objp))
+extern int umoven_or_printaddr(struct tcb *, long, unsigned int, void *);
+#define umove_or_printaddr(pid, addr, objp) \
+ umoven_or_printaddr((pid), (addr), sizeof(*(objp)), (void *) (objp))
extern int umovestr(struct tcb *, long, unsigned int, char *);
extern int upeek(int pid, long, long *);
extern int printllval(struct tcb *, const char *, int)
ATTRIBUTE_FORMAT((printf, 2, 0));
+extern void printaddr(long);
extern void printxval(const struct xlat *, const unsigned int, const char *);
extern int printargs(struct tcb *);
extern int printargs_lu(struct tcb *);
return n;
}
+void
+printaddr(const long addr)
+{
+ if (!addr)
+ tprints("NULL");
+ else
+ tprintf("%#lx", addr);
+}
+
void
printnum_long(struct tcb *tcp, long addr, const char *fmt)
{
return 0;
}
+int
+umoven_or_printaddr(struct tcb *tcp, const long addr, const unsigned int len,
+ void *our_addr)
+{
+ if (!addr) {
+ tprints("NULL");
+ return -1;
+ }
+ if ((exiting(tcp) && syserror(tcp)) ||
+ umoven(tcp, addr, len, our_addr) < 0) {
+ tprintf("%#lx", addr);
+ return -1;
+ }
+ return 0;
+}
+
/*
* Like `umove' but make the additional effort of looking
* for a terminating zero byte.