qemu

FORK: QEMU emulator
git clone https://git.neptards.moe/neptards/qemu.git
Log | Files | Refs | Submodules | LICENSE

reset.c (2697B)


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