This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [RFA/RFC] Prec multi-thread support [2/4] arch support


Now, the fp insn patch and sse patch are running.  If you don't mind,
I suggest let them go first.  :)

Thanks,
Hui

On Tue, Dec 8, 2009 at 02:59, Michael Snyder <msnyder@vmware.com> wrote:
> Hui Zhu wrote:
>>
>> 1. In record_linux_system_call gdb_sys_clone, I set record_step to 0.
>> Then the record target will let inferior continue until to a
>> breakpoint. ?Most of time, record just let inferior step. ?But
>> sys_clone is very special. ?It cannot work OK with
>> PTRACE_SINGLESTEP.(It make me hang this patch a log of months.)
>>
>> 2. Add new argument "addr" that point to the next code that need to be
>> analyzed to linux syscall record function "record_linux_system_call".
>
> Here is your stylistic review:
>
>> 2009-11-25 ?Hui Zhu ?<teawater@gmail.com>
>>
>> ? ? ? ?* amd64-linux-tdep.c (amd64_linux_syscall_record): Add new
>> ? ? ? ?argument "addr".
>> ? ? ? ?* i386-linux-tdep.c (i386_linux_intx80_sysenter_record): Ditto.
>> ? ? ? ?* i386-tdep.c (i386_record_lea_modrm): Add "if (record_debug)"
>> ? ? ? ?to segment register warning.
>> ? ? ? ?(i386_process_record): Ditto. ?Add new argument "addr" when
>> ? ? ? ?call i386_intx80_record, i386_sysenter_record and
>> ? ? ? ?i386_syscall_record.
>> ? ? ? ?* i386-tdep.h (gdbarch_tdep): Add new argument "addr" when
>> ? ? ? ?call i386_intx80_record, i386_sysenter_record and
>> ? ? ? ?i386_syscall_record.
>> ? ? ? ?* linux-record.c (inferior.h): New include.
>> ? ? ? ?(record_linux_system_call): Add new argument "addr".
>> ? ? ? ?Update code for gdb_sys_clone.
>> ? ? ? ?* linux-record.h (record_linux_system_call): Add new argument
>> ? ? ? ?"addr".
>>
>> ---
>> ?amd64-linux-tdep.c | ? ?4 ++--
>> ?i386-linux-tdep.c ?| ? ?4 ++--
>> ?i386-tdep.c ? ? ? ?| ? 52
>> +++++++++++++++++++++++++++++-----------------------
>> ?i386-tdep.h ? ? ? ?| ? ?6 +++---
>> ?linux-record.c ? ? | ? 13 +++++++++----
>> ?linux-record.h ? ? | ? ?2 +-
>> ?6 files changed, 46 insertions(+), 35 deletions(-)
>>
>> --- a/amd64-linux-tdep.c
>> +++ b/amd64-linux-tdep.c
>> @@ -1155,7 +1155,7 @@ static struct linux_record_tdep amd64_li
>> ?#define RECORD_ARCH_GET_GS ? ? 0x1004
>>
>> ?static int
>> -amd64_linux_syscall_record (struct regcache *regcache)
>> +amd64_linux_syscall_record (struct regcache *regcache, CORE_ADDR addr)
>> ?{
>> ? int ret;
>> ? ULONGEST syscall_native;
>> @@ -1205,7 +1205,7 @@ amd64_linux_syscall_record (struct regca
>> ? ? }
>> ? else
>> ? ? {
>> - ? ? ?ret = record_linux_system_call (syscall_gdb, regcache,
>> + ? ? ?ret = record_linux_system_call (syscall_gdb, addr, regcache,
>> ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? &amd64_linux_record_tdep);
>> ? ? ? if (ret)
>> ? ? ? ? return ret;
>> --- a/i386-linux-tdep.c
>> +++ b/i386-linux-tdep.c
>> @@ -411,7 +411,7 @@ i386_canonicalize_syscall (int syscall)
>> ?static struct linux_record_tdep i386_linux_record_tdep;
>>
>> ?static int
>> -i386_linux_intx80_sysenter_record (struct regcache *regcache)
>> +i386_linux_intx80_sysenter_record (struct regcache *regcache, CORE_ADDR
>> addr)
>
> Break up long line.
>
>> ?{
>> ? int ret;
>> ? LONGEST syscall_native;
>> @@ -437,7 +437,7 @@ i386_linux_intx80_sysenter_record (struc
>> ? ? ?return 0;
>> ? ?}
>>
>> - ?ret = record_linux_system_call (syscall_gdb, regcache,
>> + ?ret = record_linux_system_call (syscall_gdb, addr, regcache,
>> ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?&i386_linux_record_tdep);
>> ? if (ret)
>> ? ? return ret;
>> --- a/i386-tdep.c
>> +++ b/i386-tdep.c
>> @@ -3160,10 +3160,11 @@ i386_record_lea_modrm (struct i386_recor
>>
>> ? if (irp->override >= 0)
>> ? ? {
>> - ? ? ?warning (_("Process record ignores the memory change "
>> - ? ? ? ? ? ? ? ? "of instruction at address %s because it "
>> - ? ? ? ? ? ? ? ? "can't get the value of the segment register."),
>> - ? ? ? ? ? ? ? paddress (gdbarch, irp->orig_addr));
>> + ? ? ?if (record_debug)
>> + ? ? ? ?warning (_("Process record ignores the memory change "
>> + ? ? ? ? ? ? ? ? ? "of instruction at address %s because it "
>> + ? ? ? ? ? ? ? ? ? "can't get the value of the segment register."),
>> + ? ? ? ? ? ? ? ? paddress (gdbarch, irp->orig_addr));
>> ? ? ? return 0;
>> ? ? }
>>
>> @@ -4042,11 +4043,12 @@ reswitch:
>> ? ? case 0xa3:
>> ? ? ? if (ir.override >= 0)
>> ? ? ? ? {
>> - ? ? ? ? warning (_("Process record ignores the memory change "
>> - ? ? ? ? ? ? ? ? ? ? "of instruction at address %s because "
>> - ? ? ? ? ? ? ? ? ? ? "it can't get the value of the segment "
>> - ? ? ? ? ? ? ? ? ? ? "register."),
>> - ? ? ? ? ? ? ? ? ? paddress (gdbarch, ir.orig_addr));
>> + ? ? ? ? ?if (record_debug)
>> + ? ? ? ? ? warning (_("Process record ignores the memory change "
>> + ? ? ? ? ? ? ? ? ? ? ? "of instruction at address %s because "
>> + ? ? ? ? ? ? ? ? ? ? ? "it can't get the value of the segment "
>> + ? ? ? ? ? ? ? ? ? ? ? "register."),
>> + ? ? ? ? ? ? ? ? ? ? paddress (gdbarch, ir.orig_addr));
>> ? ? ? ?}
>> ? ? ? else
>> ? ? ? ?{
>> @@ -4467,11 +4469,12 @@ reswitch:
>> ? ? ? ? ? if (ir.aflag && (es != ds))
>> ? ? ? ? ? ? {
>> ? ? ? ? ? ? ? /* addr += ((uint32_t) read_register (I386_ES_REGNUM)) << 4;
>> */
>> - ? ? ? ? ? ? ?warning (_("Process record ignores the memory "
>> - ? ? ? ? ? ? ? ? ? ? ? ? "change of instruction at address %s "
>> - ? ? ? ? ? ? ? ? ? ? ? ? "because it can't get the value of the "
>> - ? ? ? ? ? ? ? ? ? ? ? ? "ES segment register."),
>> - ? ? ? ? ? ? ? ? ? ? ? paddress (gdbarch, ir.orig_addr));
>> + ? ? ? ? ? ? ?if (record_debug)
>> + ? ? ? ? ? ? ? ?warning (_("Process record ignores the memory "
>> + ? ? ? ? ? ? ? ? ? ? ? ? ? "change of instruction at address %s "
>> + ? ? ? ? ? ? ? ? ? ? ? ? ? "because it can't get the value of the "
>> + ? ? ? ? ? ? ? ? ? ? ? ? ? "ES segment register."),
>> + ? ? ? ? ? ? ? ? ? ? ? ? paddress (gdbarch, ir.orig_addr));
>> ? ? ? ? ? ? }
>> ? ? ? ? ? else
>> ? ? ? ? ? ? {
>> @@ -4872,7 +4875,7 @@ reswitch:
>> ? ? ? ? ? ?ir.addr -= 2;
>> ? ? ? ? ? ?goto no_support;
>> ? ? ? ? ?}
>> - ? ? ? ret = gdbarch_tdep (gdbarch)->i386_intx80_record (ir.regcache);
>> + ? ? ? ret = gdbarch_tdep (gdbarch)->i386_intx80_record (ir.regcache,
>> ir.addr);
>
> Break up long line.
>
>> ? ? ? ?if (ret)
>> ? ? ? ? ?return ret;
>> ? ? ? }
>> @@ -4974,7 +4977,8 @@ reswitch:
>> ? ? ? ? ? ?ir.addr -= 2;
>> ? ? ? ? ? ?goto no_support;
>> ? ? ? ? ?}
>> - ? ? ? ret = gdbarch_tdep (gdbarch)->i386_sysenter_record (ir.regcache);
>> + ? ? ? ret = gdbarch_tdep (gdbarch)->i386_sysenter_record (ir.regcache,
>> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?ir.addr);
>> ? ? ? ?if (ret)
>> ? ? ? ? ?return ret;
>> ? ? ? }
>> @@ -4999,7 +5003,8 @@ reswitch:
>> ? ? ? ? ? ?ir.addr -= 2;
>> ? ? ? ? ? ?goto no_support;
>> ? ? ? ? ?}
>> - ? ? ? ret = gdbarch_tdep (gdbarch)->i386_syscall_record (ir.regcache);
>> + ? ? ? ret = gdbarch_tdep (gdbarch)->i386_syscall_record (ir.regcache,
>> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ir.addr);
>> ? ? ? ?if (ret)
>> ? ? ? ? ?return ret;
>> ? ? ? }
>> @@ -5135,12 +5140,13 @@ reswitch:
>> ? ? ? ? ? ? ?/* sidt */
>> ? ? ? ? ? ? ?if (ir.override >= 0)
>> ? ? ? ? ? ? ? ?{
>> - ? ? ? ? ? ? ? ? warning (_("Process record ignores the memory "
>> - ? ? ? ? ? ? ? ? ? ? ? ? ? ? "change of instruction at "
>> - ? ? ? ? ? ? ? ? ? ? ? ? ? ? "address %s because it can't get "
>> - ? ? ? ? ? ? ? ? ? ? ? ? ? ? "the value of the segment "
>> - ? ? ? ? ? ? ? ? ? ? ? ? ? ? "register."),
>> - ? ? ? ? ? ? ? ? ? ? ? ? ? paddress (gdbarch, ir.orig_addr));
>> + ? ? ? ? ? ? ? ? ?if (record_debug)
>> + ? ? ? ? ? ? ? ? ? warning (_("Process record ignores the memory "
>> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "change of instruction at "
>> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "address %s because it can't get "
>> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "the value of the segment "
>> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "register."),
>> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? paddress (gdbarch, ir.orig_addr));
>> ? ? ? ? ? ? ? ?}
>> ? ? ? ? ? ? ?else
>> ? ? ? ? ? ? ? ?{
>> --- a/i386-tdep.h
>> +++ b/i386-tdep.h
>> @@ -115,11 +115,11 @@ struct gdbarch_tdep
>> ? ? ?in GDB is not same as I386 instructions. ?*/
>> ? const int *record_regmap;
>> ? /* Parse intx80 args. ?*/
>> - ?int (*i386_intx80_record) (struct regcache *regcache);
>> + ?int (*i386_intx80_record) (struct regcache *regcache, CORE_ADDR addr);
>> ? /* Parse sysenter args. ?*/
>> - ?int (*i386_sysenter_record) (struct regcache *regcache);
>> + ?int (*i386_sysenter_record) (struct regcache *regcache, CORE_ADDR
>> addr);
>> ? /* Parse syscall args. ?*/
>> - ?int (*i386_syscall_record) (struct regcache *regcache);
>> + ?int (*i386_syscall_record) (struct regcache *regcache, CORE_ADDR addr);
>> ?};
>>
>> ?/* Floating-point registers. ?*/
>> --- a/linux-record.c
>> +++ b/linux-record.c
>> @@ -21,6 +21,7 @@
>> ?#include "target.h"
>> ?#include "gdbtypes.h"
>> ?#include "regcache.h"
>> +#include "inferior.h"
>> ?#include "record.h"
>> ?#include "linux-record.h"
>>
>> @@ -222,7 +223,7 @@ record_linux_msghdr (struct regcache *re
>> ? ?Return -1 if something wrong. ?*/
>>
>> ?int
>> -record_linux_system_call (enum gdb_syscall syscall,
>> +record_linux_system_call (enum gdb_syscall syscall, CORE_ADDR addr,
>> ? ? ? ? ? ? ? ? ? ? ? ? ?struct regcache *regcache,
>> ? ? ? ? ? ? ? ? ? ? ? ? ? struct linux_record_tdep *tdep)
>> ?{
>> @@ -242,8 +243,9 @@ record_linux_system_call (enum gdb_sysca
>> ? ? ? ? int q;
>> ? ? ? ? target_terminal_ours ();
>> ? ? ? ? q = yquery (_("The next instruction is syscall exit. ?"
>> - ? ? ? ? ? ? ? ? ? ? ?"It will make the program exit. ?"
>> - ? ? ? ? ? ? ? ? ? ? ?"Do you want to stop the program?"));
>> + ? ? ? ? ? ? ? ? ? ? ?"It will make the thread %s exit. ?"
>> + ? ? ? ? ? ? ? ? ? ? ?"Do you want to stop the program?"),
>> + ? ? ? ? ? ? ? ? ? ?target_pid_to_str (inferior_ptid));
>> ? ? ? ? target_terminal_inferior ();
>> ? ? ? ? if (q)
>> ? ? ? ? ? return 1;
>> @@ -1209,10 +1211,13 @@ record_linux_system_call (enum gdb_sysca
>>
>> ? ? case gdb_sys_fsync:
>> ? ? case gdb_sys_sigreturn:
>> - ? ?case gdb_sys_clone:
>> ? ? case gdb_sys_setdomainname:
>> ? ? ? break;
>>
>> + ? ?case gdb_sys_clone:
>> + ? ? ?record_step = 0;
>> + ? ? ?break;
>> +
>> ? ? case gdb_sys_newuname:
>> ? ? ? regcache_raw_read_unsigned (regcache, tdep->arg1, &tmpulongest);
>> ? ? ? if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest,
>> --- a/linux-record.h
>> +++ b/linux-record.h
>> @@ -534,7 +534,7 @@ enum gdb_syscall {
>>
>> ?/* Record a linux syscall. ?*/
>>
>> -extern int record_linux_system_call (enum gdb_syscall num,
>> +extern int record_linux_system_call (enum gdb_syscall num, CORE_ADDR
>> addr,
>
> Break up long line.
>
>> ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? struct regcache *regcache,
>> ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? struct linux_record_tdep *tdep);
>> ?#endif /* _LINUX_RECORD_H_ */
>
>


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]