forked from Imagelibrary/binutils-gdb
* i386-linux-nat.c (i386_linux_resume): Use regcache functions
instead of read_register and read_register_pid. * ia64-linux-nat.c (enable_watchpoints_in_psr): Use REGCACHE argument instead of PTID. Use regcache functions instead of read_register_pid. (ia64_linux_insert_watchpoint): Update call. (ia64_linux_stopped_data_address): Use regcache functions instead of read_register_pid and write_register_pid.
This commit is contained in:
@@ -1,3 +1,15 @@
|
|||||||
|
2007-05-11 Ulrich Weigand <uweigand@de.ibm.com>
|
||||||
|
|
||||||
|
* i386-linux-nat.c (i386_linux_resume): Use regcache functions
|
||||||
|
instead of read_register and read_register_pid.
|
||||||
|
|
||||||
|
* ia64-linux-nat.c (enable_watchpoints_in_psr): Use REGCACHE
|
||||||
|
argument instead of PTID. Use regcache functions instead of
|
||||||
|
read_register_pid.
|
||||||
|
(ia64_linux_insert_watchpoint): Update call.
|
||||||
|
(ia64_linux_stopped_data_address): Use regcache functions
|
||||||
|
instead of read_register_pid and write_register_pid.
|
||||||
|
|
||||||
2007-05-11 Ulrich Weigand <uweigand@de.ibm.com>
|
2007-05-11 Ulrich Weigand <uweigand@de.ibm.com>
|
||||||
|
|
||||||
* libunwind-frame.h (struct regcache): Add forward declaration.
|
* libunwind-frame.h (struct regcache): Add forward declaration.
|
||||||
|
|||||||
@@ -736,11 +736,16 @@ i386_linux_resume (ptid_t ptid, int step, enum target_signal signal)
|
|||||||
|
|
||||||
if (step)
|
if (step)
|
||||||
{
|
{
|
||||||
CORE_ADDR pc = read_pc_pid (pid_to_ptid (pid));
|
struct cleanup *old_chain = save_inferior_ptid ();
|
||||||
|
struct regcache *regcache = current_regcache;
|
||||||
|
ULONGEST pc;
|
||||||
gdb_byte buf[LINUX_SYSCALL_LEN];
|
gdb_byte buf[LINUX_SYSCALL_LEN];
|
||||||
|
|
||||||
request = PTRACE_SINGLESTEP;
|
request = PTRACE_SINGLESTEP;
|
||||||
|
|
||||||
|
inferior_ptid = pid_to_ptid (pid);
|
||||||
|
regcache_cooked_read_unsigned (regcache, PC_REGNUM, &pc);
|
||||||
|
|
||||||
/* Returning from a signal trampoline is done by calling a
|
/* Returning from a signal trampoline is done by calling a
|
||||||
special system call (sigreturn or rt_sigreturn, see
|
special system call (sigreturn or rt_sigreturn, see
|
||||||
i386-linux-tdep.c for more information). This system call
|
i386-linux-tdep.c for more information). This system call
|
||||||
@@ -753,18 +758,21 @@ i386_linux_resume (ptid_t ptid, int step, enum target_signal signal)
|
|||||||
if (read_memory_nobpt (pc, buf, LINUX_SYSCALL_LEN) == 0
|
if (read_memory_nobpt (pc, buf, LINUX_SYSCALL_LEN) == 0
|
||||||
&& memcmp (buf, linux_syscall, LINUX_SYSCALL_LEN) == 0)
|
&& memcmp (buf, linux_syscall, LINUX_SYSCALL_LEN) == 0)
|
||||||
{
|
{
|
||||||
int syscall = read_register_pid (LINUX_SYSCALL_REGNUM,
|
ULONGEST syscall;
|
||||||
pid_to_ptid (pid));
|
regcache_cooked_read_unsigned (regcache,
|
||||||
|
LINUX_SYSCALL_REGNUM, &syscall);
|
||||||
|
|
||||||
/* Then check the system call number. */
|
/* Then check the system call number. */
|
||||||
if (syscall == SYS_sigreturn || syscall == SYS_rt_sigreturn)
|
if (syscall == SYS_sigreturn || syscall == SYS_rt_sigreturn)
|
||||||
{
|
{
|
||||||
CORE_ADDR sp = read_register (I386_ESP_REGNUM);
|
ULONGEST sp, addr;
|
||||||
CORE_ADDR addr = sp;
|
|
||||||
unsigned long int eflags;
|
unsigned long int eflags;
|
||||||
|
|
||||||
|
regcache_cooked_read_unsigned (regcache, I386_ESP_REGNUM, &sp);
|
||||||
if (syscall == SYS_rt_sigreturn)
|
if (syscall == SYS_rt_sigreturn)
|
||||||
addr = read_memory_integer (sp + 8, 4) + 20;
|
addr = read_memory_integer (sp + 8, 4) + 20;
|
||||||
|
else
|
||||||
|
addr = sp;
|
||||||
|
|
||||||
/* Set the trace flag in the context that's about to be
|
/* Set the trace flag in the context that's about to be
|
||||||
restored. */
|
restored. */
|
||||||
@@ -774,6 +782,8 @@ i386_linux_resume (ptid_t ptid, int step, enum target_signal signal)
|
|||||||
write_memory (addr, (gdb_byte *) &eflags, 4);
|
write_memory (addr, (gdb_byte *) &eflags, 4);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
do_cleanups (old_chain);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ptrace (request, pid, 0, target_signal_to_host (signal)) == -1)
|
if (ptrace (request, pid, 0, target_signal_to_host (signal)) == -1)
|
||||||
|
|||||||
@@ -477,16 +477,16 @@ fill_fpregset (const struct regcache *regcache,
|
|||||||
#define IA64_PSR_DD (1UL << 39)
|
#define IA64_PSR_DD (1UL << 39)
|
||||||
|
|
||||||
static void
|
static void
|
||||||
enable_watchpoints_in_psr (ptid_t ptid)
|
enable_watchpoints_in_psr (struct regcache *regcache)
|
||||||
{
|
{
|
||||||
CORE_ADDR psr;
|
ULONGEST psr;
|
||||||
|
|
||||||
psr = read_register_pid (IA64_PSR_REGNUM, ptid);
|
regcache_cooked_read_unsigned (regcache, IA64_PSR_REGNUM, &psr);
|
||||||
if (!(psr & IA64_PSR_DB))
|
if (!(psr & IA64_PSR_DB))
|
||||||
{
|
{
|
||||||
psr |= IA64_PSR_DB; /* Set the db bit - this enables hardware
|
psr |= IA64_PSR_DB; /* Set the db bit - this enables hardware
|
||||||
watchpoints and breakpoints. */
|
watchpoints and breakpoints. */
|
||||||
write_register_pid (IA64_PSR_REGNUM, psr, ptid);
|
regcache_cooked_write_unsigned (regcache, IA64_PSR_REGNUM, psr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -591,7 +591,7 @@ ia64_linux_insert_watchpoint (CORE_ADDR addr, int len, int rw)
|
|||||||
}
|
}
|
||||||
|
|
||||||
store_debug_register_pair (ptid, idx, &dbr_addr, &dbr_mask);
|
store_debug_register_pair (ptid, idx, &dbr_addr, &dbr_mask);
|
||||||
enable_watchpoints_in_psr (ptid);
|
enable_watchpoints_in_psr (current_regcache);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -628,6 +628,7 @@ ia64_linux_stopped_data_address (struct target_ops *ops, CORE_ADDR *addr_p)
|
|||||||
int tid;
|
int tid;
|
||||||
struct siginfo siginfo;
|
struct siginfo siginfo;
|
||||||
ptid_t ptid = inferior_ptid;
|
ptid_t ptid = inferior_ptid;
|
||||||
|
struct regcache *regcache = current_regcache;
|
||||||
|
|
||||||
tid = TIDGET(ptid);
|
tid = TIDGET(ptid);
|
||||||
if (tid == 0)
|
if (tid == 0)
|
||||||
@@ -640,10 +641,10 @@ ia64_linux_stopped_data_address (struct target_ops *ops, CORE_ADDR *addr_p)
|
|||||||
(siginfo.si_code & 0xffff) != 0x0004 /* TRAP_HWBKPT */)
|
(siginfo.si_code & 0xffff) != 0x0004 /* TRAP_HWBKPT */)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
psr = read_register_pid (IA64_PSR_REGNUM, ptid);
|
regcache_cooked_read_unsigned (regcache, IA64_PSR_REGNUM, &psr);
|
||||||
psr |= IA64_PSR_DD; /* Set the dd bit - this will disable the watchpoint
|
psr |= IA64_PSR_DD; /* Set the dd bit - this will disable the watchpoint
|
||||||
for the next instruction */
|
for the next instruction */
|
||||||
write_register_pid (IA64_PSR_REGNUM, psr, ptid);
|
regcache_cooked_write_unsigned (regcache, IA64_PSR_REGNUM, psr);
|
||||||
|
|
||||||
*addr_p = (CORE_ADDR)siginfo.si_addr;
|
*addr_p = (CORE_ADDR)siginfo.si_addr;
|
||||||
return 1;
|
return 1;
|
||||||
|
|||||||
Reference in New Issue
Block a user