From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 7010 invoked by alias); 18 Mar 2009 13:12:03 -0000 Received: (qmail 4370 invoked by uid 22791); 18 Mar 2009 13:11:52 -0000 X-SWARE-Spam-Status: No, hits=-0.3 required=5.0 tests=AWL,BAYES_50,SARE_MSGID_LONG40,SPF_PASS X-Spam-Check-By: sourceware.org Received: from ti-out-0910.google.com (HELO ti-out-0910.google.com) (209.85.142.185) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Wed, 18 Mar 2009 13:11:42 +0000 Received: by ti-out-0910.google.com with SMTP id a1so28954tib.12 for ; Wed, 18 Mar 2009 06:11:38 -0700 (PDT) MIME-Version: 1.0 Received: by 10.110.90.9 with SMTP id n9mr1961328tib.25.1237381897801; Wed, 18 Mar 2009 06:11:37 -0700 (PDT) In-Reply-To: <200903092034.57367.pedro@codesourcery.com> References: <200903092034.57367.pedro@codesourcery.com> Date: Wed, 18 Mar 2009 13:14:00 -0000 Message-ID: Subject: Re: [RFA] Submit process record and replay third time, 3/9 From: teawater To: Pedro Alves Cc: gdb-patches@sourceware.org, Marc Khouzam , Michael Snyder Content-Type: multipart/mixed; boundary=0016e6511bd0785e1f0465646c63 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-03/txt/msg00375.txt.bz2 --0016e6511bd0785e1f0465646c63 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable Content-length: 66017 Hi Pedro, I make a new patch according to your mail. Please help me review it. Thanks, Hui On Tue, Mar 10, 2009 at 04:34, Pedro Alves wrote: > On Monday 23 February 2009 09:20:13, teawater wrote: >> This is the new version patches that follow cvs-head. > > Thanks. > >> >> =A0gdb/Makefile.in | =A0 =A04 >> =A0gdb/record.c =A0 =A0| 1283 ++++++++++++++++++++++++++++++++++++++++++= ++++++++++++++ >> =A0gdb/record.h =A0 =A0| =A0 87 +++ >> =A03 files changed, 1372 insertions(+), 2 deletions(-) >> >> Index: src/gdb/Makefile.in >> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D >> --- src.orig/gdb/Makefile.in =A02009-02-21 15:53:27.000000000 +0000 >> +++ src/gdb/Makefile.in =A0 =A0 =A0 2009-02-28 20:23:20.000000000 +0000 >> @@ -662,7 +662,7 @@ SFILES =3D ada-exp.y ada-lang.c ada-typepr >> =A0 =A0 =A0 valarith.c valops.c valprint.c value.c varobj.c vec.c \ >> =A0 =A0 =A0 wrapper.c \ >> =A0 =A0 =A0 xml-tdesc.c xml-support.c \ >> - =A0 =A0 inferior.c >> + =A0 =A0 inferior.c record.c >> >> =A0LINTFILES =3D $(SFILES) $(YYFILES) $(CONFIG_SRCS) init.c >> >> @@ -813,7 +813,7 @@ COMMON_OBS =3D $(DEPFILES) $(CONFIG_OBS) $ >> =A0 =A0 =A0 solib.o solib-null.o \ >> =A0 =A0 =A0 prologue-value.o memory-map.o xml-support.o \ >> =A0 =A0 =A0 target-descriptions.o target-memory.o xml-tdesc.o xml-builti= n.o \ >> - =A0 =A0 inferior.o osdata.o >> + =A0 =A0 inferior.o osdata.o record.o >> >> =A0TSOBS =3D inflow.o >> >> Index: src/gdb/record.c >> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D >> --- /dev/null 1970-01-01 00:00:00.000000000 +0000 >> +++ src/gdb/record.c =A02009-02-28 20:23:20.000000000 +0000 >> @@ -0,0 +1,1283 @@ >> +/* Process record and replay target for GDB, the GNU debugger. >> + >> + =A0 Copyright (C) 2008 Free Software Foundation, Inc. > > Oops, you'll have to update this. > >> + >> + =A0 This file is part of GDB. >> + >> + =A0 This program is free software; you can redistribute it and/or modi= fy >> + =A0 it under the terms of the GNU General Public License as published = by >> + =A0 the Free Software Foundation; either version 3 of the License, or >> + =A0 (at your option) any later version. >> + >> + =A0 This program is distributed in the hope that it will be useful, >> + =A0 but WITHOUT ANY WARRANTY; without even the implied warranty of >> + =A0 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. =A0See the >> + =A0 GNU General Public License for more details. >> + >> + =A0 You should have received a copy of the GNU General Public License >> + =A0 along with this program. =A0If not, see . =A0*/ >> + >> +#include "defs.h" >> +#include "target.h" >> +#include "gdbcmd.h" >> +#include "regcache.h" >> +#include "inferior.h" >> +#include "gdbthread.h" >> +#include "event-top.h" >> +#include "annotate.h" >> +#include "observer.h" >> +#include "record.h" > > Why did you need annotate.h? =A0Can you check which headers are > really needed here? > >> + >> +#include >> + >> +#define DEFAULT_RECORD_INSN_MAX_NUM =A0200000 >> + >> +int record_debug =3D 0; >> + >> +record_t record_first; >> +record_t *record_list =3D &record_first; >> +record_t *record_arch_list_head =3D NULL; >> +record_t *record_arch_list_tail =3D NULL; >> +struct regcache *record_regcache =3D NULL; >> + >> +/* 1 ask user. 0 auto delete the last record_t. =A0*/ > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 ^ double-space please. > >> +static int record_stop_at_limit =3D 1; >> +static int record_insn_max_num =3D DEFAULT_RECORD_INSN_MAX_NUM; >> +static int record_insn_num =3D 0; >> + >> +struct target_ops record_ops; >> +static int record_resume_step =3D 0; >> +static enum target_signal record_resume_siggnal; >> +static int record_get_sig =3D 0; >> +static sigset_t record_maskall; >> +static int record_gdb_operation_disable =3D 0; >> +int record_will_store_registers =3D 0; > > You've got a bunch of magic variables here. =A0Could you > add some comments explaining what they're for? > >> + >> +extern struct bp_location *bp_location_chain; > > This is not right. =A0You're accessing a breakpoints.c > internal implementation detail. =A0We need to come up with interfaces > to replace this hack. > >> + >> +/* The beneath function pointers. =A0*/ >> +static struct target_ops *record_beneath_to_resume_ops =3D NULL; >> +static void (*record_beneath_to_resume) (struct target_ops *, ptid_t, i= nt, >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 =A0 enum target_signal) =3D NULL; >> +static struct target_ops *record_beneath_to_wait_ops =3D NULL; >> +static ptid_t (*record_beneath_to_wait) (struct target_ops *, ptid_t, >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0struct target_waitstatus *) =3D NULL; >> +static struct target_ops *record_beneath_to_store_registers_ops =3D NUL= L; >> +static void (*record_beneath_to_store_registers) (struct target_ops *, >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0struct regcache *, >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 =A0 =A0 =A0 =A0 int regno) =3D NULL; >> +static struct target_ops *record_beneath_to_xfer_partial_ops =3D NULL; >> +static LONGEST (*record_beneath_to_xfer_partial) (struct target_ops * o= ps, >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 =A0 =A0 =A0 =A0 enum target_object object, >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 =A0 =A0 =A0 =A0 const char *annex, >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 =A0 =A0 =A0 =A0 gdb_byte * readbuf, >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 =A0 =A0 =A0 =A0 const gdb_byte * writebuf, >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 =A0 =A0 =A0 =A0 ULONGEST offset, >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 =A0 =A0 =A0 =A0 LONGEST len) =3D NULL; >> +static int (*record_beneath_to_insert_breakpoint) (struct bp_target_inf= o *) =3D >> + =A0NULL; >> +static int (*record_beneath_to_remove_breakpoint) (struct bp_target_inf= o *) =3D >> + =A0NULL; > > I can't say I'm happy with this mechanism yet, but it is much > better than the previous version of making target.c aware of record.c's c= allbacks. > > >> + >> +static void >> +record_list_release (record_t * rec) > > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0^ no s= pace after *, please. > >> +{ >> + =A0record_t *tmp; >> + >> + =A0if (!rec) >> + =A0 =A0return; >> + >> + =A0while (rec->next) >> + =A0 =A0{ >> + =A0 =A0 =A0rec =3D rec->next; >> + =A0 =A0} >> + >> + =A0while (rec->prev) >> + =A0 =A0{ >> + =A0 =A0 =A0tmp =3D rec; >> + =A0 =A0 =A0rec =3D rec->prev; >> + =A0 =A0 =A0if (tmp->type =3D=3D record_reg) >> + =A0 =A0 xfree (tmp->u.reg.val); >> + =A0 =A0 =A0else if (tmp->type =3D=3D record_mem) >> + =A0 =A0 xfree (tmp->u.mem.val); >> + =A0 =A0 =A0xfree (tmp); >> + =A0 =A0} >> + >> + =A0if (rec !=3D &record_first) >> + =A0 =A0xfree (rec); >> +} >> + >> +static void >> +record_list_release_next (void) >> +{ >> + =A0record_t *rec =3D record_list; >> + =A0record_t *tmp =3D rec->next; >> + =A0rec->next =3D NULL; >> + =A0while (tmp) >> + =A0 =A0{ >> + =A0 =A0 =A0rec =3D tmp->next; >> + =A0 =A0 =A0if (tmp->type =3D=3D record_reg) >> + =A0 =A0 record_insn_num--; >> + =A0 =A0 =A0else if (tmp->type =3D=3D record_reg) >> + =A0 =A0 xfree (tmp->u.reg.val); >> + =A0 =A0 =A0else if (tmp->type =3D=3D record_mem) >> + =A0 =A0 xfree (tmp->u.mem.val); >> + =A0 =A0 =A0xfree (tmp); >> + =A0 =A0 =A0tmp =3D rec; >> + =A0 =A0} >> +} >> + >> +static void >> +record_list_release_first (void) >> +{ >> + =A0record_t *tmp =3D NULL; >> + =A0enum record_type type; >> + >> + =A0if (!record_first.next) >> + =A0 =A0return; >> + >> + =A0while (1) >> + =A0 =A0{ >> + =A0 =A0 =A0type =3D record_first.next->type; >> + >> + =A0 =A0 =A0if (type =3D=3D record_reg) >> + =A0 =A0 xfree (record_first.next->u.reg.val); >> + =A0 =A0 =A0else if (type =3D=3D record_mem) >> + =A0 =A0 xfree (record_first.next->u.mem.val); >> + =A0 =A0 =A0tmp =3D record_first.next; >> + =A0 =A0 =A0record_first.next =3D tmp->next; >> + =A0 =A0 =A0xfree (tmp); >> + >> + =A0 =A0 =A0if (!record_first.next) >> + =A0 =A0 { >> + =A0 =A0 =A0 gdb_assert (record_insn_num =3D=3D 1); >> + =A0 =A0 =A0 break; >> + =A0 =A0 } >> + >> + =A0 =A0 =A0record_first.next->prev =3D &record_first; >> + >> + =A0 =A0 =A0if (type =3D=3D record_end) >> + =A0 =A0 break; >> + =A0 =A0} >> + >> + =A0record_insn_num--; >> +} >> + >> +/* Add a record_t to record_arch_list. =A0*/ >> +static void >> +record_arch_list_add (record_t * rec) >> +{ >> + =A0if (record_debug > 1) >> + =A0 =A0fprintf_unfiltered (gdb_stdlog, >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 "Process record: record_arch_l= ist_add %s.\n", >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 host_address_to_string (rec)); >> + >> + =A0if (record_arch_list_tail) >> + =A0 =A0{ >> + =A0 =A0 =A0record_arch_list_tail->next =3D rec; >> + =A0 =A0 =A0rec->prev =3D record_arch_list_tail; >> + =A0 =A0 =A0record_arch_list_tail =3D rec; >> + =A0 =A0} >> + =A0else >> + =A0 =A0{ >> + =A0 =A0 =A0record_arch_list_head =3D rec; >> + =A0 =A0 =A0record_arch_list_tail =3D rec; >> + =A0 =A0} >> +} >> + >> +/* Record the value of a register ("num") to record_arch_list. =A0*/ > > When we want to mention the value of a parameter, we mentions it in > uppercase, like so: > > /* Record the value of register NUM to record_arch_list. =A0*/ > > Also, there should be an empty line between the comment and > the function itself. =A0Here and elsewhere. > >> +int >> +record_arch_list_add_reg (int num) >> +{ >> + =A0record_t *rec; >> + >> + =A0if (record_debug > 1) >> + =A0 =A0fprintf_unfiltered (gdb_stdlog, >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 "Process record: add register = num =3D %d to " >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 "record list.\n", >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 num); >> + >> + =A0rec =3D (record_t *) xmalloc (sizeof (record_t)); >> + =A0rec->u.reg.val =3D (gdb_byte *) xmalloc (MAX_REGISTER_SIZE); >> + =A0rec->prev =3D NULL; >> + =A0rec->next =3D NULL; >> + =A0rec->type =3D record_reg; >> + =A0rec->u.reg.num =3D num; >> + >> + =A0regcache_raw_read (record_regcache, num, rec->u.reg.val); >> + >> + =A0record_arch_list_add (rec); >> + >> + =A0return 0; >> +} >> + >> +/* Record the value of a region of memory whose address is "addr" and >> + =A0 length is "len" to record_arch_list. =A0*/ > > /* Record the value of a region of memory whose address is ADDR and > =A0 length is LEN to record_arch_list. =A0*/ > >> + >> +int >> +record_arch_list_add_mem (CORE_ADDR addr, int len) >> +{ >> + =A0record_t *rec; >> + >> + =A0if (record_debug > 1) >> + =A0 =A0fprintf_unfiltered (gdb_stdlog, >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 "Process record: add mem addr = =3D 0x%s len =3D %d to " >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 "record list.\n", >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 paddr_nz (addr), len); >> + > >> + =A0if (!addr) >> + =A0 =A0return 0; > > Why is this check for addr =3D=3D 0 necessary here? > >> + >> + =A0rec =3D (record_t *) xmalloc (sizeof (record_t)); >> + =A0rec->u.mem.val =3D (gdb_byte *) xmalloc (len); >> + =A0rec->prev =3D NULL; >> + =A0rec->next =3D NULL; >> + =A0rec->type =3D record_mem; >> + =A0rec->u.mem.addr =3D addr; >> + =A0rec->u.mem.len =3D len; >> + >> + =A0if (target_read_memory (addr, rec->u.mem.val, len)) >> + =A0 =A0{ >> + =A0 =A0 =A0if (record_debug) >> + =A0 =A0 fprintf_unfiltered (gdb_stdlog, >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 "Process record: error= reading memory at " >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 "addr =3D 0x%s len =3D= %d.\n", >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 paddr_nz (addr), len); >> + =A0 =A0 =A0xfree (rec->u.mem.val); >> + =A0 =A0 =A0xfree (rec); >> + =A0 =A0 =A0return -1; >> + =A0 =A0} >> + >> + =A0record_arch_list_add (rec); >> + >> + =A0return 0; >> +} >> + >> +/* Add a record_end type record_t to record_arch_list. =A0*/ >> +int >> +record_arch_list_add_end (int need_dasm) >> +{ >> + =A0record_t *rec; >> + >> + =A0if (record_debug > 1) >> + =A0 =A0fprintf_unfiltered (gdb_stdlog, >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 "Process record: add end need_= dasm =3D %d to " >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 "arch list.\n", >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 need_dasm); >> + >> + =A0rec =3D (record_t *) xmalloc (sizeof (record_t)); >> + =A0rec->prev =3D NULL; >> + =A0rec->next =3D NULL; >> + =A0rec->type =3D record_end; >> + >> + =A0rec->u.need_dasm =3D need_dasm; >> + >> + =A0record_arch_list_add (rec); >> + >> + =A0return 0; >> +} >> + >> +static void >> +record_check_insn_num (int set_terminal) >> +{ >> + =A0if (record_insn_max_num) >> + =A0 =A0{ >> + =A0 =A0 =A0gdb_assert (record_insn_num <=3D record_insn_max_num); >> + =A0 =A0 =A0if (record_insn_num =3D=3D record_insn_max_num) >> + =A0 =A0 { >> + =A0 =A0 =A0 /* Ask user what to do. =A0*/ >> + =A0 =A0 =A0 if (record_stop_at_limit) >> + =A0 =A0 =A0 =A0 { >> + =A0 =A0 =A0 =A0 =A0 int q; >> + =A0 =A0 =A0 =A0 =A0 if (set_terminal) >> + =A0 =A0 =A0 =A0 =A0 =A0 target_terminal_ours (); >> + =A0 =A0 =A0 =A0 =A0 q =3D yquery (_("Do you want to auto delete previo= us execution " >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 "log entries when reco= rd/replay buffer becomes " >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 "full (record-stop-at-= limit)?")); >> + =A0 =A0 =A0 =A0 =A0 if (set_terminal) >> + =A0 =A0 =A0 =A0 =A0 =A0 target_terminal_inferior (); >> + =A0 =A0 =A0 =A0 =A0 if (q) >> + =A0 =A0 =A0 =A0 =A0 =A0 record_stop_at_limit =3D 0; >> + =A0 =A0 =A0 =A0 =A0 else >> + =A0 =A0 =A0 =A0 =A0 =A0 error (_("Process record: inferior program sto= pped.")); >> + =A0 =A0 =A0 =A0 } >> + =A0 =A0 } >> + =A0 =A0} >> +} >> + >> +static void >> +record_normal_stop (void) >> +{ >> + =A0finish_thread_state (minus_one_ptid); >> + >> + =A0if (!breakpoints_always_inserted_mode () && target_has_execution) >> + =A0 =A0remove_breakpoints (); >> + >> + =A0target_terminal_ours (); >> + >> + =A0if (target_has_stack && !stop_stack_dummy) >> + =A0 =A0set_current_sal_from_frame (get_current_frame (), 1); >> + >> + =A0select_frame (get_current_frame ()); >> + >> + =A0annotate_stopped (); >> + =A0if (!suppress_stop_observer) >> + =A0 =A0{ >> + =A0 =A0 =A0if (!ptid_equal (inferior_ptid, null_ptid)) >> + =A0 =A0 observer_notify_normal_stop (inferior_thread ()->stop_bpstat, = 0); >> + =A0 =A0 =A0else >> + =A0 =A0 observer_notify_normal_stop (NULL, 0); >> + =A0 =A0} >> +} > > Nope sorry, this is worse than before. =A0When I asked to not call > normal_stop, I didn't mean that you should inline chunks of > it here. =A0This is papering over a different problem. =A0Why > is it that record.c needs to do this, while other targets do not? > If we need to do something like this, it should be needed by all > targets that can throw from target_wait (which, is documented > as something you shouldn't do anyway). =A0Actually, do you still need > any of this in current head? > >> + >> +/* Before inferior step (when GDB record the running message, inferior >> + =A0 only can step), GDB will call this function to record the values to >> + =A0 record_list. =A0This function will call gdbarch_process_record to >> + =A0 record the running message of inferior and set them to >> + =A0 record_arch_list, and add it to record_list. =A0*/ >> + >> +static void >> +record_message_cleanups (void *ignore) >> +{ >> + =A0record_list_release (record_arch_list_tail); >> + =A0set_executing (inferior_ptid, 0); >> + =A0record_normal_stop (); >> +} > > Same as above. =A0This isn't a record.c problem. > >> + >> +void >> +record_message (struct gdbarch *gdbarch) >> +{ >> + =A0int ret; >> + =A0struct cleanup *old_cleanups =3D make_cleanup (record_message_clean= ups, 0); >> + >> + =A0record_arch_list_head =3D NULL; >> + =A0record_arch_list_tail =3D NULL; >> + >> + =A0/* Check record_insn_num. =A0*/ >> + =A0record_check_insn_num (1); >> + >> + =A0record_regcache =3D get_current_regcache (); >> + >> + =A0ret =3D gdbarch_process_record (gdbarch, >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 regcache_read_= pc (record_regcache)); >> + =A0if (ret > 0) >> + =A0 =A0error (_("Process record: inferior program stopped.")); >> + =A0if (ret < 0) >> + =A0 =A0error (_("Process record: failed to record execution log.")); >> + >> + =A0discard_cleanups (old_cleanups); >> + >> + =A0record_list->next =3D record_arch_list_head; >> + =A0record_arch_list_head->prev =3D record_list; >> + =A0record_list =3D record_arch_list_tail; >> + >> + =A0if (record_insn_num =3D=3D record_insn_max_num && record_insn_max_n= um) >> + =A0 =A0record_list_release_first (); >> + =A0else >> + =A0 =A0record_insn_num++; >> +} >> + > > >> +/* Things to clean up if we error or QUIT out of function that set >> + =A0 record_gdb_operation_disable (ie. command that caused target_wait = to >> + =A0 be called). =A0*/ >> +static void >> +record_gdb_operation_disable_cleanups (void *ignore) >> +{ >> + =A0record_gdb_operation_disable =3D 0; >> +} >> + >> +struct cleanup * >> +record_gdb_operation_disable_set (void) >> +{ >> + =A0struct cleanup *old_cleanups =3D >> + =A0 =A0make_cleanup (record_gdb_operation_disable_cleanups, 0); >> + =A0record_gdb_operation_disable =3D 1; >> + >> + =A0return old_cleanups; >> +} > > This is make_cleanup_restore_integer. > >> + >> +static void >> +record_open (char *name, int from_tty) >> +{ >> + =A0struct target_ops *t; >> + >> + =A0if (record_debug) >> + =A0 =A0fprintf_unfiltered (gdb_stdlog, "Process record: record_open\n"= ); >> + >> + =A0/* check exec */ > > and core. > >> + =A0if (!target_has_execution) >> + =A0 =A0error (_("Process record: the program is not being run.")); >> + =A0if (non_stop) >> + =A0 =A0error (_("Process record target can't debug inferior in non-sto= p mode " >> + =A0 =A0 =A0 =A0 =A0"(non-stop).")); >> + =A0if (target_async_permitted) >> + =A0 =A0error (_("Process record target can't debug inferior in asynchr= onous " >> + =A0 =A0 =A0 =A0 =A0"mode (target-async).")); >> + >> + =A0if (!gdbarch_process_record_p (current_gdbarch)) >> + =A0 =A0error (_("Process record: the current architecture doesn't supp= ort " >> + =A0 =A0 =A0 =A0 =A0"record function.")); >> + >> + =A0/* Check if record target is already running. =A0*/ >> + =A0if (TARGET_IS_PROCESS_RECORD) >> + =A0 =A0{ >> + =A0 =A0 =A0if (!nquery >> + =A0 =A0 =A0 (_("Process record target already running, do you want to = delete " >> + =A0 =A0 =A0 =A0 =A0"the old record log?"))) >> + =A0 =A0 return; >> + =A0 =A0} >> + >> + =A0/* Set the beneath function pointers. =A0*/ >> + =A0for (t =3D current_target.beneath; t !=3D NULL; t =3D t->beneath) >> + =A0 =A0{ >> + =A0 =A0 =A0if (!record_beneath_to_resume) >> + =A0 =A0 =A0 =A0{ >> + =A0 =A0 =A0 record_beneath_to_resume =3D t->to_resume; >> + =A0 =A0 =A0 record_beneath_to_resume_ops =3D t; >> + =A0 =A0 =A0 =A0} >> + =A0 =A0 =A0if (!record_beneath_to_wait) >> + =A0 =A0 =A0 =A0{ >> + =A0 =A0 =A0 record_beneath_to_wait =3D t->to_wait; >> + =A0 =A0 =A0 record_beneath_to_wait_ops =3D t; >> + =A0 =A0 =A0 =A0} >> + =A0 =A0 =A0if (!record_beneath_to_store_registers) >> + =A0 =A0 =A0 =A0{ >> + =A0 =A0 =A0 record_beneath_to_store_registers =3D t->to_store_register= s; >> + =A0 =A0 =A0 record_beneath_to_store_registers_ops =3D t; >> + =A0 =A0 =A0 =A0} >> + =A0 =A0 =A0if (!record_beneath_to_xfer_partial) >> + =A0 =A0 =A0 =A0{ >> + =A0 =A0 =A0 record_beneath_to_xfer_partial =3D t->to_xfer_partial; >> + =A0 =A0 =A0 record_beneath_to_xfer_partial_ops =3D t; >> + =A0 =A0 =A0 =A0} >> + =A0 =A0 =A0if (!record_beneath_to_insert_breakpoint) >> + =A0 =A0 record_beneath_to_insert_breakpoint =3D t->to_insert_breakpoin= t; >> + =A0 =A0 =A0if (!record_beneath_to_remove_breakpoint) >> + =A0 =A0 record_beneath_to_remove_breakpoint =3D t->to_remove_breakpoin= t; >> + =A0 =A0} >> + =A0if (!record_beneath_to_resume) >> + =A0 =A0error (_("Process record can't get to_resume.")); >> + =A0if (!record_beneath_to_wait) >> + =A0 =A0error (_("Process record can't get to_wait.")); >> + =A0if (!record_beneath_to_store_registers) >> + =A0 =A0error (_("Process record can't get to_store_registers.")); >> + =A0if (!record_beneath_to_xfer_partial) >> + =A0 =A0error (_("Process record can't get to_xfer_partial.")); >> + =A0if (!record_beneath_to_insert_breakpoint) >> + =A0 =A0error (_("Process record can't get to_insert_breakpoint.")); >> + =A0if (!record_beneath_to_remove_breakpoint) >> + =A0 =A0error (_("Process record can't get to_remove_breakpoint.")); > > As I said above, this is better than making target.c aware of > these pointers, but, it still isn't ideal. =A0For one thing, if > some other layer/target is pushed after the record target is opened, > these will be wrong. =A0I would prefer that this beneath lookup > would be done at each callback implementation (record_resume, etc.), > but, I'm happy enough with this for now. =A0It is now contained, so we can > clean this up afterwards... > >> + >> + =A0push_target (&record_ops); >> + >> + =A0/* Reset */ >> + =A0record_insn_num =3D 0; >> + =A0record_list =3D &record_first; >> + =A0record_list->next =3D NULL; >> +} >> + >> +static void >> +record_close (int quitting) >> +{ >> + =A0if (record_debug) >> + =A0 =A0fprintf_unfiltered (gdb_stdlog, "Process record: record_close\n= "); >> + >> + =A0record_list_release (record_list); >> +} > > Shouldn't this clear the record_beneath_* pointers as well? > >> + >> +static void >> +record_resume (struct target_ops *ops, ptid_t ptid, int step, >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 enum target_signal siggnal) >> +{ >> + =A0record_resume_step =3D step; >> + =A0record_resume_siggnal =3D siggnal; >> + >> + =A0if (!RECORD_IS_REPLAY) >> + =A0 =A0{ >> + =A0 =A0 =A0record_message (current_gdbarch); >> + =A0 =A0 =A0record_beneath_to_resume (record_beneath_to_resume_ops, pti= d, 1, >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0siggnal= ); >> + =A0 =A0} >> +} >> + >> +static void >> +record_sig_handler (int signo) >> +{ >> + =A0if (record_debug) >> + =A0 =A0fprintf_unfiltered (gdb_stdlog, "Process record: get a signal\n= "); >> + >> + =A0record_resume_step =3D 1; >> + =A0record_get_sig =3D 1; >> +} > > This handler is magical. =A0Why is it setting resume_step, for instance? > It would definitelly benefic from some comments. =A0In fact, most of the > file is undercommented. > >> + >> +static void >> +record_wait_cleanups (void *ignore) >> +{ >> + =A0if (execution_direction =3D=3D EXEC_REVERSE) >> + =A0 =A0{ >> + =A0 =A0 =A0if (record_list->next) >> + =A0 =A0 record_list =3D record_list->next; >> + =A0 =A0} >> + =A0else >> + =A0 =A0record_list =3D record_list->prev; >> + >> + =A0set_executing (inferior_ptid, 0); >> + =A0record_normal_stop (); >> +} > > See comments about record_normal_stop above. > >> + >> +/* record_wait > > Please remove the function name from the comment. =A0It's redundant. > >> + =A0 In replay mode, this function examines the recorded log and >> + =A0 determines where to stop. =A0*/ >> + >> +static ptid_t >> +record_wait (struct target_ops *ops, >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0ptid_t ptid, struct target_waitstatus *stat= us) >> +{ >> + =A0struct cleanup *set_cleanups =3D record_gdb_operation_disable_set (= ); >> + >> + =A0if (record_debug) >> + =A0 =A0fprintf_unfiltered (gdb_stdlog, >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 "Process record: record_wait " >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 "record_resume_step =3D %d\n", >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 record_resume_step); >> + >> + =A0if (!RECORD_IS_REPLAY) >> + =A0 =A0{ >> + =A0 =A0 =A0if (record_resume_step) >> + =A0 =A0 { >> + =A0 =A0 =A0 /* This is a single step. =A0*/ >> + =A0 =A0 =A0 return record_beneath_to_wait (record_beneath_to_wait_ops, >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0ptid, status); >> + =A0 =A0 } >> + =A0 =A0 =A0else >> + =A0 =A0 { >> + =A0 =A0 =A0 if (record_resume_step) >> + =A0 =A0 =A0 =A0 { >> + =A0 =A0 =A0 =A0 =A0 /* This is a single step. =A0*/ >> + =A0 =A0 =A0 =A0 =A0 return record_beneath_to_wait (record_beneath_to_w= ait_ops, >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0ptid, status); >> + =A0 =A0 =A0 =A0 } >> + =A0 =A0 =A0 else >> + =A0 =A0 =A0 =A0 { >> + =A0 =A0 =A0 =A0 =A0 /* This is not a single step. =A0*/ >> + =A0 =A0 =A0 =A0 =A0 ptid_t ret; >> + =A0 =A0 =A0 =A0 =A0 int is_breakpoint =3D 1; >> + =A0 =A0 =A0 =A0 =A0 CORE_ADDR pc =3D 0; >> + =A0 =A0 =A0 =A0 =A0 int pc_is_read =3D 0; >> + =A0 =A0 =A0 =A0 =A0 struct bp_location *bl; >> + =A0 =A0 =A0 =A0 =A0 struct breakpoint *b; >> + >> + =A0 =A0 =A0 =A0 =A0 do >> + =A0 =A0 =A0 =A0 =A0 =A0 { >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 ret =3D record_beneath_to_wait (record_ben= eath_to_wait_ops, >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0ptid, status); >> + >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (status->kind =3D=3D TARGET_WAITKIND_ST= OPPED >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 && status->value.sig =3D=3D TARGET= _SIGNAL_TRAP) >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 { >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 /* Check if there is a breakpoint.= =A0*/ >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 pc_is_read =3D 0; >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 registers_changed (); >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 for (bl =3D bp_location_chain; bl;= bl =3D bl->global_next) > > This will need to be fixed. =A0Can you use the breakpoint_here-like funct= ions > exported by breakpoint.h instead of referencing bp_location_chain directl= y? > >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 { >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 b =3D bl->owner; >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 gdb_assert (b); >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (b->enable_state !=3D b= p_enabled >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 && b->enable_state= !=3D bp_permanent) >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 continue; >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (!pc_is_read) >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 { >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 pc =3D >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 regcache_read_= pc (get_thread_regcache (ret)); >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 pc_is_read =3D 1; >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 } >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 switch (b->type) >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 { >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 default: >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (bl->address = =3D=3D pc) >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 goto breakpoin= t; >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 break; >> + >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 case bp_watchpoint: >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 /* XXX teawater: I= still not very clear how to >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0deal with i= t. =A0*/ >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 goto breakpoint; >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 break; >> + >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 case bp_catchpoint: >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 gdb_assert (b->ops= !=3D NULL >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 && b->ops->breakpoint_hit !=3D NULL); >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (b->ops->breakp= oint_hit (b)) >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 goto breakpoin= t; >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 break; >> + >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 case bp_hardware_watch= point: >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 case bp_read_watchpoin= t: >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 case bp_access_watchpo= int: >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (STOPPED_BY_WAT= CHPOINT (0)) >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 goto breakpoin= t; >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 break; >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 } >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 } >> + >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 /* There is not a breakpoint. =A0*/ >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 record_message (current_gdbarch); >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 record_beneath_to_resume (record_b= eneath_to_resume_ops, >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 =A0 =A0 =A0 =A0 =A0ptid, 1, >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 =A0 =A0 =A0 record_resume_siggnal); >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 continue; >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 } >> + >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 is_breakpoint =3D 0; >> + >> + =A0 =A0 =A0 =A0 =A0 =A0 breakpoint: >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 /* Add gdbarch_decr_pc_after_break to pc b= ecause gdb will >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0expect the pc to be at address plus= decr_pc_after_break >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0when the inferior stops at a breakp= oint. =A0*/ >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (is_breakpoint) >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 { >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 CORE_ADDR decr_pc_after_break =3D >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 gdbarch_decr_pc_after_break (c= urrent_gdbarch); >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (decr_pc_after_break) >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 { >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (!pc_is_read) >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 pc =3D >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 regcache_read_pc (= get_thread_regcache (ret)); >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 regcache_write_pc (get_thr= ead_regcache (ret), >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 =A0 =A0pc + decr_pc_after_break); >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 } >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 } >> + >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 break; >> + =A0 =A0 =A0 =A0 =A0 =A0 } >> + =A0 =A0 =A0 =A0 =A0 while (1); >> + >> + =A0 =A0 =A0 =A0 =A0 return ret; >> + =A0 =A0 =A0 =A0 } >> + =A0 =A0 } >> + =A0 =A0} >> + =A0else >> + =A0 =A0{ >> + =A0 =A0 =A0int need_dasm =3D 0; >> + =A0 =A0 =A0struct regcache *regcache =3D get_current_regcache (); >> + =A0 =A0 =A0int continue_flag =3D 1; >> + =A0 =A0 =A0int first_record_end =3D 1; >> + =A0 =A0 =A0struct cleanup *old_cleanups =3D make_cleanup (record_wait_= cleanups, 0); >> + =A0 =A0 =A0CORE_ADDR tmp_pc; >> + >> + =A0 =A0 =A0status->kind =3D TARGET_WAITKIND_STOPPED; >> + >> + =A0 =A0 =A0/* Check breakpoint when forward execute. =A0*/ >> + =A0 =A0 =A0if (execution_direction =3D=3D EXEC_FORWARD) >> + =A0 =A0 { >> + =A0 =A0 =A0 tmp_pc =3D regcache_read_pc (regcache); >> + =A0 =A0 =A0 if (breakpoint_inserted_here_p (tmp_pc)) >> + =A0 =A0 =A0 =A0 { >> + =A0 =A0 =A0 =A0 =A0 if (record_debug) >> + =A0 =A0 =A0 =A0 =A0 =A0 fprintf_unfiltered (gdb_stdlog, >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 "Proce= ss record: break at 0x%s.\n", >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 paddr_= nz (tmp_pc)); >> + =A0 =A0 =A0 =A0 =A0 if (gdbarch_decr_pc_after_break (get_regcache_arch= (regcache)) >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 && !record_resume_step) >> + =A0 =A0 =A0 =A0 =A0 =A0 regcache_write_pc (regcache, >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0tmp_pc + >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0gdbarch= _decr_pc_after_break >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0(get_re= gcache_arch (regcache))); >> + =A0 =A0 =A0 =A0 =A0 goto replay_out; >> + =A0 =A0 =A0 =A0 } >> + =A0 =A0 } >> + >> + =A0 =A0 =A0record_get_sig =3D 0; >> + =A0 =A0 =A0signal (SIGINT, record_sig_handler); >> + =A0 =A0 =A0/* If GDB is in terminal_inferior mode, it will not get the= signal. >> + =A0 =A0 =A0 =A0 And in GDB replay mode, GDB doesn't need to be in term= inal_inferior >> + =A0 =A0 =A0 =A0 mode, because inferior will not executed. >> + =A0 =A0 =A0 =A0 Then set it to terminal_ours to make GDB get the signa= l. =A0*/ >> + =A0 =A0 =A0target_terminal_ours (); >> + >> + =A0 =A0 =A0/* In EXEC_FORWARD mode, record_list points to the tail of = prev >> + =A0 =A0 =A0 =A0 instruction. =A0*/ >> + =A0 =A0 =A0if (execution_direction =3D=3D EXEC_FORWARD && record_list-= >next) >> + =A0 =A0 record_list =3D record_list->next; >> + >> + =A0 =A0 =A0/* Loop over the record_list, looking for the next place to >> + =A0 =A0 =A0stop. =A0*/ >> + =A0 =A0 =A0do >> + =A0 =A0 { >> + =A0 =A0 =A0 /* Check for beginning and end of log. =A0*/ >> + =A0 =A0 =A0 if (execution_direction =3D=3D EXEC_REVERSE >> + =A0 =A0 =A0 =A0 =A0 && record_list =3D=3D &record_first) >> + =A0 =A0 =A0 =A0 { >> + =A0 =A0 =A0 =A0 =A0 /* Hit beginning of record log in reverse. =A0*/ >> + =A0 =A0 =A0 =A0 =A0 status->kind =3D TARGET_WAITKIND_NO_HISTORY; >> + =A0 =A0 =A0 =A0 =A0 break; >> + =A0 =A0 =A0 =A0 } >> + =A0 =A0 =A0 if (execution_direction !=3D EXEC_REVERSE && !record_list-= >next) >> + =A0 =A0 =A0 =A0 { >> + =A0 =A0 =A0 =A0 =A0 /* Hit end of record log going forward. =A0*/ >> + =A0 =A0 =A0 =A0 =A0 status->kind =3D TARGET_WAITKIND_NO_HISTORY; >> + =A0 =A0 =A0 =A0 =A0 break; >> + =A0 =A0 =A0 =A0 } >> + >> + =A0 =A0 =A0 /* Set ptid, register and memory according to record_list.= =A0*/ >> + =A0 =A0 =A0 if (record_list->type =3D=3D record_reg) >> + =A0 =A0 =A0 =A0 { >> + =A0 =A0 =A0 =A0 =A0 /* reg */ >> + =A0 =A0 =A0 =A0 =A0 gdb_byte reg[MAX_REGISTER_SIZE]; >> + =A0 =A0 =A0 =A0 =A0 if (record_debug > 1) >> + =A0 =A0 =A0 =A0 =A0 =A0 fprintf_unfiltered (gdb_stdlog, >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 "Proce= ss record: record_reg %s to " >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 "infer= ior num =3D %d.\n", >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 host_a= ddress_to_string (record_list), >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 record= _list->u.reg.num); >> + =A0 =A0 =A0 =A0 =A0 regcache_cooked_read (regcache, record_list->u.reg= .num, reg); >> + =A0 =A0 =A0 =A0 =A0 regcache_cooked_write (regcache, record_list->u.re= g.num, >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0rec= ord_list->u.reg.val); >> + =A0 =A0 =A0 =A0 =A0 memcpy (record_list->u.reg.val, reg, MAX_REGISTER_= SIZE); >> + =A0 =A0 =A0 =A0 } >> + =A0 =A0 =A0 else if (record_list->type =3D=3D record_mem) >> + =A0 =A0 =A0 =A0 { >> + =A0 =A0 =A0 =A0 =A0 /* mem */ >> + =A0 =A0 =A0 =A0 =A0 gdb_byte *mem =3D alloca (record_list->u.mem.len); >> + =A0 =A0 =A0 =A0 =A0 if (record_debug > 1) >> + =A0 =A0 =A0 =A0 =A0 =A0 fprintf_unfiltered (gdb_stdlog, >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 "Proce= ss record: record_mem %s to " >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 "infer= ior addr =3D 0x%s len =3D %d.\n", >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 host_a= ddress_to_string (record_list), >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 paddr_= nz (record_list->u.mem.addr), >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 record= _list->u.mem.len); >> + >> + =A0 =A0 =A0 =A0 =A0 if (target_read_memory >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 (record_list->u.mem.addr, mem, record_list= ->u.mem.len)) >> + =A0 =A0 =A0 =A0 =A0 =A0 error (_("Process record: error reading memory= at " >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0"addr =3D 0x%s len =3D %d."= ), >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0paddr_nz (record_list->u.mem.ad= dr), >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0record_list->u.mem.len); >> + >> + =A0 =A0 =A0 =A0 =A0 if (target_write_memory >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 (record_list->u.mem.addr, record_list->u.m= em.val, >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0record_list->u.mem.len)) >> + =A0 =A0 =A0 =A0 =A0 =A0 error (_ >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0("Process record: error writing= memory at " >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 "addr =3D 0x%s len =3D %d."), >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0paddr_nz (record_list->u.mem.ad= dr), >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0record_list->u.mem.len); >> + >> + =A0 =A0 =A0 =A0 =A0 memcpy (record_list->u.mem.val, mem, record_list->= u.mem.len); >> + =A0 =A0 =A0 =A0 } >> + =A0 =A0 =A0 else >> + =A0 =A0 =A0 =A0 { >> + =A0 =A0 =A0 =A0 =A0 if (record_debug > 1) >> + =A0 =A0 =A0 =A0 =A0 =A0 fprintf_unfiltered (gdb_stdlog, >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 "Proce= ss record: record_end %s to " >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 "infer= ior need_dasm =3D %d.\n", >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 host_a= ddress_to_string (record_list), >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 record= _list->u.need_dasm); >> + >> + =A0 =A0 =A0 =A0 =A0 if (execution_direction =3D=3D EXEC_FORWARD) >> + =A0 =A0 =A0 =A0 =A0 =A0 need_dasm =3D record_list->u.need_dasm; >> + =A0 =A0 =A0 =A0 =A0 if (need_dasm) >> + =A0 =A0 =A0 =A0 =A0 =A0 gdbarch_process_record_dasm (current_gdbarch); >> + >> + =A0 =A0 =A0 =A0 =A0 if (first_record_end && execution_direction =3D=3D= EXEC_REVERSE) >> + =A0 =A0 =A0 =A0 =A0 =A0 { >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 /* When reverse excute, the first record_e= nd is the part of >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0current instruction. =A0*/ >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 first_record_end =3D 0; >> + =A0 =A0 =A0 =A0 =A0 =A0 } >> + =A0 =A0 =A0 =A0 =A0 else >> + =A0 =A0 =A0 =A0 =A0 =A0 { >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 /* In EXEC_REVERSE mode, this is the recor= d_end of prev >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0instruction. >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0In EXEC_FORWARD mode, this is the r= ecord_end of current >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0instruction. =A0*/ >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 /* step */ >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (record_resume_step) >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 { >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (record_debug > 1) >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 fprintf_unfiltered (gdb_stdlog, >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 =A0 "Process record: step.\n"); >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 continue_flag =3D 0; >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 } >> + >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 /* check breakpoint */ >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 tmp_pc =3D regcache_read_pc (regcache); >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (breakpoint_inserted_here_p (tmp_pc)) >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 { >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (record_debug) >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 fprintf_unfiltered (gdb_stdlog, >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 =A0 "Process record: break " >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 =A0 "at 0x%s.\n", >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 =A0 paddr_nz (tmp_pc)); >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (gdbarch_decr_pc_after_break (g= et_regcache_arch (regcache)) >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 && execution_direction =3D= =3D EXEC_FORWARD >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 && !record_resume_step) >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 regcache_write_pc (regcache, >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 =A0tmp_pc + >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 =A0gdbarch_decr_pc_after_break >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 =A0(get_regcache_arch (regcache))); >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 continue_flag =3D 0; >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 } >> + =A0 =A0 =A0 =A0 =A0 =A0 } >> + =A0 =A0 =A0 =A0 =A0 if (execution_direction =3D=3D EXEC_REVERSE) >> + =A0 =A0 =A0 =A0 =A0 =A0 need_dasm =3D record_list->u.need_dasm; >> + =A0 =A0 =A0 =A0 } >> + >> +next: >> + =A0 =A0 =A0 if (continue_flag) >> + =A0 =A0 =A0 =A0 { >> + =A0 =A0 =A0 =A0 =A0 if (execution_direction =3D=3D EXEC_REVERSE) >> + =A0 =A0 =A0 =A0 =A0 =A0 { >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (record_list->prev) >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 record_list =3D record_list->prev; >> + =A0 =A0 =A0 =A0 =A0 =A0 } >> + =A0 =A0 =A0 =A0 =A0 else >> + =A0 =A0 =A0 =A0 =A0 =A0 { >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (record_list->next) >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 record_list =3D record_list->next; >> + =A0 =A0 =A0 =A0 =A0 =A0 } >> + =A0 =A0 =A0 =A0 } >> + =A0 =A0 } >> + =A0 =A0 =A0while (continue_flag); >> + >> + =A0 =A0 =A0signal (SIGINT, handle_sigint); >> + >> +replay_out: >> + =A0 =A0 =A0if (record_get_sig) >> + =A0 =A0 status->value.sig =3D TARGET_SIGNAL_INT; >> + =A0 =A0 =A0else >> + =A0 =A0 status->value.sig =3D TARGET_SIGNAL_TRAP; >> + >> + =A0 =A0 =A0discard_cleanups (old_cleanups); >> + =A0 =A0} >> + >> + =A0do_cleanups (set_cleanups); >> + =A0return inferior_ptid; >> +} > > I have to say that I find that function confusing, due to > the use of gotos, and excessive nesting. =A0Personally, I much prefer > code that does: > > =A0if (foo) > =A0 =A0{ > =A0 =A0 =A0/* something */ > =A0 =A0 =A0return; > =A0 =A0} > > =A0if (bar) > =A0 =A0{ > =A0 =A0 =A0/* something */ > =A0 =A0 =A0return; > =A0 =A0} > > =A0if (lala) > =A0 =A0{ > =A0 =A0 =A0/* something */ > =A0 =A0 =A0return; > =A0 =A0} > > Over: > > =A0if (foo) > =A0 =A0{ > =A0 =A0 =A0/* something */ > =A0 =A0 =A0return; > =A0 =A0} > =A0else > =A0 { > =A0 =A0 if (bar) > =A0 =A0 =A0 { > =A0 =A0 =A0 =A0 /* something */ > =A0 =A0 =A0 =A0 return; > =A0 =A0 =A0 } > =A0 =A0 else > =A0 =A0 =A0{ > =A0 =A0 =A0 =A0 if (lala) > =A0 =A0 =A0 =A0 =A0 { > =A0 =A0 =A0 =A0 =A0 =A0 /* something */ > =A0 =A0 =A0 =A0 =A0 =A0 return; > =A0 =A0 =A0 =A0 =A0 } > =A0 =A0 =A0} > =A0 } > > >> + >> +static void >> +record_disconnect (struct target_ops *target, char *args, int from_tty) >> +{ >> + =A0if (record_debug) >> + =A0 =A0fprintf_unfiltered (gdb_stdlog, "Process record: record_disconn= ect\n"); >> + >> + =A0unpush_target (&record_ops); >> + =A0target_disconnect (args, from_tty); >> +} >> + >> +static void >> +record_detach (struct target_ops *ops, char *args, int from_tty) >> +{ >> + =A0if (record_debug) >> + =A0 =A0fprintf_unfiltered (gdb_stdlog, "Process record: record_detach\= n"); >> + >> + =A0unpush_target (&record_ops); >> + =A0target_detach (args, from_tty); >> +} > > This trick you're using happens to work, but, could you try > this instead? =A0Here and elsewhere similarly. > > =A0struct target_ops *beneath =3D find_target_beaneath (ops); > =A0unpush_target (ops); > =A0beneath->to_detach (args, from_tty); > >> + >> +static void >> +record_mourn_inferior (struct target_ops *ops) >> +{ >> + =A0if (record_debug) >> + =A0 =A0fprintf_unfiltered (gdb_stdlog, "Process record: " >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 "recor= d_mourn_inferior\n"); >> + >> + =A0unpush_target (&record_ops); >> + =A0target_mourn_inferior (); >> +} >> + >> +/* Close process record target before killing the inferior process. =A0= */ >> +static void >> +record_kill (void) >> +{ >> + =A0if (record_debug) >> + =A0 =A0fprintf_unfiltered (gdb_stdlog, "Process record: record_kill\n"= ); >> + >> + =A0unpush_target (&record_ops); >> + =A0target_kill (); >> +} >> + >> +/* Record registers change (by user or by GDB) to list as an instructio= n. =A0*/ >> +static void >> +record_registers_change (struct regcache *regcache, int regnum) >> +{ >> + =A0/* Check record_insn_num. =A0*/ >> + =A0record_check_insn_num (0); >> + >> + =A0record_arch_list_head =3D NULL; >> + =A0record_arch_list_tail =3D NULL; >> + >> + =A0record_regcache =3D get_current_regcache (); >> + >> + =A0if (regnum < 0) >> + =A0 =A0{ >> + =A0 =A0 =A0int i; >> + =A0 =A0 =A0for (i =3D 0; i < gdbarch_num_regs (get_regcache_arch (regc= ache)); i++) >> + =A0 =A0 { >> + =A0 =A0 =A0 if (record_arch_list_add_reg (i)) >> + =A0 =A0 =A0 =A0 { >> + =A0 =A0 =A0 =A0 =A0 record_list_release (record_arch_list_tail); >> + =A0 =A0 =A0 =A0 =A0 error (_("Process record: failed to record executi= on log.")); >> + =A0 =A0 =A0 =A0 } >> + =A0 =A0 } >> + =A0 =A0} >> + =A0else >> + =A0 =A0{ >> + =A0 =A0 =A0if (record_arch_list_add_reg (regnum)) >> + =A0 =A0 { >> + =A0 =A0 =A0 record_list_release (record_arch_list_tail); >> + =A0 =A0 =A0 error (_("Process record: failed to record execution log."= )); >> + =A0 =A0 } >> + =A0 =A0} >> + =A0if (record_arch_list_add_end (0)) >> + =A0 =A0{ >> + =A0 =A0 =A0record_list_release (record_arch_list_tail); >> + =A0 =A0 =A0error (_("Process record: failed to record execution log.")= ); >> + =A0 =A0} >> + =A0record_list->next =3D record_arch_list_head; >> + =A0record_arch_list_head->prev =3D record_list; >> + =A0record_list =3D record_arch_list_tail; >> + >> + =A0if (record_insn_num =3D=3D record_insn_max_num && record_insn_max_n= um) >> + =A0 =A0record_list_release_first (); >> + =A0else >> + =A0 =A0record_insn_num++; >> +} >> + >> +static void >> +record_store_registers (struct target_ops *ops, struct regcache *regcac= he, >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0int regno) >> +{ >> + =A0if (!record_gdb_operation_disable) >> + =A0 =A0{ >> + =A0 =A0 =A0if (RECORD_IS_REPLAY) >> + =A0 =A0 { >> + =A0 =A0 =A0 int n; >> + =A0 =A0 =A0 struct cleanup *old_cleanups; >> + >> + =A0 =A0 =A0 /* Let user choose if he wants to write register or not. = =A0*/ >> + =A0 =A0 =A0 if (regno < 0) >> + =A0 =A0 =A0 =A0 n =3D >> + =A0 =A0 =A0 =A0 =A0 nquery (_("Because GDB is in replay mode, changing= the " >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 "value of a register will make= the execution " >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 "log unusable from this point = onward. =A0" >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 "Change all registers?")); >> + =A0 =A0 =A0 else >> + =A0 =A0 =A0 =A0 n =3D >> + =A0 =A0 =A0 =A0 =A0 nquery (_("Because GDB is in replay mode, changing= the value " >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 "of a register will make the e= xecution log unusable " >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 "from this point onward. =A0Ch= ange register %s?"), >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 gdbarch_register_name (get_regcach= e_arch (regcache), >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 =A0 =A0 =A0regno)); >> + >> + =A0 =A0 =A0 if (!n) >> + =A0 =A0 =A0 =A0 { >> + =A0 =A0 =A0 =A0 =A0 /* Invalidate the value of regcache that was set i= n function >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0"regcache_raw_write". =A0*/ >> + =A0 =A0 =A0 =A0 =A0 if (regno < 0) >> + =A0 =A0 =A0 =A0 =A0 =A0 { >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 int i; >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 for (i =3D 0; >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0i < gdbarch_num_regs (get_regca= che_arch (regcache)); >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0i++) >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 regcache_invalidate (regcache, i); >> + =A0 =A0 =A0 =A0 =A0 =A0 } >> + =A0 =A0 =A0 =A0 =A0 else >> + =A0 =A0 =A0 =A0 =A0 =A0 regcache_invalidate (regcache, regno); >> + >> + =A0 =A0 =A0 =A0 =A0 error (_("Process record canceled the operation.")= ); >> + =A0 =A0 =A0 =A0 } >> + >> + =A0 =A0 =A0 /* Destroy the record from here forward. =A0*/ >> + =A0 =A0 =A0 record_list_release_next (); >> + =A0 =A0 } >> + >> + =A0 =A0 =A0record_registers_change (regcache, regno); >> + =A0 =A0} >> + =A0record_beneath_to_store_registers (record_beneath_to_store_register= s_ops, >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 regcache, regno); >> +} >> + >> +/* record_xfer_partial -- behavior is conditional on RECORD_IS_REPLAY. >> + =A0 In replay mode, we cannot write memory unles we are willing to >> + =A0 invalidate the record/replay log from this point forward. =A0*/ >> + >> +static LONGEST >> +record_xfer_partial (struct target_ops *ops, enum target_object object, >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0const char *annex, gdb_byte * readb= uf, >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0const gdb_byte * writebuf, ULONGEST= offset, LONGEST len) >> +{ >> + =A0if (!record_gdb_operation_disable >> + =A0 =A0 =A0&& (object =3D=3D TARGET_OBJECT_MEMORY >> + =A0 =A0 =A0 || object =3D=3D TARGET_OBJECT_RAW_MEMORY) && writebuf) >> + =A0 =A0{ >> + =A0 =A0 =A0if (RECORD_IS_REPLAY) >> + =A0 =A0 { >> + =A0 =A0 =A0 /* Let user choose if he wants to write memory or not. =A0= */ >> + =A0 =A0 =A0 if (!nquery (_("Because GDB is in replay mode, writing to = memory " >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0"will make the execution lo= g unusable from this " >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0"point onward. =A0Write mem= ory at address 0x%s?"), >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0paddr_nz (offset))) >> + =A0 =A0 =A0 =A0 return -1; >> + >> + =A0 =A0 =A0 /* Destroy the record from here forward. =A0*/ >> + =A0 =A0 =A0 record_list_release_next (); >> + =A0 =A0 } >> + >> + =A0 =A0 =A0/* Check record_insn_num */ >> + =A0 =A0 =A0record_check_insn_num (0); >> + >> + =A0 =A0 =A0/* Record registers change to list as an instruction. =A0*/ >> + =A0 =A0 =A0record_arch_list_head =3D NULL; >> + =A0 =A0 =A0record_arch_list_tail =3D NULL; >> + =A0 =A0 =A0if (record_arch_list_add_mem (offset, len)) >> + =A0 =A0 { >> + =A0 =A0 =A0 record_list_release (record_arch_list_tail); >> + =A0 =A0 =A0 if (record_debug) >> + =A0 =A0 =A0 =A0 fprintf_unfiltered (gdb_stdlog, >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 _("Process rec= ord: failed to record " >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 "execution= log.")); >> + =A0 =A0 =A0 return -1; >> + =A0 =A0 } >> + =A0 =A0 =A0if (record_arch_list_add_end (0)) >> + =A0 =A0 { >> + =A0 =A0 =A0 record_list_release (record_arch_list_tail); >> + =A0 =A0 =A0 if (record_debug) >> + =A0 =A0 =A0 =A0 fprintf_unfiltered (gdb_stdlog, >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 _("Process rec= ord: failed to record " >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 "execution= log.")); >> + =A0 =A0 =A0 return -1; >> + =A0 =A0 } >> + =A0 =A0 =A0record_list->next =3D record_arch_list_head; >> + =A0 =A0 =A0record_arch_list_head->prev =3D record_list; >> + =A0 =A0 =A0record_list =3D record_arch_list_tail; >> + >> + =A0 =A0 =A0if (record_insn_num =3D=3D record_insn_max_num && record_in= sn_max_num) >> + =A0 =A0 record_list_release_first (); >> + =A0 =A0 =A0else >> + =A0 =A0 record_insn_num++; >> + =A0 =A0} >> + >> + =A0return record_beneath_to_xfer_partial (record_beneath_to_xfer_parti= al_ops, >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 =A0 object, annex, readbuf, writebuf, >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 =A0 offset, len); >> +} >> + >> +/* record_insert_breakpoint >> + =A0 record_remove_breakpoint >> + =A0 Behavior is conditional on RECORD_IS_REPLAY. >> + =A0 We will not actually insert or remove breakpoints when replaying, >> + =A0 nor when recording. =A0*/ >> + >> +static int >> +record_insert_breakpoint (struct bp_target_info *bp_tgt) >> +{ >> + =A0if (!RECORD_IS_REPLAY) >> + =A0 =A0{ >> + =A0 =A0 =A0struct cleanup *old_cleanups =3D record_gdb_operation_disab= le_set (); >> + =A0 =A0 =A0int ret =3D record_beneath_to_insert_breakpoint (bp_tgt); >> + >> + =A0 =A0 =A0do_cleanups (old_cleanups); >> + >> + =A0 =A0 =A0return ret; >> + =A0 =A0} >> + >> + =A0return 0; >> +} >> + >> +static int >> +record_remove_breakpoint (struct bp_target_info *bp_tgt) >> +{ >> + =A0if (!RECORD_IS_REPLAY) >> + =A0 =A0{ >> + =A0 =A0 =A0struct cleanup *old_cleanups =3D record_gdb_operation_disab= le_set (); >> + =A0 =A0 =A0int ret =3D record_beneath_to_remove_breakpoint (bp_tgt); >> + >> + =A0 =A0 =A0do_cleanups (old_cleanups); >> + >> + =A0 =A0 =A0return ret; >> + =A0 =A0} >> + >> + =A0return 0; >> +} >> + >> +static int >> +record_can_execute_reverse (void) >> +{ >> + =A0return 1; >> +} >> + >> +static void >> +init_record_ops (void) >> +{ >> + =A0record_ops.to_shortname =3D "record"; >> + =A0record_ops.to_longname =3D "Process record and replay target"; >> + =A0record_ops.to_doc =3D >> + =A0 =A0"Log program while executing and replay execution from log."; >> + =A0record_ops.to_open =3D record_open; >> + =A0record_ops.to_close =3D record_close; >> + =A0record_ops.to_resume =3D record_resume; >> + =A0record_ops.to_wait =3D record_wait; >> + =A0record_ops.to_disconnect =3D record_disconnect; >> + =A0record_ops.to_detach =3D record_detach; >> + =A0record_ops.to_mourn_inferior =3D record_mourn_inferior; >> + =A0record_ops.to_kill =3D record_kill; >> + =A0record_ops.to_create_inferior =3D find_default_create_inferior; >> + =A0record_ops.to_store_registers =3D record_store_registers; >> + =A0record_ops.to_xfer_partial =3D record_xfer_partial; >> + =A0record_ops.to_insert_breakpoint =3D record_insert_breakpoint; >> + =A0record_ops.to_remove_breakpoint =3D record_remove_breakpoint; >> + =A0record_ops.to_can_execute_reverse =3D record_can_execute_reverse; >> + =A0record_ops.to_stratum =3D record_stratum; >> + =A0record_ops.to_magic =3D OPS_MAGIC; >> +} >> + >> +static void >> +show_record_debug (struct ui_file *file, int from_tty, >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0struct cmd_list_element *c, const char = *value) >> +{ >> + =A0fprintf_filtered (file, _("Debugging of process record target is %s= .\n"), >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 value); >> +} >> + >> +/* cmd_record_start -- alias for "target record". =A0*/ >> + >> +static void >> +cmd_record_start (char *args, int from_tty) >> +{ >> + =A0execute_command ("target record", from_tty); >> +} >> + >> +/* cmd_record_delete -- truncate the record log from the present point >> + =A0 of replay until the end. =A0*/ >> + >> +static void >> +cmd_record_delete (char *args, int from_tty) >> +{ >> + =A0if (TARGET_IS_PROCESS_RECORD) >> + =A0 =A0{ >> + =A0 =A0 =A0if (RECORD_IS_REPLAY) >> + =A0 =A0 { >> + =A0 =A0 =A0 if (!from_tty || query (_("Delete the log from this point = forward " >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 "and b= egin to record the running message " >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 "at cu= rrent PC?"))) >> + =A0 =A0 =A0 =A0 record_list_release_next (); >> + =A0 =A0 } >> + =A0 =A0 =A0else >> + =A0 =A0 =A0 printf_unfiltered (_("Already at end of record list.\n")); >> + >> + =A0 =A0} >> + =A0else >> + =A0 =A0printf_unfiltered (_("Process record is not started.\n")); >> +} >> + >> +/* cmd_record_stop -- implement the "stoprecord" command. =A0*/ >> + >> +static void >> +cmd_record_stop (char *args, int from_tty) >> +{ >> + =A0if (TARGET_IS_PROCESS_RECORD) >> + =A0 =A0{ >> + =A0 =A0 =A0if (!record_list || !from_tty || query (_("Delete recorded = log and " >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 =A0 =A0 =A0 "stop recording?"))) >> + =A0 =A0 unpush_target (&record_ops); >> + =A0 =A0} >> + =A0else >> + =A0 =A0printf_unfiltered (_("Process record is not started.\n")); >> +} >> + >> +/* set_record_insn_max_num -- set upper limit of record log size. =A0*/ >> + >> +static void >> +set_record_insn_max_num (char *args, int from_tty, struct cmd_list_elem= ent *c) >> +{ >> + =A0if (record_insn_num > record_insn_max_num && record_insn_max_num) >> + =A0 =A0{ >> + =A0 =A0 =A0printf_unfiltered (_("Record instructions number is bigger = than " >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0"record instructions ma= x number. =A0Auto delete " >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0"the first ones?\n")); >> + >> + =A0 =A0 =A0while (record_insn_num > record_insn_max_num) >> + =A0 =A0 record_list_release_first (); >> + =A0 =A0} >> +} >> + >> +/* show_record_insn_number -- print the current index >> + =A0 into the record log (number of insns recorded so far). =A0*/ >> + >> +static void >> +show_record_insn_number (char *ignore, int from_tty) >> +{ >> + =A0printf_unfiltered (_("Record instruction number is %d.\n"), >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0record_insn_num); >> +} >> + >> +void >> +_initialize_record (void) >> +{ >> + =A0/* Init record_maskall. =A0*/ >> + =A0if (sigfillset (&record_maskall) =3D=3D -1) >> + =A0 =A0perror_with_name (_("Process record: sigfillset failed")); > > This will not build on all hosts. =A0Is it still needed? =A0I can't > find any other reference to this variable in this patch. > >> + >> + =A0/* Init record_first. =A0*/ >> + =A0record_first.prev =3D NULL; >> + =A0record_first.next =3D NULL; >> + =A0record_first.type =3D record_end; >> + =A0record_first.u.need_dasm =3D 0; >> + >> + =A0init_record_ops (); >> + =A0add_target (&record_ops); >> + >> + =A0add_setshow_zinteger_cmd ("record", no_class, &record_debug, >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 _("Set debugging of re= cord/replay feature."), >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 _("Show debugging of r= ecord/replay feature."), >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 _("When enabled, debug= ging output for " >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 "record/replay fea= ture is displayed."), >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 NULL, show_record_debu= g, &setdebuglist, >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 &showdebuglist); >> + >> + =A0add_com ("record", class_obscure, cmd_record_start, >> + =A0 =A0 =A0 =A0_("Abbreviated form of \"target record\" command.")); >> + >> + =A0add_com_alias ("rec", "record", class_obscure, 1); >> + >> + =A0/* XXX: I try to use some simple commands such as "disconnect" and >> + =A0 =A0 "detach" to support this functions. =A0But these commands all = have >> + =A0 =A0 other affect to GDB such as call function "no_shared_libraries= ". >> + =A0 =A0 So I add special commands to GDB. =A0*/ >> + =A0add_com ("delrecord", class_obscure, cmd_record_delete, >> + =A0 =A0 =A0 =A0_("Delete the rest of execution log and start recording= it anew.")); >> + =A0add_com_alias ("dr", "delrecord", class_obscure, 1); >> + =A0add_com ("stoprecord", class_obscure, cmd_record_stop, >> + =A0 =A0 =A0 =A0_("Stop the record/replay target.")); >> + =A0add_com_alias ("sr", "stoprecord", class_obscure, 1); >> + >> + =A0/* Record instructions number limit command. =A0*/ >> + =A0add_setshow_boolean_cmd ("record-stop-at-limit", no_class, >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 &record_stop_at_limit, >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 _("Set whether record/= replay stop when " >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 "record/replay buf= fer becomes full."), >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 _("Show whether record= /replay stop when " >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 "record/replay buf= fer becomes full."), >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 _("Enable is default v= alue.\n" >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 "When enabled, if = the record/replay buffer " >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 "becomes full,\n" >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0"ask user w= hat to do.\n" >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0"When disab= led, if the record/replay buffer " >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 "becomes full,\n" >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0"delete it = and start new recording."), >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 NULL, NULL, &setlist, = &showlist); >> + =A0add_setshow_zinteger_cmd ("record-insn-number-max", no_class, >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 &record_insn_max_num, >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 _("Set record/replay b= uffer limit."), >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 _("Show record/replay = buffer limit."), >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 _("Set the maximum num= ber of instructions to be " >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0"stored in = the\n" >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0"record/rep= lay buffer. =A0" >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0"Zero means= unlimited (default 200000)."), >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 set_record_insn_max_nu= m, >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 NULL, &setlist, &showl= ist); >> + =A0add_info ("record-insn-number", show_record_insn_number, >> + =A0 =A0 =A0 =A0 _("Show the current number of instructions in the " >> + =A0 =A0 =A0 =A0 =A0 "record/replay buffer.")); >> +} >> Index: src/gdb/record.h >> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D >> --- /dev/null 1970-01-01 00:00:00.000000000 +0000 >> +++ src/gdb/record.h =A02009-02-28 20:23:20.000000000 +0000 >> @@ -0,0 +1,87 @@ >> +/* Process record and replay target for GDB, the GNU debugger. >> + >> + =A0 Copyright (C) 2008 Free Software Foundation, Inc. >> + >> + =A0 This file is part of GDB. >> + >> + =A0 This program is free software; you can redistribute it and/or modi= fy >> + =A0 it under the terms of the GNU General Public License as published = by >> + =A0 the Free Software Foundation; either version 3 of the License, or >> + =A0 (at your option) any later version. >> + >> + =A0 This program is distributed in the hope that it will be useful, >> + =A0 but WITHOUT ANY WARRANTY; without even the implied warranty of >> + =A0 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. =A0See the >> + =A0 GNU General Public License for more details. >> + >> + =A0 You should have received a copy of the GNU General Public License >> + =A0 along with this program. =A0If not, see . =A0*/ >> + >> +#ifndef _RECORD_H_ >> +#define _RECORD_H_ >> + >> +#define TARGET_IS_PROCESS_RECORD =A0 \ >> + =A0 =A0 (current_target.beneath =3D=3D &record_ops) > > Sorry, but I repeat the request I've made several times already. =A0This = is > not the right way to do this. =A0You need to add a new target_ops method = or > property that the core of GDB checks on. =A0It is not correct that make > the core of GDB reference record_ops directly. =A0To come up with > the target callback's name, at each call site of TARGET_IS_PROCESS_RECORD, > consider what is the property of the current target that GDB needs to > know about the current target. =A0Is it something like: > > =A0target_is_recording () ? > =A0target_is_replaying () ? > =A0target_is_read_only () ? > > etc. > >> +#define RECORD_IS_REPLAY \ >> + =A0 =A0 (record_list->next || execution_direction =3D=3D EXEC_REVERSE) > > AFAICS, this macro is not used outside of record.c. =A0It should move > there, along with anything that isn't used outside of record.c. > >> + >> +typedef struct record_reg_s >> +{ >> + =A0int num; >> + =A0gdb_byte *val; >> +} record_reg_t; >> + >> +typedef struct record_mem_s >> +{ >> + =A0CORE_ADDR addr; >> + =A0int len; >> + =A0gdb_byte *val; >> +} record_mem_t; >> + >> +enum record_type >> +{ >> + =A0record_end =3D 0, >> + =A0record_reg, >> + =A0record_mem >> +}; >> + >> +/* This is the core struct of record function. >> + >> + =A0 An entity of record_t is a record of the value change of a register >> + =A0 ("record_reg") or a part of memory ("record_mem"). =A0And each >> + =A0 instruction must has a record_t ("record_end") that points out this >> + =A0 is the last record_t of this instruction. >> + >> + =A0 Each record_t is linked to "record_list" by "prev" and "next". >> + */ >> +typedef struct record_s >> +{ >> + =A0struct record_s *prev; >> + =A0struct record_s *next; >> + =A0enum record_type type; >> + =A0union >> + =A0{ >> + =A0 =A0/* reg */ >> + =A0 =A0record_reg_t reg; >> + =A0 =A0/* mem */ >> + =A0 =A0record_mem_t mem; >> + =A0 =A0/* end */ >> + =A0 =A0int need_dasm; >> + =A0} u; >> +} record_t; >> + >> +extern int record_debug; >> +extern record_t *record_list; >> +extern record_t *record_arch_list_head; >> +extern record_t *record_arch_list_tail; >> +extern struct regcache *record_regcache; > > Most of these things don't appear to be used anywhere else other > than in record.c. =A0Can you remove these declarations from the > public header, and make them static in record.c? > >> + >> +extern struct target_ops record_ops; > > Once you get rid of TARGET_IS_PROCESS_RECORD this doesn't > need to be public anymore. > >> + >> +extern int record_arch_list_add_reg (int num); >> +extern int record_arch_list_add_mem (CORE_ADDR addr, int len); >> +extern int record_arch_list_add_end (int need_dasm); >> +extern void record_message (struct gdbarch *gdbarch); >> +extern struct cleanup * record_gdb_operation_disable_set (void); >> + >> +#endif /* _RECORD_H_ */ >> > > -- > Pedro Alves > --0016e6511bd0785e1f0465646c63 Content-Type: text/plain; charset=US-ASCII; name="3-record_target.txt" Content-Disposition: attachment; filename="3-record_target.txt" Content-Transfer-Encoding: base64 X-Attachment-Id: f_fsg168ei0 Content-length: 51053 LS0tCiBNYWtlZmlsZS5pbiB8ICAgIDQgCiByZWNvcmQuYyAgICB8IDEyMTQg KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrCiByZWNvcmQuaCAgICB8ICAgNzQgKysrCiAzIGZp bGVzIGNoYW5nZWQsIDEyOTAgaW5zZXJ0aW9ucygrKSwgMiBkZWxldGlvbnMo LSkKCi0tLSBhL01ha2VmaWxlLmluCisrKyBiL01ha2VmaWxlLmluCkBAIC02 NjEsNyArNjYxLDcgQEAgU0ZJTEVTID0gYWRhLWV4cC55IGFkYS1sYW5nLmMg YWRhLXR5cGVwcgogCXZhbGFyaXRoLmMgdmFsb3BzLmMgdmFscHJpbnQuYyB2 YWx1ZS5jIHZhcm9iai5jIHZlYy5jIFwKIAl3cmFwcGVyLmMgXAogCXhtbC10 ZGVzYy5jIHhtbC1zdXBwb3J0LmMgXAotCWluZmVyaW9yLmMKKwlpbmZlcmlv ci5jIHJlY29yZC5jCiAKIExJTlRGSUxFUyA9ICQoU0ZJTEVTKSAkKFlZRklM RVMpICQoQ09ORklHX1NSQ1MpIGluaXQuYwogCkBAIC04MTIsNyArODEyLDcg QEAgQ09NTU9OX09CUyA9ICQoREVQRklMRVMpICQoQ09ORklHX09CUykgJAog CXNvbGliLm8gc29saWItbnVsbC5vIFwKIAlwcm9sb2d1ZS12YWx1ZS5vIG1l bW9yeS1tYXAubyB4bWwtc3VwcG9ydC5vIFwKIAl0YXJnZXQtZGVzY3JpcHRp b25zLm8gdGFyZ2V0LW1lbW9yeS5vIHhtbC10ZGVzYy5vIHhtbC1idWlsdGlu Lm8gXAotCWluZmVyaW9yLm8gb3NkYXRhLm8KKwlpbmZlcmlvci5vIG9zZGF0 YS5vIHJlY29yZC5vCiAKIFRTT0JTID0gaW5mbG93Lm8KIAotLS0gL2Rldi9u dWxsCisrKyBiL3JlY29yZC5jCkBAIC0wLDAgKzEsMTIxNCBAQAorLyogUHJv Y2VzcyByZWNvcmQgYW5kIHJlcGxheSB0YXJnZXQgZm9yIEdEQiwgdGhlIEdO VSBkZWJ1Z2dlci4KKworICAgQ29weXJpZ2h0IChDKSAyMDA4LCAyMDA5IEZy ZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIGZpbGUg aXMgcGFydCBvZiBHREIuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNv ZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5 CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1 YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29m dHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGlj ZW5zZSwgb3IKKyAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNp b24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUg aG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQg QU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFu dHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBB UlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1 YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91 bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1 YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElm IG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICov CisKKyNpbmNsdWRlICJkZWZzLmgiCisjaW5jbHVkZSAiZ2RiY21kLmgiCisj aW5jbHVkZSAicmVnY2FjaGUuaCIKKyNpbmNsdWRlICJnZGJ0aHJlYWQuaCIK KyNpbmNsdWRlICJldmVudC10b3AuaCIKKyNpbmNsdWRlICJleGNlcHRpb25z LmgiCisjaW5jbHVkZSAicmVjb3JkLmgiCisKKyNpbmNsdWRlIDxzaWduYWwu aD4KKworI2RlZmluZSBERUZBVUxUX1JFQ09SRF9JTlNOX01BWF9OVU0JMjAw MDAwCisKKyNkZWZpbmUgUkVDT1JEX0lTX1JFUExBWSBcCisgICAgIChyZWNv cmRfbGlzdC0+bmV4dCB8fCBleGVjdXRpb25fZGlyZWN0aW9uID09IEVYRUNf UkVWRVJTRSkKKworLyogVGhpcyBpcyB0aGUgZGVidWcgc3dpdGNoIGZvciBw cm9jZXNzIHJlY29yZC4gICovCitpbnQgcmVjb3JkX2RlYnVnID0gMDsKKwor LyogVGhpcyBpcyByZWdjYWNoZSBpcyB1c2VkIGJ5IHJlY29yZF9tZXNzYWdl LCByZWNvcmRfYXJjaF9saXN0X2FkZF9yZWcKKyAgIGFuZCBnZGJhcmNoX3By b2Nlc3NfcmVjb3JkIHRvIGluY3JlYXNlIHRoZSBzcGVlZCB0aGF0IGFjY2Vz cyB0byB0aGUKKyAgIHZhbHVlIG9mIHRoZSByZWdpc3RlcnMuICAqLworc3Ry dWN0IHJlZ2NhY2hlICpyZWNvcmRfcmVnY2FjaGUgPSBOVUxMOworCisvKiBU aGVzZSBsaXN0IGlzIGZvciBleGVjdXRpb24gbG9nLiAgKi8KK3N0YXRpYyBy ZWNvcmRfdCByZWNvcmRfZmlyc3Q7CitzdGF0aWMgcmVjb3JkX3QgKnJlY29y ZF9saXN0ID0gJnJlY29yZF9maXJzdDsKK3N0YXRpYyByZWNvcmRfdCAqcmVj b3JkX2FyY2hfbGlzdF9oZWFkID0gTlVMTDsKK3N0YXRpYyByZWNvcmRfdCAq cmVjb3JkX2FyY2hfbGlzdF90YWlsID0gTlVMTDsKKworLyogMSBhc2sgdXNl ci4gMCBhdXRvIGRlbGV0ZSB0aGUgbGFzdCByZWNvcmRfdC4gICovCitzdGF0 aWMgaW50IHJlY29yZF9zdG9wX2F0X2xpbWl0ID0gMTsKK3N0YXRpYyBpbnQg cmVjb3JkX2luc25fbWF4X251bSA9IERFRkFVTFRfUkVDT1JEX0lOU05fTUFY X05VTTsKK3N0YXRpYyBpbnQgcmVjb3JkX2luc25fbnVtID0gMDsKKworLyog VGhlIHRhcmdldF9vcHMgb2YgcHJvY2VzcyByZWNvcmQuICAqLworc3RhdGlj IHN0cnVjdCB0YXJnZXRfb3BzIHJlY29yZF9vcHM7CisKKy8qIFRoZSBiZW5l YXRoIGZ1bmN0aW9uIHBvaW50ZXJzLiAgKi8KK3N0YXRpYyBzdHJ1Y3QgdGFy Z2V0X29wcyAqcmVjb3JkX2JlbmVhdGhfdG9fcmVzdW1lX29wczsKK3N0YXRp YyB2b2lkICgqcmVjb3JkX2JlbmVhdGhfdG9fcmVzdW1lKSAoc3RydWN0IHRh cmdldF9vcHMgKiwgcHRpZF90LCBpbnQsCisgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIGVudW0gdGFyZ2V0X3NpZ25hbCk7Citz dGF0aWMgc3RydWN0IHRhcmdldF9vcHMgKnJlY29yZF9iZW5lYXRoX3RvX3dh aXRfb3BzOworc3RhdGljIHB0aWRfdCAoKnJlY29yZF9iZW5lYXRoX3RvX3dh aXQpIChzdHJ1Y3QgdGFyZ2V0X29wcyAqLCBwdGlkX3QsCisJCQkJCSBzdHJ1 Y3QgdGFyZ2V0X3dhaXRzdGF0dXMgKik7CitzdGF0aWMgc3RydWN0IHRhcmdl dF9vcHMgKnJlY29yZF9iZW5lYXRoX3RvX3N0b3JlX3JlZ2lzdGVyc19vcHM7 CitzdGF0aWMgdm9pZCAoKnJlY29yZF9iZW5lYXRoX3RvX3N0b3JlX3JlZ2lz dGVycykgKHN0cnVjdCB0YXJnZXRfb3BzICosCisgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCByZWdj YWNoZSAqLAorCQkJCQkJICBpbnQgcmVnbm8pOworc3RhdGljIHN0cnVjdCB0 YXJnZXRfb3BzICpyZWNvcmRfYmVuZWF0aF90b194ZmVyX3BhcnRpYWxfb3Bz Oworc3RhdGljIExPTkdFU1QgKCpyZWNvcmRfYmVuZWF0aF90b194ZmVyX3Bh cnRpYWwpIChzdHJ1Y3QgdGFyZ2V0X29wcyAqIG9wcywKKwkJCQkJCSAgZW51 bSB0YXJnZXRfb2JqZWN0IG9iamVjdCwKKwkJCQkJCSAgY29uc3QgY2hhciAq YW5uZXgsCisJCQkJCQkgIGdkYl9ieXRlICogcmVhZGJ1ZiwKKwkJCQkJCSAg Y29uc3QgZ2RiX2J5dGUgKiB3cml0ZWJ1ZiwKKwkJCQkJCSAgVUxPTkdFU1Qg b2Zmc2V0LAorCQkJCQkJICBMT05HRVNUIGxlbik7CitzdGF0aWMgaW50ICgq cmVjb3JkX2JlbmVhdGhfdG9faW5zZXJ0X2JyZWFrcG9pbnQpIChzdHJ1Y3Qg YnBfdGFyZ2V0X2luZm8gKik7CitzdGF0aWMgaW50ICgqcmVjb3JkX2JlbmVh dGhfdG9fcmVtb3ZlX2JyZWFrcG9pbnQpIChzdHJ1Y3QgYnBfdGFyZ2V0X2lu Zm8gKik7CisKK3N0YXRpYyB2b2lkCityZWNvcmRfbGlzdF9yZWxlYXNlIChy ZWNvcmRfdCAqIHJlYykKK3sKKyAgcmVjb3JkX3QgKnRtcDsKKworICBpZiAo IXJlYykKKyAgICByZXR1cm47CisKKyAgd2hpbGUgKHJlYy0+bmV4dCkKKyAg ICB7CisgICAgICByZWMgPSByZWMtPm5leHQ7CisgICAgfQorCisgIHdoaWxl IChyZWMtPnByZXYpCisgICAgeworICAgICAgdG1wID0gcmVjOworICAgICAg cmVjID0gcmVjLT5wcmV2OworICAgICAgaWYgKHRtcC0+dHlwZSA9PSByZWNv cmRfcmVnKQorCXhmcmVlICh0bXAtPnUucmVnLnZhbCk7CisgICAgICBlbHNl IGlmICh0bXAtPnR5cGUgPT0gcmVjb3JkX21lbSkKKwl4ZnJlZSAodG1wLT51 Lm1lbS52YWwpOworICAgICAgeGZyZWUgKHRtcCk7CisgICAgfQorCisgIGlm IChyZWMgIT0gJnJlY29yZF9maXJzdCkKKyAgICB4ZnJlZSAocmVjKTsKK30K Kworc3RhdGljIHZvaWQKK3JlY29yZF9saXN0X3JlbGVhc2VfbmV4dCAodm9p ZCkKK3sKKyAgcmVjb3JkX3QgKnJlYyA9IHJlY29yZF9saXN0OworICByZWNv cmRfdCAqdG1wID0gcmVjLT5uZXh0OworICByZWMtPm5leHQgPSBOVUxMOwor ICB3aGlsZSAodG1wKQorICAgIHsKKyAgICAgIHJlYyA9IHRtcC0+bmV4dDsK KyAgICAgIGlmICh0bXAtPnR5cGUgPT0gcmVjb3JkX3JlZykKKwlyZWNvcmRf aW5zbl9udW0tLTsKKyAgICAgIGVsc2UgaWYgKHRtcC0+dHlwZSA9PSByZWNv cmRfcmVnKQorCXhmcmVlICh0bXAtPnUucmVnLnZhbCk7CisgICAgICBlbHNl IGlmICh0bXAtPnR5cGUgPT0gcmVjb3JkX21lbSkKKwl4ZnJlZSAodG1wLT51 Lm1lbS52YWwpOworICAgICAgeGZyZWUgKHRtcCk7CisgICAgICB0bXAgPSBy ZWM7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorcmVjb3JkX2xpc3RfcmVs ZWFzZV9maXJzdCAodm9pZCkKK3sKKyAgcmVjb3JkX3QgKnRtcCA9IE5VTEw7 CisgIGVudW0gcmVjb3JkX3R5cGUgdHlwZTsKKworICBpZiAoIXJlY29yZF9m aXJzdC5uZXh0KQorICAgIHJldHVybjsKKworICB3aGlsZSAoMSkKKyAgICB7 CisgICAgICB0eXBlID0gcmVjb3JkX2ZpcnN0Lm5leHQtPnR5cGU7CisKKyAg ICAgIGlmICh0eXBlID09IHJlY29yZF9yZWcpCisJeGZyZWUgKHJlY29yZF9m aXJzdC5uZXh0LT51LnJlZy52YWwpOworICAgICAgZWxzZSBpZiAodHlwZSA9 PSByZWNvcmRfbWVtKQorCXhmcmVlIChyZWNvcmRfZmlyc3QubmV4dC0+dS5t ZW0udmFsKTsKKyAgICAgIHRtcCA9IHJlY29yZF9maXJzdC5uZXh0OworICAg ICAgcmVjb3JkX2ZpcnN0Lm5leHQgPSB0bXAtPm5leHQ7CisgICAgICB4ZnJl ZSAodG1wKTsKKworICAgICAgaWYgKCFyZWNvcmRfZmlyc3QubmV4dCkKKwl7 CisJICBnZGJfYXNzZXJ0IChyZWNvcmRfaW5zbl9udW0gPT0gMSk7CisJICBi cmVhazsKKwl9CisKKyAgICAgIHJlY29yZF9maXJzdC5uZXh0LT5wcmV2ID0g JnJlY29yZF9maXJzdDsKKworICAgICAgaWYgKHR5cGUgPT0gcmVjb3JkX2Vu ZCkKKwlicmVhazsKKyAgICB9CisKKyAgcmVjb3JkX2luc25fbnVtLS07Cit9 CisKKy8qIEFkZCBhIHJlY29yZF90IHRvIHJlY29yZF9hcmNoX2xpc3QuICAq Lworc3RhdGljIHZvaWQKK3JlY29yZF9hcmNoX2xpc3RfYWRkIChyZWNvcmRf dCAqIHJlYykKK3sKKyAgaWYgKHJlY29yZF9kZWJ1ZyA+IDEpCisgICAgZnBy aW50Zl91bmZpbHRlcmVkIChnZGJfc3RkbG9nLAorCQkJIlByb2Nlc3MgcmVj b3JkOiByZWNvcmRfYXJjaF9saXN0X2FkZCAlcy5cbiIsCisJCQlob3N0X2Fk ZHJlc3NfdG9fc3RyaW5nIChyZWMpKTsKKworICBpZiAocmVjb3JkX2FyY2hf bGlzdF90YWlsKQorICAgIHsKKyAgICAgIHJlY29yZF9hcmNoX2xpc3RfdGFp bC0+bmV4dCA9IHJlYzsKKyAgICAgIHJlYy0+cHJldiA9IHJlY29yZF9hcmNo X2xpc3RfdGFpbDsKKyAgICAgIHJlY29yZF9hcmNoX2xpc3RfdGFpbCA9IHJl YzsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICByZWNvcmRfYXJjaF9s aXN0X2hlYWQgPSByZWM7CisgICAgICByZWNvcmRfYXJjaF9saXN0X3RhaWwg PSByZWM7CisgICAgfQorfQorCisvKiBSZWNvcmQgdGhlIHZhbHVlIG9mIGEg cmVnaXN0ZXIgTlVNIHRvIHJlY29yZF9hcmNoX2xpc3QuICAqLworaW50City ZWNvcmRfYXJjaF9saXN0X2FkZF9yZWcgKGludCBudW0pCit7CisgIHJlY29y ZF90ICpyZWM7CisKKyAgaWYgKHJlY29yZF9kZWJ1ZyA+IDEpCisgICAgZnBy aW50Zl91bmZpbHRlcmVkIChnZGJfc3RkbG9nLAorCQkJIlByb2Nlc3MgcmVj b3JkOiBhZGQgcmVnaXN0ZXIgbnVtID0gJWQgdG8gIgorCQkJInJlY29yZCBs aXN0LlxuIiwKKwkJCW51bSk7CisKKyAgcmVjID0gKHJlY29yZF90ICopIHht YWxsb2MgKHNpemVvZiAocmVjb3JkX3QpKTsKKyAgcmVjLT51LnJlZy52YWwg PSAoZ2RiX2J5dGUgKikgeG1hbGxvYyAoTUFYX1JFR0lTVEVSX1NJWkUpOwor ICByZWMtPnByZXYgPSBOVUxMOworICByZWMtPm5leHQgPSBOVUxMOworICBy ZWMtPnR5cGUgPSByZWNvcmRfcmVnOworICByZWMtPnUucmVnLm51bSA9IG51 bTsKKworICByZWdjYWNoZV9yYXdfcmVhZCAocmVjb3JkX3JlZ2NhY2hlLCBu dW0sIHJlYy0+dS5yZWcudmFsKTsKKworICByZWNvcmRfYXJjaF9saXN0X2Fk ZCAocmVjKTsKKworICByZXR1cm4gMDsKK30KKworLyogUmVjb3JkIHRoZSB2 YWx1ZSBvZiBhIHJlZ2lvbiBvZiBtZW1vcnkgd2hvc2UgYWRkcmVzcyBpcyBB RERSIGFuZAorICAgbGVuZ3RoIGlzIExFTiB0byByZWNvcmRfYXJjaF9saXN0 LiAgKi8KKworaW50CityZWNvcmRfYXJjaF9saXN0X2FkZF9tZW0gKENPUkVf QUREUiBhZGRyLCBpbnQgbGVuKQoreworICByZWNvcmRfdCAqcmVjOworCisg IGlmIChyZWNvcmRfZGVidWcgPiAxKQorICAgIGZwcmludGZfdW5maWx0ZXJl ZCAoZ2RiX3N0ZGxvZywKKwkJCSJQcm9jZXNzIHJlY29yZDogYWRkIG1lbSBh ZGRyID0gMHglcyBsZW4gPSAlZCB0byAiCisJCQkicmVjb3JkIGxpc3QuXG4i LAorCQkJcGFkZHJfbnogKGFkZHIpLCBsZW4pOworCisgIGlmICghYWRkcikK KyAgICByZXR1cm4gMDsKKworICByZWMgPSAocmVjb3JkX3QgKikgeG1hbGxv YyAoc2l6ZW9mIChyZWNvcmRfdCkpOworICByZWMtPnUubWVtLnZhbCA9IChn ZGJfYnl0ZSAqKSB4bWFsbG9jIChsZW4pOworICByZWMtPnByZXYgPSBOVUxM OworICByZWMtPm5leHQgPSBOVUxMOworICByZWMtPnR5cGUgPSByZWNvcmRf bWVtOworICByZWMtPnUubWVtLmFkZHIgPSBhZGRyOworICByZWMtPnUubWVt LmxlbiA9IGxlbjsKKworICBpZiAodGFyZ2V0X3JlYWRfbWVtb3J5IChhZGRy LCByZWMtPnUubWVtLnZhbCwgbGVuKSkKKyAgICB7CisgICAgICBpZiAocmVj b3JkX2RlYnVnKQorCWZwcmludGZfdW5maWx0ZXJlZCAoZ2RiX3N0ZGxvZywK KwkJCSAgICAiUHJvY2VzcyByZWNvcmQ6IGVycm9yIHJlYWRpbmcgbWVtb3J5 IGF0ICIKKwkJCSAgICAiYWRkciA9IDB4JXMgbGVuID0gJWQuXG4iLAorCQkJ ICAgIHBhZGRyX256IChhZGRyKSwgbGVuKTsKKyAgICAgIHhmcmVlIChyZWMt PnUubWVtLnZhbCk7CisgICAgICB4ZnJlZSAocmVjKTsKKyAgICAgIHJldHVy biAtMTsKKyAgICB9CisKKyAgcmVjb3JkX2FyY2hfbGlzdF9hZGQgKHJlYyk7 CisKKyAgcmV0dXJuIDA7Cit9CisKKy8qIEFkZCBhIHJlY29yZF9lbmQgdHlw ZSByZWNvcmRfdCB0byByZWNvcmRfYXJjaF9saXN0LiAgKi8KK2ludAorcmVj b3JkX2FyY2hfbGlzdF9hZGRfZW5kICh2b2lkKQoreworICByZWNvcmRfdCAq cmVjOworCisgIGlmIChyZWNvcmRfZGVidWcgPiAxKQorICAgIGZwcmludGZf dW5maWx0ZXJlZCAoZ2RiX3N0ZGxvZywKKwkJCSJQcm9jZXNzIHJlY29yZDog YWRkIGVuZCB0byBhcmNoIGxpc3QuXG4iKTsKKworICByZWMgPSAocmVjb3Jk X3QgKikgeG1hbGxvYyAoc2l6ZW9mIChyZWNvcmRfdCkpOworICByZWMtPnBy ZXYgPSBOVUxMOworICByZWMtPm5leHQgPSBOVUxMOworICByZWMtPnR5cGUg PSByZWNvcmRfZW5kOworCisgIHJlY29yZF9hcmNoX2xpc3RfYWRkIChyZWMp OworCisgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorcmVjb3JkX2No ZWNrX2luc25fbnVtIChpbnQgc2V0X3Rlcm1pbmFsKQoreworICBpZiAocmVj b3JkX2luc25fbWF4X251bSkKKyAgICB7CisgICAgICBnZGJfYXNzZXJ0IChy ZWNvcmRfaW5zbl9udW0gPD0gcmVjb3JkX2luc25fbWF4X251bSk7CisgICAg ICBpZiAocmVjb3JkX2luc25fbnVtID09IHJlY29yZF9pbnNuX21heF9udW0p CisJeworCSAgLyogQXNrIHVzZXIgd2hhdCB0byBkby4gICovCisJICBpZiAo cmVjb3JkX3N0b3BfYXRfbGltaXQpCisJICAgIHsKKwkgICAgICBpbnQgcTsK KwkgICAgICBpZiAoc2V0X3Rlcm1pbmFsKQorCQl0YXJnZXRfdGVybWluYWxf b3VycyAoKTsKKwkgICAgICBxID0geXF1ZXJ5IChfKCJEbyB5b3Ugd2FudCB0 byBhdXRvIGRlbGV0ZSBwcmV2aW91cyBleGVjdXRpb24gIgorCQkJICAgICJs b2cgZW50cmllcyB3aGVuIHJlY29yZC9yZXBsYXkgYnVmZmVyIGJlY29tZXMg IgorCQkJICAgICJmdWxsIChyZWNvcmQtc3RvcC1hdC1saW1pdCk/IikpOwor CSAgICAgIGlmIChzZXRfdGVybWluYWwpCisJCXRhcmdldF90ZXJtaW5hbF9p bmZlcmlvciAoKTsKKwkgICAgICBpZiAocSkKKwkJcmVjb3JkX3N0b3BfYXRf bGltaXQgPSAwOworCSAgICAgIGVsc2UKKwkJZXJyb3IgKF8oIlByb2Nlc3Mg cmVjb3JkOiBpbmZlcmlvciBwcm9ncmFtIHN0b3BwZWQuIikpOworCSAgICB9 CisJfQorICAgIH0KK30KKworLyogQmVmb3JlIGluZmVyaW9yIHN0ZXAgKHdo ZW4gR0RCIHJlY29yZCB0aGUgcnVubmluZyBtZXNzYWdlLCBpbmZlcmlvcgor ICAgb25seSBjYW4gc3RlcCksIEdEQiB3aWxsIGNhbGwgdGhpcyBmdW5jdGlv biB0byByZWNvcmQgdGhlIHZhbHVlcyB0bworICAgcmVjb3JkX2xpc3QuICBU aGlzIGZ1bmN0aW9uIHdpbGwgY2FsbCBnZGJhcmNoX3Byb2Nlc3NfcmVjb3Jk IHRvCisgICByZWNvcmQgdGhlIHJ1bm5pbmcgbWVzc2FnZSBvZiBpbmZlcmlv ciBhbmQgc2V0IHRoZW0gdG8KKyAgIHJlY29yZF9hcmNoX2xpc3QsIGFuZCBh ZGQgaXQgdG8gcmVjb3JkX2xpc3QuICAqLworCitzdGF0aWMgdm9pZAorcmVj b3JkX21lc3NhZ2VfY2xlYW51cHMgKHZvaWQgKmlnbm9yZSkKK3sKKyAgcmVj b3JkX2xpc3RfcmVsZWFzZSAocmVjb3JkX2FyY2hfbGlzdF90YWlsKTsKK30K Kworc3RhdGljIGludAorcmVjb3JkX21lc3NhZ2UgKHZvaWQgKmFyZ3MpCit7 CisgIGludCByZXQ7CisgIHN0cnVjdCBnZGJhcmNoICpnZGJhcmNoID0gYXJn czsKKyAgc3RydWN0IGNsZWFudXAgKm9sZF9jbGVhbnVwcyA9IG1ha2VfY2xl YW51cCAocmVjb3JkX21lc3NhZ2VfY2xlYW51cHMsIDApOworCisgIHJlY29y ZF9hcmNoX2xpc3RfaGVhZCA9IE5VTEw7CisgIHJlY29yZF9hcmNoX2xpc3Rf dGFpbCA9IE5VTEw7CisKKyAgLyogQ2hlY2sgcmVjb3JkX2luc25fbnVtLiAg Ki8KKyAgcmVjb3JkX2NoZWNrX2luc25fbnVtICgxKTsKKworICByZWNvcmRf cmVnY2FjaGUgPSBnZXRfY3VycmVudF9yZWdjYWNoZSAoKTsKKworICByZXQg PSBnZGJhcmNoX3Byb2Nlc3NfcmVjb3JkIChnZGJhcmNoLAorCQkJCXJlZ2Nh Y2hlX3JlYWRfcGMgKHJlY29yZF9yZWdjYWNoZSkpOworICBpZiAocmV0ID4g MCkKKyAgICBlcnJvciAoXygiUHJvY2VzcyByZWNvcmQ6IGluZmVyaW9yIHBy b2dyYW0gc3RvcHBlZC4iKSk7CisgIGlmIChyZXQgPCAwKQorICAgIGVycm9y IChfKCJQcm9jZXNzIHJlY29yZDogZmFpbGVkIHRvIHJlY29yZCBleGVjdXRp b24gbG9nLiIpKTsKKworICBkaXNjYXJkX2NsZWFudXBzIChvbGRfY2xlYW51 cHMpOworCisgIHJlY29yZF9saXN0LT5uZXh0ID0gcmVjb3JkX2FyY2hfbGlz dF9oZWFkOworICByZWNvcmRfYXJjaF9saXN0X2hlYWQtPnByZXYgPSByZWNv cmRfbGlzdDsKKyAgcmVjb3JkX2xpc3QgPSByZWNvcmRfYXJjaF9saXN0X3Rh aWw7CisKKyAgaWYgKHJlY29yZF9pbnNuX251bSA9PSByZWNvcmRfaW5zbl9t YXhfbnVtICYmIHJlY29yZF9pbnNuX21heF9udW0pCisgICAgcmVjb3JkX2xp c3RfcmVsZWFzZV9maXJzdCAoKTsKKyAgZWxzZQorICAgIHJlY29yZF9pbnNu X251bSsrOworCisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50Citkb19y ZWNvcmRfbWVzc2FnZSAoc3RydWN0IGdkYmFyY2ggKmdkYmFyY2gpCit7Cisg IHJldHVybiBjYXRjaF9lcnJvcnMgKHJlY29yZF9tZXNzYWdlLCBnZGJhcmNo LCBOVUxMLCBSRVRVUk5fTUFTS19BTEwpOworfQorCisvKiBTZXQgdG8gMSBp ZiByZWNvcmRfc3RvcmVfcmVnaXN0ZXJzIGFuZCByZWNvcmRfeGZlcl9wYXJ0 aWFsCisgICBkb2Vzbid0IG5lZWQgcmVjb3JkLiAgKi8KKworc3RhdGljIGlu dCByZWNvcmRfZ2RiX29wZXJhdGlvbl9kaXNhYmxlID0gMDsKKworc3RydWN0 IGNsZWFudXAgKgorcmVjb3JkX2dkYl9vcGVyYXRpb25fZGlzYWJsZV9zZXQg KHZvaWQpCit7CisgIHN0cnVjdCBjbGVhbnVwICpvbGRfY2xlYW51cHM7CisK KyAgcmVjb3JkX2dkYl9vcGVyYXRpb25fZGlzYWJsZSA9IDA7CisgIG9sZF9j bGVhbnVwcyA9CisgICAgbWFrZV9jbGVhbnVwX3Jlc3RvcmVfaW50ZWdlciAo JnJlY29yZF9nZGJfb3BlcmF0aW9uX2Rpc2FibGUpOworICByZWNvcmRfZ2Ri X29wZXJhdGlvbl9kaXNhYmxlID0gMTsKKworICByZXR1cm4gb2xkX2NsZWFu dXBzOworfQorCitzdGF0aWMgdm9pZAorcmVjb3JkX29wZW4gKGNoYXIgKm5h bWUsIGludCBmcm9tX3R0eSkKK3sKKyAgc3RydWN0IHRhcmdldF9vcHMgKnQ7 CisKKyAgaWYgKHJlY29yZF9kZWJ1ZykKKyAgICBmcHJpbnRmX3VuZmlsdGVy ZWQgKGdkYl9zdGRsb2csICJQcm9jZXNzIHJlY29yZDogcmVjb3JkX29wZW5c biIpOworCisgIC8qIGNoZWNrIGV4ZWMgKi8KKyAgaWYgKCF0YXJnZXRfaGFz X2V4ZWN1dGlvbikKKyAgICBlcnJvciAoXygiUHJvY2VzcyByZWNvcmQ6IHRo ZSBwcm9ncmFtIGlzIG5vdCBiZWluZyBydW4uIikpOworICBpZiAobm9uX3N0 b3ApCisgICAgZXJyb3IgKF8oIlByb2Nlc3MgcmVjb3JkIHRhcmdldCBjYW4n dCBkZWJ1ZyBpbmZlcmlvciBpbiBub24tc3RvcCBtb2RlICIKKwkgICAgICIo bm9uLXN0b3ApLiIpKTsKKyAgaWYgKHRhcmdldF9hc3luY19wZXJtaXR0ZWQp CisgICAgZXJyb3IgKF8oIlByb2Nlc3MgcmVjb3JkIHRhcmdldCBjYW4ndCBk ZWJ1ZyBpbmZlcmlvciBpbiBhc3luY2hyb25vdXMgIgorCSAgICAgIm1vZGUg KHRhcmdldC1hc3luYykuIikpOworCisgIGlmICghZ2RiYXJjaF9wcm9jZXNz X3JlY29yZF9wIChjdXJyZW50X2dkYmFyY2gpKQorICAgIGVycm9yIChfKCJQ cm9jZXNzIHJlY29yZDogdGhlIGN1cnJlbnQgYXJjaGl0ZWN0dXJlIGRvZXNu J3Qgc3VwcG9ydCAiCisJICAgICAicmVjb3JkIGZ1bmN0aW9uLiIpKTsKKwor ICAvKiBDaGVjayBpZiByZWNvcmQgdGFyZ2V0IGlzIGFscmVhZHkgcnVubmlu Zy4gICovCisgIGlmIChjdXJyZW50X3RhcmdldC50b19zdHJhdHVtID09IHJl Y29yZF9zdHJhdHVtKQorICAgIHsKKyAgICAgIGlmICghbnF1ZXJ5CisJICAo XygiUHJvY2VzcyByZWNvcmQgdGFyZ2V0IGFscmVhZHkgcnVubmluZywgZG8g eW91IHdhbnQgdG8gZGVsZXRlICIKKwkgICAgICJ0aGUgb2xkIHJlY29yZCBs b2c/IikpKQorCXJldHVybjsKKyAgICB9CisKKyAgLypSZXNldCB0aGUgYmVu ZWF0aCBmdW5jdGlvbiBwb2ludGVycy4gICovCisgIHJlY29yZF9iZW5lYXRo X3RvX3Jlc3VtZSA9IE5VTEw7CisgIHJlY29yZF9iZW5lYXRoX3RvX3dhaXQg PSBOVUxMOworICByZWNvcmRfYmVuZWF0aF90b19zdG9yZV9yZWdpc3RlcnMg PSBOVUxMOworICByZWNvcmRfYmVuZWF0aF90b194ZmVyX3BhcnRpYWwgPSBO VUxMOworICByZWNvcmRfYmVuZWF0aF90b19pbnNlcnRfYnJlYWtwb2ludCA9 IE5VTEw7CisgIHJlY29yZF9iZW5lYXRoX3RvX3JlbW92ZV9icmVha3BvaW50 ID0gTlVMTDsKKworICAvKiBTZXQgdGhlIGJlbmVhdGggZnVuY3Rpb24gcG9p bnRlcnMuICAqLworICBmb3IgKHQgPSBjdXJyZW50X3RhcmdldC5iZW5lYXRo OyB0ICE9IE5VTEw7IHQgPSB0LT5iZW5lYXRoKQorICAgIHsKKyAgICAgIGlm ICghcmVjb3JkX2JlbmVhdGhfdG9fcmVzdW1lKQorICAgICAgICB7CisJICBy ZWNvcmRfYmVuZWF0aF90b19yZXN1bWUgPSB0LT50b19yZXN1bWU7CisJICBy ZWNvcmRfYmVuZWF0aF90b19yZXN1bWVfb3BzID0gdDsKKyAgICAgICAgfQor ICAgICAgaWYgKCFyZWNvcmRfYmVuZWF0aF90b193YWl0KQorICAgICAgICB7 CisJICByZWNvcmRfYmVuZWF0aF90b193YWl0ID0gdC0+dG9fd2FpdDsKKwkg IHJlY29yZF9iZW5lYXRoX3RvX3dhaXRfb3BzID0gdDsKKyAgICAgICAgfQor ICAgICAgaWYgKCFyZWNvcmRfYmVuZWF0aF90b19zdG9yZV9yZWdpc3RlcnMp CisgICAgICAgIHsKKwkgIHJlY29yZF9iZW5lYXRoX3RvX3N0b3JlX3JlZ2lz dGVycyA9IHQtPnRvX3N0b3JlX3JlZ2lzdGVyczsKKwkgIHJlY29yZF9iZW5l YXRoX3RvX3N0b3JlX3JlZ2lzdGVyc19vcHMgPSB0OworICAgICAgICB9Cisg ICAgICBpZiAoIXJlY29yZF9iZW5lYXRoX3RvX3hmZXJfcGFydGlhbCkKKyAg ICAgICAgeworCSAgcmVjb3JkX2JlbmVhdGhfdG9feGZlcl9wYXJ0aWFsID0g dC0+dG9feGZlcl9wYXJ0aWFsOworCSAgcmVjb3JkX2JlbmVhdGhfdG9feGZl cl9wYXJ0aWFsX29wcyA9IHQ7CisgICAgICAgIH0KKyAgICAgIGlmICghcmVj b3JkX2JlbmVhdGhfdG9faW5zZXJ0X2JyZWFrcG9pbnQpCisJcmVjb3JkX2Jl bmVhdGhfdG9faW5zZXJ0X2JyZWFrcG9pbnQgPSB0LT50b19pbnNlcnRfYnJl YWtwb2ludDsKKyAgICAgIGlmICghcmVjb3JkX2JlbmVhdGhfdG9fcmVtb3Zl X2JyZWFrcG9pbnQpCisJcmVjb3JkX2JlbmVhdGhfdG9fcmVtb3ZlX2JyZWFr cG9pbnQgPSB0LT50b19yZW1vdmVfYnJlYWtwb2ludDsKKyAgICB9CisgIGlm ICghcmVjb3JkX2JlbmVhdGhfdG9fcmVzdW1lKQorICAgIGVycm9yIChfKCJQ cm9jZXNzIHJlY29yZCBjYW4ndCBnZXQgdG9fcmVzdW1lLiIpKTsKKyAgaWYg KCFyZWNvcmRfYmVuZWF0aF90b193YWl0KQorICAgIGVycm9yIChfKCJQcm9j ZXNzIHJlY29yZCBjYW4ndCBnZXQgdG9fd2FpdC4iKSk7CisgIGlmICghcmVj b3JkX2JlbmVhdGhfdG9fc3RvcmVfcmVnaXN0ZXJzKQorICAgIGVycm9yIChf KCJQcm9jZXNzIHJlY29yZCBjYW4ndCBnZXQgdG9fc3RvcmVfcmVnaXN0ZXJz LiIpKTsKKyAgaWYgKCFyZWNvcmRfYmVuZWF0aF90b194ZmVyX3BhcnRpYWwp CisgICAgZXJyb3IgKF8oIlByb2Nlc3MgcmVjb3JkIGNhbid0IGdldCB0b194 ZmVyX3BhcnRpYWwuIikpOworICBpZiAoIXJlY29yZF9iZW5lYXRoX3RvX2lu c2VydF9icmVha3BvaW50KQorICAgIGVycm9yIChfKCJQcm9jZXNzIHJlY29y ZCBjYW4ndCBnZXQgdG9faW5zZXJ0X2JyZWFrcG9pbnQuIikpOworICBpZiAo IXJlY29yZF9iZW5lYXRoX3RvX3JlbW92ZV9icmVha3BvaW50KQorICAgIGVy cm9yIChfKCJQcm9jZXNzIHJlY29yZCBjYW4ndCBnZXQgdG9fcmVtb3ZlX2Jy ZWFrcG9pbnQuIikpOworCisgIHB1c2hfdGFyZ2V0ICgmcmVjb3JkX29wcyk7 CisKKyAgLyogUmVzZXQgKi8KKyAgcmVjb3JkX2luc25fbnVtID0gMDsKKyAg cmVjb3JkX2xpc3QgPSAmcmVjb3JkX2ZpcnN0OworICByZWNvcmRfbGlzdC0+ bmV4dCA9IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkCityZWNvcmRfY2xvc2Ug KGludCBxdWl0dGluZykKK3sKKyAgaWYgKHJlY29yZF9kZWJ1ZykKKyAgICBm cHJpbnRmX3VuZmlsdGVyZWQgKGdkYl9zdGRsb2csICJQcm9jZXNzIHJlY29y ZDogcmVjb3JkX2Nsb3NlXG4iKTsKKworICByZWNvcmRfbGlzdF9yZWxlYXNl IChyZWNvcmRfbGlzdCk7Cit9CisKK3N0YXRpYyBpbnQgcmVjb3JkX3Jlc3Vt ZV9zdGVwID0gMDsKK3N0YXRpYyBlbnVtIHRhcmdldF9zaWduYWwgcmVjb3Jk X3Jlc3VtZV9zaWdnbmFsOworc3RhdGljIGludCByZWNvcmRfcmVzdW1lX2Vy cm9yOworCitzdGF0aWMgdm9pZAorcmVjb3JkX3Jlc3VtZSAoc3RydWN0IHRh cmdldF9vcHMgKm9wcywgcHRpZF90IHB0aWQsIGludCBzdGVwLAorICAgICAg ICAgICAgICAgZW51bSB0YXJnZXRfc2lnbmFsIHNpZ2duYWwpCit7CisgIHJl Y29yZF9yZXN1bWVfc3RlcCA9IHN0ZXA7CisgIHJlY29yZF9yZXN1bWVfc2ln Z25hbCA9IHNpZ2duYWw7CisKKyAgaWYgKCFSRUNPUkRfSVNfUkVQTEFZKQor ICAgIHsKKyAgICAgIGlmIChkb19yZWNvcmRfbWVzc2FnZSAoY3VycmVudF9n ZGJhcmNoKSkKKyAgICAgICAgeworICAgICAgICAgIHJlY29yZF9yZXN1bWVf ZXJyb3IgPSAwOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsK KyAgICAgICAgICByZWNvcmRfcmVzdW1lX2Vycm9yID0gMTsKKyAgICAgICAg ICByZXR1cm47CisgICAgICAgIH0KKyAgICAgIHJlY29yZF9iZW5lYXRoX3Rv X3Jlc3VtZSAocmVjb3JkX2JlbmVhdGhfdG9fcmVzdW1lX29wcywgcHRpZCwg MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnZ25hbCk7 CisgICAgfQorfQorCitzdGF0aWMgaW50IHJlY29yZF9nZXRfc2lnID0gMDsK Kworc3RhdGljIHZvaWQKK3JlY29yZF9zaWdfaGFuZGxlciAoaW50IHNpZ25v KQoreworICBpZiAocmVjb3JkX2RlYnVnKQorICAgIGZwcmludGZfdW5maWx0 ZXJlZCAoZ2RiX3N0ZGxvZywgIlByb2Nlc3MgcmVjb3JkOiBnZXQgYSBzaWdu YWxcbiIpOworCisgIC8qIEl0IHdpbGwgYnJlYWsgdGhlIHJ1bm5pbmcgaW5m ZXJpb3IgaW4gcmVwbGF5IG1vZGUuICAqLworICByZWNvcmRfcmVzdW1lX3N0 ZXAgPSAxOworCisgIC8qIEl0IHdpbGwgbGV0IHJlY29yZF93YWl0IHNldCBp bmZlcmlvciBzdGF0dXMgdG8gZ2V0IHRoZSBzaWduYWwKKyAgICAgU0lHSU5U LiAgKi8KKyAgcmVjb3JkX2dldF9zaWcgPSAxOworfQorCitzdGF0aWMgdm9p ZAorcmVjb3JkX3dhaXRfY2xlYW51cHMgKHZvaWQgKmlnbm9yZSkKK3sKKyAg aWYgKGV4ZWN1dGlvbl9kaXJlY3Rpb24gPT0gRVhFQ19SRVZFUlNFKQorICAg IHsKKyAgICAgIGlmIChyZWNvcmRfbGlzdC0+bmV4dCkKKwlyZWNvcmRfbGlz dCA9IHJlY29yZF9saXN0LT5uZXh0OworICAgIH0KKyAgZWxzZQorICAgIHJl Y29yZF9saXN0ID0gcmVjb3JkX2xpc3QtPnByZXY7Cit9CisKKy8qIEluIHJl cGxheSBtb2RlLCB0aGlzIGZ1bmN0aW9uIGV4YW1pbmVzIHRoZSByZWNvcmRl ZCBsb2cgYW5kCisgICBkZXRlcm1pbmVzIHdoZXJlIHRvIHN0b3AuICAqLwor CitzdGF0aWMgcHRpZF90CityZWNvcmRfd2FpdCAoc3RydWN0IHRhcmdldF9v cHMgKm9wcywKKyAgICAgICAgICAgICAgcHRpZF90IHB0aWQsIHN0cnVjdCB0 YXJnZXRfd2FpdHN0YXR1cyAqc3RhdHVzKQoreworICBzdHJ1Y3QgY2xlYW51 cCAqc2V0X2NsZWFudXBzID0gcmVjb3JkX2dkYl9vcGVyYXRpb25fZGlzYWJs ZV9zZXQgKCk7CisKKyAgaWYgKHJlY29yZF9kZWJ1ZykKKyAgICBmcHJpbnRm X3VuZmlsdGVyZWQgKGdkYl9zdGRsb2csCisJCQkiUHJvY2VzcyByZWNvcmQ6 IHJlY29yZF93YWl0ICIKKwkJCSJyZWNvcmRfcmVzdW1lX3N0ZXAgPSAlZFxu IiwKKwkJCXJlY29yZF9yZXN1bWVfc3RlcCk7CisKKyAgaWYgKCFSRUNPUkRf SVNfUkVQTEFZKQorICAgIHsKKyAgICAgIGlmIChyZWNvcmRfcmVzdW1lX2Vy cm9yKQorCXsKKwkgIC8qIElmIHJlY29yZF9yZXN1bWUgZ2V0IGVycm9yLCBy ZXR1cm4gZGlyZWN0bHkuICAqLworCSAgc3RhdHVzLT5raW5kID0gVEFSR0VU X1dBSVRLSU5EX1NUT1BQRUQ7CisJICBzdGF0dXMtPnZhbHVlLnNpZyA9IFRB UkdFVF9TSUdOQUxfVFJBUDsKKwkgIHJldHVybiBpbmZlcmlvcl9wdGlkOwor CX0KKworICAgICAgaWYgKHJlY29yZF9yZXN1bWVfc3RlcCkKKwl7CisJICAv KiBUaGlzIGlzIGEgc2luZ2xlIHN0ZXAuICAqLworCSAgcmV0dXJuIHJlY29y ZF9iZW5lYXRoX3RvX3dhaXQgKHJlY29yZF9iZW5lYXRoX3RvX3dhaXRfb3Bz LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgcHRpZCwgc3RhdHVzKTsKKwl9CisgICAgICBlbHNlCisJ eworCSAgLyogVGhpcyBpcyBub3QgYSBzaW5nbGUgc3RlcC4gICovCisJICBw dGlkX3QgcmV0OworCSAgQ09SRV9BRERSIHRtcF9wYzsKKworCSAgd2hpbGUg KDEpCisJICAgIHsKKwkgICAgICByZXQgPQorCQlyZWNvcmRfYmVuZWF0aF90 b193YWl0IChyZWNvcmRfYmVuZWF0aF90b193YWl0X29wcywgcHRpZCwKKwkJ CQkJc3RhdHVzKTsKKworCSAgICAgIGlmIChzdGF0dXMtPmtpbmQgPT0gVEFS R0VUX1dBSVRLSU5EX1NUT1BQRUQKKwkJICAmJiBzdGF0dXMtPnZhbHVlLnNp ZyA9PSBUQVJHRVRfU0lHTkFMX1RSQVApCisJCXsKKwkJICAvKiBDaGVjayBp ZiB0aGVyZSBpcyBhIGJyZWFrcG9pbnQuICAqLworCQkgIHJlZ2lzdGVyc19j aGFuZ2VkICgpOworCQkgIHRtcF9wYyA9IHJlYWRfcGMgKCk7CisJCSAgaWYg KGJyZWFrcG9pbnRfaW5zZXJ0ZWRfaGVyZV9wICh0bXBfcGMpKQorCQkgICAg eworCQkgICAgICAvKiBUaGVyZSBpcyBhIGJyZWFrcG9pbnQuICAqLworCQkg ICAgICBDT1JFX0FERFIgZGVjcl9wY19hZnRlcl9icmVhayA9CisJCQlnZGJh cmNoX2RlY3JfcGNfYWZ0ZXJfYnJlYWsgKGN1cnJlbnRfZ2RiYXJjaCk7CisJ CSAgICAgIGlmIChkZWNyX3BjX2FmdGVyX2JyZWFrKQorCQkJeworCQkJICBy ZWdjYWNoZV93cml0ZV9wYyAoZ2V0X3RocmVhZF9yZWdjYWNoZSAocmV0KSwK KwkJCQkJICAgICB0bXBfcGMgKyBkZWNyX3BjX2FmdGVyX2JyZWFrKTsKKwkJ CX0KKwkJICAgIH0KKwkJICBlbHNlCisJCSAgICB7CisJCSAgICAgIC8qIFRo ZXJlIGlzIG5vdCBhIGJyZWFrcG9pbnQuICAqLworCQkgICAgICBpZiAoIWRv X3JlY29yZF9tZXNzYWdlIChjdXJyZW50X2dkYmFyY2gpKQorCQkJeworICAg ICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKwkJCX0KKwkJICAgICAg cmVjb3JkX2JlbmVhdGhfdG9fcmVzdW1lIChyZWNvcmRfYmVuZWF0aF90b19y ZXN1bWVfb3BzLAorCQkJCQkJcHRpZCwgMSwKKwkJCQkJCXJlY29yZF9yZXN1 bWVfc2lnZ25hbCk7CisJCSAgICAgIGNvbnRpbnVlOworCQkgICAgfQorCQl9 CisKKwkgICAgICAvKiBUaGUgaW5mZXJpb3IgaXMgYnJva2VuIGJ5IGEgYnJl YWtwb2ludCBvciBhIHNpZ25hbC4gICovCisJICAgICAgYnJlYWs7CisJICAg IH0KKworCSAgcmV0dXJuIHJldDsKKwl9CisgICAgfQorICBlbHNlCisgICAg eworICAgICAgc3RydWN0IHJlZ2NhY2hlICpyZWdjYWNoZSA9IGdldF9jdXJy ZW50X3JlZ2NhY2hlICgpOworICAgICAgaW50IGNvbnRpbnVlX2ZsYWcgPSAx OworICAgICAgaW50IGZpcnN0X3JlY29yZF9lbmQgPSAxOworICAgICAgc3Ry dWN0IGNsZWFudXAgKm9sZF9jbGVhbnVwcyA9IG1ha2VfY2xlYW51cCAocmVj b3JkX3dhaXRfY2xlYW51cHMsIDApOworICAgICAgQ09SRV9BRERSIHRtcF9w YzsKKworICAgICAgc3RhdHVzLT5raW5kID0gVEFSR0VUX1dBSVRLSU5EX1NU T1BQRUQ7CisKKyAgICAgIC8qIENoZWNrIGJyZWFrcG9pbnQgd2hlbiBmb3J3 YXJkIGV4ZWN1dGUuICAqLworICAgICAgaWYgKGV4ZWN1dGlvbl9kaXJlY3Rp b24gPT0gRVhFQ19GT1JXQVJEKQorCXsKKwkgIHRtcF9wYyA9IHJlZ2NhY2hl X3JlYWRfcGMgKHJlZ2NhY2hlKTsKKwkgIGlmIChicmVha3BvaW50X2luc2Vy dGVkX2hlcmVfcCAodG1wX3BjKSkKKwkgICAgeworCSAgICAgIGlmIChyZWNv cmRfZGVidWcpCisJCWZwcmludGZfdW5maWx0ZXJlZCAoZ2RiX3N0ZGxvZywK KwkJCQkgICAgIlByb2Nlc3MgcmVjb3JkOiBicmVhayBhdCAweCVzLlxuIiwK KwkJCQkgICAgcGFkZHJfbnogKHRtcF9wYykpOworCSAgICAgIGlmIChnZGJh cmNoX2RlY3JfcGNfYWZ0ZXJfYnJlYWsgKGdldF9yZWdjYWNoZV9hcmNoIChy ZWdjYWNoZSkpCisJCSAgJiYgIXJlY29yZF9yZXN1bWVfc3RlcCkKKwkJcmVn Y2FjaGVfd3JpdGVfcGMgKHJlZ2NhY2hlLAorCQkJCSAgIHRtcF9wYyArCisJ CQkJICAgZ2RiYXJjaF9kZWNyX3BjX2FmdGVyX2JyZWFrCisJCQkJICAgKGdl dF9yZWdjYWNoZV9hcmNoIChyZWdjYWNoZSkpKTsKKwkgICAgICBnb3RvIHJl cGxheV9vdXQ7CisJICAgIH0KKwl9CisKKyAgICAgIHJlY29yZF9nZXRfc2ln ID0gMDsKKyAgICAgIHNpZ25hbCAoU0lHSU5ULCByZWNvcmRfc2lnX2hhbmRs ZXIpOworICAgICAgLyogSWYgR0RCIGlzIGluIHRlcm1pbmFsX2luZmVyaW9y IG1vZGUsIGl0IHdpbGwgbm90IGdldCB0aGUgc2lnbmFsLgorICAgICAgICAg QW5kIGluIEdEQiByZXBsYXkgbW9kZSwgR0RCIGRvZXNuJ3QgbmVlZCB0byBi ZSBpbiB0ZXJtaW5hbF9pbmZlcmlvcgorICAgICAgICAgbW9kZSwgYmVjYXVz ZSBpbmZlcmlvciB3aWxsIG5vdCBleGVjdXRlZC4KKyAgICAgICAgIFRoZW4g c2V0IGl0IHRvIHRlcm1pbmFsX291cnMgdG8gbWFrZSBHREIgZ2V0IHRoZSBz aWduYWwuICAqLworICAgICAgdGFyZ2V0X3Rlcm1pbmFsX291cnMgKCk7CisK KyAgICAgIC8qIEluIEVYRUNfRk9SV0FSRCBtb2RlLCByZWNvcmRfbGlzdCBw b2ludHMgdG8gdGhlIHRhaWwgb2YgcHJldgorICAgICAgICAgaW5zdHJ1Y3Rp b24uICAqLworICAgICAgaWYgKGV4ZWN1dGlvbl9kaXJlY3Rpb24gPT0gRVhF Q19GT1JXQVJEICYmIHJlY29yZF9saXN0LT5uZXh0KQorCXJlY29yZF9saXN0 ID0gcmVjb3JkX2xpc3QtPm5leHQ7CisKKyAgICAgIC8qIExvb3Agb3ZlciB0 aGUgcmVjb3JkX2xpc3QsIGxvb2tpbmcgZm9yIHRoZSBuZXh0IHBsYWNlIHRv CisJIHN0b3AuICAqLworICAgICAgZG8KKwl7CisJICAvKiBDaGVjayBmb3Ig YmVnaW5uaW5nIGFuZCBlbmQgb2YgbG9nLiAgKi8KKwkgIGlmIChleGVjdXRp b25fZGlyZWN0aW9uID09IEVYRUNfUkVWRVJTRQorCSAgICAgICYmIHJlY29y ZF9saXN0ID09ICZyZWNvcmRfZmlyc3QpCisJICAgIHsKKwkgICAgICAvKiBI aXQgYmVnaW5uaW5nIG9mIHJlY29yZCBsb2cgaW4gcmV2ZXJzZS4gICovCisJ ICAgICAgc3RhdHVzLT5raW5kID0gVEFSR0VUX1dBSVRLSU5EX05PX0hJU1RP Ulk7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwkgIGlmIChleGVjdXRpb25f ZGlyZWN0aW9uICE9IEVYRUNfUkVWRVJTRSAmJiAhcmVjb3JkX2xpc3QtPm5l eHQpCisJICAgIHsKKwkgICAgICAvKiBIaXQgZW5kIG9mIHJlY29yZCBsb2cg Z29pbmcgZm9yd2FyZC4gICovCisJICAgICAgc3RhdHVzLT5raW5kID0gVEFS R0VUX1dBSVRLSU5EX05PX0hJU1RPUlk7CisJICAgICAgYnJlYWs7CisJICAg IH0KKworCSAgLyogU2V0IHB0aWQsIHJlZ2lzdGVyIGFuZCBtZW1vcnkgYWNj b3JkaW5nIHRvIHJlY29yZF9saXN0LiAgKi8KKwkgIGlmIChyZWNvcmRfbGlz dC0+dHlwZSA9PSByZWNvcmRfcmVnKQorCSAgICB7CisJICAgICAgLyogcmVn ICovCisJICAgICAgZ2RiX2J5dGUgcmVnW01BWF9SRUdJU1RFUl9TSVpFXTsK KwkgICAgICBpZiAocmVjb3JkX2RlYnVnID4gMSkKKwkJZnByaW50Zl91bmZp bHRlcmVkIChnZGJfc3RkbG9nLAorCQkJCSAgICAiUHJvY2VzcyByZWNvcmQ6 IHJlY29yZF9yZWcgJXMgdG8gIgorCQkJCSAgICAiaW5mZXJpb3IgbnVtID0g JWQuXG4iLAorCQkJCSAgICBob3N0X2FkZHJlc3NfdG9fc3RyaW5nIChyZWNv cmRfbGlzdCksCisJCQkJICAgIHJlY29yZF9saXN0LT51LnJlZy5udW0pOwor CSAgICAgIHJlZ2NhY2hlX2Nvb2tlZF9yZWFkIChyZWdjYWNoZSwgcmVjb3Jk X2xpc3QtPnUucmVnLm51bSwgcmVnKTsKKwkgICAgICByZWdjYWNoZV9jb29r ZWRfd3JpdGUgKHJlZ2NhY2hlLCByZWNvcmRfbGlzdC0+dS5yZWcubnVtLAor CQkJCSAgICAgcmVjb3JkX2xpc3QtPnUucmVnLnZhbCk7CisJICAgICAgbWVt Y3B5IChyZWNvcmRfbGlzdC0+dS5yZWcudmFsLCByZWcsIE1BWF9SRUdJU1RF Ul9TSVpFKTsKKwkgICAgfQorCSAgZWxzZSBpZiAocmVjb3JkX2xpc3QtPnR5 cGUgPT0gcmVjb3JkX21lbSkKKwkgICAgeworCSAgICAgIC8qIG1lbSAqLwor CSAgICAgIGdkYl9ieXRlICptZW0gPSBhbGxvY2EgKHJlY29yZF9saXN0LT51 Lm1lbS5sZW4pOworCSAgICAgIGlmIChyZWNvcmRfZGVidWcgPiAxKQorCQlm cHJpbnRmX3VuZmlsdGVyZWQgKGdkYl9zdGRsb2csCisJCQkJICAgICJQcm9j ZXNzIHJlY29yZDogcmVjb3JkX21lbSAlcyB0byAiCisJCQkJICAgICJpbmZl cmlvciBhZGRyID0gMHglcyBsZW4gPSAlZC5cbiIsCisJCQkJICAgIGhvc3Rf YWRkcmVzc190b19zdHJpbmcgKHJlY29yZF9saXN0KSwKKwkJCQkgICAgcGFk ZHJfbnogKHJlY29yZF9saXN0LT51Lm1lbS5hZGRyKSwKKwkJCQkgICAgcmVj b3JkX2xpc3QtPnUubWVtLmxlbik7CisKKwkgICAgICBpZiAodGFyZ2V0X3Jl YWRfbWVtb3J5CisJCSAgKHJlY29yZF9saXN0LT51Lm1lbS5hZGRyLCBtZW0s IHJlY29yZF9saXN0LT51Lm1lbS5sZW4pKQorCQllcnJvciAoXygiUHJvY2Vz cyByZWNvcmQ6IGVycm9yIHJlYWRpbmcgbWVtb3J5IGF0ICIKKwkJCSAiYWRk ciA9IDB4JXMgbGVuID0gJWQuIiksCisJCSAgICAgICBwYWRkcl9ueiAocmVj b3JkX2xpc3QtPnUubWVtLmFkZHIpLAorCQkgICAgICAgcmVjb3JkX2xpc3Qt PnUubWVtLmxlbik7CisKKwkgICAgICBpZiAodGFyZ2V0X3dyaXRlX21lbW9y eQorCQkgIChyZWNvcmRfbGlzdC0+dS5tZW0uYWRkciwgcmVjb3JkX2xpc3Qt PnUubWVtLnZhbCwKKwkJICAgcmVjb3JkX2xpc3QtPnUubWVtLmxlbikpCisJ CWVycm9yIChfCisJCSAgICAgICAoIlByb2Nlc3MgcmVjb3JkOiBlcnJvciB3 cml0aW5nIG1lbW9yeSBhdCAiCisJCQkiYWRkciA9IDB4JXMgbGVuID0gJWQu IiksCisJCSAgICAgICBwYWRkcl9ueiAocmVjb3JkX2xpc3QtPnUubWVtLmFk ZHIpLAorCQkgICAgICAgcmVjb3JkX2xpc3QtPnUubWVtLmxlbik7CisKKwkg ICAgICBtZW1jcHkgKHJlY29yZF9saXN0LT51Lm1lbS52YWwsIG1lbSwgcmVj b3JkX2xpc3QtPnUubWVtLmxlbik7CisJICAgIH0KKwkgIGVsc2UKKwkgICAg eworCSAgICAgIGlmIChyZWNvcmRfZGVidWcgPiAxKQorCQlmcHJpbnRmX3Vu ZmlsdGVyZWQgKGdkYl9zdGRsb2csCisJCQkJICAgICJQcm9jZXNzIHJlY29y ZDogcmVjb3JkX2VuZCAlcyB0byAiCisJCQkJICAgICJpbmZlcmlvci5cbiIs CisJCQkJICAgIGhvc3RfYWRkcmVzc190b19zdHJpbmcgKHJlY29yZF9saXN0 KSk7CisKKwkgICAgICBpZiAoZmlyc3RfcmVjb3JkX2VuZCAmJiBleGVjdXRp b25fZGlyZWN0aW9uID09IEVYRUNfUkVWRVJTRSkKKwkJeworCQkgIC8qIFdo ZW4gcmV2ZXJzZSBleGN1dGUsIHRoZSBmaXJzdCByZWNvcmRfZW5kIGlzIHRo ZSBwYXJ0IG9mCisJCSAgICAgY3VycmVudCBpbnN0cnVjdGlvbi4gICovCisJ CSAgZmlyc3RfcmVjb3JkX2VuZCA9IDA7CisJCX0KKwkgICAgICBlbHNlCisJ CXsKKwkJICAvKiBJbiBFWEVDX1JFVkVSU0UgbW9kZSwgdGhpcyBpcyB0aGUg cmVjb3JkX2VuZCBvZiBwcmV2CisJCSAgICAgaW5zdHJ1Y3Rpb24uCisJCSAg ICAgSW4gRVhFQ19GT1JXQVJEIG1vZGUsIHRoaXMgaXMgdGhlIHJlY29yZF9l bmQgb2YgY3VycmVudAorCQkgICAgIGluc3RydWN0aW9uLiAgKi8KKwkJICAv KiBzdGVwICovCisJCSAgaWYgKHJlY29yZF9yZXN1bWVfc3RlcCkKKwkJICAg IHsKKwkJICAgICAgaWYgKHJlY29yZF9kZWJ1ZyA+IDEpCisJCQlmcHJpbnRm X3VuZmlsdGVyZWQgKGdkYl9zdGRsb2csCisJCQkJCSAgICAiUHJvY2VzcyBy ZWNvcmQ6IHN0ZXAuXG4iKTsKKwkJICAgICAgY29udGludWVfZmxhZyA9IDA7 CisJCSAgICB9CisKKwkJICAvKiBjaGVjayBicmVha3BvaW50ICovCisJCSAg dG1wX3BjID0gcmVnY2FjaGVfcmVhZF9wYyAocmVnY2FjaGUpOworCQkgIGlm IChicmVha3BvaW50X2luc2VydGVkX2hlcmVfcCAodG1wX3BjKSkKKwkJICAg IHsKKwkJICAgICAgaWYgKHJlY29yZF9kZWJ1ZykKKwkJCWZwcmludGZfdW5m aWx0ZXJlZCAoZ2RiX3N0ZGxvZywKKwkJCQkJICAgICJQcm9jZXNzIHJlY29y ZDogYnJlYWsgIgorCQkJCQkgICAgImF0IDB4JXMuXG4iLAorCQkJCQkgICAg cGFkZHJfbnogKHRtcF9wYykpOworCQkgICAgICBpZiAoZ2RiYXJjaF9kZWNy X3BjX2FmdGVyX2JyZWFrIChnZXRfcmVnY2FjaGVfYXJjaCAocmVnY2FjaGUp KQorCQkJICAmJiBleGVjdXRpb25fZGlyZWN0aW9uID09IEVYRUNfRk9SV0FS RAorCQkJICAmJiAhcmVjb3JkX3Jlc3VtZV9zdGVwKQorCQkJcmVnY2FjaGVf d3JpdGVfcGMgKHJlZ2NhY2hlLAorCQkJCQkgICB0bXBfcGMgKworCQkJCQkg ICBnZGJhcmNoX2RlY3JfcGNfYWZ0ZXJfYnJlYWsKKwkJCQkJICAgKGdldF9y ZWdjYWNoZV9hcmNoIChyZWdjYWNoZSkpKTsKKwkJICAgICAgY29udGludWVf ZmxhZyA9IDA7CisJCSAgICB9CisJCX0KKwkgICAgfQorCituZXh0OgorCSAg aWYgKGNvbnRpbnVlX2ZsYWcpCisJICAgIHsKKwkgICAgICBpZiAoZXhlY3V0 aW9uX2RpcmVjdGlvbiA9PSBFWEVDX1JFVkVSU0UpCisJCXsKKwkJICBpZiAo cmVjb3JkX2xpc3QtPnByZXYpCisJCSAgICByZWNvcmRfbGlzdCA9IHJlY29y ZF9saXN0LT5wcmV2OworCQl9CisJICAgICAgZWxzZQorCQl7CisJCSAgaWYg KHJlY29yZF9saXN0LT5uZXh0KQorCQkgICAgcmVjb3JkX2xpc3QgPSByZWNv cmRfbGlzdC0+bmV4dDsKKwkJfQorCSAgICB9CisJfQorICAgICAgd2hpbGUg KGNvbnRpbnVlX2ZsYWcpOworCisgICAgICBzaWduYWwgKFNJR0lOVCwgaGFu ZGxlX3NpZ2ludCk7CisKK3JlcGxheV9vdXQ6CisgICAgICBpZiAocmVjb3Jk X2dldF9zaWcpCisJc3RhdHVzLT52YWx1ZS5zaWcgPSBUQVJHRVRfU0lHTkFM X0lOVDsKKyAgICAgIGVsc2UKKwlzdGF0dXMtPnZhbHVlLnNpZyA9IFRBUkdF VF9TSUdOQUxfVFJBUDsKKworICAgICAgZGlzY2FyZF9jbGVhbnVwcyAob2xk X2NsZWFudXBzKTsKKyAgICB9CisKKyAgZG9fY2xlYW51cHMgKHNldF9jbGVh bnVwcyk7CisgIHJldHVybiBpbmZlcmlvcl9wdGlkOworfQorCitzdGF0aWMg dm9pZAorcmVjb3JkX2Rpc2Nvbm5lY3QgKHN0cnVjdCB0YXJnZXRfb3BzICp0 YXJnZXQsIGNoYXIgKmFyZ3MsIGludCBmcm9tX3R0eSkKK3sKKyAgaWYgKHJl Y29yZF9kZWJ1ZykKKyAgICBmcHJpbnRmX3VuZmlsdGVyZWQgKGdkYl9zdGRs b2csICJQcm9jZXNzIHJlY29yZDogcmVjb3JkX2Rpc2Nvbm5lY3RcbiIpOwor CisgIHVucHVzaF90YXJnZXQgKCZyZWNvcmRfb3BzKTsKKyAgdGFyZ2V0X2Rp c2Nvbm5lY3QgKGFyZ3MsIGZyb21fdHR5KTsKK30KKworc3RhdGljIHZvaWQK K3JlY29yZF9kZXRhY2ggKHN0cnVjdCB0YXJnZXRfb3BzICpvcHMsIGNoYXIg KmFyZ3MsIGludCBmcm9tX3R0eSkKK3sKKyAgaWYgKHJlY29yZF9kZWJ1ZykK KyAgICBmcHJpbnRmX3VuZmlsdGVyZWQgKGdkYl9zdGRsb2csICJQcm9jZXNz IHJlY29yZDogcmVjb3JkX2RldGFjaFxuIik7CisKKyAgdW5wdXNoX3Rhcmdl dCAoJnJlY29yZF9vcHMpOworICB0YXJnZXRfZGV0YWNoIChhcmdzLCBmcm9t X3R0eSk7Cit9CisKK3N0YXRpYyB2b2lkCityZWNvcmRfbW91cm5faW5mZXJp b3IgKHN0cnVjdCB0YXJnZXRfb3BzICpvcHMpCit7CisgIGlmIChyZWNvcmRf ZGVidWcpCisgICAgZnByaW50Zl91bmZpbHRlcmVkIChnZGJfc3RkbG9nLCAi UHJvY2VzcyByZWNvcmQ6ICIKKwkJCSAgICAgICAgICAgICJyZWNvcmRfbW91 cm5faW5mZXJpb3JcbiIpOworCisgIHVucHVzaF90YXJnZXQgKCZyZWNvcmRf b3BzKTsKKyAgdGFyZ2V0X21vdXJuX2luZmVyaW9yICgpOworfQorCisvKiBD bG9zZSBwcm9jZXNzIHJlY29yZCB0YXJnZXQgYmVmb3JlIGtpbGxpbmcgdGhl IGluZmVyaW9yIHByb2Nlc3MuICAqLworc3RhdGljIHZvaWQKK3JlY29yZF9r aWxsIChzdHJ1Y3QgdGFyZ2V0X29wcyAqb3BzKQoreworICBpZiAocmVjb3Jk X2RlYnVnKQorICAgIGZwcmludGZfdW5maWx0ZXJlZCAoZ2RiX3N0ZGxvZywg IlByb2Nlc3MgcmVjb3JkOiByZWNvcmRfa2lsbFxuIik7CisKKyAgdW5wdXNo X3RhcmdldCAoJnJlY29yZF9vcHMpOworICB0YXJnZXRfa2lsbCAoKTsKK30K KworLyogUmVjb3JkIHJlZ2lzdGVycyBjaGFuZ2UgKGJ5IHVzZXIgb3IgYnkg R0RCKSB0byBsaXN0IGFzIGFuIGluc3RydWN0aW9uLiAgKi8KK3N0YXRpYyB2 b2lkCityZWNvcmRfcmVnaXN0ZXJzX2NoYW5nZSAoc3RydWN0IHJlZ2NhY2hl ICpyZWdjYWNoZSwgaW50IHJlZ251bSkKK3sKKyAgLyogQ2hlY2sgcmVjb3Jk X2luc25fbnVtLiAgKi8KKyAgcmVjb3JkX2NoZWNrX2luc25fbnVtICgwKTsK KworICByZWNvcmRfYXJjaF9saXN0X2hlYWQgPSBOVUxMOworICByZWNvcmRf YXJjaF9saXN0X3RhaWwgPSBOVUxMOworCisgIHJlY29yZF9yZWdjYWNoZSA9 IGdldF9jdXJyZW50X3JlZ2NhY2hlICgpOworCisgIGlmIChyZWdudW0gPCAw KQorICAgIHsKKyAgICAgIGludCBpOworICAgICAgZm9yIChpID0gMDsgaSA8 IGdkYmFyY2hfbnVtX3JlZ3MgKGdldF9yZWdjYWNoZV9hcmNoIChyZWdjYWNo ZSkpOyBpKyspCisJeworCSAgaWYgKHJlY29yZF9hcmNoX2xpc3RfYWRkX3Jl ZyAoaSkpCisJICAgIHsKKwkgICAgICByZWNvcmRfbGlzdF9yZWxlYXNlIChy ZWNvcmRfYXJjaF9saXN0X3RhaWwpOworCSAgICAgIGVycm9yIChfKCJQcm9j ZXNzIHJlY29yZDogZmFpbGVkIHRvIHJlY29yZCBleGVjdXRpb24gbG9nLiIp KTsKKwkgICAgfQorCX0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBp ZiAocmVjb3JkX2FyY2hfbGlzdF9hZGRfcmVnIChyZWdudW0pKQorCXsKKwkg IHJlY29yZF9saXN0X3JlbGVhc2UgKHJlY29yZF9hcmNoX2xpc3RfdGFpbCk7 CisJICBlcnJvciAoXygiUHJvY2VzcyByZWNvcmQ6IGZhaWxlZCB0byByZWNv cmQgZXhlY3V0aW9uIGxvZy4iKSk7CisJfQorICAgIH0KKyAgaWYgKHJlY29y ZF9hcmNoX2xpc3RfYWRkX2VuZCAoKSkKKyAgICB7CisgICAgICByZWNvcmRf bGlzdF9yZWxlYXNlIChyZWNvcmRfYXJjaF9saXN0X3RhaWwpOworICAgICAg ZXJyb3IgKF8oIlByb2Nlc3MgcmVjb3JkOiBmYWlsZWQgdG8gcmVjb3JkIGV4 ZWN1dGlvbiBsb2cuIikpOworICAgIH0KKyAgcmVjb3JkX2xpc3QtPm5leHQg PSByZWNvcmRfYXJjaF9saXN0X2hlYWQ7CisgIHJlY29yZF9hcmNoX2xpc3Rf aGVhZC0+cHJldiA9IHJlY29yZF9saXN0OworICByZWNvcmRfbGlzdCA9IHJl Y29yZF9hcmNoX2xpc3RfdGFpbDsKKworICBpZiAocmVjb3JkX2luc25fbnVt ID09IHJlY29yZF9pbnNuX21heF9udW0gJiYgcmVjb3JkX2luc25fbWF4X251 bSkKKyAgICByZWNvcmRfbGlzdF9yZWxlYXNlX2ZpcnN0ICgpOworICBlbHNl CisgICAgcmVjb3JkX2luc25fbnVtKys7Cit9CisKK3N0YXRpYyB2b2lkCity ZWNvcmRfc3RvcmVfcmVnaXN0ZXJzIChzdHJ1Y3QgdGFyZ2V0X29wcyAqb3Bz LCBzdHJ1Y3QgcmVnY2FjaGUgKnJlZ2NhY2hlLAorICAgICAgICAgICAgICAg ICAgICAgICAgaW50IHJlZ25vKQoreworICBpZiAoIXJlY29yZF9nZGJfb3Bl cmF0aW9uX2Rpc2FibGUpCisgICAgeworICAgICAgaWYgKFJFQ09SRF9JU19S RVBMQVkpCisJeworCSAgaW50IG47CisJICBzdHJ1Y3QgY2xlYW51cCAqb2xk X2NsZWFudXBzOworCisJICAvKiBMZXQgdXNlciBjaG9vc2UgaWYgaGUgd2Fu dHMgdG8gd3JpdGUgcmVnaXN0ZXIgb3Igbm90LiAgKi8KKwkgIGlmIChyZWdu byA8IDApCisJICAgIG4gPQorCSAgICAgIG5xdWVyeSAoXygiQmVjYXVzZSBH REIgaXMgaW4gcmVwbGF5IG1vZGUsIGNoYW5naW5nIHRoZSAiCisJCQkidmFs dWUgb2YgYSByZWdpc3RlciB3aWxsIG1ha2UgdGhlIGV4ZWN1dGlvbiAiCisJ CQkibG9nIHVudXNhYmxlIGZyb20gdGhpcyBwb2ludCBvbndhcmQuICAiCisJ CQkiQ2hhbmdlIGFsbCByZWdpc3RlcnM/IikpOworCSAgZWxzZQorCSAgICBu ID0KKwkgICAgICBucXVlcnkgKF8oIkJlY2F1c2UgR0RCIGlzIGluIHJlcGxh eSBtb2RlLCBjaGFuZ2luZyB0aGUgdmFsdWUgIgorCQkJIm9mIGEgcmVnaXN0 ZXIgd2lsbCBtYWtlIHRoZSBleGVjdXRpb24gbG9nIHVudXNhYmxlICIKKwkJ CSJmcm9tIHRoaXMgcG9pbnQgb253YXJkLiAgQ2hhbmdlIHJlZ2lzdGVyICVz PyIpLAorCQkgICAgICBnZGJhcmNoX3JlZ2lzdGVyX25hbWUgKGdldF9yZWdj YWNoZV9hcmNoIChyZWdjYWNoZSksCisJCQkJCSAgICAgICByZWdubykpOwor CisJICBpZiAoIW4pCisJICAgIHsKKwkgICAgICAvKiBJbnZhbGlkYXRlIHRo ZSB2YWx1ZSBvZiByZWdjYWNoZSB0aGF0IHdhcyBzZXQgaW4gZnVuY3Rpb24K KwkgICAgICAgICAicmVnY2FjaGVfcmF3X3dyaXRlIi4gICovCisJICAgICAg aWYgKHJlZ25vIDwgMCkKKwkJeworCQkgIGludCBpOworCQkgIGZvciAoaSA9 IDA7CisJCSAgICAgICBpIDwgZ2RiYXJjaF9udW1fcmVncyAoZ2V0X3JlZ2Nh Y2hlX2FyY2ggKHJlZ2NhY2hlKSk7CisJCSAgICAgICBpKyspCisJCSAgICBy ZWdjYWNoZV9pbnZhbGlkYXRlIChyZWdjYWNoZSwgaSk7CisJCX0KKwkgICAg ICBlbHNlCisJCXJlZ2NhY2hlX2ludmFsaWRhdGUgKHJlZ2NhY2hlLCByZWdu byk7CisKKwkgICAgICBlcnJvciAoXygiUHJvY2VzcyByZWNvcmQgY2FuY2Vs ZWQgdGhlIG9wZXJhdGlvbi4iKSk7CisJICAgIH0KKworCSAgLyogRGVzdHJv eSB0aGUgcmVjb3JkIGZyb20gaGVyZSBmb3J3YXJkLiAgKi8KKwkgIHJlY29y ZF9saXN0X3JlbGVhc2VfbmV4dCAoKTsKKwl9CisKKyAgICAgIHJlY29yZF9y ZWdpc3RlcnNfY2hhbmdlIChyZWdjYWNoZSwgcmVnbm8pOworICAgIH0KKyAg cmVjb3JkX2JlbmVhdGhfdG9fc3RvcmVfcmVnaXN0ZXJzIChyZWNvcmRfYmVu ZWF0aF90b19zdG9yZV9yZWdpc3RlcnNfb3BzLAorICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHJlZ2NhY2hlLCByZWdubyk7Cit9CisK Ky8qIEJlaGF2aW9yIGlzIGNvbmRpdGlvbmFsIG9uIFJFQ09SRF9JU19SRVBM QVkuCisgICBJbiByZXBsYXkgbW9kZSwgd2UgY2Fubm90IHdyaXRlIG1lbW9y eSB1bmxlcyB3ZSBhcmUgd2lsbGluZyB0bworICAgaW52YWxpZGF0ZSB0aGUg cmVjb3JkL3JlcGxheSBsb2cgZnJvbSB0aGlzIHBvaW50IGZvcndhcmQuICAq LworCitzdGF0aWMgTE9OR0VTVAorcmVjb3JkX3hmZXJfcGFydGlhbCAoc3Ry dWN0IHRhcmdldF9vcHMgKm9wcywgZW51bSB0YXJnZXRfb2JqZWN0IG9iamVj dCwKKwkJICAgICBjb25zdCBjaGFyICphbm5leCwgZ2RiX2J5dGUgKiByZWFk YnVmLAorCQkgICAgIGNvbnN0IGdkYl9ieXRlICogd3JpdGVidWYsIFVMT05H RVNUIG9mZnNldCwgTE9OR0VTVCBsZW4pCit7CisgIGlmICghcmVjb3JkX2dk Yl9vcGVyYXRpb25fZGlzYWJsZQorICAgICAgJiYgKG9iamVjdCA9PSBUQVJH RVRfT0JKRUNUX01FTU9SWQorCSAgfHwgb2JqZWN0ID09IFRBUkdFVF9PQkpF Q1RfUkFXX01FTU9SWSkgJiYgd3JpdGVidWYpCisgICAgeworICAgICAgaWYg KFJFQ09SRF9JU19SRVBMQVkpCisJeworCSAgLyogTGV0IHVzZXIgY2hvb3Nl IGlmIGhlIHdhbnRzIHRvIHdyaXRlIG1lbW9yeSBvciBub3QuICAqLworCSAg aWYgKCFucXVlcnkgKF8oIkJlY2F1c2UgR0RCIGlzIGluIHJlcGxheSBtb2Rl LCB3cml0aW5nIHRvIG1lbW9yeSAiCisJCSAgICAgICAgICJ3aWxsIG1ha2Ug dGhlIGV4ZWN1dGlvbiBsb2cgdW51c2FibGUgZnJvbSB0aGlzICIKKwkJICAg ICAgICAgInBvaW50IG9ud2FyZC4gIFdyaXRlIG1lbW9yeSBhdCBhZGRyZXNz IDB4JXM/IiksCisJCSAgICAgICBwYWRkcl9ueiAob2Zmc2V0KSkpCisJICAg IHJldHVybiAtMTsKKworCSAgLyogRGVzdHJveSB0aGUgcmVjb3JkIGZyb20g aGVyZSBmb3J3YXJkLiAgKi8KKwkgIHJlY29yZF9saXN0X3JlbGVhc2VfbmV4 dCAoKTsKKwl9CisKKyAgICAgIC8qIENoZWNrIHJlY29yZF9pbnNuX251bSAq LworICAgICAgcmVjb3JkX2NoZWNrX2luc25fbnVtICgwKTsKKworICAgICAg LyogUmVjb3JkIHJlZ2lzdGVycyBjaGFuZ2UgdG8gbGlzdCBhcyBhbiBpbnN0 cnVjdGlvbi4gICovCisgICAgICByZWNvcmRfYXJjaF9saXN0X2hlYWQgPSBO VUxMOworICAgICAgcmVjb3JkX2FyY2hfbGlzdF90YWlsID0gTlVMTDsKKyAg ICAgIGlmIChyZWNvcmRfYXJjaF9saXN0X2FkZF9tZW0gKG9mZnNldCwgbGVu KSkKKwl7CisJICByZWNvcmRfbGlzdF9yZWxlYXNlIChyZWNvcmRfYXJjaF9s aXN0X3RhaWwpOworCSAgaWYgKHJlY29yZF9kZWJ1ZykKKwkgICAgZnByaW50 Zl91bmZpbHRlcmVkIChnZGJfc3RkbG9nLAorCQkJCV8oIlByb2Nlc3MgcmVj b3JkOiBmYWlsZWQgdG8gcmVjb3JkICIKKwkJCQkgICJleGVjdXRpb24gbG9n LiIpKTsKKwkgIHJldHVybiAtMTsKKwl9CisgICAgICBpZiAocmVjb3JkX2Fy Y2hfbGlzdF9hZGRfZW5kICgpKQorCXsKKwkgIHJlY29yZF9saXN0X3JlbGVh c2UgKHJlY29yZF9hcmNoX2xpc3RfdGFpbCk7CisJICBpZiAocmVjb3JkX2Rl YnVnKQorCSAgICBmcHJpbnRmX3VuZmlsdGVyZWQgKGdkYl9zdGRsb2csCisJ CQkJXygiUHJvY2VzcyByZWNvcmQ6IGZhaWxlZCB0byByZWNvcmQgIgorCQkJ CSAgImV4ZWN1dGlvbiBsb2cuIikpOworCSAgcmV0dXJuIC0xOworCX0KKyAg ICAgIHJlY29yZF9saXN0LT5uZXh0ID0gcmVjb3JkX2FyY2hfbGlzdF9oZWFk OworICAgICAgcmVjb3JkX2FyY2hfbGlzdF9oZWFkLT5wcmV2ID0gcmVjb3Jk X2xpc3Q7CisgICAgICByZWNvcmRfbGlzdCA9IHJlY29yZF9hcmNoX2xpc3Rf dGFpbDsKKworICAgICAgaWYgKHJlY29yZF9pbnNuX251bSA9PSByZWNvcmRf aW5zbl9tYXhfbnVtICYmIHJlY29yZF9pbnNuX21heF9udW0pCisJcmVjb3Jk X2xpc3RfcmVsZWFzZV9maXJzdCAoKTsKKyAgICAgIGVsc2UKKwlyZWNvcmRf aW5zbl9udW0rKzsKKyAgICB9CisKKyAgcmV0dXJuIHJlY29yZF9iZW5lYXRo X3RvX3hmZXJfcGFydGlhbCAocmVjb3JkX2JlbmVhdGhfdG9feGZlcl9wYXJ0 aWFsX29wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgb2JqZWN0LCBhbm5leCwgcmVhZGJ1Ziwgd3JpdGVidWYsCisgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwg bGVuKTsKK30KKworLyogQmVoYXZpb3IgaXMgY29uZGl0aW9uYWwgb24gUkVD T1JEX0lTX1JFUExBWS4KKyAgIFdlIHdpbGwgbm90IGFjdHVhbGx5IGluc2Vy dCBvciByZW1vdmUgYnJlYWtwb2ludHMgd2hlbiByZXBsYXlpbmcsCisgICBu b3Igd2hlbiByZWNvcmRpbmcuICAqLworCitzdGF0aWMgaW50CityZWNvcmRf aW5zZXJ0X2JyZWFrcG9pbnQgKHN0cnVjdCBicF90YXJnZXRfaW5mbyAqYnBf dGd0KQoreworICBpZiAoIVJFQ09SRF9JU19SRVBMQVkpCisgICAgeworICAg ICAgc3RydWN0IGNsZWFudXAgKm9sZF9jbGVhbnVwcyA9IHJlY29yZF9nZGJf b3BlcmF0aW9uX2Rpc2FibGVfc2V0ICgpOworICAgICAgaW50IHJldCA9IHJl Y29yZF9iZW5lYXRoX3RvX2luc2VydF9icmVha3BvaW50IChicF90Z3QpOwor CisgICAgICBkb19jbGVhbnVwcyAob2xkX2NsZWFudXBzKTsKKworICAgICAg cmV0dXJuIHJldDsKKyAgICB9CisKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRp YyBpbnQKK3JlY29yZF9yZW1vdmVfYnJlYWtwb2ludCAoc3RydWN0IGJwX3Rh cmdldF9pbmZvICpicF90Z3QpCit7CisgIGlmICghUkVDT1JEX0lTX1JFUExB WSkKKyAgICB7CisgICAgICBzdHJ1Y3QgY2xlYW51cCAqb2xkX2NsZWFudXBz ID0gcmVjb3JkX2dkYl9vcGVyYXRpb25fZGlzYWJsZV9zZXQgKCk7CisgICAg ICBpbnQgcmV0ID0gcmVjb3JkX2JlbmVhdGhfdG9fcmVtb3ZlX2JyZWFrcG9p bnQgKGJwX3RndCk7CisKKyAgICAgIGRvX2NsZWFudXBzIChvbGRfY2xlYW51 cHMpOworCisgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICByZXR1cm4g MDsKK30KKworc3RhdGljIGludAorcmVjb3JkX2Nhbl9leGVjdXRlX3JldmVy c2UgKHZvaWQpCit7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgdm9pZAor aW5pdF9yZWNvcmRfb3BzICh2b2lkKQoreworICByZWNvcmRfb3BzLnRvX3No b3J0bmFtZSA9ICJyZWNvcmQiOworICByZWNvcmRfb3BzLnRvX2xvbmduYW1l ID0gIlByb2Nlc3MgcmVjb3JkIGFuZCByZXBsYXkgdGFyZ2V0IjsKKyAgcmVj b3JkX29wcy50b19kb2MgPQorICAgICJMb2cgcHJvZ3JhbSB3aGlsZSBleGVj dXRpbmcgYW5kIHJlcGxheSBleGVjdXRpb24gZnJvbSBsb2cuIjsKKyAgcmVj b3JkX29wcy50b19vcGVuID0gcmVjb3JkX29wZW47CisgIHJlY29yZF9vcHMu dG9fY2xvc2UgPSByZWNvcmRfY2xvc2U7CisgIHJlY29yZF9vcHMudG9fcmVz dW1lID0gcmVjb3JkX3Jlc3VtZTsKKyAgcmVjb3JkX29wcy50b193YWl0ID0g cmVjb3JkX3dhaXQ7CisgIHJlY29yZF9vcHMudG9fZGlzY29ubmVjdCA9IHJl Y29yZF9kaXNjb25uZWN0OworICByZWNvcmRfb3BzLnRvX2RldGFjaCA9IHJl Y29yZF9kZXRhY2g7CisgIHJlY29yZF9vcHMudG9fbW91cm5faW5mZXJpb3Ig PSByZWNvcmRfbW91cm5faW5mZXJpb3I7CisgIHJlY29yZF9vcHMudG9fa2ls bCA9IHJlY29yZF9raWxsOworICByZWNvcmRfb3BzLnRvX2NyZWF0ZV9pbmZl cmlvciA9IGZpbmRfZGVmYXVsdF9jcmVhdGVfaW5mZXJpb3I7CisgIHJlY29y ZF9vcHMudG9fc3RvcmVfcmVnaXN0ZXJzID0gcmVjb3JkX3N0b3JlX3JlZ2lz dGVyczsKKyAgcmVjb3JkX29wcy50b194ZmVyX3BhcnRpYWwgPSByZWNvcmRf eGZlcl9wYXJ0aWFsOworICByZWNvcmRfb3BzLnRvX2luc2VydF9icmVha3Bv aW50ID0gcmVjb3JkX2luc2VydF9icmVha3BvaW50OworICByZWNvcmRfb3Bz LnRvX3JlbW92ZV9icmVha3BvaW50ID0gcmVjb3JkX3JlbW92ZV9icmVha3Bv aW50OworICByZWNvcmRfb3BzLnRvX2Nhbl9leGVjdXRlX3JldmVyc2UgPSBy ZWNvcmRfY2FuX2V4ZWN1dGVfcmV2ZXJzZTsKKyAgcmVjb3JkX29wcy50b19z dHJhdHVtID0gcmVjb3JkX3N0cmF0dW07CisgIHJlY29yZF9vcHMudG9fbWFn aWMgPSBPUFNfTUFHSUM7Cit9CisKK3N0YXRpYyB2b2lkCitzaG93X3JlY29y ZF9kZWJ1ZyAoc3RydWN0IHVpX2ZpbGUgKmZpbGUsIGludCBmcm9tX3R0eSwK KwkJICAgc3RydWN0IGNtZF9saXN0X2VsZW1lbnQgKmMsIGNvbnN0IGNoYXIg KnZhbHVlKQoreworICBmcHJpbnRmX2ZpbHRlcmVkIChmaWxlLCBfKCJEZWJ1 Z2dpbmcgb2YgcHJvY2VzcyByZWNvcmQgdGFyZ2V0IGlzICVzLlxuIiksCisJ CSAgICB2YWx1ZSk7Cit9CisKKy8qIEFsaWFzIGZvciAidGFyZ2V0IHJlY29y ZCIuICAqLworCitzdGF0aWMgdm9pZAorY21kX3JlY29yZF9zdGFydCAoY2hh ciAqYXJncywgaW50IGZyb21fdHR5KQoreworICBleGVjdXRlX2NvbW1hbmQg KCJ0YXJnZXQgcmVjb3JkIiwgZnJvbV90dHkpOworfQorCisvKiBUcnVuY2F0 ZSB0aGUgcmVjb3JkIGxvZyBmcm9tIHRoZSBwcmVzZW50IHBvaW50CisgICBv ZiByZXBsYXkgdW50aWwgdGhlIGVuZC4gICovCisKK3N0YXRpYyB2b2lkCitj bWRfcmVjb3JkX2RlbGV0ZSAoY2hhciAqYXJncywgaW50IGZyb21fdHR5KQor eworICBpZiAoY3VycmVudF90YXJnZXQudG9fc3RyYXR1bSA9PSByZWNvcmRf c3RyYXR1bSkKKyAgICB7CisgICAgICBpZiAoUkVDT1JEX0lTX1JFUExBWSkK Kwl7CisJICBpZiAoIWZyb21fdHR5IHx8IHF1ZXJ5IChfKCJEZWxldGUgdGhl IGxvZyBmcm9tIHRoaXMgcG9pbnQgZm9yd2FyZCAiCisJCSAgICAgICAgICAg ICAgICAgICAgImFuZCBiZWdpbiB0byByZWNvcmQgdGhlIHJ1bm5pbmcgbWVz c2FnZSAiCisJCSAgICAgICAgICAgICAgICAgICAgImF0IGN1cnJlbnQgUEM/ IikpKQorCSAgICByZWNvcmRfbGlzdF9yZWxlYXNlX25leHQgKCk7CisJfQor ICAgICAgZWxzZQorCSAgcHJpbnRmX3VuZmlsdGVyZWQgKF8oIkFscmVhZHkg YXQgZW5kIG9mIHJlY29yZCBsaXN0LlxuIikpOworCisgICAgfQorICBlbHNl CisgICAgcHJpbnRmX3VuZmlsdGVyZWQgKF8oIlByb2Nlc3MgcmVjb3JkIGlz IG5vdCBzdGFydGVkLlxuIikpOworfQorCisvKiBJbXBsZW1lbnQgdGhlICJz dG9wcmVjb3JkIiBjb21tYW5kLiAgKi8KKworc3RhdGljIHZvaWQKK2NtZF9y ZWNvcmRfc3RvcCAoY2hhciAqYXJncywgaW50IGZyb21fdHR5KQoreworICBp ZiAoY3VycmVudF90YXJnZXQudG9fc3RyYXR1bSA9PSByZWNvcmRfc3RyYXR1 bSkKKyAgICB7CisgICAgICBpZiAoIXJlY29yZF9saXN0IHx8ICFmcm9tX3R0 eSB8fCBxdWVyeSAoXygiRGVsZXRlIHJlY29yZGVkIGxvZyBhbmQgIgorCSAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3RvcCBy ZWNvcmRpbmc/IikpKQorCXVucHVzaF90YXJnZXQgKCZyZWNvcmRfb3BzKTsK KyAgICB9CisgIGVsc2UKKyAgICBwcmludGZfdW5maWx0ZXJlZCAoXygiUHJv Y2VzcyByZWNvcmQgaXMgbm90IHN0YXJ0ZWQuXG4iKSk7Cit9CisKKy8qIFNl dCB1cHBlciBsaW1pdCBvZiByZWNvcmQgbG9nIHNpemUuICAqLworCitzdGF0 aWMgdm9pZAorc2V0X3JlY29yZF9pbnNuX21heF9udW0gKGNoYXIgKmFyZ3Ms IGludCBmcm9tX3R0eSwgc3RydWN0IGNtZF9saXN0X2VsZW1lbnQgKmMpCit7 CisgIGlmIChyZWNvcmRfaW5zbl9udW0gPiByZWNvcmRfaW5zbl9tYXhfbnVt ICYmIHJlY29yZF9pbnNuX21heF9udW0pCisgICAgeworICAgICAgcHJpbnRm X3VuZmlsdGVyZWQgKF8oIlJlY29yZCBpbnN0cnVjdGlvbnMgbnVtYmVyIGlz IGJpZ2dlciB0aGFuICIKKwkJICAgICAgICAgICAicmVjb3JkIGluc3RydWN0 aW9ucyBtYXggbnVtYmVyLiAgQXV0byBkZWxldGUgIgorCQkgICAgICAgICAg ICJ0aGUgZmlyc3Qgb25lcz9cbiIpKTsKKworICAgICAgd2hpbGUgKHJlY29y ZF9pbnNuX251bSA+IHJlY29yZF9pbnNuX21heF9udW0pCisJcmVjb3JkX2xp c3RfcmVsZWFzZV9maXJzdCAoKTsKKyAgICB9Cit9CisKKy8qIFByaW50IHRo ZSBjdXJyZW50IGluZGV4IGludG8gdGhlIHJlY29yZCBsb2cgKG51bWJlciBv ZiBpbnNucyByZWNvcmRlZAorICAgc28gZmFyKS4gICovCisKK3N0YXRpYyB2 b2lkCitzaG93X3JlY29yZF9pbnNuX251bWJlciAoY2hhciAqaWdub3JlLCBp bnQgZnJvbV90dHkpCit7CisgIHByaW50Zl91bmZpbHRlcmVkIChfKCJSZWNv cmQgaW5zdHJ1Y3Rpb24gbnVtYmVyIGlzICVkLlxuIiksCisJCSAgICAgcmVj b3JkX2luc25fbnVtKTsKK30KKwordm9pZAorX2luaXRpYWxpemVfcmVjb3Jk ICh2b2lkKQoreworICAvKiBJbml0IHJlY29yZF9maXJzdC4gICovCisgIHJl Y29yZF9maXJzdC5wcmV2ID0gTlVMTDsKKyAgcmVjb3JkX2ZpcnN0Lm5leHQg PSBOVUxMOworICByZWNvcmRfZmlyc3QudHlwZSA9IHJlY29yZF9lbmQ7CisK KyAgaW5pdF9yZWNvcmRfb3BzICgpOworICBhZGRfdGFyZ2V0ICgmcmVjb3Jk X29wcyk7CisKKyAgYWRkX3NldHNob3dfemludGVnZXJfY21kICgicmVjb3Jk Iiwgbm9fY2xhc3MsICZyZWNvcmRfZGVidWcsCisJCQkgICAgXygiU2V0IGRl YnVnZ2luZyBvZiByZWNvcmQvcmVwbGF5IGZlYXR1cmUuIiksCisJCQkgICAg XygiU2hvdyBkZWJ1Z2dpbmcgb2YgcmVjb3JkL3JlcGxheSBmZWF0dXJlLiIp LAorCQkJICAgIF8oIldoZW4gZW5hYmxlZCwgZGVidWdnaW5nIG91dHB1dCBm b3IgIgorCQkJICAgICAgInJlY29yZC9yZXBsYXkgZmVhdHVyZSBpcyBkaXNw bGF5ZWQuIiksCisJCQkgICAgTlVMTCwgc2hvd19yZWNvcmRfZGVidWcsICZz ZXRkZWJ1Z2xpc3QsCisJCQkgICAgJnNob3dkZWJ1Z2xpc3QpOworCisgIGFk ZF9jb20gKCJyZWNvcmQiLCBjbGFzc19vYnNjdXJlLCBjbWRfcmVjb3JkX3N0 YXJ0LAorCSAgIF8oIkFiYnJldmlhdGVkIGZvcm0gb2YgXCJ0YXJnZXQgcmVj b3JkXCIgY29tbWFuZC4iKSk7CisKKyAgYWRkX2NvbV9hbGlhcyAoInJlYyIs ICJyZWNvcmQiLCBjbGFzc19vYnNjdXJlLCAxKTsKKworICAvKiBYWFg6IEkg dHJ5IHRvIHVzZSBzb21lIHNpbXBsZSBjb21tYW5kcyBzdWNoIGFzICJkaXNj b25uZWN0IiBhbmQKKyAgICAgImRldGFjaCIgdG8gc3VwcG9ydCB0aGlzIGZ1 bmN0aW9ucy4gIEJ1dCB0aGVzZSBjb21tYW5kcyBhbGwgaGF2ZQorICAgICBv dGhlciBhZmZlY3QgdG8gR0RCIHN1Y2ggYXMgY2FsbCBmdW5jdGlvbiAibm9f c2hhcmVkX2xpYnJhcmllcyIuCisgICAgIFNvIEkgYWRkIHNwZWNpYWwgY29t bWFuZHMgdG8gR0RCLiAgKi8KKyAgYWRkX2NvbSAoImRlbHJlY29yZCIsIGNs YXNzX29ic2N1cmUsIGNtZF9yZWNvcmRfZGVsZXRlLAorCSAgIF8oIkRlbGV0 ZSB0aGUgcmVzdCBvZiBleGVjdXRpb24gbG9nIGFuZCBzdGFydCByZWNvcmRp bmcgaXQgYW5ldy4iKSk7CisgIGFkZF9jb21fYWxpYXMgKCJkciIsICJkZWxy ZWNvcmQiLCBjbGFzc19vYnNjdXJlLCAxKTsKKyAgYWRkX2NvbSAoInN0b3By ZWNvcmQiLCBjbGFzc19vYnNjdXJlLCBjbWRfcmVjb3JkX3N0b3AsCisJICAg XygiU3RvcCB0aGUgcmVjb3JkL3JlcGxheSB0YXJnZXQuIikpOworICBhZGRf Y29tX2FsaWFzICgic3IiLCAic3RvcHJlY29yZCIsIGNsYXNzX29ic2N1cmUs IDEpOworCisgIC8qIFJlY29yZCBpbnN0cnVjdGlvbnMgbnVtYmVyIGxpbWl0 IGNvbW1hbmQuICAqLworICBhZGRfc2V0c2hvd19ib29sZWFuX2NtZCAoInJl Y29yZC1zdG9wLWF0LWxpbWl0Iiwgbm9fY2xhc3MsCisJCQkgICAgJnJlY29y ZF9zdG9wX2F0X2xpbWl0LAorCQkJICAgIF8oIlNldCB3aGV0aGVyIHJlY29y ZC9yZXBsYXkgc3RvcCB3aGVuICIKKwkJCSAgICAgICJyZWNvcmQvcmVwbGF5 IGJ1ZmZlciBiZWNvbWVzIGZ1bGwuIiksCisJCQkgICAgXygiU2hvdyB3aGV0 aGVyIHJlY29yZC9yZXBsYXkgc3RvcCB3aGVuICIKKwkJCSAgICAgICJyZWNv cmQvcmVwbGF5IGJ1ZmZlciBiZWNvbWVzIGZ1bGwuIiksCisJICAgICAgICAg ICAgICAgICAgICBfKCJFbmFibGUgaXMgZGVmYXVsdCB2YWx1ZS5cbiIKKwkg ICAgICAgICAgICAgICAgICAgICAgIldoZW4gZW5hYmxlZCwgaWYgdGhlIHJl Y29yZC9yZXBsYXkgYnVmZmVyICIKKwkJCSAgICAgICJiZWNvbWVzIGZ1bGws XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXNrIHVzZXIg d2hhdCB0byBkby5cbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICJXaGVuIGRpc2FibGVkLCBpZiB0aGUgcmVjb3JkL3JlcGxheSBidWZmZXIg IgorCQkJICAgICAgImJlY29tZXMgZnVsbCxcbiIKKyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICJkZWxldGUgaXQgYW5kIHN0YXJ0IG5ldyByZWNv cmRpbmcuIiksCisJCQkgICAgTlVMTCwgTlVMTCwgJnNldGxpc3QsICZzaG93 bGlzdCk7CisgIGFkZF9zZXRzaG93X3ppbnRlZ2VyX2NtZCAoInJlY29yZC1p bnNuLW51bWJlci1tYXgiLCBub19jbGFzcywKKwkJCSAgICAmcmVjb3JkX2lu c25fbWF4X251bSwKKwkJCSAgICBfKCJTZXQgcmVjb3JkL3JlcGxheSBidWZm ZXIgbGltaXQuIiksCisJCQkgICAgXygiU2hvdyByZWNvcmQvcmVwbGF5IGJ1 ZmZlciBsaW1pdC4iKSwKKwkJCSAgICBfKCJTZXQgdGhlIG1heGltdW0gbnVt YmVyIG9mIGluc3RydWN0aW9ucyB0byBiZSAiCisgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAic3RvcmVkIGluIHRoZVxuIgorICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgInJlY29yZC9yZXBsYXkgYnVmZmVyLiAgIgor ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlplcm8gbWVhbnMgdW5s aW1pdGVkIChkZWZhdWx0IDIwMDAwMCkuIiksCisJCQkgICAgc2V0X3JlY29y ZF9pbnNuX21heF9udW0sCisJCQkgICAgTlVMTCwgJnNldGxpc3QsICZzaG93 bGlzdCk7CisgIGFkZF9pbmZvICgicmVjb3JkLWluc24tbnVtYmVyIiwgc2hv d19yZWNvcmRfaW5zbl9udW1iZXIsCisJICAgIF8oIlNob3cgdGhlIGN1cnJl bnQgbnVtYmVyIG9mIGluc3RydWN0aW9ucyBpbiB0aGUgIgorCSAgICAgICJy ZWNvcmQvcmVwbGF5IGJ1ZmZlci4iKSk7Cit9Ci0tLSAvZGV2L251bGwKKysr IGIvcmVjb3JkLmgKQEAgLTAsMCArMSw3NCBAQAorLyogUHJvY2VzcyByZWNv cmQgYW5kIHJlcGxheSB0YXJnZXQgZm9yIEdEQiwgdGhlIEdOVSBkZWJ1Z2dl ci4KKworICAgQ29weXJpZ2h0IChDKSAyMDA4LCAyMDA5IEZyZWUgU29mdHdh cmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBv ZiBHREIuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5 b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1 bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNl bnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91 bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IK KyAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAg IFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0 IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJB TlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAg IE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIg UFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNl bnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSBy ZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNl bnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2Vl IDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCisKKyNpZm5k ZWYgX1JFQ09SRF9IXworI2RlZmluZSBfUkVDT1JEX0hfCisKK3R5cGVkZWYg c3RydWN0IHJlY29yZF9yZWdfcworeworICBpbnQgbnVtOworICBnZGJfYnl0 ZSAqdmFsOworfSByZWNvcmRfcmVnX3Q7CisKK3R5cGVkZWYgc3RydWN0IHJl Y29yZF9tZW1fcworeworICBDT1JFX0FERFIgYWRkcjsKKyAgaW50IGxlbjsK KyAgZ2RiX2J5dGUgKnZhbDsKK30gcmVjb3JkX21lbV90OworCitlbnVtIHJl Y29yZF90eXBlCit7CisgIHJlY29yZF9lbmQgPSAwLAorICByZWNvcmRfcmVn LAorICByZWNvcmRfbWVtCit9OworCisvKiBUaGlzIGlzIHRoZSBjb3JlIHN0 cnVjdCBvZiByZWNvcmQgZnVuY3Rpb24uCisKKyAgIEFuIGVudGl0eSBvZiBy ZWNvcmRfdCBpcyBhIHJlY29yZCBvZiB0aGUgdmFsdWUgY2hhbmdlIG9mIGEg cmVnaXN0ZXIKKyAgICgicmVjb3JkX3JlZyIpIG9yIGEgcGFydCBvZiBtZW1v cnkgKCJyZWNvcmRfbWVtIikuICBBbmQgZWFjaAorICAgaW5zdHJ1Y3Rpb24g bXVzdCBoYXMgYSByZWNvcmRfdCAoInJlY29yZF9lbmQiKSB0aGF0IHBvaW50 cyBvdXQgdGhpcworICAgaXMgdGhlIGxhc3QgcmVjb3JkX3Qgb2YgdGhpcyBp bnN0cnVjdGlvbi4KKworICAgRWFjaCByZWNvcmRfdCBpcyBsaW5rZWQgdG8g InJlY29yZF9saXN0IiBieSAicHJldiIgYW5kICJuZXh0Ii4KKyAqLwordHlw ZWRlZiBzdHJ1Y3QgcmVjb3JkX3MKK3sKKyAgc3RydWN0IHJlY29yZF9zICpw cmV2OworICBzdHJ1Y3QgcmVjb3JkX3MgKm5leHQ7CisgIGVudW0gcmVjb3Jk X3R5cGUgdHlwZTsKKyAgdW5pb24KKyAgeworICAgIC8qIHJlZyAqLworICAg IHJlY29yZF9yZWdfdCByZWc7CisgICAgLyogbWVtICovCisgICAgcmVjb3Jk X21lbV90IG1lbTsKKyAgfSB1OworfSByZWNvcmRfdDsKKworZXh0ZXJuIGlu dCByZWNvcmRfZGVidWc7CitleHRlcm4gc3RydWN0IHJlZ2NhY2hlICpyZWNv cmRfcmVnY2FjaGU7CisKK2V4dGVybiBpbnQgcmVjb3JkX2FyY2hfbGlzdF9h ZGRfcmVnIChpbnQgbnVtKTsKK2V4dGVybiBpbnQgcmVjb3JkX2FyY2hfbGlz dF9hZGRfbWVtIChDT1JFX0FERFIgYWRkciwgaW50IGxlbik7CitleHRlcm4g aW50IHJlY29yZF9hcmNoX2xpc3RfYWRkX2VuZCAodm9pZCk7CitleHRlcm4g c3RydWN0IGNsZWFudXAgKiByZWNvcmRfZ2RiX29wZXJhdGlvbl9kaXNhYmxl X3NldCAodm9pZCk7CisKKyNlbmRpZiAvKiBfUkVDT1JEX0hfICovCg== --0016e6511bd0785e1f0465646c63--