xref: /dragonfly/contrib/gdb-7/gdb/record.c (revision dcd37f7d)
1 /* Process record and replay target for GDB, the GNU debugger.
2 
3    Copyright (C) 2008, 2009 Free Software Foundation, Inc.
4 
5    This file is part of GDB.
6 
7    This program is free software; you can redistribute it and/or modify
8    it under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 3 of the License, or
10    (at your option) any later version.
11 
12    This program is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15    GNU General Public License for more details.
16 
17    You should have received a copy of the GNU General Public License
18    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
19 
20 #include "defs.h"
21 #include "gdbcmd.h"
22 #include "regcache.h"
23 #include "gdbthread.h"
24 #include "event-top.h"
25 #include "exceptions.h"
26 #include "record.h"
27 
28 #include <signal.h>
29 
30 #define DEFAULT_RECORD_INSN_MAX_NUM	200000
31 
32 #define RECORD_IS_REPLAY \
33      (record_list->next || execution_direction == EXEC_REVERSE)
34 
35 /* These are the core structs of the process record functionality.
36 
37    A record_entry is a record of the value change of a register
38    ("record_reg") or a part of memory ("record_mem").  And each
39    instruction must have a struct record_entry ("record_end") that
40    indicates that this is the last struct record_entry of this
41    instruction.
42 
43    Each struct record_entry is linked to "record_list" by "prev" and
44    "next" pointers.  */
45 
46 struct record_reg_entry
47 {
48   int num;
49   gdb_byte *val;
50 };
51 
52 struct record_mem_entry
53 {
54   CORE_ADDR addr;
55   int len;
56   /* Set this flag if target memory for this entry
57      can no longer be accessed.  */
58   int mem_entry_not_accessible;
59   gdb_byte *val;
60 };
61 
62 struct record_end_entry
63 {
64   enum target_signal sigval;
65 };
66 
67 enum record_type
68 {
69   record_end = 0,
70   record_reg,
71   record_mem
72 };
73 
74 struct record_entry
75 {
76   struct record_entry *prev;
77   struct record_entry *next;
78   enum record_type type;
79   union
80   {
81     /* reg */
82     struct record_reg_entry reg;
83     /* mem */
84     struct record_mem_entry mem;
85     /* end */
86     struct record_end_entry end;
87   } u;
88 };
89 
90 /* This is the debug switch for process record.  */
91 int record_debug = 0;
92 
93 /* These list is for execution log.  */
94 static struct record_entry record_first;
95 static struct record_entry *record_list = &record_first;
96 static struct record_entry *record_arch_list_head = NULL;
97 static struct record_entry *record_arch_list_tail = NULL;
98 
99 /* 1 ask user. 0 auto delete the last struct record_entry.  */
100 static int record_stop_at_limit = 1;
101 static int record_insn_max_num = DEFAULT_RECORD_INSN_MAX_NUM;
102 static int record_insn_num = 0;
103 
104 /* The target_ops of process record.  */
105 static struct target_ops record_ops;
106 
107 /* The beneath function pointers.  */
108 static struct target_ops *record_beneath_to_resume_ops;
109 static void (*record_beneath_to_resume) (struct target_ops *, ptid_t, int,
110                                          enum target_signal);
111 static struct target_ops *record_beneath_to_wait_ops;
112 static ptid_t (*record_beneath_to_wait) (struct target_ops *, ptid_t,
113 					 struct target_waitstatus *,
114 					 int);
115 static struct target_ops *record_beneath_to_store_registers_ops;
116 static void (*record_beneath_to_store_registers) (struct target_ops *,
117                                                   struct regcache *,
118 						  int regno);
119 static struct target_ops *record_beneath_to_xfer_partial_ops;
120 static LONGEST (*record_beneath_to_xfer_partial) (struct target_ops *ops,
121 						  enum target_object object,
122 						  const char *annex,
123 						  gdb_byte *readbuf,
124 						  const gdb_byte *writebuf,
125 						  ULONGEST offset,
126 						  LONGEST len);
127 static int (*record_beneath_to_insert_breakpoint) (struct gdbarch *,
128 						   struct bp_target_info *);
129 static int (*record_beneath_to_remove_breakpoint) (struct gdbarch *,
130 						   struct bp_target_info *);
131 
132 static void
133 record_list_release (struct record_entry *rec)
134 {
135   struct record_entry *tmp;
136 
137   if (!rec)
138     return;
139 
140   while (rec->next)
141     {
142       rec = rec->next;
143     }
144 
145   while (rec->prev)
146     {
147       tmp = rec;
148       rec = rec->prev;
149       if (tmp->type == record_reg)
150 	xfree (tmp->u.reg.val);
151       else if (tmp->type == record_mem)
152 	xfree (tmp->u.mem.val);
153       xfree (tmp);
154     }
155 
156   if (rec != &record_first)
157     xfree (rec);
158 }
159 
160 static void
161 record_list_release_next (void)
162 {
163   struct record_entry *rec = record_list;
164   struct record_entry *tmp = rec->next;
165   rec->next = NULL;
166   while (tmp)
167     {
168       rec = tmp->next;
169       if (tmp->type == record_end)
170 	record_insn_num--;
171       else if (tmp->type == record_reg)
172 	xfree (tmp->u.reg.val);
173       else if (tmp->type == record_mem)
174 	xfree (tmp->u.mem.val);
175       xfree (tmp);
176       tmp = rec;
177     }
178 }
179 
180 static void
181 record_list_release_first (void)
182 {
183   struct record_entry *tmp = NULL;
184   enum record_type type;
185 
186   if (!record_first.next)
187     return;
188 
189   while (1)
190     {
191       type = record_first.next->type;
192 
193       if (type == record_reg)
194 	xfree (record_first.next->u.reg.val);
195       else if (type == record_mem)
196 	xfree (record_first.next->u.mem.val);
197       tmp = record_first.next;
198       record_first.next = tmp->next;
199       xfree (tmp);
200 
201       if (!record_first.next)
202 	{
203 	  gdb_assert (record_insn_num == 1);
204 	  break;
205 	}
206 
207       record_first.next->prev = &record_first;
208 
209       if (type == record_end)
210 	break;
211     }
212 
213   record_insn_num--;
214 }
215 
216 /* Add a struct record_entry to record_arch_list.  */
217 
218 static void
219 record_arch_list_add (struct record_entry *rec)
220 {
221   if (record_debug > 1)
222     fprintf_unfiltered (gdb_stdlog,
223 			"Process record: record_arch_list_add %s.\n",
224 			host_address_to_string (rec));
225 
226   if (record_arch_list_tail)
227     {
228       record_arch_list_tail->next = rec;
229       rec->prev = record_arch_list_tail;
230       record_arch_list_tail = rec;
231     }
232   else
233     {
234       record_arch_list_head = rec;
235       record_arch_list_tail = rec;
236     }
237 }
238 
239 /* Record the value of a register NUM to record_arch_list.  */
240 
241 int
242 record_arch_list_add_reg (struct regcache *regcache, int num)
243 {
244   struct record_entry *rec;
245 
246   if (record_debug > 1)
247     fprintf_unfiltered (gdb_stdlog,
248 			"Process record: add register num = %d to "
249 			"record list.\n",
250 			num);
251 
252   rec = (struct record_entry *) xmalloc (sizeof (struct record_entry));
253   rec->u.reg.val = (gdb_byte *) xmalloc (MAX_REGISTER_SIZE);
254   rec->prev = NULL;
255   rec->next = NULL;
256   rec->type = record_reg;
257   rec->u.reg.num = num;
258 
259   regcache_raw_read (regcache, num, rec->u.reg.val);
260 
261   record_arch_list_add (rec);
262 
263   return 0;
264 }
265 
266 /* Record the value of a region of memory whose address is ADDR and
267    length is LEN to record_arch_list.  */
268 
269 int
270 record_arch_list_add_mem (CORE_ADDR addr, int len)
271 {
272   struct record_entry *rec;
273 
274   if (record_debug > 1)
275     fprintf_unfiltered (gdb_stdlog,
276 			"Process record: add mem addr = %s len = %d to "
277 			"record list.\n",
278 			paddress (target_gdbarch, addr), len);
279 
280   if (!addr)
281     return 0;
282 
283   rec = (struct record_entry *) xmalloc (sizeof (struct record_entry));
284   rec->u.mem.val = (gdb_byte *) xmalloc (len);
285   rec->prev = NULL;
286   rec->next = NULL;
287   rec->type = record_mem;
288   rec->u.mem.addr = addr;
289   rec->u.mem.len = len;
290   rec->u.mem.mem_entry_not_accessible = 0;
291 
292   if (target_read_memory (addr, rec->u.mem.val, len))
293     {
294       if (record_debug)
295 	fprintf_unfiltered (gdb_stdlog,
296 			    "Process record: error reading memory at "
297 			    "addr = %s len = %d.\n",
298 			    paddress (target_gdbarch, addr), len);
299       xfree (rec->u.mem.val);
300       xfree (rec);
301       return -1;
302     }
303 
304   record_arch_list_add (rec);
305 
306   return 0;
307 }
308 
309 /* Add a record_end type struct record_entry to record_arch_list.  */
310 
311 int
312 record_arch_list_add_end (void)
313 {
314   struct record_entry *rec;
315 
316   if (record_debug > 1)
317     fprintf_unfiltered (gdb_stdlog,
318 			"Process record: add end to arch list.\n");
319 
320   rec = (struct record_entry *) xmalloc (sizeof (struct record_entry));
321   rec->prev = NULL;
322   rec->next = NULL;
323   rec->type = record_end;
324   rec->u.end.sigval = TARGET_SIGNAL_0;
325 
326   record_arch_list_add (rec);
327 
328   return 0;
329 }
330 
331 static void
332 record_check_insn_num (int set_terminal)
333 {
334   if (record_insn_max_num)
335     {
336       gdb_assert (record_insn_num <= record_insn_max_num);
337       if (record_insn_num == record_insn_max_num)
338 	{
339 	  /* Ask user what to do.  */
340 	  if (record_stop_at_limit)
341 	    {
342 	      int q;
343 	      if (set_terminal)
344 		target_terminal_ours ();
345 	      q = yquery (_("Do you want to auto delete previous execution "
346 			    "log entries when record/replay buffer becomes "
347 			    "full (record stop-at-limit)?"));
348 	      if (set_terminal)
349 		target_terminal_inferior ();
350 	      if (q)
351 		record_stop_at_limit = 0;
352 	      else
353 		error (_("Process record: inferior program stopped."));
354 	    }
355 	}
356     }
357 }
358 
359 /* Before inferior step (when GDB record the running message, inferior
360    only can step), GDB will call this function to record the values to
361    record_list.  This function will call gdbarch_process_record to
362    record the running message of inferior and set them to
363    record_arch_list, and add it to record_list.  */
364 
365 static void
366 record_message_cleanups (void *ignore)
367 {
368   record_list_release (record_arch_list_tail);
369 }
370 
371 struct record_message_args {
372   struct regcache *regcache;
373   enum target_signal signal;
374 };
375 
376 static int
377 record_message (void *args)
378 {
379   int ret;
380   struct record_message_args *myargs = args;
381   struct gdbarch *gdbarch = get_regcache_arch (myargs->regcache);
382   struct cleanup *old_cleanups = make_cleanup (record_message_cleanups, 0);
383 
384   record_arch_list_head = NULL;
385   record_arch_list_tail = NULL;
386 
387   /* Check record_insn_num.  */
388   record_check_insn_num (1);
389 
390   /* If gdb sends a signal value to target_resume,
391      save it in the 'end' field of the previous instruction.
392 
393      Maybe process record should record what really happened,
394      rather than what gdb pretends has happened.
395 
396      So if Linux delivered the signal to the child process during
397      the record mode, we will record it and deliver it again in
398      the replay mode.
399 
400      If user says "ignore this signal" during the record mode, then
401      it will be ignored again during the replay mode (no matter if
402      the user says something different, like "deliver this signal"
403      during the replay mode).
404 
405      User should understand that nothing he does during the replay
406      mode will change the behavior of the child.  If he tries,
407      then that is a user error.
408 
409      But we should still deliver the signal to gdb during the replay,
410      if we delivered it during the recording.  Therefore we should
411      record the signal during record_wait, not record_resume.  */
412   if (record_list != &record_first)    /* FIXME better way to check */
413     {
414       gdb_assert (record_list->type == record_end);
415       record_list->u.end.sigval = myargs->signal;
416     }
417 
418   if (myargs->signal == TARGET_SIGNAL_0
419       || !gdbarch_process_record_signal_p (gdbarch))
420     ret = gdbarch_process_record (gdbarch,
421 				  myargs->regcache,
422 				  regcache_read_pc (myargs->regcache));
423   else
424     ret = gdbarch_process_record_signal (gdbarch,
425 					 myargs->regcache,
426 					 myargs->signal);
427 
428   if (ret > 0)
429     error (_("Process record: inferior program stopped."));
430   if (ret < 0)
431     error (_("Process record: failed to record execution log."));
432 
433   discard_cleanups (old_cleanups);
434 
435   record_list->next = record_arch_list_head;
436   record_arch_list_head->prev = record_list;
437   record_list = record_arch_list_tail;
438 
439   if (record_insn_num == record_insn_max_num && record_insn_max_num)
440     record_list_release_first ();
441   else
442     record_insn_num++;
443 
444   return 1;
445 }
446 
447 static int
448 do_record_message (struct regcache *regcache,
449 		   enum target_signal signal)
450 {
451   struct record_message_args args;
452 
453   args.regcache = regcache;
454   args.signal = signal;
455   return catch_errors (record_message, &args, NULL, RETURN_MASK_ALL);
456 }
457 
458 /* Set to 1 if record_store_registers and record_xfer_partial
459    doesn't need record.  */
460 
461 static int record_gdb_operation_disable = 0;
462 
463 struct cleanup *
464 record_gdb_operation_disable_set (void)
465 {
466   struct cleanup *old_cleanups = NULL;
467 
468   old_cleanups =
469     make_cleanup_restore_integer (&record_gdb_operation_disable);
470   record_gdb_operation_disable = 1;
471 
472   return old_cleanups;
473 }
474 
475 static void
476 record_open (char *name, int from_tty)
477 {
478   struct target_ops *t;
479 
480   if (record_debug)
481     fprintf_unfiltered (gdb_stdlog, "Process record: record_open\n");
482 
483   /* check exec */
484   if (!target_has_execution)
485     error (_("Process record: the program is not being run."));
486   if (non_stop)
487     error (_("Process record target can't debug inferior in non-stop mode "
488 	     "(non-stop)."));
489   if (target_async_permitted)
490     error (_("Process record target can't debug inferior in asynchronous "
491 	     "mode (target-async)."));
492 
493   if (!gdbarch_process_record_p (target_gdbarch))
494     error (_("Process record: the current architecture doesn't support "
495 	     "record function."));
496 
497   /* Check if record target is already running.  */
498   if (current_target.to_stratum == record_stratum)
499      error (_("Process record target already running.  Use \"record stop\" to "
500  	     "stop record target first."));
501 
502   /*Reset the beneath function pointers.  */
503   record_beneath_to_resume = NULL;
504   record_beneath_to_wait = NULL;
505   record_beneath_to_store_registers = NULL;
506   record_beneath_to_xfer_partial = NULL;
507   record_beneath_to_insert_breakpoint = NULL;
508   record_beneath_to_remove_breakpoint = NULL;
509 
510   /* Set the beneath function pointers.  */
511   for (t = current_target.beneath; t != NULL; t = t->beneath)
512     {
513       if (!record_beneath_to_resume)
514         {
515 	  record_beneath_to_resume = t->to_resume;
516 	  record_beneath_to_resume_ops = t;
517         }
518       if (!record_beneath_to_wait)
519         {
520 	  record_beneath_to_wait = t->to_wait;
521 	  record_beneath_to_wait_ops = t;
522         }
523       if (!record_beneath_to_store_registers)
524         {
525 	  record_beneath_to_store_registers = t->to_store_registers;
526 	  record_beneath_to_store_registers_ops = t;
527         }
528       if (!record_beneath_to_xfer_partial)
529         {
530 	  record_beneath_to_xfer_partial = t->to_xfer_partial;
531 	  record_beneath_to_xfer_partial_ops = t;
532         }
533       if (!record_beneath_to_insert_breakpoint)
534 	record_beneath_to_insert_breakpoint = t->to_insert_breakpoint;
535       if (!record_beneath_to_remove_breakpoint)
536 	record_beneath_to_remove_breakpoint = t->to_remove_breakpoint;
537     }
538   if (!record_beneath_to_resume)
539     error (_("Process record can't get to_resume."));
540   if (!record_beneath_to_wait)
541     error (_("Process record can't get to_wait."));
542   if (!record_beneath_to_store_registers)
543     error (_("Process record can't get to_store_registers."));
544   if (!record_beneath_to_xfer_partial)
545     error (_("Process record can't get to_xfer_partial."));
546   if (!record_beneath_to_insert_breakpoint)
547     error (_("Process record can't get to_insert_breakpoint."));
548   if (!record_beneath_to_remove_breakpoint)
549     error (_("Process record can't get to_remove_breakpoint."));
550 
551   push_target (&record_ops);
552 
553   /* Reset */
554   record_insn_num = 0;
555   record_list = &record_first;
556   record_list->next = NULL;
557 }
558 
559 static void
560 record_close (int quitting)
561 {
562   if (record_debug)
563     fprintf_unfiltered (gdb_stdlog, "Process record: record_close\n");
564 
565   record_list_release (record_list);
566 }
567 
568 static int record_resume_step = 0;
569 static int record_resume_error;
570 
571 static void
572 record_resume (struct target_ops *ops, ptid_t ptid, int step,
573                enum target_signal signal)
574 {
575   record_resume_step = step;
576 
577   if (!RECORD_IS_REPLAY)
578     {
579       if (do_record_message (get_current_regcache (), signal))
580         {
581           record_resume_error = 0;
582         }
583       else
584         {
585           record_resume_error = 1;
586           return;
587         }
588       record_beneath_to_resume (record_beneath_to_resume_ops, ptid, 1,
589                                 signal);
590     }
591 }
592 
593 static int record_get_sig = 0;
594 
595 static void
596 record_sig_handler (int signo)
597 {
598   if (record_debug)
599     fprintf_unfiltered (gdb_stdlog, "Process record: get a signal\n");
600 
601   /* It will break the running inferior in replay mode.  */
602   record_resume_step = 1;
603 
604   /* It will let record_wait set inferior status to get the signal
605      SIGINT.  */
606   record_get_sig = 1;
607 }
608 
609 static void
610 record_wait_cleanups (void *ignore)
611 {
612   if (execution_direction == EXEC_REVERSE)
613     {
614       if (record_list->next)
615 	record_list = record_list->next;
616     }
617   else
618     record_list = record_list->prev;
619 }
620 
621 /* In replay mode, this function examines the recorded log and
622    determines where to stop.  */
623 
624 static ptid_t
625 record_wait (struct target_ops *ops,
626 	     ptid_t ptid, struct target_waitstatus *status,
627 	     int options)
628 {
629   struct cleanup *set_cleanups = record_gdb_operation_disable_set ();
630 
631   if (record_debug)
632     fprintf_unfiltered (gdb_stdlog,
633 			"Process record: record_wait "
634 			"record_resume_step = %d\n",
635 			record_resume_step);
636 
637   if (!RECORD_IS_REPLAY)
638     {
639       if (record_resume_error)
640 	{
641 	  /* If record_resume get error, return directly.  */
642 	  status->kind = TARGET_WAITKIND_STOPPED;
643 	  status->value.sig = TARGET_SIGNAL_ABRT;
644 	  return inferior_ptid;
645 	}
646 
647       if (record_resume_step)
648 	{
649 	  /* This is a single step.  */
650 	  return record_beneath_to_wait (record_beneath_to_wait_ops,
651 					 ptid, status, options);
652 	}
653       else
654 	{
655 	  /* This is not a single step.  */
656 	  ptid_t ret;
657 	  CORE_ADDR tmp_pc;
658 
659 	  while (1)
660 	    {
661 	      ret = record_beneath_to_wait (record_beneath_to_wait_ops,
662 					    ptid, status, options);
663 
664 	      /* Is this a SIGTRAP?  */
665 	      if (status->kind == TARGET_WAITKIND_STOPPED
666 		  && status->value.sig == TARGET_SIGNAL_TRAP)
667 		{
668 		  /* Yes -- check if there is a breakpoint.  */
669 		  registers_changed ();
670 		  tmp_pc = regcache_read_pc (get_current_regcache ());
671 		  if (breakpoint_inserted_here_p (tmp_pc))
672 		    {
673 		      /* There is a breakpoint.  GDB will want to stop.  */
674 		      CORE_ADDR decr_pc_after_break =
675 			gdbarch_decr_pc_after_break
676 			(get_regcache_arch (get_current_regcache ()));
677 		      if (decr_pc_after_break)
678 			{
679 			  regcache_write_pc (get_thread_regcache (ret),
680 					     tmp_pc + decr_pc_after_break);
681 			}
682 		    }
683 		  else
684 		    {
685 		      /* There is not a breakpoint, and gdb is not
686 		         stepping, therefore gdb will not stop.
687 			 Therefore we will not return to gdb.
688 		         Record the insn and resume.  */
689 		      if (!do_record_message (get_current_regcache (),
690 					      TARGET_SIGNAL_0))
691 			{
692                           break;
693 			}
694 		      record_beneath_to_resume (record_beneath_to_resume_ops,
695 						ptid, 1,
696 						TARGET_SIGNAL_0);
697 		      continue;
698 		    }
699 		}
700 
701 	      /* The inferior is broken by a breakpoint or a signal.  */
702 	      break;
703 	    }
704 
705 	  return ret;
706 	}
707     }
708   else
709     {
710       struct regcache *regcache = get_current_regcache ();
711       struct gdbarch *gdbarch = get_regcache_arch (regcache);
712       int continue_flag = 1;
713       int first_record_end = 1;
714       struct cleanup *old_cleanups = make_cleanup (record_wait_cleanups, 0);
715       CORE_ADDR tmp_pc;
716 
717       status->kind = TARGET_WAITKIND_STOPPED;
718 
719       /* Check breakpoint when forward execute.  */
720       if (execution_direction == EXEC_FORWARD)
721 	{
722 	  tmp_pc = regcache_read_pc (regcache);
723 	  if (breakpoint_inserted_here_p (tmp_pc))
724 	    {
725 	      if (record_debug)
726 		fprintf_unfiltered (gdb_stdlog,
727 				    "Process record: break at %s.\n",
728 				    paddress (gdbarch, tmp_pc));
729 	      if (gdbarch_decr_pc_after_break (gdbarch)
730 		  && !record_resume_step)
731 		regcache_write_pc (regcache,
732 				   tmp_pc +
733 				   gdbarch_decr_pc_after_break (gdbarch));
734 	      goto replay_out;
735 	    }
736 	}
737 
738       record_get_sig = 0;
739       signal (SIGINT, record_sig_handler);
740       /* If GDB is in terminal_inferior mode, it will not get the signal.
741          And in GDB replay mode, GDB doesn't need to be in terminal_inferior
742          mode, because inferior will not executed.
743          Then set it to terminal_ours to make GDB get the signal.  */
744       target_terminal_ours ();
745 
746       /* In EXEC_FORWARD mode, record_list points to the tail of prev
747          instruction.  */
748       if (execution_direction == EXEC_FORWARD && record_list->next)
749 	record_list = record_list->next;
750 
751       /* Loop over the record_list, looking for the next place to
752 	 stop.  */
753       do
754 	{
755 	  /* Check for beginning and end of log.  */
756 	  if (execution_direction == EXEC_REVERSE
757 	      && record_list == &record_first)
758 	    {
759 	      /* Hit beginning of record log in reverse.  */
760 	      status->kind = TARGET_WAITKIND_NO_HISTORY;
761 	      break;
762 	    }
763 	  if (execution_direction != EXEC_REVERSE && !record_list->next)
764 	    {
765 	      /* Hit end of record log going forward.  */
766 	      status->kind = TARGET_WAITKIND_NO_HISTORY;
767 	      break;
768 	    }
769 
770 	  /* Set ptid, register and memory according to record_list.  */
771 	  if (record_list->type == record_reg)
772 	    {
773 	      /* reg */
774 	      gdb_byte reg[MAX_REGISTER_SIZE];
775 	      if (record_debug > 1)
776 		fprintf_unfiltered (gdb_stdlog,
777 				    "Process record: record_reg %s to "
778 				    "inferior num = %d.\n",
779 				    host_address_to_string (record_list),
780 				    record_list->u.reg.num);
781 	      regcache_cooked_read (regcache, record_list->u.reg.num, reg);
782 	      regcache_cooked_write (regcache, record_list->u.reg.num,
783 				     record_list->u.reg.val);
784 	      memcpy (record_list->u.reg.val, reg, MAX_REGISTER_SIZE);
785 	    }
786 	  else if (record_list->type == record_mem)
787 	    {
788 	      /* mem */
789 	      /* Nothing to do if the entry is flagged not_accessible.  */
790 	      if (!record_list->u.mem.mem_entry_not_accessible)
791 		{
792 		  gdb_byte *mem = alloca (record_list->u.mem.len);
793 		  if (record_debug > 1)
794 		    fprintf_unfiltered (gdb_stdlog,
795 				        "Process record: record_mem %s to "
796 				        "inferior addr = %s len = %d.\n",
797 				        host_address_to_string (record_list),
798 				        paddress (gdbarch,
799 					          record_list->u.mem.addr),
800 				        record_list->u.mem.len);
801 
802 		  if (target_read_memory (record_list->u.mem.addr, mem,
803 		                          record_list->u.mem.len))
804 	            {
805 		      if (execution_direction != EXEC_REVERSE)
806 		        error (_("Process record: error reading memory at "
807 			         "addr = %s len = %d."),
808 		               paddress (gdbarch, record_list->u.mem.addr),
809 		               record_list->u.mem.len);
810 		      else
811 			/* Read failed --
812 			   flag entry as not_accessible.  */
813 		        record_list->u.mem.mem_entry_not_accessible = 1;
814 		    }
815 		  else
816 		    {
817 		      if (target_write_memory (record_list->u.mem.addr,
818 			                       record_list->u.mem.val,
819 		                               record_list->u.mem.len))
820 	                {
821 			  if (execution_direction != EXEC_REVERSE)
822 			    error (_("Process record: error writing memory at "
823 			             "addr = %s len = %d."),
824 		                   paddress (gdbarch, record_list->u.mem.addr),
825 		                   record_list->u.mem.len);
826 			  else
827 			    /* Write failed --
828 			       flag entry as not_accessible.  */
829 			    record_list->u.mem.mem_entry_not_accessible = 1;
830 			}
831 		      else
832 		        {
833 			  memcpy (record_list->u.mem.val, mem,
834 				  record_list->u.mem.len);
835 			}
836 		    }
837 		}
838 	    }
839 	  else
840 	    {
841 	      if (record_debug > 1)
842 		fprintf_unfiltered (gdb_stdlog,
843 				    "Process record: record_end %s to "
844 				    "inferior.\n",
845 				    host_address_to_string (record_list));
846 
847 	      if (first_record_end && execution_direction == EXEC_REVERSE)
848 		{
849 		  /* When reverse excute, the first record_end is the part of
850 		     current instruction.  */
851 		  first_record_end = 0;
852 		}
853 	      else
854 		{
855 		  /* In EXEC_REVERSE mode, this is the record_end of prev
856 		     instruction.
857 		     In EXEC_FORWARD mode, this is the record_end of current
858 		     instruction.  */
859 		  /* step */
860 		  if (record_resume_step)
861 		    {
862 		      if (record_debug > 1)
863 			fprintf_unfiltered (gdb_stdlog,
864 					    "Process record: step.\n");
865 		      continue_flag = 0;
866 		    }
867 
868 		  /* check breakpoint */
869 		  tmp_pc = regcache_read_pc (regcache);
870 		  if (breakpoint_inserted_here_p (tmp_pc))
871 		    {
872 		      if (record_debug)
873 			fprintf_unfiltered (gdb_stdlog,
874 					    "Process record: break "
875 					    "at %s.\n",
876 					    paddress (gdbarch, tmp_pc));
877 		      if (gdbarch_decr_pc_after_break (gdbarch)
878 			  && execution_direction == EXEC_FORWARD
879 			  && !record_resume_step)
880 			regcache_write_pc (regcache,
881 					   tmp_pc +
882 					   gdbarch_decr_pc_after_break (gdbarch));
883 		      continue_flag = 0;
884 		    }
885 		  /* Check target signal */
886 		  if (record_list->u.end.sigval != TARGET_SIGNAL_0)
887 		    /* FIXME: better way to check */
888 		    continue_flag = 0;
889 		}
890 	    }
891 
892 	  if (continue_flag)
893 	    {
894 	      if (execution_direction == EXEC_REVERSE)
895 		{
896 		  if (record_list->prev)
897 		    record_list = record_list->prev;
898 		}
899 	      else
900 		{
901 		  if (record_list->next)
902 		    record_list = record_list->next;
903 		}
904 	    }
905 	}
906       while (continue_flag);
907 
908       signal (SIGINT, handle_sigint);
909 
910 replay_out:
911       if (record_get_sig)
912 	status->value.sig = TARGET_SIGNAL_INT;
913       else if (record_list->u.end.sigval != TARGET_SIGNAL_0)
914 	/* FIXME: better way to check */
915 	status->value.sig = record_list->u.end.sigval;
916       else
917 	status->value.sig = TARGET_SIGNAL_TRAP;
918 
919       discard_cleanups (old_cleanups);
920     }
921 
922   do_cleanups (set_cleanups);
923   return inferior_ptid;
924 }
925 
926 static void
927 record_disconnect (struct target_ops *target, char *args, int from_tty)
928 {
929   if (record_debug)
930     fprintf_unfiltered (gdb_stdlog, "Process record: record_disconnect\n");
931 
932   unpush_target (&record_ops);
933   target_disconnect (args, from_tty);
934 }
935 
936 static void
937 record_detach (struct target_ops *ops, char *args, int from_tty)
938 {
939   if (record_debug)
940     fprintf_unfiltered (gdb_stdlog, "Process record: record_detach\n");
941 
942   unpush_target (&record_ops);
943   target_detach (args, from_tty);
944 }
945 
946 static void
947 record_mourn_inferior (struct target_ops *ops)
948 {
949   if (record_debug)
950     fprintf_unfiltered (gdb_stdlog, "Process record: "
951 			            "record_mourn_inferior\n");
952 
953   unpush_target (&record_ops);
954   target_mourn_inferior ();
955 }
956 
957 /* Close process record target before killing the inferior process.  */
958 
959 static void
960 record_kill (struct target_ops *ops)
961 {
962   if (record_debug)
963     fprintf_unfiltered (gdb_stdlog, "Process record: record_kill\n");
964 
965   unpush_target (&record_ops);
966   target_kill ();
967 }
968 
969 /* Record registers change (by user or by GDB) to list as an instruction.  */
970 
971 static void
972 record_registers_change (struct regcache *regcache, int regnum)
973 {
974   /* Check record_insn_num.  */
975   record_check_insn_num (0);
976 
977   record_arch_list_head = NULL;
978   record_arch_list_tail = NULL;
979 
980   if (regnum < 0)
981     {
982       int i;
983       for (i = 0; i < gdbarch_num_regs (get_regcache_arch (regcache)); i++)
984 	{
985 	  if (record_arch_list_add_reg (regcache, i))
986 	    {
987 	      record_list_release (record_arch_list_tail);
988 	      error (_("Process record: failed to record execution log."));
989 	    }
990 	}
991     }
992   else
993     {
994       if (record_arch_list_add_reg (regcache, regnum))
995 	{
996 	  record_list_release (record_arch_list_tail);
997 	  error (_("Process record: failed to record execution log."));
998 	}
999     }
1000   if (record_arch_list_add_end ())
1001     {
1002       record_list_release (record_arch_list_tail);
1003       error (_("Process record: failed to record execution log."));
1004     }
1005   record_list->next = record_arch_list_head;
1006   record_arch_list_head->prev = record_list;
1007   record_list = record_arch_list_tail;
1008 
1009   if (record_insn_num == record_insn_max_num && record_insn_max_num)
1010     record_list_release_first ();
1011   else
1012     record_insn_num++;
1013 }
1014 
1015 static void
1016 record_store_registers (struct target_ops *ops, struct regcache *regcache,
1017                         int regno)
1018 {
1019   if (!record_gdb_operation_disable)
1020     {
1021       if (RECORD_IS_REPLAY)
1022 	{
1023 	  int n;
1024 
1025 	  /* Let user choose if he wants to write register or not.  */
1026 	  if (regno < 0)
1027 	    n =
1028 	      query (_("Because GDB is in replay mode, changing the "
1029 		       "value of a register will make the execution "
1030 		       "log unusable from this point onward.  "
1031 		       "Change all registers?"));
1032 	  else
1033 	    n =
1034 	      query (_("Because GDB is in replay mode, changing the value "
1035 		       "of a register will make the execution log unusable "
1036 		       "from this point onward.  Change register %s?"),
1037 		      gdbarch_register_name (get_regcache_arch (regcache),
1038 					       regno));
1039 
1040 	  if (!n)
1041 	    {
1042 	      /* Invalidate the value of regcache that was set in function
1043 	         "regcache_raw_write".  */
1044 	      if (regno < 0)
1045 		{
1046 		  int i;
1047 		  for (i = 0;
1048 		       i < gdbarch_num_regs (get_regcache_arch (regcache));
1049 		       i++)
1050 		    regcache_invalidate (regcache, i);
1051 		}
1052 	      else
1053 		regcache_invalidate (regcache, regno);
1054 
1055 	      error (_("Process record canceled the operation."));
1056 	    }
1057 
1058 	  /* Destroy the record from here forward.  */
1059 	  record_list_release_next ();
1060 	}
1061 
1062       record_registers_change (regcache, regno);
1063     }
1064   record_beneath_to_store_registers (record_beneath_to_store_registers_ops,
1065                                      regcache, regno);
1066 }
1067 
1068 /* Behavior is conditional on RECORD_IS_REPLAY.
1069    In replay mode, we cannot write memory unles we are willing to
1070    invalidate the record/replay log from this point forward.  */
1071 
1072 static LONGEST
1073 record_xfer_partial (struct target_ops *ops, enum target_object object,
1074 		     const char *annex, gdb_byte *readbuf,
1075 		     const gdb_byte *writebuf, ULONGEST offset, LONGEST len)
1076 {
1077   if (!record_gdb_operation_disable
1078       && (object == TARGET_OBJECT_MEMORY
1079 	  || object == TARGET_OBJECT_RAW_MEMORY) && writebuf)
1080     {
1081       if (RECORD_IS_REPLAY)
1082 	{
1083 	  /* Let user choose if he wants to write memory or not.  */
1084 	  if (!query (_("Because GDB is in replay mode, writing to memory "
1085 		        "will make the execution log unusable from this "
1086 		        "point onward.  Write memory at address %s?"),
1087 		       paddress (target_gdbarch, offset)))
1088 	    error (_("Process record canceled the operation."));
1089 
1090 	  /* Destroy the record from here forward.  */
1091 	  record_list_release_next ();
1092 	}
1093 
1094       /* Check record_insn_num */
1095       record_check_insn_num (0);
1096 
1097       /* Record registers change to list as an instruction.  */
1098       record_arch_list_head = NULL;
1099       record_arch_list_tail = NULL;
1100       if (record_arch_list_add_mem (offset, len))
1101 	{
1102 	  record_list_release (record_arch_list_tail);
1103 	  if (record_debug)
1104 	    fprintf_unfiltered (gdb_stdlog,
1105 				_("Process record: failed to record "
1106 				  "execution log."));
1107 	  return -1;
1108 	}
1109       if (record_arch_list_add_end ())
1110 	{
1111 	  record_list_release (record_arch_list_tail);
1112 	  if (record_debug)
1113 	    fprintf_unfiltered (gdb_stdlog,
1114 				_("Process record: failed to record "
1115 				  "execution log."));
1116 	  return -1;
1117 	}
1118       record_list->next = record_arch_list_head;
1119       record_arch_list_head->prev = record_list;
1120       record_list = record_arch_list_tail;
1121 
1122       if (record_insn_num == record_insn_max_num && record_insn_max_num)
1123 	record_list_release_first ();
1124       else
1125 	record_insn_num++;
1126     }
1127 
1128   return record_beneath_to_xfer_partial (record_beneath_to_xfer_partial_ops,
1129                                          object, annex, readbuf, writebuf,
1130                                          offset, len);
1131 }
1132 
1133 /* Behavior is conditional on RECORD_IS_REPLAY.
1134    We will not actually insert or remove breakpoints when replaying,
1135    nor when recording.  */
1136 
1137 static int
1138 record_insert_breakpoint (struct gdbarch *gdbarch,
1139 			  struct bp_target_info *bp_tgt)
1140 {
1141   if (!RECORD_IS_REPLAY)
1142     {
1143       struct cleanup *old_cleanups = record_gdb_operation_disable_set ();
1144       int ret = record_beneath_to_insert_breakpoint (gdbarch, bp_tgt);
1145 
1146       do_cleanups (old_cleanups);
1147 
1148       return ret;
1149     }
1150 
1151   return 0;
1152 }
1153 
1154 static int
1155 record_remove_breakpoint (struct gdbarch *gdbarch,
1156 			  struct bp_target_info *bp_tgt)
1157 {
1158   if (!RECORD_IS_REPLAY)
1159     {
1160       struct cleanup *old_cleanups = record_gdb_operation_disable_set ();
1161       int ret = record_beneath_to_remove_breakpoint (gdbarch, bp_tgt);
1162 
1163       do_cleanups (old_cleanups);
1164 
1165       return ret;
1166     }
1167 
1168   return 0;
1169 }
1170 
1171 static int
1172 record_can_execute_reverse (void)
1173 {
1174   return 1;
1175 }
1176 
1177 static void
1178 init_record_ops (void)
1179 {
1180   record_ops.to_shortname = "record";
1181   record_ops.to_longname = "Process record and replay target";
1182   record_ops.to_doc =
1183     "Log program while executing and replay execution from log.";
1184   record_ops.to_open = record_open;
1185   record_ops.to_close = record_close;
1186   record_ops.to_resume = record_resume;
1187   record_ops.to_wait = record_wait;
1188   record_ops.to_disconnect = record_disconnect;
1189   record_ops.to_detach = record_detach;
1190   record_ops.to_mourn_inferior = record_mourn_inferior;
1191   record_ops.to_kill = record_kill;
1192   record_ops.to_create_inferior = find_default_create_inferior;
1193   record_ops.to_store_registers = record_store_registers;
1194   record_ops.to_xfer_partial = record_xfer_partial;
1195   record_ops.to_insert_breakpoint = record_insert_breakpoint;
1196   record_ops.to_remove_breakpoint = record_remove_breakpoint;
1197   record_ops.to_can_execute_reverse = record_can_execute_reverse;
1198   record_ops.to_stratum = record_stratum;
1199   record_ops.to_magic = OPS_MAGIC;
1200 }
1201 
1202 static void
1203 show_record_debug (struct ui_file *file, int from_tty,
1204 		   struct cmd_list_element *c, const char *value)
1205 {
1206   fprintf_filtered (file, _("Debugging of process record target is %s.\n"),
1207 		    value);
1208 }
1209 
1210 /* Alias for "target record".  */
1211 
1212 static void
1213 cmd_record_start (char *args, int from_tty)
1214 {
1215   execute_command ("target record", from_tty);
1216 }
1217 
1218 /* Truncate the record log from the present point
1219    of replay until the end.  */
1220 
1221 static void
1222 cmd_record_delete (char *args, int from_tty)
1223 {
1224   if (current_target.to_stratum == record_stratum)
1225     {
1226       if (RECORD_IS_REPLAY)
1227 	{
1228 	  if (!from_tty || query (_("Delete the log from this point forward "
1229 		                    "and begin to record the running message "
1230 		                    "at current PC?")))
1231 	    record_list_release_next ();
1232 	}
1233       else
1234 	  printf_unfiltered (_("Already at end of record list.\n"));
1235 
1236     }
1237   else
1238     printf_unfiltered (_("Process record is not started.\n"));
1239 }
1240 
1241 /* Implement the "stoprecord" command.  */
1242 
1243 static void
1244 cmd_record_stop (char *args, int from_tty)
1245 {
1246   if (current_target.to_stratum == record_stratum)
1247     {
1248       unpush_target (&record_ops);
1249       printf_unfiltered (_("Process record is stoped and all execution "
1250                            "log is deleted.\n"));
1251     }
1252   else
1253     printf_unfiltered (_("Process record is not started.\n"));
1254 }
1255 
1256 /* Set upper limit of record log size.  */
1257 
1258 static void
1259 set_record_insn_max_num (char *args, int from_tty, struct cmd_list_element *c)
1260 {
1261   if (record_insn_num > record_insn_max_num && record_insn_max_num)
1262     {
1263       printf_unfiltered (_("Record instructions number is bigger than "
1264 		           "record instructions max number.  Auto delete "
1265 		           "the first ones?\n"));
1266 
1267       while (record_insn_num > record_insn_max_num)
1268 	record_list_release_first ();
1269     }
1270 }
1271 
1272 /* Print the current index into the record log (number of insns recorded
1273    so far).  */
1274 
1275 static void
1276 show_record_insn_number (char *ignore, int from_tty)
1277 {
1278   printf_unfiltered (_("Record instruction number is %d.\n"),
1279 		     record_insn_num);
1280 }
1281 
1282 static struct cmd_list_element *record_cmdlist, *set_record_cmdlist,
1283 			       *show_record_cmdlist, *info_record_cmdlist;
1284 
1285 static void
1286 set_record_command (char *args, int from_tty)
1287 {
1288   printf_unfiltered (_("\
1289 \"set record\" must be followed by an apporpriate subcommand.\n"));
1290   help_list (set_record_cmdlist, "set record ", all_commands, gdb_stdout);
1291 }
1292 
1293 static void
1294 show_record_command (char *args, int from_tty)
1295 {
1296   cmd_show_list (show_record_cmdlist, from_tty, "");
1297 }
1298 
1299 static void
1300 info_record_command (char *args, int from_tty)
1301 {
1302   cmd_show_list (info_record_cmdlist, from_tty, "");
1303 }
1304 
1305 void
1306 _initialize_record (void)
1307 {
1308   /* Init record_first.  */
1309   record_first.prev = NULL;
1310   record_first.next = NULL;
1311   record_first.type = record_end;
1312 
1313   init_record_ops ();
1314   add_target (&record_ops);
1315 
1316   add_setshow_zinteger_cmd ("record", no_class, &record_debug,
1317 			    _("Set debugging of record/replay feature."),
1318 			    _("Show debugging of record/replay feature."),
1319 			    _("When enabled, debugging output for "
1320 			      "record/replay feature is displayed."),
1321 			    NULL, show_record_debug, &setdebuglist,
1322 			    &showdebuglist);
1323 
1324   add_prefix_cmd ("record", class_obscure, cmd_record_start,
1325 		  _("Abbreviated form of \"target record\" command."),
1326  		  &record_cmdlist, "record ", 0, &cmdlist);
1327   add_com_alias ("rec", "record", class_obscure, 1);
1328   add_prefix_cmd ("record", class_support, set_record_command,
1329 		  _("Set record options"), &set_record_cmdlist,
1330 		  "set record ", 0, &setlist);
1331   add_alias_cmd ("rec", "record", class_obscure, 1, &setlist);
1332   add_prefix_cmd ("record", class_support, show_record_command,
1333 		  _("Show record options"), &show_record_cmdlist,
1334 		  "show record ", 0, &showlist);
1335   add_alias_cmd ("rec", "record", class_obscure, 1, &showlist);
1336   add_prefix_cmd ("record", class_support, info_record_command,
1337 		  _("Info record options"), &info_record_cmdlist,
1338 		  "info record ", 0, &infolist);
1339   add_alias_cmd ("rec", "record", class_obscure, 1, &infolist);
1340 
1341 
1342   add_cmd ("delete", class_obscure, cmd_record_delete,
1343 	   _("Delete the rest of execution log and start recording it anew."),
1344            &record_cmdlist);
1345   add_alias_cmd ("d", "delete", class_obscure, 1, &record_cmdlist);
1346   add_alias_cmd ("del", "delete", class_obscure, 1, &record_cmdlist);
1347 
1348   add_cmd ("stop", class_obscure, cmd_record_stop,
1349 	   _("Stop the record/replay target."),
1350            &record_cmdlist);
1351   add_alias_cmd ("s", "stop", class_obscure, 1, &record_cmdlist);
1352 
1353   /* Record instructions number limit command.  */
1354   add_setshow_boolean_cmd ("stop-at-limit", no_class,
1355 			   &record_stop_at_limit, _("\
1356 Set whether record/replay stops when record/replay buffer becomes full."), _("\
1357 Show whether record/replay stops when record/replay buffer becomes full."), _("\
1358 Default is ON.\n\
1359 When ON, if the record/replay buffer becomes full, ask user what to do.\n\
1360 When OFF, if the record/replay buffer becomes full,\n\
1361 delete the oldest recorded instruction to make room for each new one."),
1362 			   NULL, NULL,
1363 			   &set_record_cmdlist, &show_record_cmdlist);
1364   add_setshow_zinteger_cmd ("insn-number-max", no_class,
1365 			    &record_insn_max_num,
1366 			    _("Set record/replay buffer limit."),
1367 			    _("Show record/replay buffer limit."), _("\
1368 Set the maximum number of instructions to be stored in the\n\
1369 record/replay buffer.  Zero means unlimited.  Default is 200000."),
1370 			    set_record_insn_max_num,
1371 			    NULL, &set_record_cmdlist, &show_record_cmdlist);
1372   add_cmd ("insn-number", class_obscure, show_record_insn_number,
1373 	   _("Show the current number of instructions in the "
1374 	     "record/replay buffer."), &info_record_cmdlist);
1375 }
1376