1*e88899faSAndrew Melnychenko /* 2*e88899faSAndrew Melnychenko * QEMU eBPF binary declaration routine. 3*e88899faSAndrew Melnychenko * 4*e88899faSAndrew Melnychenko * Developed by Daynix Computing LTD (http://www.daynix.com) 5*e88899faSAndrew Melnychenko * 6*e88899faSAndrew Melnychenko * Authors: 7*e88899faSAndrew Melnychenko * Andrew Melnychenko <andrew@daynix.com> 8*e88899faSAndrew Melnychenko * 9*e88899faSAndrew Melnychenko * SPDX-License-Identifier: GPL-2.0-or-later 10*e88899faSAndrew Melnychenko */ 11*e88899faSAndrew Melnychenko 12*e88899faSAndrew Melnychenko #include "qemu/osdep.h" 13*e88899faSAndrew Melnychenko #include "qemu/queue.h" 14*e88899faSAndrew Melnychenko #include "qapi/error.h" 15*e88899faSAndrew Melnychenko #include "qapi/qapi-commands-ebpf.h" 16*e88899faSAndrew Melnychenko #include "ebpf/ebpf.h" 17*e88899faSAndrew Melnychenko 18*e88899faSAndrew Melnychenko typedef struct ElfBinaryDataEntry { 19*e88899faSAndrew Melnychenko int id; 20*e88899faSAndrew Melnychenko const void *data; 21*e88899faSAndrew Melnychenko size_t datalen; 22*e88899faSAndrew Melnychenko 23*e88899faSAndrew Melnychenko QSLIST_ENTRY(ElfBinaryDataEntry) node; 24*e88899faSAndrew Melnychenko } ElfBinaryDataEntry; 25*e88899faSAndrew Melnychenko 26*e88899faSAndrew Melnychenko static QSLIST_HEAD(, ElfBinaryDataEntry) ebpf_elf_obj_list = 27*e88899faSAndrew Melnychenko QSLIST_HEAD_INITIALIZER(); 28*e88899faSAndrew Melnychenko 29*e88899faSAndrew Melnychenko void ebpf_register_binary_data(int id, const void *data, size_t datalen) 30*e88899faSAndrew Melnychenko { 31*e88899faSAndrew Melnychenko struct ElfBinaryDataEntry *dataentry = NULL; 32*e88899faSAndrew Melnychenko 33*e88899faSAndrew Melnychenko dataentry = g_new0(struct ElfBinaryDataEntry, 1); 34*e88899faSAndrew Melnychenko dataentry->data = data; 35*e88899faSAndrew Melnychenko dataentry->datalen = datalen; 36*e88899faSAndrew Melnychenko dataentry->id = id; 37*e88899faSAndrew Melnychenko 38*e88899faSAndrew Melnychenko QSLIST_INSERT_HEAD(&ebpf_elf_obj_list, dataentry, node); 39*e88899faSAndrew Melnychenko } 40*e88899faSAndrew Melnychenko 41*e88899faSAndrew Melnychenko const void *ebpf_find_binary_by_id(int id, size_t *sz, Error **errp) 42*e88899faSAndrew Melnychenko { 43*e88899faSAndrew Melnychenko struct ElfBinaryDataEntry *it = NULL; 44*e88899faSAndrew Melnychenko QSLIST_FOREACH(it, &ebpf_elf_obj_list, node) { 45*e88899faSAndrew Melnychenko if (id == it->id) { 46*e88899faSAndrew Melnychenko *sz = it->datalen; 47*e88899faSAndrew Melnychenko return it->data; 48*e88899faSAndrew Melnychenko } 49*e88899faSAndrew Melnychenko } 50*e88899faSAndrew Melnychenko 51*e88899faSAndrew Melnychenko error_setg(errp, "can't find eBPF object with id: %d", id); 52*e88899faSAndrew Melnychenko 53*e88899faSAndrew Melnychenko return NULL; 54*e88899faSAndrew Melnychenko } 55*e88899faSAndrew Melnychenko 56*e88899faSAndrew Melnychenko EbpfObject *qmp_request_ebpf(EbpfProgramID id, Error **errp) 57*e88899faSAndrew Melnychenko { 58*e88899faSAndrew Melnychenko EbpfObject *ret = NULL; 59*e88899faSAndrew Melnychenko size_t size = 0; 60*e88899faSAndrew Melnychenko const void *data = ebpf_find_binary_by_id(id, &size, errp); 61*e88899faSAndrew Melnychenko if (!data) { 62*e88899faSAndrew Melnychenko return NULL; 63*e88899faSAndrew Melnychenko } 64*e88899faSAndrew Melnychenko 65*e88899faSAndrew Melnychenko ret = g_new0(EbpfObject, 1); 66*e88899faSAndrew Melnychenko ret->object = g_base64_encode(data, size); 67*e88899faSAndrew Melnychenko 68*e88899faSAndrew Melnychenko return ret; 69*e88899faSAndrew Melnychenko } 70