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