From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 30410 invoked by alias); 6 Sep 2009 15:06:28 -0000 Received: (qmail 30368 invoked by uid 22791); 6 Sep 2009 15:06:26 -0000 X-SWARE-Spam-Status: No, hits=-1.4 required=5.0 tests=AWL,BAYES_00,J_CHICKENPOX_28,SARE_MSGID_LONG40,SPF_PASS X-Spam-Check-By: sourceware.org Received: from mail-pz0-f196.google.com (HELO mail-pz0-f196.google.com) (209.85.222.196) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Sun, 06 Sep 2009 15:06:18 +0000 Received: by pzk34 with SMTP id 34so454983pzk.25 for ; Sun, 06 Sep 2009 08:06:16 -0700 (PDT) MIME-Version: 1.0 Received: by 10.143.131.6 with SMTP id i6mr457777wfn.338.1252249576140; Sun, 06 Sep 2009 08:06:16 -0700 (PDT) In-Reply-To: References: <4A999BC3.5020606@vmware.com> <4AA1CFD1.4000502@vmware.com> <200909050814.n858EvHR016392@brahms.sibelius.xs4all.nl> From: Hui Zhu Date: Sun, 06 Sep 2009 15:06:00 -0000 Message-ID: Subject: Re: [RFA/prec] Make i386 handle segment register better To: Mark Kettenis , Michael Snyder Cc: gdb-patches@sourceware.org Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable X-IsSubscribed: yes Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2009-09/txt/msg00144.txt.bz2 On Sun, Sep 6, 2009 at 14:52, Hui Zhu wrote: > Hi guys, > > Sorry I didn't do more test for this patch on amd64 before I check it in. > > But this patch really work not very good in amd64. > > For example: > > Process record: i386_process_record addr =3D 0x7ffff7b13cc9 signal =3D 0 > Process record: add mem addr =3D 0xffffffffffffffa8 len =3D 4 to record l= ist. > Process record: error reading memory at addr =3D 0xffffffffffffffa8 len = =3D 4. > Process record: failed to record execution log. > > Program received signal SIGTRAP, Trace/breakpoint trap. > 0x00007ffff7b13cc9 in pause () from /lib/libc.so.6 > (gdb) disassemble > Dump of assembler code for function pause: > 0x00007ffff7b13c70 : =A0 cmpl =A0 $0x0,0x2c93d1(%rip) =A0 =A0 = =A0 =A0# 0x7ffff7ddd048 > 0x00007ffff7b13c77 : =A0 jne =A0 =A00x7ffff7b13c89 > 0x00007ffff7b13c79 : =A0 mov =A0 =A0$0x22,%eax > 0x00007ffff7b13c7e : =A0syscall > 0x00007ffff7b13c80 : =A0cmp =A0 =A0$0xfffffffffffff001,%rax > 0x00007ffff7b13c86 : =A0jae =A0 =A00x7ffff7b13cbd > 0x00007ffff7b13c88 : =A0retq > 0x00007ffff7b13c89 : =A0sub =A0 =A0$0x18,%rsp > 0x00007ffff7b13c8d : =A0callq =A00x7ffff7b60770 > 0x00007ffff7b13c92 : =A0mov =A0 =A0%rax,(%rsp) > 0x00007ffff7b13c96 : =A0mov =A0 =A0$0x22,%eax > 0x00007ffff7b13c9b : =A0syscall > 0x00007ffff7b13c9d : =A0mov =A0 =A0(%rsp),%rdi > 0x00007ffff7b13ca1 : =A0mov =A0 =A0%rax,0x8(%rsp) > 0x00007ffff7b13ca6 : =A0callq =A00x7ffff7b60740 > 0x00007ffff7b13cab : =A0mov =A0 =A00x8(%rsp),%rax > 0x00007ffff7b13cb0 : =A0add =A0 =A0$0x18,%rsp > 0x00007ffff7b13cb4 : =A0cmp =A0 =A0$0xfffffffffffff001,%rax > 0x00007ffff7b13cba : =A0jae =A0 =A00x7ffff7b13cbd > 0x00007ffff7b13cbc : =A0retq > 0x00007ffff7b13cbd : =A0mov =A0 =A00x2c42cc(%rip),%rcx =A0 =A0 = =A0 =A0# > 0x7ffff7dd7f90 > 0x00007ffff7b13cc4 : =A0xor =A0 =A0%edx,%edx > 0x00007ffff7b13cc6 : =A0sub =A0 =A0%rax,%rdx > 0x00007ffff7b13cc9 : =A0mov =A0 =A0%edx,%fs:(%rcx) > 0x00007ffff7b13ccc : =A0or =A0 =A0 $0xffffffffffffffff,%rax > 0x00007ffff7b13cd0 : =A0jmp =A0 =A00x7ffff7b13cbc > End of assembler dump. > (gdb) info reg > rax =A0 =A0 =A0 =A0 =A0 =A00xfffffffffffffffc =A0 =A0 =A0 -4 > rbx =A0 =A0 =A0 =A0 =A0 =A00x4007c0 4196288 > rcx =A0 =A0 =A0 =A0 =A0 =A00xffffffffffffffa8 =A0 =A0 =A0 -88 > rdx =A0 =A0 =A0 =A0 =A0 =A00x4 =A0 =A0 =A04 > rsi =A0 =A0 =A0 =A0 =A0 =A00x0 =A0 =A0 =A00 > rdi =A0 =A0 =A0 =A0 =A0 =A00x1 =A0 =A0 =A01 > rbp =A0 =A0 =A0 =A0 =A0 =A00x7fffffffe2e0 =A0 0x7fffffffe2e0 > rsp =A0 =A0 =A0 =A0 =A0 =A00x7fffffffe2b8 =A0 0x7fffffffe2b8 > r8 =A0 =A0 =A0 =A0 =A0 =A0 0x7fffffffe210 =A0 140737488347664 > r9 =A0 =A0 =A0 =A0 =A0 =A0 0x7fffffffe170 =A0 140737488347504 > r10 =A0 =A0 =A0 =A0 =A0 =A00x7fffffffe040 =A0 140737488347200 > r11 =A0 =A0 =A0 =A0 =A0 =A00x346 =A0 =A0838 > r12 =A0 =A0 =A0 =A0 =A0 =A00x400640 4195904 > r13 =A0 =A0 =A0 =A0 =A0 =A00x7fffffffe3b0 =A0 140737488348080 > r14 =A0 =A0 =A0 =A0 =A0 =A00x0 =A0 =A0 =A00 > r15 =A0 =A0 =A0 =A0 =A0 =A00x0 =A0 =A0 =A00 > rip =A0 =A0 =A0 =A0 =A0 =A00x7ffff7b13cc9 =A0 0x7ffff7b13cc9 > eflags =A0 =A0 =A0 =A0 0x313 =A0 =A0[ CF AF TF IF ] > cs =A0 =A0 =A0 =A0 =A0 =A0 0x33 =A0 =A0 51 > ss =A0 =A0 =A0 =A0 =A0 =A0 0x2b =A0 =A0 43 > ds =A0 =A0 =A0 =A0 =A0 =A0 0x0 =A0 =A0 =A00 > es =A0 =A0 =A0 =A0 =A0 =A0 0x0 =A0 =A0 =A00 > fs =A0 =A0 =A0 =A0 =A0 =A0 0x0 =A0 =A0 =A00 > gs =A0 =A0 =A0 =A0 =A0 =A0 0x0 =A0 =A0 =A00 > fctrl =A0 =A0 =A0 =A0 =A00x37f =A0 =A0895 > fstat =A0 =A0 =A0 =A0 =A00x0 =A0 =A0 =A00 > ftag =A0 =A0 =A0 =A0 =A0 0xffff =A0 65535 > fiseg =A0 =A0 =A0 =A0 =A00x0 =A0 =A0 =A00 > fioff =A0 =A0 =A0 =A0 =A00x0 =A0 =A0 =A00 > foseg =A0 =A0 =A0 =A0 =A00x0 =A0 =A0 =A00 > fooff =A0 =A0 =A0 =A0 =A00x0 =A0 =A0 =A00 > fop =A0 =A0 =A0 =A0 =A0 =A00x0 =A0 =A0 =A00 > mxcsr =A0 =A0 =A0 =A0 =A00x1f80 =A0 [ IM DM ZM OM UM PM ] > (gdb) record stop > Delete recorded log and stop recording?(y or n) y > Process record: record_close > (gdb) set disassemble-next-line on > (gdb) si > 0x00007ffff7b13ccc in pause () from /lib/libc.so.6 > 0x00007ffff7b13ccc : =A0 48 83 c8 ff =A0 =A0or =A0 =A0 $0xfffff= fffffffffff,%rax > (gdb) info registers > rax =A0 =A0 =A0 =A0 =A0 =A00xfffffffffffffffc =A0 =A0 =A0 -4 > rbx =A0 =A0 =A0 =A0 =A0 =A00x4007c0 4196288 > rcx =A0 =A0 =A0 =A0 =A0 =A00xffffffffffffffa8 =A0 =A0 =A0 -88 > rdx =A0 =A0 =A0 =A0 =A0 =A00x4 =A0 =A0 =A04 > rsi =A0 =A0 =A0 =A0 =A0 =A00x0 =A0 =A0 =A00 > rdi =A0 =A0 =A0 =A0 =A0 =A00x1 =A0 =A0 =A01 > rbp =A0 =A0 =A0 =A0 =A0 =A00x7fffffffe2e0 =A0 0x7fffffffe2e0 > rsp =A0 =A0 =A0 =A0 =A0 =A00x7fffffffe2b8 =A0 0x7fffffffe2b8 > r8 =A0 =A0 =A0 =A0 =A0 =A0 0x7fffffffe210 =A0 140737488347664 > r9 =A0 =A0 =A0 =A0 =A0 =A0 0x7fffffffe170 =A0 140737488347504 > r10 =A0 =A0 =A0 =A0 =A0 =A00x7fffffffe040 =A0 140737488347200 > r11 =A0 =A0 =A0 =A0 =A0 =A00x346 =A0 =A0838 > r12 =A0 =A0 =A0 =A0 =A0 =A00x400640 4195904 > r13 =A0 =A0 =A0 =A0 =A0 =A00x7fffffffe3b0 =A0 140737488348080 > r14 =A0 =A0 =A0 =A0 =A0 =A00x0 =A0 =A0 =A00 > r15 =A0 =A0 =A0 =A0 =A0 =A00x0 =A0 =A0 =A00 > rip =A0 =A0 =A0 =A0 =A0 =A00x7ffff7b13ccc =A0 0x7ffff7b13ccc > eflags =A0 =A0 =A0 =A0 0x313 =A0 =A0[ CF AF TF IF ] > cs =A0 =A0 =A0 =A0 =A0 =A0 0x33 =A0 =A0 51 > ss =A0 =A0 =A0 =A0 =A0 =A0 0x2b =A0 =A0 43 > ds =A0 =A0 =A0 =A0 =A0 =A0 0x0 =A0 =A0 =A00 > es =A0 =A0 =A0 =A0 =A0 =A0 0x0 =A0 =A0 =A00 > fs =A0 =A0 =A0 =A0 =A0 =A0 0x0 =A0 =A0 =A00 > gs =A0 =A0 =A0 =A0 =A0 =A0 0x0 =A0 =A0 =A00 > fctrl =A0 =A0 =A0 =A0 =A00x37f =A0 =A0895 > fstat =A0 =A0 =A0 =A0 =A00x0 =A0 =A0 =A00 > ftag =A0 =A0 =A0 =A0 =A0 0xffff =A0 65535 > fiseg =A0 =A0 =A0 =A0 =A00x0 =A0 =A0 =A00 > fioff =A0 =A0 =A0 =A0 =A00x0 =A0 =A0 =A00 > foseg =A0 =A0 =A0 =A0 =A00x0 =A0 =A0 =A00 > fooff =A0 =A0 =A0 =A0 =A00x0 =A0 =A0 =A00 > fop =A0 =A0 =A0 =A0 =A0 =A00x0 =A0 =A0 =A00 > mxcsr =A0 =A0 =A0 =A0 =A00x1f80 =A0 [ IM DM ZM OM UM PM ] > (gdb) x 0x7ffff7dd7f90 > 0x7ffff7dd7f90: 0xffffffa8 > (gdb) x 0xffffffa8 > 0xffffffa8: =A0 =A0 Cannot access memory at address 0xffffffa8 > (gdb) x 0xffffffffffffffa8 > 0xffffffffffffffa8: =A0 =A0 Cannot access memory at address 0xfffffffffff= fffa8 > (gdb) > > > The fs is same with gs, but "mov =A0 =A0%edx,%fs:(%rcx)" is not same with > "mov =A0 =A0%edx,(%rcx)". > > I think remove this patch from gdb-cvs-head before 7.0 branch =A0and > make the segment reg clear is better. > > What =A0do you think about it? > > Thanks, > Hui > I make a patch for it. Please help me review it. Thanks, Hui 2009-09-06 Hui Zhu * i386-tdep.c (i386_record_check_override): Deleted. (i386_record_lea_modrm): Ditto. (i386_process_record): Ditto. --- i386-tdep.c | 37 +++++++++++-------------------------- 1 file changed, 11 insertions(+), 26 deletions(-) --- a/i386-tdep.c +++ b/i386-tdep.c @@ -3148,26 +3148,6 @@ no_rm: return 0; } -static int -i386_record_check_override (struct i386_record_s *irp) -{ - if (irp->override >=3D 0 && irp->override !=3D X86_RECORD_DS_REGNUM) - { - ULONGEST orv, ds; - - regcache_raw_read_unsigned (irp->regcache, - irp->regmap[irp->override], - &orv); - regcache_raw_read_unsigned (irp->regcache, - irp->regmap[X86_RECORD_DS_REGNUM], - &ds); - if (orv !=3D ds) - return 1; - } - - return 0; -} - /* Record the value of the memory that willbe changed in current instructi= on to "record_arch_list". Return -1 if something wrong. */ @@ -3178,7 +3158,7 @@ i386_record_lea_modrm (struct i386_recor struct gdbarch *gdbarch =3D irp->gdbarch; uint64_t addr; - if (i386_record_check_override (irp)) + if (irp->override >=3D 0) { warning (_("Process record ignores the memory change " "of instruction at address %s because it " @@ -4060,7 +4040,7 @@ reswitch: /* mov EAX */ case 0xa2: case 0xa3: - if (i386_record_check_override (&ir)) + if (ir.override >=3D 0) { warning (_("Process record ignores the memory change " "of instruction at address 0x%s because " @@ -4478,8 +4458,13 @@ reswitch: ir.regmap[X86_RECORD_REDI_REGNUM], &tmpulongest); - ir.override =3D X86_RECORD_ES_REGNUM; - if (ir.aflag && i386_record_check_override (&ir)) + regcache_raw_read_unsigned (ir.regcache, + ir.regmap[X86_RECORD_ES_REGNUM], + &es); + regcache_raw_read_unsigned (ir.regcache, + ir.regmap[X86_RECORD_DS_REGNUM], + &ds); + if (ir.aflag && (es !=3D ds)) { /* addr +=3D ((uint32_t) read_register (I386_ES_REGNUM)) << = 4; */ warning (_("Process record ignores the memory " @@ -5103,7 +5088,7 @@ reswitch: opcode =3D opcode << 8 | ir.modrm; goto no_support; } - if (i386_record_check_override (&ir)) + if (ir.override >=3D 0) { warning (_("Process record ignores the memory " "change of instruction at " @@ -5154,7 +5139,7 @@ reswitch: else { /* sidt */ - if (i386_record_check_override (&ir)) + if (ir.override >=3D 0) { warning (_("Process record ignores the memory " "change of instruction at "