1e965ffa7SStefan Hajnoczi /* 2e965ffa7SStefan Hajnoczi * qdev vm change state handlers 3e965ffa7SStefan Hajnoczi * 4e965ffa7SStefan Hajnoczi * This program is free software; you can redistribute it and/or modify 5e965ffa7SStefan Hajnoczi * it under the terms of the GNU General Public License as published by 6e965ffa7SStefan Hajnoczi * the Free Software Foundation; either version 2 of the License, 7e965ffa7SStefan Hajnoczi * or (at your option) any later version. 8e965ffa7SStefan Hajnoczi * 9e965ffa7SStefan Hajnoczi * This program is distributed in the hope that it will be useful, 10e965ffa7SStefan Hajnoczi * but WITHOUT ANY WARRANTY; without even the implied warranty of 11e965ffa7SStefan Hajnoczi * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12e965ffa7SStefan Hajnoczi * GNU General Public License for more details. 13e965ffa7SStefan Hajnoczi * 14e965ffa7SStefan Hajnoczi * You should have received a copy of the GNU General Public License 15e965ffa7SStefan Hajnoczi * along with this program; if not, see <http://www.gnu.org/licenses/>. 16e965ffa7SStefan Hajnoczi */ 17e965ffa7SStefan Hajnoczi 18e965ffa7SStefan Hajnoczi #include "qemu/osdep.h" 19a27bd6c7SMarkus Armbruster #include "hw/qdev-core.h" 20*32cad1ffSPhilippe Mathieu-Daudé #include "system/runstate.h" 21e965ffa7SStefan Hajnoczi 22e965ffa7SStefan Hajnoczi static int qdev_get_dev_tree_depth(DeviceState *dev) 23e965ffa7SStefan Hajnoczi { 24e965ffa7SStefan Hajnoczi int depth; 25e965ffa7SStefan Hajnoczi 26e965ffa7SStefan Hajnoczi for (depth = 0; dev; depth++) { 27e965ffa7SStefan Hajnoczi BusState *bus = dev->parent_bus; 28e965ffa7SStefan Hajnoczi 29e965ffa7SStefan Hajnoczi if (!bus) { 30e965ffa7SStefan Hajnoczi break; 31e965ffa7SStefan Hajnoczi } 32e965ffa7SStefan Hajnoczi 33e965ffa7SStefan Hajnoczi dev = bus->parent; 34e965ffa7SStefan Hajnoczi } 35e965ffa7SStefan Hajnoczi 36e965ffa7SStefan Hajnoczi return depth; 37e965ffa7SStefan Hajnoczi } 38e965ffa7SStefan Hajnoczi 39e965ffa7SStefan Hajnoczi /** 40e965ffa7SStefan Hajnoczi * qdev_add_vm_change_state_handler: 41e965ffa7SStefan Hajnoczi * @dev: the device that owns this handler 42e965ffa7SStefan Hajnoczi * @cb: the callback function to be invoked 43e965ffa7SStefan Hajnoczi * @opaque: user data passed to the callback function 44e965ffa7SStefan Hajnoczi * 45e965ffa7SStefan Hajnoczi * This function works like qemu_add_vm_change_state_handler() except callbacks 46e965ffa7SStefan Hajnoczi * are invoked in qdev tree depth order. Ordering is desirable when callbacks 47e965ffa7SStefan Hajnoczi * of children depend on their parent's callback having completed first. 48e965ffa7SStefan Hajnoczi * 49e965ffa7SStefan Hajnoczi * For example, when qdev_add_vm_change_state_handler() is used, a host 50e965ffa7SStefan Hajnoczi * controller's callback is invoked before the children on its bus when the VM 51e965ffa7SStefan Hajnoczi * starts running. The order is reversed when the VM stops running. 52e965ffa7SStefan Hajnoczi * 53e965ffa7SStefan Hajnoczi * Returns: an entry to be freed with qemu_del_vm_change_state_handler() 54e965ffa7SStefan Hajnoczi */ 55e965ffa7SStefan Hajnoczi VMChangeStateEntry *qdev_add_vm_change_state_handler(DeviceState *dev, 56e965ffa7SStefan Hajnoczi VMChangeStateHandler *cb, 57e965ffa7SStefan Hajnoczi void *opaque) 58e965ffa7SStefan Hajnoczi { 5902b2e253SAvihai Horon return qdev_add_vm_change_state_handler_full(dev, cb, NULL, opaque); 6002b2e253SAvihai Horon } 6102b2e253SAvihai Horon 6202b2e253SAvihai Horon /* 6302b2e253SAvihai Horon * Exactly like qdev_add_vm_change_state_handler() but passes a prepare_cb 6402b2e253SAvihai Horon * argument too. 6502b2e253SAvihai Horon */ 6602b2e253SAvihai Horon VMChangeStateEntry *qdev_add_vm_change_state_handler_full( 6702b2e253SAvihai Horon DeviceState *dev, VMChangeStateHandler *cb, 6802b2e253SAvihai Horon VMChangeStateHandler *prepare_cb, void *opaque) 6902b2e253SAvihai Horon { 70e965ffa7SStefan Hajnoczi int depth = qdev_get_dev_tree_depth(dev); 71e965ffa7SStefan Hajnoczi 7202b2e253SAvihai Horon return qemu_add_vm_change_state_handler_prio_full(cb, prepare_cb, opaque, 7302b2e253SAvihai Horon depth); 74e965ffa7SStefan Hajnoczi } 75