replay: vmstate for replay module
This patch introduces vmstate for replay data structures. It allows saving and loading vmstate while replaying. Signed-off-by: Pavel Dovgalyuk <pavel.dovgaluk@ispras.ru> Message-Id: <20160926080810.6992.68420.stgit@PASHA-ISP> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
		
							parent
							
								
									f186d64d8f
								
							
						
					
					
						commit
						306e196fa2
					
				| @ -4,3 +4,4 @@ common-obj-y += replay-events.o | ||||
| common-obj-y += replay-time.o | ||||
| common-obj-y += replay-input.o | ||||
| common-obj-y += replay-char.o | ||||
| common-obj-y += replay-snapshot.o | ||||
|  | ||||
| @ -66,6 +66,8 @@ typedef struct ReplayState { | ||||
|     unsigned int data_kind; | ||||
|     /*! Flag which indicates that event is not processed yet. */ | ||||
|     unsigned int has_unread_data; | ||||
|     /*! Temporary variable for saving current log offset. */ | ||||
|     uint64_t file_offset; | ||||
| } ReplayState; | ||||
| extern ReplayState replay_state; | ||||
| 
 | ||||
| @ -157,4 +159,11 @@ void replay_event_char_read_save(void *opaque); | ||||
| /*! Reads char event read from the file. */ | ||||
| void *replay_event_char_read_load(void); | ||||
| 
 | ||||
| /* VMState-related functions */ | ||||
| 
 | ||||
| /* Registers replay VMState.
 | ||||
|    Should be called before virtual devices initialization | ||||
|    to make cached timers available for post_load functions. */ | ||||
| void replay_vmstate_register(void); | ||||
| 
 | ||||
| #endif | ||||
|  | ||||
							
								
								
									
										60
									
								
								replay/replay-snapshot.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										60
									
								
								replay/replay-snapshot.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,60 @@ | ||||
| /*
 | ||||
|  * replay-snapshot.c | ||||
|  * | ||||
|  * Copyright (c) 2010-2016 Institute for System Programming | ||||
|  *                         of the Russian Academy of Sciences. | ||||
|  * | ||||
|  * This work is licensed under the terms of the GNU GPL, version 2 or later. | ||||
|  * See the COPYING file in the top-level directory. | ||||
|  * | ||||
|  */ | ||||
| 
 | ||||
| #include "qemu/osdep.h" | ||||
| #include "qapi/error.h" | ||||
| #include "qemu-common.h" | ||||
| #include "sysemu/replay.h" | ||||
| #include "replay-internal.h" | ||||
| #include "sysemu/sysemu.h" | ||||
| #include "monitor/monitor.h" | ||||
| #include "qapi/qmp/qstring.h" | ||||
| #include "qemu/error-report.h" | ||||
| #include "migration/vmstate.h" | ||||
| 
 | ||||
| static void replay_pre_save(void *opaque) | ||||
| { | ||||
|     ReplayState *state = opaque; | ||||
|     state->file_offset = ftell(replay_file); | ||||
| } | ||||
| 
 | ||||
| static int replay_post_load(void *opaque, int version_id) | ||||
| { | ||||
|     ReplayState *state = opaque; | ||||
|     fseek(replay_file, state->file_offset, SEEK_SET); | ||||
|     /* If this was a vmstate, saved in recording mode,
 | ||||
|        we need to initialize replay data fields. */ | ||||
|     replay_fetch_data_kind(); | ||||
| 
 | ||||
|     return 0; | ||||
| } | ||||
| 
 | ||||
| static const VMStateDescription vmstate_replay = { | ||||
|     .name = "replay", | ||||
|     .version_id = 1, | ||||
|     .minimum_version_id = 1, | ||||
|     .pre_save = replay_pre_save, | ||||
|     .post_load = replay_post_load, | ||||
|     .fields = (VMStateField[]) { | ||||
|         VMSTATE_INT64_ARRAY(cached_clock, ReplayState, REPLAY_CLOCK_COUNT), | ||||
|         VMSTATE_UINT64(current_step, ReplayState), | ||||
|         VMSTATE_INT32(instructions_count, ReplayState), | ||||
|         VMSTATE_UINT32(data_kind, ReplayState), | ||||
|         VMSTATE_UINT32(has_unread_data, ReplayState), | ||||
|         VMSTATE_UINT64(file_offset, ReplayState), | ||||
|         VMSTATE_END_OF_LIST() | ||||
|     }, | ||||
| }; | ||||
| 
 | ||||
| void replay_vmstate_register(void) | ||||
| { | ||||
|     vmstate_register(NULL, 0, &vmstate_replay, &replay_state); | ||||
| } | ||||
| @ -292,6 +292,7 @@ void replay_configure(QemuOpts *opts) | ||||
|         exit(1); | ||||
|     } | ||||
| 
 | ||||
|     replay_vmstate_register(); | ||||
|     replay_enable(fname, mode); | ||||
| 
 | ||||
| out: | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Pavel Dovgalyuk
						Pavel Dovgalyuk