qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] Re: [RFC][PATCH 1/2] machine-specific command line swit


From: Glauber Costa
Subject: Re: [Qemu-devel] Re: [RFC][PATCH 1/2] machine-specific command line switches
Date: Mon, 19 May 2008 11:02:35 -0300

On Mon, May 19, 2008 at 10:53 AM, Jan Kiszka <address@hidden> wrote:
> Glauber Costa wrote:
>> On Sat, May 17, 2008 at 10:34 AM, Jan Kiszka <address@hidden> wrote:
>>> For a different project, I once wrote a patch to organize purely
>>> machine-specific command line switches under the hood of the respective
>>> machine implementations. Now the MusicPal has precisely that need as
>>> well. So I reanimated the patch, and here we go:
>>>
>>> The idea is to add two fields to QEMUMachine and process them:
>>>  o options_help - a string that is inserted under a separate section of
>>>   the "qemu -h" output.
>>>  o parse_option - a callback invoked if a given option was not handled
>>>   by the generic code. It returns -1 if the option is unkown, 0 if it
>>>   is know but comes without an argument, and 1 when the argument was
>>>   consumed.
>>
>> This would be quite useful for QEMUAccel too.
>>
>> So...
>>
>>> +typedef int QEMUMachineParseOption(const char *optname, const char 
>>> *optarg);
>>> +
>>>  typedef struct QEMUMachine {
>>>     const char *name;
>>>     const char *desc;
>>>     QEMUMachineInitFunc *init;
>>>  #define RAMSIZE_FIXED  (1 << 0)
>>>     ram_addr_t ram_require;
>>> +    const char *options_help;
>>> +    QEMUMachineParseOption *parse_option;
>>>     struct QEMUMachine *next;
>>>  } QEMUMachine;
>>
>> Why don't turn the naming into a more generic one? Maybe QEMUOpts, or
>> smth like this.
>>
>>> Index: b/vl.c
>>> ===================================================================
>>> --- a/vl.c
>>> +++ b/vl.c
>>> @@ -7141,6 +7141,8 @@ static int main_loop(void)
>>>
>>>  static void help(int exitcode)
>>>  {
>>> +    QEMUMachine *m;
>>> +
>>>     printf("QEMU PC emulator version " QEMU_VERSION ", Copyright (c) 
>>> 2003-2008 Fabrice Bellard\n"
>>>            "usage: %s [options] [disk_image]\n"
>>>            "\n"
>>> @@ -7275,14 +7277,7 @@ static void help(int exitcode)
>>>            "-clock          force the use of the given methods for timer 
>>> alarm.\n"
>>>            "                To see what timers are available use -clock ?\n"
>>>            "-startdate      select initial date of the clock\n"
>>> -           "\n"
>>> -           "During emulation, the following keys are useful:\n"
>>> -           "ctrl-alt-f      toggle full screen\n"
>>> -           "ctrl-alt-n      switch to virtual console 'n'\n"
>>> -           "ctrl-alt        toggle mouse and keyboard grab\n"
>>> -           "\n"
>>> -           "When using -nographic, press 'ctrl-a h' to get some help.\n"
>>> -           ,
>>> +           "\n",
>>>            "qemu",
>>>            DEFAULT_RAM_SIZE,
>>>  #ifndef _WIN32
>>> @@ -7291,6 +7286,17 @@ static void help(int exitcode)
>>>  #endif
>>>            DEFAULT_GDBSTUB_PORT,
>>>            "/tmp/qemu.log");
>>> +    for (m = first_machine; m != NULL; m = m->next) {
>>> +        if (m->options_help)
>>> +            printf("Options specific to %s machine:\n%s\n",
>>> +                   m->name, m->options_help);
>>> +    }
>> So, If I understand correctly what you mean here, This will print out
>> specific options for every registered machine, right?
>
> Right.
>
>> It does not sound correct, since we won't have support for more than
>> one in the same binary anyway. It looks correct, tough, if we think
>
> I was thinking of such examples:
>
> $ arm-softmmu/qemu-system-arm -M ?
> Supported machines are:
> integratorcp ARM Integrator/CP (ARM926EJ-S) (default)
> versatilepb ARM Versatile/PB (ARM926EJ-S)
> versatileab ARM Versatile/AB (ARM926EJ-S)
> realview   ARM RealView Emulation Baseboard (ARM926EJ-S)
> akita      Akita PDA (PXA270)
> spitz      Spitz PDA (PXA270)
> borzoi     Borzoi PDA (PXA270)
> terrier    Terrier PDA (PXA270)
> cheetah    Palm Tungsten|E aka. Cheetah PDA (OMAP310)
> n800       Nokia N800 tablet aka. RX-34 (OMAP2420)
> n810       Nokia N810 tablet aka. RX-44 (OMAP2420)
> lm3s811evb Stellaris LM3S811EVB
> lm3s6965evb Stellaris LM3S6965EVB
> connex     Gumstix Connex (PXA255)
> verdex     Gumstix Verdex (PXA270)
> mainstone  Mainstone II (PXA27x)
> musicpal   Marvell 88w8618 / MusicPal (ARM926EJ-S)
>
> And only the latter one needs a special switch here. Thus the user
> should know that this switch is not interpreted if some other machine is
> picked.

Now, with the examples it becomes clear. I was messing "machines" and
"architectures" in my head.

>> that we're not representing 'machines', but anything dumping specific
>> options here. But in this case, wouldn't it be better to leave the
>> whole help string
>> to the user of the interface, instead of just using m->name and m->help?
>
> Nevertheless, I do agree that a non-machine oriented abstraction would
> be even nicer in order to organize all those specific options without
> the help of increasing #ifdef'ery. However, yet no smart idea came to my
> mind to handle all cases (per-arch, per-machine, per-accelerator,
> per-whatever - and all this combined).
>

I think that your patch as-is comes very close to this. Just the
naming and a few details need to be changed to make it a generic
interface
for everyone wanting to put specific options in.

>>> +
>>> +            result = -1;
>>> +            for (m = first_machine; m != NULL; m = m->next) {
>>> +                if (m->parse_option) {
>> I don't like this very much. There's no point in having specific
>> options without this parse_option anyway. So it would be better to
>> check for it before displaying the options at all, and simplify the
>> code here.
>
> Don't understand your concern yet. If machine provides options_help, it
> is supposed to provide parse_options and vice versa. Thus you don't dump
> help about non-existent services - unless someone messes up the machine
> definition.

Precisely. Since it is supposed to always happen together, we should
check for them together.
It could look like:

+    for (m = first_machine; m != NULL; m = m->next) {
+        if (m->options_help) && (m->parse_options)
+            printf("Options specific to %s machine:\n%s\n",
+                   m->name, m->options_help);
+    }

in the piece of code above, and so we can simplify it a  little at this point.

>
> OK, let's try again and do some brainstorming about more flexible option
> handling. My initial idea was machine focused (both for the MusicPal and
> here @work), thus I stuffed the information into the machine descriptor.
> However, my scenario would be fine as well when the machines register
> some additional options (in what ever form). The same could be done by
> arch-common initialization functions for per-arch options or by an
> accelerator initializer for its special switches. Sounds feasible?
a lot.



-- 
Glauber Costa.
"Free as in Freedom"
http://glommer.net

"The less confident you are, the more serious you have to act."




reply via email to

[Prev in Thread] Current Thread [Next in Thread]