From: Simon Horman <horms@verge.net.au>
To: Matt Evans <matt@ozlabs.org>
Cc: Michael Neuling <mikey@neuling.org>, kexec@lists.infradead.org
Subject: Re: [PATCH v2] kexec-tools: Fix option/argument parsing
Date: Wed, 19 May 2010 09:37:16 +0900 [thread overview]
Message-ID: <20100519003716.GE8536@verge.net.au> (raw)
In-Reply-To: <4BECCE4D.2030905@ozlabs.org>
On Fri, May 14, 2010 at 02:15:09PM +1000, Matt Evans wrote:
> Hi,
>
> v2 changes:
> - Fixed ARM's multiline KEXEC_ALL_OPTIONS #define
> - Removed opterr=0 from main()'s getopts_long() scan, and handle
> unknown options in main() (as it now knows about all allowed opts).
> Previously it relied on the file_type->load()er parsing & complaining
> about unknown options; if the loader didn't parse them, no complaint.
>
> Tested on x86, ppc and compile-tested on my new crisv32-axis-linux-gnu
> crosscompiler :-)
>
>
> Cheers,
>
>
> Matt
>
>
> ---
> The argument parsing is currently a bit broken as main()'s getopt_long()
> knows nothing about either the architecture-specific options or, even
> more specifically, the architecture-and-loader-specific options.
>
> This patch introduces new #defines for all architectures,
> KEXEC_ALL_OPTIONS and KEXEC_ALL_OPT_STR. These contain all possible
> options for a given build, and the getopt_long() passes in main() and
> arch_process_options() will now recognise arch- and loader-specific
> options; these will not be re-ordered in argv[], there is no confusion
> over which argv[] entry is the kernel filename, and using '--opt=foo' and
> '--opt foo' both work.
>
> All architectures have command line options (and #define OPT_BLAHs)
> consolidated into their include/arch/option.h files. x86_64 builds
> parts of i386/ as well, so now both share a single option.h file (with
> a symlink).
>
> Signed-off-by: Matt Evans <matt@ozlabs.org>
> ---
[snip]
> diff --git a/kexec/arch/sh/include/arch/options.h b/kexec/arch/sh/include/arch/options.h
> index e02960d..4bdd6a3 100644
> --- a/kexec/arch/sh/include/arch/options.h
> +++ b/kexec/arch/sh/include/arch/options.h
> @@ -7,16 +7,36 @@
> #define OPT_NBSD_HOWTO (OPT_ARCH_MAX+3)
> #define OPT_NBSD_MROOT (OPT_ARCH_MAX+4)
>
> -
> +/* Options relevant to the architecture (excluding loader-specific ones): */
> #define KEXEC_ARCH_OPTIONS \
> KEXEC_OPTIONS \
> {"command-line", 1, 0, OPT_APPEND}, \
> {"append", 1, 0, OPT_APPEND}, \
> {"empty-zero", 1, 0, OPT_APPEND}, \
> {"howto", 1, 0, OPT_NBSD_HOWTO}, \
> - {"miniroot", 1, 0, OPT_NBSD_MROOT}, \
> -
> + {"miniroot", 1, 0, OPT_NBSD_MROOT},
> +/* These options seem to be loader-specific rather than cris-specific, so
> + * ought to be moved to KEXEC_ALL_OPTIONS below and parsed in the relevant
The line above has a trailing space.
> + * loader, e.g. kexec-netbsd-sh.c
> + */
>
> #define KEXEC_ARCH_OPT_STR KEXEC_OPT_STR ""
>
> +/* The following two #defines list ALL of the options added by all of the
> + * architecture's loaders.
> + * o main() uses this complete list to scan for its options, ignoring
> + * arch-specific/loader-specific ones.
> + * o Then, arch_process_options() uses this complete list to scan for its
> + * options, ignoring general/loader-specific ones.
> + * o Then, the file_type[n].load re-scans for options, using
> + * KEXEC_ARCH_OPTIONS plus its loader-specific options subset.
> + * Any unrecognised options cause an error here.
> + *
> + * This is done so that main()'s/arch_process_options()'s getopt_long() calls
> + * don't choose a kernel filename from random arguments to options they don't
> + * recognise -- as they now recognise (if not act upon) all possible options.
> + */
> +#define KEXEC_ALL_OPTIONS KEXEC_ARCH_OPTIONS
> +#define KEXEC_ALL_OPT_STR KEXEC_ARCH_OPT_STR
> +
> #endif /* KEXEC_ARCH_SH_OPTIONS_H */
[snip]
> diff --git a/kexec/arch/x86_64/include/arch/options.h b/kexec/arch/x86_64/include/arch/options.h
> deleted file mode 100644
> index 75065b9..0000000
> --- a/kexec/arch/x86_64/include/arch/options.h
> +++ /dev/null
> @@ -1,22 +0,0 @@
> -#ifndef KEXEC_ARCH_X86_64_OPTIONS_H
> -#define KEXEC_ARCH_X86_64_OPTIONS_H
> -
> -#define OPT_RESET_VGA (OPT_MAX+0)
> -#define OPT_SERIAL (OPT_MAX+1)
> -#define OPT_SERIAL_BAUD (OPT_MAX+2)
> -#define OPT_CONSOLE_VGA (OPT_MAX+3)
> -#define OPT_CONSOLE_SERIAL (OPT_MAX+4)
> -#define OPT_ARCH_MAX (OPT_MAX+5)
> -
> -#define KEXEC_ARCH_OPTIONS \
> - KEXEC_OPTIONS \
> - { "reset-vga", 0, 0, OPT_RESET_VGA }, \
> - { "serial", 1, 0, OPT_SERIAL }, \
> - { "serial-baud", 1, 0, OPT_SERIAL_BAUD }, \
> - { "console-vga", 0, 0, OPT_CONSOLE_VGA }, \
> - { "console-serial", 0, 0, OPT_CONSOLE_SERIAL }, \
> -
> -#define KEXEC_ARCH_OPT_STR KEXEC_OPT_STR ""
> -
> -#endif /* KEXEC_ARCH_X86_64_OPTIONS_H */
> -
> diff --git a/kexec/arch/x86_64/include/arch/options.h b/kexec/arch/x86_64/include/arch/options.h
> new file mode 120000
> index 0000000..047b0f9
> --- /dev/null
> +++ b/kexec/arch/x86_64/include/arch/options.h
> @@ -0,0 +1 @@
> +../../../i386/include/arch/options.h
> \ No newline at end of file
The fragment above seems to a) belong in the previous fragment and
b) be bogus. In any case x86_64 fails to build.
kexec/kexec.c: In function 'main':
kexec/kexec.c:1061: error: 'KEXEC_ALL_OPTIONS' undeclared (first use in this function)
...
[snip]
_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec
next prev parent reply other threads:[~2010-05-19 0:37 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-05-14 4:15 [PATCH v2] kexec-tools: Fix option/argument parsing Matt Evans
2010-05-19 0:37 ` Simon Horman [this message]
2010-05-19 2:20 ` Matt Evans
2010-05-19 2:55 ` Simon Horman
2010-05-19 3:26 ` Simon Horman
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=20100519003716.GE8536@verge.net.au \
--to=horms@verge.net.au \
--cc=kexec@lists.infradead.org \
--cc=matt@ozlabs.org \
--cc=mikey@neuling.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox