clock-vmstate.c (1485B)
1/* 2 * Clock migration structure 3 * 4 * Copyright GreenSocs 2019-2020 5 * 6 * Authors: 7 * Damien Hedde 8 * 9 * This work is licensed under the terms of the GNU GPL, version 2 or later. 10 * See the COPYING file in the top-level directory. 11 */ 12 13#include "qemu/osdep.h" 14#include "migration/vmstate.h" 15#include "hw/clock.h" 16 17static bool muldiv_needed(void *opaque) 18{ 19 Clock *clk = opaque; 20 21 return clk->multiplier != 1 || clk->divider != 1; 22} 23 24static int clock_pre_load(void *opaque) 25{ 26 Clock *clk = opaque; 27 /* 28 * The initial out-of-reset settings of the Clock might have been 29 * configured by the device to be different from what we set 30 * in clock_initfn(), so we must here set the default values to 31 * be used if they are not in the inbound migration state. 32 */ 33 clk->multiplier = 1; 34 clk->divider = 1; 35 36 return 0; 37} 38 39const VMStateDescription vmstate_muldiv = { 40 .name = "clock/muldiv", 41 .version_id = 1, 42 .minimum_version_id = 1, 43 .needed = muldiv_needed, 44 .fields = (VMStateField[]) { 45 VMSTATE_UINT32(multiplier, Clock), 46 VMSTATE_UINT32(divider, Clock), 47 }, 48}; 49 50const VMStateDescription vmstate_clock = { 51 .name = "clock", 52 .version_id = 0, 53 .minimum_version_id = 0, 54 .pre_load = clock_pre_load, 55 .fields = (VMStateField[]) { 56 VMSTATE_UINT64(period, Clock), 57 VMSTATE_END_OF_LIST() 58 }, 59 .subsections = (const VMStateDescription*[]) { 60 &vmstate_muldiv, 61 NULL 62 }, 63};