qemu with hax to log dma reads & writes jcs.org/2018/11/12/vfio
at jcs-vmm 141 lines 3.7 kB view raw
1/* 2 * Dealloc Visitor 3 * 4 * Copyright (C) 2012-2016 Red Hat, Inc. 5 * Copyright IBM, Corp. 2011 6 * 7 * Authors: 8 * Michael Roth <mdroth@linux.vnet.ibm.com> 9 * 10 * This work is licensed under the terms of the GNU LGPL, version 2.1 or later. 11 * See the COPYING.LIB file in the top-level directory. 12 * 13 */ 14 15#include "qemu/osdep.h" 16#include "qapi/dealloc-visitor.h" 17#include "qapi/qmp/qnull.h" 18#include "qapi/visitor-impl.h" 19 20struct QapiDeallocVisitor 21{ 22 Visitor visitor; 23}; 24 25static void qapi_dealloc_start_struct(Visitor *v, const char *name, void **obj, 26 size_t unused, Error **errp) 27{ 28} 29 30static void qapi_dealloc_end_struct(Visitor *v, void **obj) 31{ 32 if (obj) { 33 g_free(*obj); 34 } 35} 36 37static void qapi_dealloc_start_alternate(Visitor *v, const char *name, 38 GenericAlternate **obj, size_t size, 39 Error **errp) 40{ 41} 42 43static void qapi_dealloc_end_alternate(Visitor *v, void **obj) 44{ 45 if (obj) { 46 g_free(*obj); 47 } 48} 49 50static void qapi_dealloc_start_list(Visitor *v, const char *name, 51 GenericList **list, size_t size, 52 Error **errp) 53{ 54} 55 56static GenericList *qapi_dealloc_next_list(Visitor *v, GenericList *tail, 57 size_t size) 58{ 59 GenericList *next = tail->next; 60 g_free(tail); 61 return next; 62} 63 64static void qapi_dealloc_end_list(Visitor *v, void **obj) 65{ 66} 67 68static void qapi_dealloc_type_str(Visitor *v, const char *name, char **obj, 69 Error **errp) 70{ 71 if (obj) { 72 g_free(*obj); 73 } 74} 75 76static void qapi_dealloc_type_int64(Visitor *v, const char *name, int64_t *obj, 77 Error **errp) 78{ 79} 80 81static void qapi_dealloc_type_uint64(Visitor *v, const char *name, 82 uint64_t *obj, Error **errp) 83{ 84} 85 86static void qapi_dealloc_type_bool(Visitor *v, const char *name, bool *obj, 87 Error **errp) 88{ 89} 90 91static void qapi_dealloc_type_number(Visitor *v, const char *name, double *obj, 92 Error **errp) 93{ 94} 95 96static void qapi_dealloc_type_anything(Visitor *v, const char *name, 97 QObject **obj, Error **errp) 98{ 99 if (obj) { 100 qobject_unref(*obj); 101 } 102} 103 104static void qapi_dealloc_type_null(Visitor *v, const char *name, 105 QNull **obj, Error **errp) 106{ 107 if (obj) { 108 qobject_unref(*obj); 109 } 110} 111 112static void qapi_dealloc_free(Visitor *v) 113{ 114 g_free(container_of(v, QapiDeallocVisitor, visitor)); 115} 116 117Visitor *qapi_dealloc_visitor_new(void) 118{ 119 QapiDeallocVisitor *v; 120 121 v = g_malloc0(sizeof(*v)); 122 123 v->visitor.type = VISITOR_DEALLOC; 124 v->visitor.start_struct = qapi_dealloc_start_struct; 125 v->visitor.end_struct = qapi_dealloc_end_struct; 126 v->visitor.start_alternate = qapi_dealloc_start_alternate; 127 v->visitor.end_alternate = qapi_dealloc_end_alternate; 128 v->visitor.start_list = qapi_dealloc_start_list; 129 v->visitor.next_list = qapi_dealloc_next_list; 130 v->visitor.end_list = qapi_dealloc_end_list; 131 v->visitor.type_int64 = qapi_dealloc_type_int64; 132 v->visitor.type_uint64 = qapi_dealloc_type_uint64; 133 v->visitor.type_bool = qapi_dealloc_type_bool; 134 v->visitor.type_str = qapi_dealloc_type_str; 135 v->visitor.type_number = qapi_dealloc_type_number; 136 v->visitor.type_any = qapi_dealloc_type_anything; 137 v->visitor.type_null = qapi_dealloc_type_null; 138 v->visitor.free = qapi_dealloc_free; 139 140 return &v->visitor; 141}