cda382594b
This patch adds support of the reverse continue operation for gdbstub. Reverse continue finds the last breakpoint that would happen in normal execution from the beginning to the current moment. Implementation of the reverse continue replays the execution twice: to find the breakpoints that were hit and to seek to the last breakpoint. Reverse continue loads the previous snapshot and tries to find the breakpoint since that moment. If there are no such breakpoints, it proceeds to the earlier snapshot, and so on. When no breakpoints or watchpoints were hit at all, execution stops at the beginning of the replay log. Signed-off-by: Pavel Dovgalyuk <Pavel.Dovgalyuk@ispras.ru> Message-Id: <160174522930.12451.6994758004725016836.stgit@pasha-ThinkPad-X280> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
106 lines
1.3 KiB
C
106 lines
1.3 KiB
C
#include "qemu/osdep.h"
|
|
#include "sysemu/replay.h"
|
|
|
|
ReplayMode replay_mode;
|
|
|
|
int64_t replay_save_clock(unsigned int kind, int64_t clock, int64_t raw_icount)
|
|
{
|
|
abort();
|
|
return 0;
|
|
}
|
|
|
|
int64_t replay_read_clock(unsigned int kind)
|
|
{
|
|
abort();
|
|
return 0;
|
|
}
|
|
|
|
bool replay_checkpoint(ReplayCheckpoint checkpoint)
|
|
{
|
|
return true;
|
|
}
|
|
|
|
bool replay_events_enabled(void)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
void replay_finish(void)
|
|
{
|
|
}
|
|
|
|
void replay_register_char_driver(Chardev *chr)
|
|
{
|
|
}
|
|
|
|
void replay_chr_be_write(Chardev *s, uint8_t *buf, int len)
|
|
{
|
|
abort();
|
|
}
|
|
|
|
void replay_char_write_event_save(int res, int offset)
|
|
{
|
|
abort();
|
|
}
|
|
|
|
void replay_char_write_event_load(int *res, int *offset)
|
|
{
|
|
abort();
|
|
}
|
|
|
|
int replay_char_read_all_load(uint8_t *buf)
|
|
{
|
|
abort();
|
|
}
|
|
|
|
void replay_char_read_all_save_error(int res)
|
|
{
|
|
abort();
|
|
}
|
|
|
|
void replay_char_read_all_save_buf(uint8_t *buf, int offset)
|
|
{
|
|
abort();
|
|
}
|
|
|
|
void replay_block_event(QEMUBH *bh, uint64_t id)
|
|
{
|
|
}
|
|
|
|
uint64_t blkreplay_next_id(void)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
void replay_mutex_lock(void)
|
|
{
|
|
}
|
|
|
|
void replay_mutex_unlock(void)
|
|
{
|
|
}
|
|
|
|
void replay_save_random(int ret, void *buf, size_t len)
|
|
{
|
|
}
|
|
|
|
int replay_read_random(void *buf, size_t len)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
uint64_t replay_get_current_icount(void)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
bool replay_reverse_step(void)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
bool replay_reverse_continue(void)
|
|
{
|
|
return false;
|
|
}
|