2 * Global State configuration
4 * Copyright (c) 2014-2017 Red Hat Inc
7 * Juan Quintela <quintela@redhat.com>
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.
13 #include "qemu/osdep.h"
14 #include "qemu/cutils.h"
15 #include "qemu/error-report.h"
16 #include "qapi/error.h"
17 #include "qapi/util.h"
18 #include "migration/global_state.h"
19 #include "migration/vmstate.h"
20 #include "sysemu/sysemu.h"
26 uint8_t runstate
[100];
31 static GlobalState global_state
;
33 int global_state_store(void)
35 if (!runstate_store((char *)global_state
.runstate
,
36 sizeof(global_state
.runstate
))) {
37 error_report("runstate name too big: %s", global_state
.runstate
);
38 trace_migrate_state_too_big();
44 void global_state_store_running(void)
46 const char *state
= RunState_lookup
[RUN_STATE_RUNNING
];
47 strncpy((char *)global_state
.runstate
,
48 state
, sizeof(global_state
.runstate
));
51 bool global_state_received(void)
53 return global_state
.received
;
56 RunState
global_state_get_runstate(void)
58 return global_state
.state
;
61 void global_state_set_optional(void)
63 global_state
.optional
= true;
66 static bool global_state_needed(void *opaque
)
68 GlobalState
*s
= opaque
;
69 char *runstate
= (char *)s
->runstate
;
71 /* If it is not optional, it is mandatory */
73 if (s
->optional
== false) {
77 /* If state is running or paused, it is not needed */
79 if (strcmp(runstate
, "running") == 0 ||
80 strcmp(runstate
, "paused") == 0) {
84 /* for any other state it is needed */
88 static int global_state_post_load(void *opaque
, int version_id
)
90 GlobalState
*s
= opaque
;
91 Error
*local_err
= NULL
;
93 char *runstate
= (char *)s
->runstate
;
96 trace_migrate_global_state_post_load(runstate
);
98 r
= qapi_enum_parse(RunState_lookup
, runstate
, RUN_STATE__MAX
,
103 error_report_err(local_err
);
112 static void global_state_pre_save(void *opaque
)
114 GlobalState
*s
= opaque
;
116 trace_migrate_global_state_pre_save((char *)s
->runstate
);
117 s
->size
= strlen((char *)s
->runstate
) + 1;
120 static const VMStateDescription vmstate_globalstate
= {
121 .name
= "globalstate",
123 .minimum_version_id
= 1,
124 .post_load
= global_state_post_load
,
125 .pre_save
= global_state_pre_save
,
126 .needed
= global_state_needed
,
127 .fields
= (VMStateField
[]) {
128 VMSTATE_UINT32(size
, GlobalState
),
129 VMSTATE_BUFFER(runstate
, GlobalState
),
130 VMSTATE_END_OF_LIST()
134 void register_global_state(void)
136 /* We would use it independently that we receive it */
137 strcpy((char *)&global_state
.runstate
, "");
138 global_state
.received
= false;
139 vmstate_register(NULL
, 0, &vmstate_globalstate
, &global_state
);