All of lore.kernel.org
 help / color / mirror / Atom feed
From: Daniel Kiper <daniel.kiper@oracle.com>
To: Jan Beulich <JBeulich@suse.com>
Cc: Juergen Gross <JGross@suse.com>,
	grub-devel@gnu.org, wei.liu2@citrix.com, ian.campbell@citrix.com,
	stefano.stabellini@eu.citrix.com, andrew.cooper3@citrix.com,
	roy.franz@linaro.org, ning.sun@intel.com,
	david.vrabel@citrix.com, phcoder@gmail.com,
	xen-devel@lists.xenproject.org, qiaowei.ren@intel.com,
	keir@xen.org, richard.l.maliszewski@intel.com,
	gang.wei@intel.com, fu.wei@linaro.org
Subject: Re: [PATCH v2 21/23] x86/boot: implement early command line parser in C
Date: Tue, 22 Sep 2015 19:03:32 +0200	[thread overview]
Message-ID: <20150922170332.GH3501__37743.1945097216$1442941543$gmane$org@olila.local.net-space.pl> (raw)
In-Reply-To: <55DF221B020000780009D6C6@prv-mh.provo.novell.com>

On Thu, Aug 27, 2015 at 06:43:39AM -0600, Jan Beulich wrote:
> >>> On 20.07.15 at 16:29, <daniel.kiper@oracle.com> wrote:
> > Current early command line parser implementation in assembler
> > is very difficult to change to relocatable stuff using segment
> > registers. This requires a lot of changes in very weird and
> > fragile code. So, reimplement this functionality in C. This
> > way code will be relocatable out of the box and much easier
> > to maintain.
>
> All appreciated and nice, but the goal of making the code
> relocatable by playing with segment registers sounds fragile:
> This breaks assumptions the compiler may validly make.

Well, it looks that this sentence is not precise. I should fix this.
Anyway, I am not playing with segment registers in C code because
it is not needed and as you pointed out it is dangerous.

> >  xen/arch/x86/boot/cmdline.S    |  367 -------------------------------------
> >  xen/arch/x86/boot/cmdline.c    |  396 ++++++++++++++++++++++++++++++++++++++++
>
> A fundamental expectation I would have had is for the C file to be
> noticeably smaller than the assembly file.
>
> > --- /dev/null
> > +++ b/xen/arch/x86/boot/cmdline.c
> >[...]
> > +#define VESA_WIDTH	0
> > +#define VESA_HEIGHT	1
> > +#define VESA_DEPTH	2
> > +
> > +#define VESA_SIZE	3
>
> These should go away in favor of using individual (sub)structure fields.
>
> > +#define __cdecl		__attribute__((__cdecl__))
>
> ???

Please look below.

> > +#define __packed	__attribute__((__packed__))
> > +#define __text		__attribute__((__section__(".text")))
> > +#define __used		__attribute__((__used__))
>
> Likely better to include compiler.h instead.

As I know you do not like to include such headers in early C files
because it makes code fragile and it looks strange. I agree with you
to some extent. So, I decided to define needed constants ourselves.
Whatever we do we should be consistent. Hence, if we include compiler.h
here we should do the same in reloc.c too if it is required.

> > +#define max(x,y) ({ \
> > +        const typeof(x) _x = (x);       \
> > +        const typeof(y) _y = (y);       \
> > +        (void) (&_x == &_y);            \
> > +        _x > _y ? _x : _y; })
>
> I also wonder whether -imacros .../xen/kernel.h wouldn't be a better
> approach here. Please really think hard on how to avoid duplications
> like these.

Ditto. So, what is your decision? Include or define? If include then
we should think how to generate relevant dependencies automatically.

> > +#define strlen_static(s) (sizeof(s) - 1)
>
> What is this good for? A decent compiler should be able to deal with
> strlen("..."). Plus your macro is longer that what it tries to "abbreviate".

I thought that it is true but it is not. Sadly, without this binary is bigger... :-(((
However, you are right that the name could be better.

> > +static const char empty_chars[] __text = " \n\r\t";
>
> What is empty about them? DYM blank or (white) space or separator
> or delimiter? I also wonder whether \n and \r are actually usefully here,

Yep, delimiter or something like that looks better.

> as they should (if at all) only end the line.

Yes, I included them just in case and they should not appear in command line.

> > +static const char *find_opt(const char *cmdline, const char *opt, int arg)
> > +{
> > +    size_t lc, lo;
> > +    static const char mm[] __text = "--";
>
> I'd be surprised if there weren't compiler/assembler versions
> complaining about a section type conflict here. I can see why you
> want everything in one section, but I'd rather suggest achieving
> this at the linking step (which I would suppose to already be taking
> care of this).

Nope, it does not work in that way. However, I discovered that newer GCC
versions generate .rodata for switch/case. So, anyway we must cope with
at least two different sections and link them properly.

> > +static u8 skip_realmode(const char *cmdline)
> > +{
> > +    static const char nrm[] __text = "no-real-mode";
> > +    static const char tboot[] __text = "tboot=";
> > +
> > +    if ( find_opt(cmdline, nrm, 0) || find_opt(cmdline, tboot, 1) )
> > +        return 1;
> > +
> > +    return 0;
>
> return find_opt(cmdline, nrm, 0) || find_opt(cmdline, tboot, 1);
>
> > +static u8 edd_parse(const char *cmdline)
> > +{
> > +    const char *c;
> > +    size_t la;
> > +    static const char edd[] __text = "edd=";
> > +    static const char edd_off[] __text = "off";
> > +    static const char edd_skipmbr[] __text = "skipmbr";
> > +
> > +    c = find_opt(cmdline, edd, 1);
> > +
> > +    if ( !c )
> > +        return 0;
> > +
> > +    c += strlen_static(edd);
> > +    la = strcspn(c, empty_chars);
> > +
> > +    if ( !strncmp(c, edd_off, max(la, strlen_static(edd_off))) )
> > +        return 2;
> > +    else if ( !strncmp(c, edd_skipmbr, max(la, strlen_static(edd_skipmbr))) )
>
> Pointless else.
>
> > +        return 1;
> > +
> > +    return 0;
>
> And the last two returns can be folded again anyway.
>
> > +static void __cdecl __used cmdline_parse_early(const char *cmdline, early_boot_opts_t *ebo)
>
> I don't see the point of the __cdecl, and (as said before) dislike the
> static __used pair.

Are you sure that without __cdecl compiler will not try to optimize
cmdline_parse_early() call and try to pass arguments using registers
or anything else not conforming to cdecl calling convention? Right
now I am not sure about that. However, I suppose that if we remove
static then there is a chance that function will be always called
according to cdecl (I must check this). Anyway, I think that we
should retain (even add in case of reloc.c:reloc(), others?) __cdecl
before 32-bit functions which are called from assembly. Just in case.

Daniel

  reply	other threads:[~2015-09-22 17:04 UTC|newest]

Thread overview: 204+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-07-20 14:28 [PATCH v2 00/23] x86: multiboot2 protocol support Daniel Kiper
2015-07-20 14:28 ` [PATCH v2 01/23] x86/boot: remove unneeded instruction Daniel Kiper
2015-07-24 16:22   ` Konrad Rzeszutek Wilk
2015-07-24 16:22   ` Konrad Rzeszutek Wilk
2015-07-27 19:46     ` Daniel Kiper
2015-08-10 16:07       ` Konrad Rzeszutek Wilk
2015-08-10 16:07       ` Konrad Rzeszutek Wilk
2015-07-27 19:46     ` Daniel Kiper
2015-07-20 14:28 ` Daniel Kiper
2015-07-20 14:28 ` [PATCH v2 02/23] x86/boot: copy only text section from *.lnk file to *.bin file Daniel Kiper
2015-07-20 14:28 ` Daniel Kiper
2015-07-21  9:35   ` Jan Beulich
2015-07-21 17:23     ` Daniel Kiper
2015-07-22  5:14       ` Jan Beulich
2015-07-22  8:02       ` Jan Beulich
2015-07-22 13:31         ` Daniel Kiper
2015-07-22 14:07           ` Jan Beulich
2015-07-20 14:28 ` [PATCH v2 03/23] x86: zero BSS using stosl instead of stosb Daniel Kiper
2015-07-20 14:28 ` Daniel Kiper
2015-07-21  9:37   ` Jan Beulich
2015-07-21 18:23     ` Daniel Kiper
2015-07-22  5:18       ` Jan Beulich
2015-07-22  8:42         ` Andrew Cooper
2015-07-22 10:04           ` Jan Beulich
2015-07-22 11:22             ` Andrew Cooper
2015-07-22 11:48               ` Jan Beulich
2015-07-20 14:28 ` [PATCH v2 04/23] x86/boot: call reloc() using cdecl calling convention Daniel Kiper
2015-07-20 14:28 ` Daniel Kiper
2015-08-10 16:33   ` [Xen-devel] " Konrad Rzeszutek Wilk
2015-08-10 16:33   ` Konrad Rzeszutek Wilk
2015-08-17 15:44   ` Jan Beulich
2015-08-17 15:44   ` Jan Beulich
2015-07-20 14:29 ` [PATCH v2 05/23] x86/boot/reloc: create generic alloc and copy functions Daniel Kiper
2015-08-17 15:51   ` Jan Beulich
2015-08-17 22:03     ` Daniel Kiper
2015-08-17 15:51   ` Jan Beulich
2015-07-20 14:29 ` Daniel Kiper
2015-07-20 14:29 ` [PATCH v2 06/23] x86/boot: use %ecx instead of %eax Daniel Kiper
2015-07-20 14:29 ` Daniel Kiper
2015-08-10 16:36   ` [Xen-devel] " Konrad Rzeszutek Wilk
2015-08-10 16:36   ` Konrad Rzeszutek Wilk
2015-07-20 14:29 ` [PATCH v2 07/23] x86/boot/reloc: Rename some variables and rearrange code a bit Daniel Kiper
2015-08-10 16:40   ` Konrad Rzeszutek Wilk
2015-08-10 16:40   ` [Xen-devel] " Konrad Rzeszutek Wilk
2015-08-17 15:55   ` Jan Beulich
2015-08-17 15:55   ` Jan Beulich
2015-07-20 14:29 ` Daniel Kiper
2015-07-20 14:29 ` [PATCH v2 08/23] x86: add multiboot2 protocol support Daniel Kiper
2015-08-10 19:17   ` [Xen-devel] " Konrad Rzeszutek Wilk
2015-08-13 19:22     ` Daniel Kiper
2015-08-14 10:03       ` Jan Beulich
2015-08-15  6:00         ` Andrew Cooper
2015-08-15  6:00         ` [Xen-devel] " Andrew Cooper
2015-08-14 10:03       ` Jan Beulich
2015-08-13 19:22     ` Daniel Kiper
2015-08-10 19:17   ` Konrad Rzeszutek Wilk
2015-08-18  8:12   ` Jan Beulich
2015-08-18 12:00     ` Daniel Kiper
2015-08-18 14:20       ` Jan Beulich
2015-07-20 14:29 ` [PATCH v2 09/23] efi: create efi_enabled() Daniel Kiper
2015-08-10 19:20   ` [Xen-devel] " Konrad Rzeszutek Wilk
2015-08-10 19:20   ` Konrad Rzeszutek Wilk
2015-08-20 15:18   ` Jan Beulich
2015-08-22 12:33     ` Daniel Kiper
2015-08-22 12:33     ` Daniel Kiper
2015-08-24 11:29       ` Jan Beulich
2015-07-20 14:29 ` [PATCH v2 10/23] efi: build xen.gz with EFI code Daniel Kiper
2015-07-20 14:29 ` Daniel Kiper
2015-08-10 19:24   ` [Xen-devel] " Konrad Rzeszutek Wilk
2015-08-10 19:24   ` Konrad Rzeszutek Wilk
2015-08-20 15:39   ` Jan Beulich
2015-08-22 13:59     ` Daniel Kiper
2015-08-24 11:35       ` Jan Beulich
2015-08-24 20:54         ` Daniel Kiper
2015-08-24 20:54         ` Daniel Kiper
2015-08-25 10:50           ` Andrew Cooper
2015-08-25 15:39             ` Daniel Kiper
2015-08-25 15:39             ` Daniel Kiper
2015-08-25 10:50           ` Andrew Cooper
2015-08-25 12:09           ` Jan Beulich
2015-08-25 12:09           ` Jan Beulich
2015-08-25 16:31             ` Daniel Kiper
2015-08-26  6:46               ` Jan Beulich
2015-08-26 12:33                 ` Daniel Kiper
2015-08-26 12:40                   ` Jan Beulich
2015-08-26 12:58                     ` Daniel Kiper
2015-08-26 12:58                     ` Daniel Kiper
2015-08-26 12:40                   ` Jan Beulich
2015-08-26 12:33                 ` Daniel Kiper
2015-08-26  6:46               ` Jan Beulich
2015-08-25 16:31             ` Daniel Kiper
2015-08-22 13:59     ` Daniel Kiper
2015-07-20 14:29 ` [PATCH v2 11/23] efi: split out efi_init() Daniel Kiper
2015-08-10 19:25   ` Konrad Rzeszutek Wilk
2015-08-10 19:25   ` [Xen-devel] " Konrad Rzeszutek Wilk
2015-07-20 14:29 ` [PATCH v2 12/23] efi: split out efi_console_set_mode() Daniel Kiper
2015-07-20 14:29 ` Daniel Kiper
2015-08-10 19:25   ` [Xen-devel] " Konrad Rzeszutek Wilk
2015-08-10 19:25   ` Konrad Rzeszutek Wilk
2015-07-20 14:29 ` [PATCH v2 13/23] efi: split out efi_get_gop() Daniel Kiper
2015-07-20 14:29 ` Daniel Kiper
2015-08-10 19:27   ` Konrad Rzeszutek Wilk
2015-08-10 19:27   ` [Xen-devel] " Konrad Rzeszutek Wilk
2015-07-20 14:29 ` [PATCH v2 14/23] efi: split out efi_find_gop_mode() Daniel Kiper
2015-08-10 19:31   ` [Xen-devel] " Konrad Rzeszutek Wilk
2015-08-10 19:31   ` Konrad Rzeszutek Wilk
2015-08-20 15:48   ` Jan Beulich
2015-07-20 14:29 ` [PATCH v2 15/23] efi: split out efi_tables() Daniel Kiper
2015-08-10 19:32   ` [Xen-devel] " Konrad Rzeszutek Wilk
2015-08-10 19:32   ` Konrad Rzeszutek Wilk
2015-07-20 14:29 ` [PATCH v2 16/23] efi: split out efi_variables() Daniel Kiper
2015-08-10 19:34   ` Konrad Rzeszutek Wilk
2015-08-10 19:34   ` [Xen-devel] " Konrad Rzeszutek Wilk
2015-07-20 14:29 ` [PATCH v2 17/23] efi: split out efi_set_gop_mode() Daniel Kiper
2015-08-10 19:34   ` [Xen-devel] " Konrad Rzeszutek Wilk
2015-08-10 19:34   ` Konrad Rzeszutek Wilk
2015-07-20 14:29 ` [PATCH v2 18/23] efi: split out efi_exit_boot() Daniel Kiper
2015-08-10 19:36   ` Konrad Rzeszutek Wilk
2015-08-10 19:36   ` [Xen-devel] " Konrad Rzeszutek Wilk
2015-07-20 14:29 ` Daniel Kiper
2015-07-20 14:29 ` [PATCH v2 19/23] x86/efi: create new early memory allocator Daniel Kiper
2015-08-10 19:49   ` [Xen-devel] " Konrad Rzeszutek Wilk
2015-08-10 19:49   ` Konrad Rzeszutek Wilk
2015-08-27 11:23   ` Jan Beulich
2015-08-27 11:23   ` Jan Beulich
2015-07-20 14:29 ` Daniel Kiper
2015-07-20 14:29 ` [PATCH v2 20/23] x86: add multiboot2 protocol support for EFI platforms Daniel Kiper
2015-08-10 20:07   ` Konrad Rzeszutek Wilk
2015-08-10 20:07   ` [Xen-devel] " Konrad Rzeszutek Wilk
2015-08-11 15:23   ` Konrad Rzeszutek Wilk
2015-08-11 15:23   ` Konrad Rzeszutek Wilk
2015-08-27 12:01   ` Jan Beulich
2015-09-22 15:21     ` Daniel Kiper
2015-09-22 15:58       ` Jan Beulich
2015-09-22 15:58       ` Jan Beulich
2015-08-27 12:01   ` Jan Beulich
2015-07-20 14:29 ` [PATCH v2 21/23] x86/boot: implement early command line parser in C Daniel Kiper
2015-07-20 14:29 ` Daniel Kiper
2015-08-10 20:31   ` Konrad Rzeszutek Wilk
2015-08-10 20:31   ` [Xen-devel] " Konrad Rzeszutek Wilk
2015-08-11 14:43   ` Konrad Rzeszutek Wilk
2015-08-11 14:43   ` [Xen-devel] " Konrad Rzeszutek Wilk
2015-08-27 12:43   ` Jan Beulich
2015-08-27 12:43   ` Jan Beulich
2015-09-22 17:03     ` Daniel Kiper [this message]
2015-09-22 17:03     ` Daniel Kiper
2015-09-23  7:25       ` Jan Beulich
2015-09-23  7:25       ` Jan Beulich
2015-07-20 14:29 ` [PATCH v2 22/23] x86: make Xen early boot code relocatable Daniel Kiper
2015-08-11 16:48   ` [Xen-devel] " Konrad Rzeszutek Wilk
2015-08-14 11:52     ` Daniel Kiper
2015-08-14 11:52     ` [Xen-devel] " Daniel Kiper
2015-08-14 12:49       ` Jan Beulich
2015-08-14 12:49       ` [Xen-devel] " Jan Beulich
2015-08-14 13:59         ` Daniel Kiper
2015-08-14 14:32           ` Jan Beulich
2015-08-14 14:37             ` Daniel Kiper
2015-08-14 14:37             ` [Xen-devel] " Daniel Kiper
2015-08-14 15:12               ` Jan Beulich
2015-08-14 15:12                 ` [Xen-devel] " Jan Beulich
2015-08-14 14:32           ` Jan Beulich
2015-08-14 13:59         ` Daniel Kiper
2015-08-14 15:20       ` Konrad Rzeszutek Wilk
2015-08-14 15:20       ` [Xen-devel] " Konrad Rzeszutek Wilk
2015-08-11 16:48   ` Konrad Rzeszutek Wilk
2015-08-27 13:12   ` Jan Beulich
2015-08-27 15:10     ` Daniel Kiper
2015-08-27 15:10     ` Daniel Kiper
2015-08-27 15:29       ` Jan Beulich
2015-08-27 17:56         ` Ben Hildred
2015-08-28  8:22           ` Jan Beulich
2015-08-28  8:22           ` [Xen-devel] " Jan Beulich
2015-08-28 13:42             ` Konrad Rzeszutek Wilk
2015-08-28 14:16               ` Jan Beulich
2015-08-28 14:16                 ` [Xen-devel] " Jan Beulich
2015-08-31 19:49                 ` Daniel Kiper
2015-08-31 19:49                 ` [Xen-devel] " Daniel Kiper
2015-09-01  6:59                   ` Jan Beulich
2015-09-01  6:59                   ` Jan Beulich
2015-08-28 13:42             ` Konrad Rzeszutek Wilk
2015-08-27 17:56         ` Ben Hildred
2015-08-27 18:04         ` Andrew Cooper
2015-08-28  6:54           ` Jan Beulich
2015-08-28 11:59             ` Andrew Cooper
2015-08-28 11:59             ` Andrew Cooper
2015-08-28  6:54           ` Jan Beulich
2015-08-27 18:04         ` Andrew Cooper
2015-08-28 14:24         ` [Xen-devel] " Jan Beulich
2015-08-28 14:24         ` Jan Beulich
2015-08-27 15:29       ` Jan Beulich
2015-08-27 13:12   ` Jan Beulich
2015-07-20 14:29 ` Daniel Kiper
2015-07-20 14:29 ` [PATCH v2 23/23] x86: add multiboot2 protocol support for relocatable images Daniel Kiper
2015-08-11 16:56   ` Konrad Rzeszutek Wilk
2015-08-14 11:57     ` Daniel Kiper
2015-08-14 13:43       ` Konrad Rzeszutek Wilk
2015-08-14 13:43       ` Konrad Rzeszutek Wilk
2015-08-14 11:57     ` Daniel Kiper
2015-08-11 16:56   ` Konrad Rzeszutek Wilk
2015-07-21  9:39 ` [PATCH v2 00/23] x86: multiboot2 protocol support Jan Beulich
2015-07-21  9:39 ` Jan Beulich
2015-08-16 13:48 [PATCH v2 21/23] x86/boot: implement early command line parser in C George Diamantopoulos
2015-08-16 17:22 ` Konrad Rzeszutek Wilk
2015-08-17 20:37   ` Daniel Kiper

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='20150922170332.GH3501__37743.1945097216$1442941543$gmane$org@olila.local.net-space.pl' \
    --to=daniel.kiper@oracle.com \
    --cc=JBeulich@suse.com \
    --cc=JGross@suse.com \
    --cc=andrew.cooper3@citrix.com \
    --cc=david.vrabel@citrix.com \
    --cc=fu.wei@linaro.org \
    --cc=gang.wei@intel.com \
    --cc=grub-devel@gnu.org \
    --cc=ian.campbell@citrix.com \
    --cc=keir@xen.org \
    --cc=ning.sun@intel.com \
    --cc=phcoder@gmail.com \
    --cc=qiaowei.ren@intel.com \
    --cc=richard.l.maliszewski@intel.com \
    --cc=roy.franz@linaro.org \
    --cc=stefano.stabellini@eu.citrix.com \
    --cc=wei.liu2@citrix.com \
    --cc=xen-devel@lists.xenproject.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.