* 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:
Maciej W. Rozycki 2011-12-06 23:00:15 +00:00
parent 2c21c232ac
commit 7325beb467
2 changed files with 64 additions and 53 deletions

View File

@ -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>
* Makefile.in (s390-linux32v1.o, s390-linux32v1.c): New rules.

View File

@ -3768,6 +3768,60 @@ fetch_register (struct regcache *regcache, int regno)
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. */
static void
usr_fetch_inferior_registers (struct regcache *regcache, int regno)
@ -3785,60 +3839,11 @@ usr_fetch_inferior_registers (struct regcache *regcache, int regno)
static void
usr_store_inferior_registers (struct regcache *regcache, int regno)
{
CORE_ADDR regaddr;
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
if (regno == -1)
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 */