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 27*32cad1ffSPhilippe Mathieu-Daudé #ifndef QEMU_SYSTEM_RESET_H 28*32cad1ffSPhilippe Mathieu-Daudé #define QEMU_SYSTEM_RESET_H 292f7b92a0SPaolo Bonzini 301b063fe2SJuraj Marcin #include "hw/resettable.h" 317966d70fSJason A. Donenfeld #include "qapi/qapi-events-run-state.h" 327966d70fSJason A. Donenfeld 332f7b92a0SPaolo Bonzini typedef void QEMUResetHandler(void *opaque); 342f7b92a0SPaolo Bonzini 359f1c70a2SPeter Maydell /** 3686fae16eSPeter Maydell * qemu_register_resettable: Register an object to be reset 3786fae16eSPeter Maydell * @obj: object to be reset: it must implement the Resettable interface 3886fae16eSPeter Maydell * 3986fae16eSPeter Maydell * Register @obj on the list of objects which will be reset when the 4086fae16eSPeter Maydell * simulation is reset. These objects will be reset in the order 4186fae16eSPeter Maydell * they were added, using the three-phase Resettable protocol, 4286fae16eSPeter Maydell * so first all objects go through the enter phase, then all objects 4386fae16eSPeter Maydell * go through the hold phase, and then finally all go through the 4486fae16eSPeter Maydell * exit phase. 4586fae16eSPeter Maydell * 4686fae16eSPeter Maydell * It is not permitted to register or unregister reset functions or 4786fae16eSPeter Maydell * resettable objects from within any of the reset phase methods of @obj. 4886fae16eSPeter Maydell * 4986fae16eSPeter Maydell * We assume that the caller holds the BQL. 5086fae16eSPeter Maydell */ 5186fae16eSPeter Maydell void qemu_register_resettable(Object *obj); 5286fae16eSPeter Maydell 5386fae16eSPeter Maydell /** 5486fae16eSPeter Maydell * qemu_unregister_resettable: Unregister an object to be reset 5586fae16eSPeter Maydell * @obj: object to unregister 5686fae16eSPeter Maydell * 5786fae16eSPeter Maydell * Remove @obj from the list of objects which are reset when the 5886fae16eSPeter Maydell * simulation is reset. It must have been previously added to 5986fae16eSPeter Maydell * the list via qemu_register_resettable(). 6086fae16eSPeter Maydell * 6186fae16eSPeter Maydell * We assume that the caller holds the BQL. 6286fae16eSPeter Maydell */ 6386fae16eSPeter Maydell void qemu_unregister_resettable(Object *obj); 6486fae16eSPeter Maydell 6586fae16eSPeter Maydell /** 669f1c70a2SPeter Maydell * qemu_register_reset: Register a callback for system reset 679f1c70a2SPeter Maydell * @func: function to call 689f1c70a2SPeter Maydell * @opaque: opaque data to pass to @func 699f1c70a2SPeter Maydell * 709f1c70a2SPeter Maydell * Register @func on the list of functions which are called when the 7171b3ea37SPeter Maydell * entire system is reset. Functions registered with this API and 7271b3ea37SPeter Maydell * Resettable objects registered with qemu_register_resettable() are 7371b3ea37SPeter Maydell * handled together, in the order in which they were registered. 7471b3ea37SPeter Maydell * Functions registered with this API are called in the 'hold' phase 7571b3ea37SPeter Maydell * of the 3-phase reset. 769f1c70a2SPeter Maydell * 779f1c70a2SPeter Maydell * In general this function should not be used in new code where possible; 789f1c70a2SPeter Maydell * for instance, device model reset is better accomplished using the 799f1c70a2SPeter Maydell * methods on DeviceState. 809f1c70a2SPeter Maydell * 8186fae16eSPeter Maydell * It is not permitted to register or unregister reset functions or 8286fae16eSPeter Maydell * resettable objects from within the @func callback. 839f1c70a2SPeter Maydell * 849f1c70a2SPeter Maydell * We assume that the caller holds the BQL. 859f1c70a2SPeter Maydell */ 862f7b92a0SPaolo Bonzini void qemu_register_reset(QEMUResetHandler *func, void *opaque); 879f1c70a2SPeter Maydell 889f1c70a2SPeter Maydell /** 899f1c70a2SPeter Maydell * qemu_register_reset_nosnapshotload: Register a callback for system reset 909f1c70a2SPeter Maydell * @func: function to call 919f1c70a2SPeter Maydell * @opaque: opaque data to pass to @func 929f1c70a2SPeter Maydell * 939f1c70a2SPeter Maydell * This is the same as qemu_register_reset(), except that @func is 949f1c70a2SPeter Maydell * not called if the reason that the system is being reset is to 959f1c70a2SPeter Maydell * put it into a clean state prior to loading a snapshot (i.e. for 969f1c70a2SPeter Maydell * SHUTDOWN_CAUSE_SNAPSHOT_LOAD). 979f1c70a2SPeter Maydell */ 987966d70fSJason A. Donenfeld void qemu_register_reset_nosnapshotload(QEMUResetHandler *func, void *opaque); 999f1c70a2SPeter Maydell 1009f1c70a2SPeter Maydell /** 1019f1c70a2SPeter Maydell * qemu_unregister_reset: Unregister a system reset callback 1029f1c70a2SPeter Maydell * @func: function registered with qemu_register_reset() 1039f1c70a2SPeter Maydell * @opaque: the same opaque data that was passed to qemu_register_reset() 1049f1c70a2SPeter Maydell * 1059f1c70a2SPeter Maydell * Undo the effects of a qemu_register_reset(). The @func and @opaque 1069f1c70a2SPeter Maydell * must both match the arguments originally used with qemu_register_reset(). 1079f1c70a2SPeter Maydell * 1089f1c70a2SPeter Maydell * We assume that the caller holds the BQL. 1099f1c70a2SPeter Maydell */ 1102f7b92a0SPaolo Bonzini void qemu_unregister_reset(QEMUResetHandler *func, void *opaque); 1119f1c70a2SPeter Maydell 1129f1c70a2SPeter Maydell /** 1139f1c70a2SPeter Maydell * qemu_devices_reset: Perform a complete system reset 1141b063fe2SJuraj Marcin * @reason: type of the reset 1159f1c70a2SPeter Maydell * 1169f1c70a2SPeter Maydell * This function performs the low-level work needed to do a complete reset 1179f1c70a2SPeter Maydell * of the system (calling all the callbacks registered with 11886fae16eSPeter Maydell * qemu_register_reset() and resetting all the Resettable objects registered 11986fae16eSPeter Maydell * with qemu_register_resettable()). It should only be called by the code in a 1209f1c70a2SPeter Maydell * MachineClass reset method. 1219f1c70a2SPeter Maydell * 1229f1c70a2SPeter Maydell * If you want to trigger a system reset from, for instance, a device 1239f1c70a2SPeter Maydell * model, don't use this function. Use qemu_system_reset_request(). 1249f1c70a2SPeter Maydell */ 1251b063fe2SJuraj Marcin void qemu_devices_reset(ResetType type); 1262f7b92a0SPaolo Bonzini 1272f7b92a0SPaolo Bonzini #endif 128