2009-10-13 Tristan Gingold <gingold@adacore.com>
[deliverable/binutils-gdb.git] / gdb / record.c
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 }
This page took 0.059986 seconds and 4 git commands to generate.