xref: /qemu/hw/core/reset.c (revision 2f7b92a03f1e3813fc046d757138da519f4218d3)
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