All of lore.kernel.org
 help / color / mirror / Atom feed
From: Alexander Bulekov <alxndr@bu.edu>
To: "qemu-devel@nongnu.org" <qemu-devel@nongnu.org>,
	Paolo Bonzini <pbonzini@redhat.com>
Subject: Re: [PATCH v4 01/20] softmmu: split off vl.c:main() into main.c
Date: Tue, 12 Nov 2019 11:46:57 -0500	[thread overview]
Message-ID: <737fcde0-53bb-c0c4-452a-738a188b1c81@bu.edu> (raw)
In-Reply-To: <20191105164140.gts3ratgxwa4z2jg@starbug-mbp>

On 11/5/19 11:41 AM, Darren Kenny wrote:
> On Wed, Oct 30, 2019 at 02:49:48PM +0000, Oleinik, Alexander wrote:
>> From: Alexander Oleinik <alxndr@bu.edu>
>>
>> A program might rely on functions implemented in vl.c, but implement its
>> own main(). By placing main into a separate source file, there are no
>> complaints about duplicate main()s when linking against vl.o. For
>> example, the virtual-device fuzzer uses a main() provided by libfuzzer,
>> and needs to perform some initialization before running the softmmu
>> initialization. Now, main simply calls three vl.c functions which
>> handle the guest initialization, main loop and cleanup.
>>
>> Signed-off-by: Alexander Oleinik <alxndr@bu.edu>
>> ---
>> Makefile                |  1 +
>> Makefile.objs           |  2 ++
>> include/sysemu/sysemu.h |  4 ++++
>> main.c                  | 52 +++++++++++++++++++++++++++++++++++++++++
>> vl.c                    | 36 +++++++---------------------
>> 5 files changed, 68 insertions(+), 27 deletions(-)
>> create mode 100644 main.c
>>
>> diff --git a/Makefile b/Makefile
>> index 0e994a275d..d2b2ecd3c4 100644
>> --- a/Makefile
>> +++ b/Makefile
>> @@ -474,6 +474,7 @@ $(SOFTMMU_ALL_RULES): $(crypto-obj-y)
>> $(SOFTMMU_ALL_RULES): $(io-obj-y)
>> $(SOFTMMU_ALL_RULES): config-all-devices.mak
>> $(SOFTMMU_ALL_RULES): $(edk2-decompressed)
>> +$(SOFTMMU_ALL_RULES): $(softmmu-main-y)
>>
>> .PHONY: $(TARGET_DIRS_RULES)
>> # The $(TARGET_DIRS_RULES) are of the form SUBDIR/GOAL, so that
>> diff --git a/Makefile.objs b/Makefile.objs
>> index 11ba1a36bd..9ff9b0c6f9 100644
>> --- a/Makefile.objs
>> +++ b/Makefile.objs
>> @@ -86,6 +86,8 @@ common-obj-$(CONFIG_FDT) += device_tree.o
>> # qapi
>>
>> common-obj-y += qapi/
>> +
>> +softmmu-main-y = main.o
>> endif
>>
>> #######################################################################
>> diff --git a/include/sysemu/sysemu.h b/include/sysemu/sysemu.h
>> index 44f18eb739..03f9838b81 100644
>> --- a/include/sysemu/sysemu.h
>> +++ b/include/sysemu/sysemu.h
>> @@ -114,6 +114,10 @@ QemuOpts *qemu_get_machine_opts(void);
>>
>> bool defaults_enabled(void);
>>
>> +void main_loop(void);
>> +void qemu_init(int argc, char **argv, char **envp);
>> +void qemu_cleanup(void);
>> +
>> extern QemuOptsList qemu_legacy_drive_opts;
>> extern QemuOptsList qemu_common_drive_opts;
>> extern QemuOptsList qemu_drive_opts;
>> diff --git a/main.c b/main.c
>> new file mode 100644
>> index 0000000000..ecd6389424
>> --- /dev/null
>> +++ b/main.c
>> @@ -0,0 +1,52 @@
>> +/*
>> + * QEMU System Emulator
>> + *
>> + * Copyright (c) 2003-2008 Fabrice Bellard
>> + *
>> + * Permission is hereby granted, free of charge, to any person 
>> obtaining a copy
>> + * of this software and associated documentation files (the 
>> "Software"), to deal
>> + * in the Software without restriction, including without limitation 
>> the rights
>> + * to use, copy, modify, merge, publish, distribute, sublicense, 
>> and/or sell
>> + * copies of the Software, and to permit persons to whom the Software is
>> + * furnished to do so, subject to the following conditions:
>> + *
>> + * The above copyright notice and this permission notice shall be 
>> included in
>> + * all copies or substantial portions of the Software.
>> + *
>> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 
>> EXPRESS OR
>> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 
>> MERCHANTABILITY,
>> + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT 
>> SHALL
>> + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES 
>> OR OTHER
>> + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 
>> ARISING FROM,
>> + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
>> DEALINGS IN
>> + * THE SOFTWARE.
>> + */
>> +
>> +#include "qemu/osdep.h"
>> +#include "sysemu/sysemu.h"
>> +
>> +#ifdef CONFIG_SDL
>> +#if defined(__APPLE__) || defined(main)
>> +#include <SDL.h>
>> +int main(int argc, char **argv)
>> +{
>> +    return qemu_main(argc, argv, NULL);
>> +}
>> +#undef main
>> +#define main qemu_main
> 
> This /looks/ wrong, you're defining a function main(), and then
> immediately #undef and #define main again.
> 
> Maybe this could be written differently, or add a comment here as to
> why you need to do this.
> 
>> +#endif
>> +#endif /* CONFIG_SDL */
>> +
>> +#ifdef CONFIG_COCOA
>> +#undef main
>> +#define main qemu_main
>> +#endif /* CONFIG_COCOA */
> 
> I don't really know the combinations that might exist, but it looks
> like if CONFIG_SDL is not defined, then we're redefining main() to be
> qemi_main() - so what main() function will actually be used here?

I tried to copy this straight from vl.c. It seems that this was 
originally added for similar reasons that I added this patch - similarly 
to libfuzzer, SDL has its own main function, and I'm guessing its 
similar for cocoa. With some  preprocessor flags, the result looks like:
int SDL_main(int argc, char **argv)
{
     return qemu_main(argc, argv,
                                 ((void *)0)
                                     );
}
int qemu_main(int argc, char **argv, char **envp)
{
     qemu_init(argc, argv, envp);
     main_loop();
     qemu_cleanup();
     return 0;
}

So it looks like this is there since SDL expects main to have two args. 
Maybe this is something that can be solved by adding separate main-sdl.c 
and main-cocoa.c files and tweaks to the build system, which should be 
possible now that qemu_init is separate from main().

-Alex

> Thanks,
> 
> Darren.
> 
>> +
>> +int main(int argc, char **argv, char **envp)
>> +{
>> +    qemu_init(argc, argv, envp);
>> +    main_loop();
>> +    qemu_cleanup();
>> +
>> +    return 0;
>> +}
>> diff --git a/vl.c b/vl.c
>> index c389d24b2c..472f09e12a 100644
>> --- a/vl.c
>> +++ b/vl.c
>> @@ -36,25 +36,6 @@
>> #include "sysemu/seccomp.h"
>> #include "sysemu/tcg.h"
>>
>> -#ifdef CONFIG_SDL
>> -#if defined(__APPLE__) || defined(main)
>> -#include <SDL.h>
>> -int qemu_main(int argc, char **argv, char **envp);
>> -int main(int argc, char **argv)
>> -{
>> -    return qemu_main(argc, argv, NULL);
>> -}
>> -#undef main
>> -#define main qemu_main
>> -#endif
>> -#endif /* CONFIG_SDL */
>> -
>> -#ifdef CONFIG_COCOA
>> -#undef main
>> -#define main qemu_main
>> -#endif /* CONFIG_COCOA */
>> -
>> -
>> #include "qemu/error-report.h"
>> #include "qemu/sockets.h"
>> #include "sysemu/accel.h"
>> @@ -1797,7 +1778,7 @@ static bool main_loop_should_exit(void)
>>     return false;
>> }
>>
>> -static void main_loop(void)
>> +void main_loop(void)
>> {
>> #ifdef CONFIG_PROFILER
>>     int64_t ti;
>> @@ -2824,7 +2805,7 @@ static void user_register_global_props(void)
>>                       global_init_func, NULL, NULL);
>> }
>>
>> -int main(int argc, char **argv, char **envp)
>> +void qemu_init(int argc, char **argv, char **envp)
>> {
>>     int i;
>>     int snapshot, linux_boot;
>> @@ -3404,7 +3385,7 @@ int main(int argc, char **argv, char **envp)
>>             case QEMU_OPTION_watchdog:
>>                 if (watchdog) {
>>                     error_report("only one watchdog option may be 
>> given");
>> -                    return 1;
>> +                    exit(1);
>>                 }
>>                 watchdog = optarg;
>>                 break;
>> @@ -4440,7 +4421,7 @@ int main(int argc, char **argv, char **envp)
>>     if (vmstate_dump_file) {
>>         /* dump and exit */
>>         dump_vmstate_json_to_file(vmstate_dump_file);
>> -        return 0;
>> +        exit(0);
>>     }
>>
>>     if (incoming) {
>> @@ -4457,8 +4438,11 @@ int main(int argc, char **argv, char **envp)
>>     accel_setup_post(current_machine);
>>     os_setup_post();
>>
>> -    main_loop();
>> +    return;
>> +}
>>
>> +void qemu_cleanup(void)
>> +{
>>     gdbserver_cleanup();
>>
>>     /*
>> @@ -4495,6 +4479,4 @@ int main(int argc, char **argv, char **envp)
>>     qemu_chr_cleanup();
>>     user_creatable_cleanup();
>>     /* TODO: unref root container, check all devices are ok */
>> -
>> -    return 0;
>> }
>> -- 
>> 2.23.0
>>
>>


-- 
===
I recently changed my last name from Oleinik to Bulekov
===


  reply	other threads:[~2019-11-12 16:48 UTC|newest]

Thread overview: 57+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-10-30 14:49 [PATCH v4 00/20] Add virtual device fuzzing support Oleinik, Alexander
2019-10-30 14:49 ` [PATCH v4 01/20] softmmu: split off vl.c:main() into main.c Oleinik, Alexander
2019-11-05 16:41   ` Darren Kenny
2019-11-12 16:46     ` Alexander Bulekov [this message]
2019-11-06 15:01   ` Stefan Hajnoczi
2019-10-30 14:49 ` [PATCH v4 02/20] libqos: Rename i2c_send and i2c_recv Oleinik, Alexander
2019-11-06 15:17   ` Stefan Hajnoczi
2019-10-30 14:49 ` [PATCH v4 03/20] fuzz: Add FUZZ_TARGET module type Oleinik, Alexander
2019-11-06 13:17   ` Darren Kenny
2019-11-06 15:18   ` Stefan Hajnoczi
2019-10-30 14:49 ` [PATCH v4 04/20] qtest: add qtest_server_send abstraction Oleinik, Alexander
2019-11-06 13:29   ` Darren Kenny
2019-11-06 15:19   ` Stefan Hajnoczi
2019-10-30 14:49 ` [PATCH v4 06/20] module: check module wasn't already initialized Oleinik, Alexander
2019-11-06 15:26   ` Stefan Hajnoczi
2019-11-06 17:40   ` Darren Kenny
2019-10-30 14:49 ` [PATCH v4 05/20] libqtest: Add a layer of abstraciton to send/recv Oleinik, Alexander
2019-11-06 16:22   ` Stefan Hajnoczi
2019-10-30 14:49 ` [PATCH v4 07/20] qtest: add in-process incoming command handler Oleinik, Alexander
2019-11-06 16:33   ` Stefan Hajnoczi
2019-10-30 14:49 ` [PATCH v4 08/20] tests: provide test variables to other targets Oleinik, Alexander
2019-11-07 14:32   ` Darren Kenny
2019-10-30 14:49 ` [PATCH v4 09/20] libqos: split qos-test and libqos makefile vars Oleinik, Alexander
2019-11-07 14:03   ` Darren Kenny
2019-10-30 14:49 ` [PATCH v4 10/20] libqos: move useful qos-test funcs to qos_external Oleinik, Alexander
2019-11-06 16:41   ` Stefan Hajnoczi
2019-10-30 14:49 ` [PATCH v4 11/20] libqtest: make qtest_bufwrite send "atomic" Oleinik, Alexander
2019-11-06 16:44   ` Stefan Hajnoczi
2019-10-30 14:49 ` [PATCH v4 12/20] libqtest: add in-process qtest.c tx/rx handlers Oleinik, Alexander
2019-11-06 16:56   ` Stefan Hajnoczi
2019-11-12 17:38     ` Alexander Bulekov
2019-10-30 14:49 ` [PATCH v4 13/20] fuzz: add configure flag --enable-fuzzing Oleinik, Alexander
2019-11-06 16:57   ` Stefan Hajnoczi
2019-10-30 14:50 ` [PATCH v4 15/20] fuzz: add fuzzer skeleton Oleinik, Alexander
2019-11-07 12:55   ` Stefan Hajnoczi
2019-11-12 19:04     ` Alexander Bulekov
2019-10-30 14:50 ` [PATCH v4 14/20] fuzz: Add target/fuzz makefile rules Oleinik, Alexander
2019-11-07 14:31   ` Darren Kenny
2019-10-30 14:50 ` [PATCH v4 16/20] fuzz: add support for fork-based fuzzing Oleinik, Alexander
2019-11-07 13:17   ` Stefan Hajnoczi
2019-10-30 14:50 ` [PATCH v4 17/20] fuzz: add support for qos-assisted fuzz targets Oleinik, Alexander
2019-11-07 13:22   ` Stefan Hajnoczi
2019-10-30 14:50 ` [PATCH v4 18/20] fuzz: add i440fx " Oleinik, Alexander
2019-11-07 13:26   ` Stefan Hajnoczi
2019-10-30 14:50 ` [PATCH v4 19/20] fuzz: add virtio-net fuzz target Oleinik, Alexander
2019-11-07 13:36   ` Stefan Hajnoczi
2019-11-07 13:42   ` Jason Wang
2019-11-07 15:41     ` Stefan Hajnoczi
2019-10-30 14:50 ` [PATCH v4 20/20] fuzz: add documentation to docs/devel/ Oleinik, Alexander
2019-11-07 13:40   ` Stefan Hajnoczi
2019-11-07 15:02     ` Alexander Oleinik
2019-10-30 15:23 ` [PATCH v4 00/20] Add virtual device fuzzing support no-reply
2019-11-06 15:27   ` Stefan Hajnoczi
2019-11-05 13:57 ` Darren Kenny
2019-11-05 16:28   ` Alexander Oleinik
2019-11-05 16:47     ` Darren Kenny
2019-11-07 13:41 ` Stefan Hajnoczi

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=737fcde0-53bb-c0c4-452a-738a188b1c81@bu.edu \
    --to=alxndr@bu.edu \
    --cc=pbonzini@redhat.com \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.