[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [RFC PATCH v3 1/2] xen: add libafl-qemu fuzzer support
On 07.05.2025 11:53, Volodymyr Babchuk wrote: > --- a/xen/common/Makefile > +++ b/xen/common/Makefile > @@ -78,6 +78,7 @@ extra-y := symbols-dummy.o > obj-$(CONFIG_COVERAGE) += coverage/ > obj-y += sched/ > obj-$(CONFIG_UBSAN) += ubsan/ > +obj-$(CONFIG_FUZZER_LIBAFL_QEMU) += libafl-qemu.o This ought to move up into the list of (mostly?) sorted object files. > --- /dev/null > +++ b/xen/common/libafl-qemu.c > @@ -0,0 +1,80 @@ > +/* SPDX-License-Identifier: MIT */ > +/* > + This file is based on libafl_qemu_impl.h, libafl_qemu_qemu_arch.h > + and libafl_qemu_defs.h from LibAFL project. > +*/ > +#include <xen/lib.h> > +#include <xen/init.h> > +#include <xen/kernel.h> > +#include <xen/spinlock.h> > +#include <xen/libafl-qemu.h> > +#include <asm/libafl-qemu.h> > + > +/* Generates sync exit functions */ > +LIBAFL_DEFINE_FUNCTIONS(sync_exit, LIBAFL_SYNC_EXIT_OPCODE) > + > + void libafl_qemu_end(enum LibaflQemuEndStatus status) > +{ > + _libafl_sync_exit_call1(LIBAFL_QEMU_COMMAND_END, status); > +} > + > +void libafl_qemu_internal_error(void) > +{ > + _libafl_sync_exit_call0(LIBAFL_QEMU_COMMAND_INTERNAL_ERROR); > +} > + > +void lqprintf(const char *fmt, ...) At least this one looks as if it can be static. Anything which can be should be made so. > +{ > + static DEFINE_SPINLOCK(lock); > + static char buffer[LIBAFL_QEMU_PRINTF_MAX_SIZE] = {0}; > + va_list args; > + int res; > + > + spin_lock(&lock); > + > + va_start(args, fmt); > + res = vsnprintf(buffer, LIBAFL_QEMU_PRINTF_MAX_SIZE, fmt, args); > + va_end(args); > + > + if ( res >= LIBAFL_QEMU_PRINTF_MAX_SIZE ) > + { > + /* buffer is not big enough, either recompile the target with more */ > + /* space or print less things */ > + libafl_qemu_internal_error(); > + } > + > + _libafl_sync_exit_call2(LIBAFL_QEMU_COMMAND_LQPRINTF, > + (libafl_word)buffer, res); > + spin_unlock(&lock); > +} > + > +void libafl_qemu_trace_vaddr_range(libafl_word start, > + libafl_word end) > +{ > + _libafl_sync_exit_call2(LIBAFL_QEMU_COMMAND_VADDR_FILTER_ALLOW, start, > end); > +} > + > +static int init_afl(void) > +{ > + vaddr_t xen_text_start = (vaddr_t)_stext; > + vaddr_t xen_text_end = (vaddr_t)_etext; > + > + lqprintf("Telling AFL about code section: %lx - %lx\n", xen_text_start, > + xen_text_end); > + > + libafl_qemu_trace_vaddr_range(xen_text_start, xen_text_end); > + > + return 0; > +} > + > +__initcall(init_afl); Please omit the blank line ahead of the __initcall() if that immediately follows the respective function. > --- /dev/null > +++ b/xen/include/xen/libafl-qemu.h > @@ -0,0 +1,63 @@ > +/* SPDX-License-Identifier: MIT */ > +#ifndef __XEN_LIBAFL_QEMU_H > +#define __XEN_LIBAFL_QEMU_H > + > +#include <xen/stdint.h> > +#define LIBAFL_QEMU_PRINTF_MAX_SIZE 4096 > + > +#define LIBAFL_STRINGIFY(s) #s > +#define XSTRINGIFY(s) LIBAFL_STRINGIFY(s) We have STR() (and stringify()) - why would we need yet another macro? > +#define LIBAFL_SYNC_EXIT_OPCODE 0x66f23a0f > + > +typedef enum LibaflQemuCommand > +{ > + LIBAFL_QEMU_COMMAND_START_VIRT = 0, > + LIBAFL_QEMU_COMMAND_START_PHYS = 1, > + LIBAFL_QEMU_COMMAND_INPUT_VIRT = 2, > + LIBAFL_QEMU_COMMAND_INPUT_PHYS = 3, > + LIBAFL_QEMU_COMMAND_END = 4, > + LIBAFL_QEMU_COMMAND_SAVE = 5, > + LIBAFL_QEMU_COMMAND_LOAD = 6, > + LIBAFL_QEMU_COMMAND_VERSION = 7, > + LIBAFL_QEMU_COMMAND_VADDR_FILTER_ALLOW = 8, > + LIBAFL_QEMU_COMMAND_INTERNAL_ERROR = 9, > + LIBAFL_QEMU_COMMAND_LQPRINTF = 10, > + LIBAFL_QEMU_COMMAND_TEST = 11, > +} LibaflExit; > + > +typedef uint64_t libafl_word; Looking at its uses, this rather wants to be unsigned long as it seems. Jan
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |