|  | /* | 
|  | * Clock migration structure | 
|  | * | 
|  | * Copyright GreenSocs 2019-2020 | 
|  | * | 
|  | * Authors: | 
|  | *  Damien Hedde | 
|  | * | 
|  | * 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 "migration/vmstate.h" | 
|  | #include "hw/clock.h" | 
|  |  | 
|  | static bool muldiv_needed(void *opaque) | 
|  | { | 
|  | Clock *clk = opaque; | 
|  |  | 
|  | return clk->multiplier != 1 || clk->divider != 1; | 
|  | } | 
|  |  | 
|  | static int clock_pre_load(void *opaque) | 
|  | { | 
|  | Clock *clk = opaque; | 
|  | /* | 
|  | * The initial out-of-reset settings of the Clock might have been | 
|  | * configured by the device to be different from what we set | 
|  | * in clock_initfn(), so we must here set the default values to | 
|  | * be used if they are not in the inbound migration state. | 
|  | */ | 
|  | clk->multiplier = 1; | 
|  | clk->divider = 1; | 
|  |  | 
|  | return 0; | 
|  | } | 
|  |  | 
|  | const VMStateDescription vmstate_muldiv = { | 
|  | .name = "clock/muldiv", | 
|  | .version_id = 1, | 
|  | .minimum_version_id = 1, | 
|  | .needed = muldiv_needed, | 
|  | .fields = (const VMStateField[]) { | 
|  | VMSTATE_UINT32(multiplier, Clock), | 
|  | VMSTATE_UINT32(divider, Clock), | 
|  | VMSTATE_END_OF_LIST() | 
|  | }, | 
|  | }; | 
|  |  | 
|  | const VMStateDescription vmstate_clock = { | 
|  | .name = "clock", | 
|  | .version_id = 0, | 
|  | .minimum_version_id = 0, | 
|  | .pre_load = clock_pre_load, | 
|  | .fields = (const VMStateField[]) { | 
|  | VMSTATE_UINT64(period, Clock), | 
|  | VMSTATE_END_OF_LIST() | 
|  | }, | 
|  | .subsections = (const VMStateDescription * const []) { | 
|  | &vmstate_muldiv, | 
|  | NULL | 
|  | }, | 
|  | }; |