45 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			45 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								 * replay-random.c
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * Copyright (c) 2010-2020 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 "qemu/error-report.h"
							 | 
						||
| 
								 | 
							
								#include "sysemu/replay.h"
							 | 
						||
| 
								 | 
							
								#include "replay-internal.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void replay_save_random(int ret, void *buf, size_t len)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    g_assert(replay_mutex_locked());
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    replay_save_instructions();
							 | 
						||
| 
								 | 
							
								    replay_put_event(EVENT_RANDOM);
							 | 
						||
| 
								 | 
							
								    replay_put_dword(ret);
							 | 
						||
| 
								 | 
							
								    replay_put_array(buf, len);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								int replay_read_random(void *buf, size_t len)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    int ret = 0;
							 | 
						||
| 
								 | 
							
								    g_assert(replay_mutex_locked());
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    replay_account_executed_instructions();
							 | 
						||
| 
								 | 
							
								    if (replay_next_event_is(EVENT_RANDOM)) {
							 | 
						||
| 
								 | 
							
								        size_t buf_size = 0;
							 | 
						||
| 
								 | 
							
								        ret = replay_get_dword();
							 | 
						||
| 
								 | 
							
								        replay_get_array(buf, &buf_size);
							 | 
						||
| 
								 | 
							
								        replay_finish_event();
							 | 
						||
| 
								 | 
							
								        g_assert(buf_size == len);
							 | 
						||
| 
								 | 
							
								    } else {
							 | 
						||
| 
								 | 
							
								        error_report("Missing random event in the replay log");
							 | 
						||
| 
								 | 
							
								        exit(1);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    return ret;
							 | 
						||
| 
								 | 
							
								}
							 |