* linux-low.c (usr_store_inferior_registers): Factor out code
to handle individual registers into... (store_register): ... this new function.
This commit is contained in:
parent
2c21c232ac
commit
7325beb467
|
@ -1,3 +1,9 @@
|
||||||
|
2011-12-06 Maciej W. Rozycki <macro@codesourcery.com>
|
||||||
|
|
||||||
|
* linux-low.c (usr_store_inferior_registers): Factor out code
|
||||||
|
to handle individual registers into...
|
||||||
|
(store_register): ... this new function.
|
||||||
|
|
||||||
2011-12-06 Ulrich Weigand <uweigand@de.ibm.com>
|
2011-12-06 Ulrich Weigand <uweigand@de.ibm.com>
|
||||||
|
|
||||||
* Makefile.in (s390-linux32v1.o, s390-linux32v1.c): New rules.
|
* Makefile.in (s390-linux32v1.o, s390-linux32v1.c): New rules.
|
||||||
|
|
|
@ -3768,6 +3768,60 @@ fetch_register (struct regcache *regcache, int regno)
|
||||||
supply_register (regcache, regno, buf);
|
supply_register (regcache, regno, buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Store one register. */
|
||||||
|
static void
|
||||||
|
store_register (struct regcache *regcache, int regno)
|
||||||
|
{
|
||||||
|
CORE_ADDR regaddr;
|
||||||
|
int i, size;
|
||||||
|
char *buf;
|
||||||
|
int pid;
|
||||||
|
|
||||||
|
if (regno >= the_low_target.num_regs)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if ((*the_low_target.cannot_store_register) (regno) == 1)
|
||||||
|
return;
|
||||||
|
|
||||||
|
regaddr = register_addr (regno);
|
||||||
|
if (regaddr == -1)
|
||||||
|
return;
|
||||||
|
errno = 0;
|
||||||
|
size = (register_size (regno) + sizeof (PTRACE_XFER_TYPE) - 1)
|
||||||
|
& - sizeof (PTRACE_XFER_TYPE);
|
||||||
|
buf = alloca (size);
|
||||||
|
memset (buf, 0, size);
|
||||||
|
|
||||||
|
if (the_low_target.collect_ptrace_register)
|
||||||
|
the_low_target.collect_ptrace_register (regcache, regno, buf);
|
||||||
|
else
|
||||||
|
collect_register (regcache, regno, buf);
|
||||||
|
|
||||||
|
pid = lwpid_of (get_thread_lwp (current_inferior));
|
||||||
|
for (i = 0; i < size; i += sizeof (PTRACE_XFER_TYPE))
|
||||||
|
{
|
||||||
|
errno = 0;
|
||||||
|
ptrace (PTRACE_POKEUSER, pid,
|
||||||
|
/* Coerce to a uintptr_t first to avoid potential gcc warning
|
||||||
|
about coercing an 8 byte integer to a 4 byte pointer. */
|
||||||
|
(PTRACE_ARG3_TYPE) (uintptr_t) regaddr,
|
||||||
|
(PTRACE_ARG4_TYPE) *(PTRACE_XFER_TYPE *) (buf + i));
|
||||||
|
if (errno != 0)
|
||||||
|
{
|
||||||
|
/* At this point, ESRCH should mean the process is
|
||||||
|
already gone, in which case we simply ignore attempts
|
||||||
|
to change its registers. See also the related
|
||||||
|
comment in linux_resume_one_lwp. */
|
||||||
|
if (errno == ESRCH)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if ((*the_low_target.cannot_store_register) (regno) == 0)
|
||||||
|
error ("writing register %d: %s", regno, strerror (errno));
|
||||||
|
}
|
||||||
|
regaddr += sizeof (PTRACE_XFER_TYPE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Fetch all registers, or just one, from the child process. */
|
/* Fetch all registers, or just one, from the child process. */
|
||||||
static void
|
static void
|
||||||
usr_fetch_inferior_registers (struct regcache *regcache, int regno)
|
usr_fetch_inferior_registers (struct regcache *regcache, int regno)
|
||||||
|
@ -3785,60 +3839,11 @@ usr_fetch_inferior_registers (struct regcache *regcache, int regno)
|
||||||
static void
|
static void
|
||||||
usr_store_inferior_registers (struct regcache *regcache, int regno)
|
usr_store_inferior_registers (struct regcache *regcache, int regno)
|
||||||
{
|
{
|
||||||
CORE_ADDR regaddr;
|
if (regno == -1)
|
||||||
int i, size;
|
|
||||||
char *buf;
|
|
||||||
int pid;
|
|
||||||
|
|
||||||
if (regno >= 0)
|
|
||||||
{
|
|
||||||
if (regno >= the_low_target.num_regs)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if ((*the_low_target.cannot_store_register) (regno) == 1)
|
|
||||||
return;
|
|
||||||
|
|
||||||
regaddr = register_addr (regno);
|
|
||||||
if (regaddr == -1)
|
|
||||||
return;
|
|
||||||
errno = 0;
|
|
||||||
size = (register_size (regno) + sizeof (PTRACE_XFER_TYPE) - 1)
|
|
||||||
& - sizeof (PTRACE_XFER_TYPE);
|
|
||||||
buf = alloca (size);
|
|
||||||
memset (buf, 0, size);
|
|
||||||
|
|
||||||
if (the_low_target.collect_ptrace_register)
|
|
||||||
the_low_target.collect_ptrace_register (regcache, regno, buf);
|
|
||||||
else
|
|
||||||
collect_register (regcache, regno, buf);
|
|
||||||
|
|
||||||
pid = lwpid_of (get_thread_lwp (current_inferior));
|
|
||||||
for (i = 0; i < size; i += sizeof (PTRACE_XFER_TYPE))
|
|
||||||
{
|
|
||||||
errno = 0;
|
|
||||||
ptrace (PTRACE_POKEUSER, pid,
|
|
||||||
/* Coerce to a uintptr_t first to avoid potential gcc warning
|
|
||||||
about coercing an 8 byte integer to a 4 byte pointer. */
|
|
||||||
(PTRACE_ARG3_TYPE) (uintptr_t) regaddr,
|
|
||||||
(PTRACE_ARG4_TYPE) *(PTRACE_XFER_TYPE *) (buf + i));
|
|
||||||
if (errno != 0)
|
|
||||||
{
|
|
||||||
/* At this point, ESRCH should mean the process is
|
|
||||||
already gone, in which case we simply ignore attempts
|
|
||||||
to change its registers. See also the related
|
|
||||||
comment in linux_resume_one_lwp. */
|
|
||||||
if (errno == ESRCH)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if ((*the_low_target.cannot_store_register) (regno) == 0)
|
|
||||||
error ("writing register %d: %s", regno, strerror (errno));
|
|
||||||
}
|
|
||||||
regaddr += sizeof (PTRACE_XFER_TYPE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
for (regno = 0; regno < the_low_target.num_regs; regno++)
|
for (regno = 0; regno < the_low_target.num_regs; regno++)
|
||||||
usr_store_inferior_registers (regcache, regno);
|
store_register (regcache, regno);
|
||||||
|
else
|
||||||
|
store_register (regcache, regno);
|
||||||
}
|
}
|
||||||
#endif /* HAVE_LINUX_USRREGS */
|
#endif /* HAVE_LINUX_USRREGS */
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue