143d7e1d7SPavel Dovgalyuk# -*- Mode: Python -*- 27e7237cdSVictor Toso# vim: filetype=python 343d7e1d7SPavel Dovgalyuk# 443d7e1d7SPavel Dovgalyuk 543d7e1d7SPavel Dovgalyuk## 643d7e1d7SPavel Dovgalyuk# = Record/replay 743d7e1d7SPavel Dovgalyuk## 843d7e1d7SPavel Dovgalyuk 943d7e1d7SPavel Dovgalyuk{ 'include': 'common.json' } 1043d7e1d7SPavel Dovgalyuk 1143d7e1d7SPavel Dovgalyuk## 1243d7e1d7SPavel Dovgalyuk# @ReplayMode: 1343d7e1d7SPavel Dovgalyuk# 1443d7e1d7SPavel Dovgalyuk# Mode of the replay subsystem. 1543d7e1d7SPavel Dovgalyuk# 1643d7e1d7SPavel Dovgalyuk# @none: normal execution mode. Replay or record are not enabled. 1743d7e1d7SPavel Dovgalyuk# 18a937b6aaSMarkus Armbruster# @record: record mode. All non-deterministic data is written into 19a937b6aaSMarkus Armbruster# the replay log. 2043d7e1d7SPavel Dovgalyuk# 21a937b6aaSMarkus Armbruster# @play: replay mode. Non-deterministic data required for system 22a937b6aaSMarkus Armbruster# execution is read from the log. 2343d7e1d7SPavel Dovgalyuk# 2443d7e1d7SPavel Dovgalyuk# Since: 2.5 2543d7e1d7SPavel Dovgalyuk## 2643d7e1d7SPavel Dovgalyuk{ 'enum': 'ReplayMode', 2743d7e1d7SPavel Dovgalyuk 'data': [ 'none', 'record', 'play' ] } 28e3b09ad2SPavel Dovgalyuk 29e3b09ad2SPavel Dovgalyuk## 30e3b09ad2SPavel Dovgalyuk# @ReplayInfo: 31e3b09ad2SPavel Dovgalyuk# 32e3b09ad2SPavel Dovgalyuk# Record/replay information. 33e3b09ad2SPavel Dovgalyuk# 34e3b09ad2SPavel Dovgalyuk# @mode: current mode. 35e3b09ad2SPavel Dovgalyuk# 36a937b6aaSMarkus Armbruster# @filename: name of the record/replay log file. It is present only 37a937b6aaSMarkus Armbruster# in record or replay modes, when the log is recorded or replayed. 38e3b09ad2SPavel Dovgalyuk# 39e3b09ad2SPavel Dovgalyuk# @icount: current number of executed instructions. 40e3b09ad2SPavel Dovgalyuk# 41e3b09ad2SPavel Dovgalyuk# Since: 5.2 42e3b09ad2SPavel Dovgalyuk## 43e3b09ad2SPavel Dovgalyuk{ 'struct': 'ReplayInfo', 44e3b09ad2SPavel Dovgalyuk 'data': { 'mode': 'ReplayMode', '*filename': 'str', 'icount': 'int' } } 45e3b09ad2SPavel Dovgalyuk 46e3b09ad2SPavel Dovgalyuk## 47e3b09ad2SPavel Dovgalyuk# @query-replay: 48e3b09ad2SPavel Dovgalyuk# 49a937b6aaSMarkus Armbruster# Retrieve the record/replay information. It includes current 50a937b6aaSMarkus Armbruster# instruction count which may be used for @replay-break and 51a937b6aaSMarkus Armbruster# @replay-seek commands. 52e3b09ad2SPavel Dovgalyuk# 53e3b09ad2SPavel Dovgalyuk# Returns: record/replay information. 54e3b09ad2SPavel Dovgalyuk# 55e3b09ad2SPavel Dovgalyuk# Since: 5.2 56e3b09ad2SPavel Dovgalyuk# 57*14b48aaaSJohn Snow# .. qmp-example:: 58e3b09ad2SPavel Dovgalyuk# 59e3b09ad2SPavel Dovgalyuk# -> { "execute": "query-replay" } 60e3b09ad2SPavel Dovgalyuk# <- { "return": { "mode": "play", "filename": "log.rr", "icount": 220414 } } 61e3b09ad2SPavel Dovgalyuk## 62e3b09ad2SPavel Dovgalyuk{ 'command': 'query-replay', 63e3b09ad2SPavel Dovgalyuk 'returns': 'ReplayInfo' } 64e7510671SPavel Dovgalyuk 65e7510671SPavel Dovgalyuk## 66e7510671SPavel Dovgalyuk# @replay-break: 67e7510671SPavel Dovgalyuk# 68a937b6aaSMarkus Armbruster# Set replay breakpoint at instruction count @icount. Execution stops 69a937b6aaSMarkus Armbruster# when the specified instruction is reached. There can be at most one 70a937b6aaSMarkus Armbruster# breakpoint. When breakpoint is set, any prior one is removed. The 71a937b6aaSMarkus Armbruster# breakpoint may be set only in replay mode and only "in the future", 72a937b6aaSMarkus Armbruster# i.e. at instruction counts greater than the current one. The 73a937b6aaSMarkus Armbruster# current instruction count can be observed with @query-replay. 74e7510671SPavel Dovgalyuk# 75e7510671SPavel Dovgalyuk# @icount: instruction count to stop at 76e7510671SPavel Dovgalyuk# 77e7510671SPavel Dovgalyuk# Since: 5.2 78e7510671SPavel Dovgalyuk# 79*14b48aaaSJohn Snow# .. qmp-example:: 80e7510671SPavel Dovgalyuk# 81227a762bSVictor Toso# -> { "execute": "replay-break", "arguments": { "icount": 220414 } } 8237fa48a4SMarkus Armbruster# <- { "return": {} } 83e7510671SPavel Dovgalyuk## 84e7510671SPavel Dovgalyuk{ 'command': 'replay-break', 'data': { 'icount': 'int' } } 85e7510671SPavel Dovgalyuk 86e7510671SPavel Dovgalyuk## 87e7510671SPavel Dovgalyuk# @replay-delete-break: 88e7510671SPavel Dovgalyuk# 89a937b6aaSMarkus Armbruster# Remove replay breakpoint which was set with @replay-break. The 90a937b6aaSMarkus Armbruster# command is ignored when there are no replay breakpoints. 91e7510671SPavel Dovgalyuk# 92e7510671SPavel Dovgalyuk# Since: 5.2 93e7510671SPavel Dovgalyuk# 94*14b48aaaSJohn Snow# .. qmp-example:: 95e7510671SPavel Dovgalyuk# 96e7510671SPavel Dovgalyuk# -> { "execute": "replay-delete-break" } 9737fa48a4SMarkus Armbruster# <- { "return": {} } 98e7510671SPavel Dovgalyuk## 99e7510671SPavel Dovgalyuk{ 'command': 'replay-delete-break' } 100f6baed3dSPavel Dovgalyuk 101f6baed3dSPavel Dovgalyuk## 102f6baed3dSPavel Dovgalyuk# @replay-seek: 103f6baed3dSPavel Dovgalyuk# 104f6baed3dSPavel Dovgalyuk# Automatically proceed to the instruction count @icount, when 105f6baed3dSPavel Dovgalyuk# replaying the execution. The command automatically loads nearest 106f6baed3dSPavel Dovgalyuk# snapshot and replays the execution to find the desired instruction. 107a937b6aaSMarkus Armbruster# When there is no preceding snapshot or the execution is not 108f972ed59SMarkus Armbruster# replayed, then the command fails. Instruction count can be obtained 109f972ed59SMarkus Armbruster# with the @query-replay command. 110f6baed3dSPavel Dovgalyuk# 111f6baed3dSPavel Dovgalyuk# @icount: target instruction count 112f6baed3dSPavel Dovgalyuk# 113f6baed3dSPavel Dovgalyuk# Since: 5.2 114f6baed3dSPavel Dovgalyuk# 115*14b48aaaSJohn Snow# .. qmp-example:: 116f6baed3dSPavel Dovgalyuk# 117227a762bSVictor Toso# -> { "execute": "replay-seek", "arguments": { "icount": 220414 } } 11837fa48a4SMarkus Armbruster# <- { "return": {} } 119f6baed3dSPavel Dovgalyuk## 120f6baed3dSPavel Dovgalyuk{ 'command': 'replay-seek', 'data': { 'icount': 'int' } } 121