xref: /qemu/include/system/reset.h (revision 86fae16ed298518ea851d6accc48643e6bdf8ed1)
19f1c70a2SPeter Maydell /*
29f1c70a2SPeter Maydell  *  Reset handlers.
39f1c70a2SPeter Maydell  *
49f1c70a2SPeter Maydell  * Copyright (c) 2003-2008 Fabrice Bellard
59f1c70a2SPeter Maydell  * Copyright (c) 2016 Red Hat, Inc.
69f1c70a2SPeter Maydell  * Copyright (c) 2024 Linaro, Ltd.
79f1c70a2SPeter Maydell  *
89f1c70a2SPeter Maydell  * Permission is hereby granted, free of charge, to any person obtaining a copy
99f1c70a2SPeter Maydell  * of this software and associated documentation files (the "Software"), to deal
109f1c70a2SPeter Maydell  * in the Software without restriction, including without limitation the rights
119f1c70a2SPeter Maydell  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
129f1c70a2SPeter Maydell  * copies of the Software, and to permit persons to whom the Software is
139f1c70a2SPeter Maydell  * furnished to do so, subject to the following conditions:
149f1c70a2SPeter Maydell  *
159f1c70a2SPeter Maydell  * The above copyright notice and this permission notice shall be included in
169f1c70a2SPeter Maydell  * all copies or substantial portions of the Software.
179f1c70a2SPeter Maydell  *
189f1c70a2SPeter Maydell  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
199f1c70a2SPeter Maydell  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
209f1c70a2SPeter Maydell  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
219f1c70a2SPeter Maydell  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
229f1c70a2SPeter Maydell  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
239f1c70a2SPeter Maydell  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
249f1c70a2SPeter Maydell  * THE SOFTWARE.
259f1c70a2SPeter Maydell  */
269f1c70a2SPeter Maydell 
272f7b92a0SPaolo Bonzini #ifndef QEMU_SYSEMU_RESET_H
282f7b92a0SPaolo Bonzini #define QEMU_SYSEMU_RESET_H
292f7b92a0SPaolo Bonzini 
307966d70fSJason A. Donenfeld #include "qapi/qapi-events-run-state.h"
317966d70fSJason A. Donenfeld 
322f7b92a0SPaolo Bonzini typedef void QEMUResetHandler(void *opaque);
332f7b92a0SPaolo Bonzini 
349f1c70a2SPeter Maydell /**
35*86fae16eSPeter Maydell  * qemu_register_resettable: Register an object to be reset
36*86fae16eSPeter Maydell  * @obj: object to be reset: it must implement the Resettable interface
37*86fae16eSPeter Maydell  *
38*86fae16eSPeter Maydell  * Register @obj on the list of objects which will be reset when the
39*86fae16eSPeter Maydell  * simulation is reset. These objects will be reset in the order
40*86fae16eSPeter Maydell  * they were added, using the three-phase Resettable protocol,
41*86fae16eSPeter Maydell  * so first all objects go through the enter phase, then all objects
42*86fae16eSPeter Maydell  * go through the hold phase, and then finally all go through the
43*86fae16eSPeter Maydell  * exit phase.
44*86fae16eSPeter Maydell  *
45*86fae16eSPeter Maydell  * It is not permitted to register or unregister reset functions or
46*86fae16eSPeter Maydell  * resettable objects from within any of the reset phase methods of @obj.
47*86fae16eSPeter Maydell  *
48*86fae16eSPeter Maydell  * We assume that the caller holds the BQL.
49*86fae16eSPeter Maydell  */
50*86fae16eSPeter Maydell void qemu_register_resettable(Object *obj);
51*86fae16eSPeter Maydell 
52*86fae16eSPeter Maydell /**
53*86fae16eSPeter Maydell  * qemu_unregister_resettable: Unregister an object to be reset
54*86fae16eSPeter Maydell  * @obj: object to unregister
55*86fae16eSPeter Maydell  *
56*86fae16eSPeter Maydell  * Remove @obj from the list of objects which are reset when the
57*86fae16eSPeter Maydell  * simulation is reset. It must have been previously added to
58*86fae16eSPeter Maydell  * the list via qemu_register_resettable().
59*86fae16eSPeter Maydell  *
60*86fae16eSPeter Maydell  * We assume that the caller holds the BQL.
61*86fae16eSPeter Maydell  */
62*86fae16eSPeter Maydell void qemu_unregister_resettable(Object *obj);
63*86fae16eSPeter Maydell 
64*86fae16eSPeter Maydell /**
659f1c70a2SPeter Maydell  * qemu_register_reset: Register a callback for system reset
669f1c70a2SPeter Maydell  * @func: function to call
679f1c70a2SPeter Maydell  * @opaque: opaque data to pass to @func
689f1c70a2SPeter Maydell  *
699f1c70a2SPeter Maydell  * Register @func on the list of functions which are called when the
709f1c70a2SPeter Maydell  * entire system is reset. The functions are called in the order in
719f1c70a2SPeter Maydell  * which they are registered.
729f1c70a2SPeter Maydell  *
739f1c70a2SPeter Maydell  * In general this function should not be used in new code where possible;
749f1c70a2SPeter Maydell  * for instance, device model reset is better accomplished using the
759f1c70a2SPeter Maydell  * methods on DeviceState.
769f1c70a2SPeter Maydell  *
77*86fae16eSPeter Maydell  * It is not permitted to register or unregister reset functions or
78*86fae16eSPeter Maydell  * resettable objects from within the @func callback.
799f1c70a2SPeter Maydell  *
809f1c70a2SPeter Maydell  * We assume that the caller holds the BQL.
819f1c70a2SPeter Maydell  */
822f7b92a0SPaolo Bonzini void qemu_register_reset(QEMUResetHandler *func, void *opaque);
839f1c70a2SPeter Maydell 
849f1c70a2SPeter Maydell /**
859f1c70a2SPeter Maydell  * qemu_register_reset_nosnapshotload: Register a callback for system reset
869f1c70a2SPeter Maydell  * @func: function to call
879f1c70a2SPeter Maydell  * @opaque: opaque data to pass to @func
889f1c70a2SPeter Maydell  *
899f1c70a2SPeter Maydell  * This is the same as qemu_register_reset(), except that @func is
909f1c70a2SPeter Maydell  * not called if the reason that the system is being reset is to
919f1c70a2SPeter Maydell  * put it into a clean state prior to loading a snapshot (i.e. for
929f1c70a2SPeter Maydell  * SHUTDOWN_CAUSE_SNAPSHOT_LOAD).
939f1c70a2SPeter Maydell  */
947966d70fSJason A. Donenfeld void qemu_register_reset_nosnapshotload(QEMUResetHandler *func, void *opaque);
959f1c70a2SPeter Maydell 
969f1c70a2SPeter Maydell /**
979f1c70a2SPeter Maydell  * qemu_unregister_reset: Unregister a system reset callback
989f1c70a2SPeter Maydell  * @func: function registered with qemu_register_reset()
999f1c70a2SPeter Maydell  * @opaque: the same opaque data that was passed to qemu_register_reset()
1009f1c70a2SPeter Maydell  *
1019f1c70a2SPeter Maydell  * Undo the effects of a qemu_register_reset(). The @func and @opaque
1029f1c70a2SPeter Maydell  * must both match the arguments originally used with qemu_register_reset().
1039f1c70a2SPeter Maydell  *
1049f1c70a2SPeter Maydell  * We assume that the caller holds the BQL.
1059f1c70a2SPeter Maydell  */
1062f7b92a0SPaolo Bonzini void qemu_unregister_reset(QEMUResetHandler *func, void *opaque);
1079f1c70a2SPeter Maydell 
1089f1c70a2SPeter Maydell /**
1099f1c70a2SPeter Maydell  * qemu_devices_reset: Perform a complete system reset
1109f1c70a2SPeter Maydell  * @reason: reason for the reset
1119f1c70a2SPeter Maydell  *
1129f1c70a2SPeter Maydell  * This function performs the low-level work needed to do a complete reset
1139f1c70a2SPeter Maydell  * of the system (calling all the callbacks registered with
114*86fae16eSPeter Maydell  * qemu_register_reset() and resetting all the Resettable objects registered
115*86fae16eSPeter Maydell  * with qemu_register_resettable()). It should only be called by the code in a
1169f1c70a2SPeter Maydell  * MachineClass reset method.
1179f1c70a2SPeter Maydell  *
1189f1c70a2SPeter Maydell  * If you want to trigger a system reset from, for instance, a device
1199f1c70a2SPeter Maydell  * model, don't use this function. Use qemu_system_reset_request().
1209f1c70a2SPeter Maydell  */
1217966d70fSJason A. Donenfeld void qemu_devices_reset(ShutdownCause reason);
1222f7b92a0SPaolo Bonzini 
1232f7b92a0SPaolo Bonzini #endif
124