1*2f7b92a0SPaolo Bonzini /* 2*2f7b92a0SPaolo Bonzini * Reset handlers. 3*2f7b92a0SPaolo Bonzini * 4*2f7b92a0SPaolo Bonzini * Copyright (c) 2003-2008 Fabrice Bellard 5*2f7b92a0SPaolo Bonzini * Copyright (c) 2016 Red Hat, Inc. 6*2f7b92a0SPaolo Bonzini * 7*2f7b92a0SPaolo Bonzini * Permission is hereby granted, free of charge, to any person obtaining a copy 8*2f7b92a0SPaolo Bonzini * of this software and associated documentation files (the "Software"), to deal 9*2f7b92a0SPaolo Bonzini * in the Software without restriction, including without limitation the rights 10*2f7b92a0SPaolo Bonzini * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 11*2f7b92a0SPaolo Bonzini * copies of the Software, and to permit persons to whom the Software is 12*2f7b92a0SPaolo Bonzini * furnished to do so, subject to the following conditions: 13*2f7b92a0SPaolo Bonzini * 14*2f7b92a0SPaolo Bonzini * The above copyright notice and this permission notice shall be included in 15*2f7b92a0SPaolo Bonzini * all copies or substantial portions of the Software. 16*2f7b92a0SPaolo Bonzini * 17*2f7b92a0SPaolo Bonzini * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 18*2f7b92a0SPaolo Bonzini * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19*2f7b92a0SPaolo Bonzini * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 20*2f7b92a0SPaolo Bonzini * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 21*2f7b92a0SPaolo Bonzini * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 22*2f7b92a0SPaolo Bonzini * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 23*2f7b92a0SPaolo Bonzini * THE SOFTWARE. 24*2f7b92a0SPaolo Bonzini */ 25*2f7b92a0SPaolo Bonzini 26*2f7b92a0SPaolo Bonzini #include "qemu/osdep.h" 27*2f7b92a0SPaolo Bonzini #include "qemu/queue.h" 28*2f7b92a0SPaolo Bonzini #include "sysemu/reset.h" 29*2f7b92a0SPaolo Bonzini 30*2f7b92a0SPaolo Bonzini /* reset/shutdown handler */ 31*2f7b92a0SPaolo Bonzini 32*2f7b92a0SPaolo Bonzini typedef struct QEMUResetEntry { 33*2f7b92a0SPaolo Bonzini QTAILQ_ENTRY(QEMUResetEntry) entry; 34*2f7b92a0SPaolo Bonzini QEMUResetHandler *func; 35*2f7b92a0SPaolo Bonzini void *opaque; 36*2f7b92a0SPaolo Bonzini } QEMUResetEntry; 37*2f7b92a0SPaolo Bonzini 38*2f7b92a0SPaolo Bonzini static QTAILQ_HEAD(reset_handlers, QEMUResetEntry) reset_handlers = 39*2f7b92a0SPaolo Bonzini QTAILQ_HEAD_INITIALIZER(reset_handlers); 40*2f7b92a0SPaolo Bonzini 41*2f7b92a0SPaolo Bonzini void qemu_register_reset(QEMUResetHandler *func, void *opaque) 42*2f7b92a0SPaolo Bonzini { 43*2f7b92a0SPaolo Bonzini QEMUResetEntry *re = g_malloc0(sizeof(QEMUResetEntry)); 44*2f7b92a0SPaolo Bonzini 45*2f7b92a0SPaolo Bonzini re->func = func; 46*2f7b92a0SPaolo Bonzini re->opaque = opaque; 47*2f7b92a0SPaolo Bonzini QTAILQ_INSERT_TAIL(&reset_handlers, re, entry); 48*2f7b92a0SPaolo Bonzini } 49*2f7b92a0SPaolo Bonzini 50*2f7b92a0SPaolo Bonzini void qemu_unregister_reset(QEMUResetHandler *func, void *opaque) 51*2f7b92a0SPaolo Bonzini { 52*2f7b92a0SPaolo Bonzini QEMUResetEntry *re; 53*2f7b92a0SPaolo Bonzini 54*2f7b92a0SPaolo Bonzini QTAILQ_FOREACH(re, &reset_handlers, entry) { 55*2f7b92a0SPaolo Bonzini if (re->func == func && re->opaque == opaque) { 56*2f7b92a0SPaolo Bonzini QTAILQ_REMOVE(&reset_handlers, re, entry); 57*2f7b92a0SPaolo Bonzini g_free(re); 58*2f7b92a0SPaolo Bonzini return; 59*2f7b92a0SPaolo Bonzini } 60*2f7b92a0SPaolo Bonzini } 61*2f7b92a0SPaolo Bonzini } 62*2f7b92a0SPaolo Bonzini 63*2f7b92a0SPaolo Bonzini void qemu_devices_reset(void) 64*2f7b92a0SPaolo Bonzini { 65*2f7b92a0SPaolo Bonzini QEMUResetEntry *re, *nre; 66*2f7b92a0SPaolo Bonzini 67*2f7b92a0SPaolo Bonzini /* reset all devices */ 68*2f7b92a0SPaolo Bonzini QTAILQ_FOREACH_SAFE(re, &reset_handlers, entry, nre) { 69*2f7b92a0SPaolo Bonzini re->func(re->opaque); 70*2f7b92a0SPaolo Bonzini } 71*2f7b92a0SPaolo Bonzini } 72*2f7b92a0SPaolo Bonzini 73