All of lore.kernel.org
 help / color / mirror / Atom feed
From: Bill Wendling <morbo@google.com>
To: Thomas Huth <thuth@redhat.com>
Cc: kvm list <kvm@vger.kernel.org>,
	Paolo Bonzini <pbonzini@redhat.com>,
	alexandru.elisei@arm.com, Jim Mattson <jmattson@google.com>
Subject: Re: [kvm-unit-tests PATCH 1/1] x86: use pointer for end of exception table
Date: Tue, 15 Oct 2019 01:06:40 -0700	[thread overview]
Message-ID: <CAGG=3QVzF+Obz4ONuV-GPwz8v-St0VbkbDf2J9S3dS3o09pNzg@mail.gmail.com> (raw)
In-Reply-To: <6656e70c-4866-55e8-108b-9bbb2c6fd081@redhat.com>

On Tue, Oct 15, 2019 at 12:41 AM Thomas Huth <thuth@redhat.com> wrote:
>
> On 13/10/2019 09.18, Bill Wendling wrote:
> > Two global objects can't have the same address in C. Clang uses this
> > fact to omit the check on the first iteration of the loop in
> > check_exception_table.
> >
> > Signed-off-by: Bill Wendling <morbo@google.com>
> > ---
> >  lib/x86/desc.c | 4 ++--
> >  1 file changed, 2 insertions(+), 2 deletions(-)
> >
> > diff --git a/lib/x86/desc.c b/lib/x86/desc.c
> > index 451f504..cfc449f 100644
> > --- a/lib/x86/desc.c
> > +++ b/lib/x86/desc.c
> > @@ -41,7 +41,7 @@ struct ex_record {
> >      unsigned long handler;
> >  };
> >
> > -extern struct ex_record exception_table_start, exception_table_end;
> > +extern struct ex_record exception_table_start, *exception_table_end;
> >
> >  static const char* exception_mnemonic(int vector)
> >  {
> > @@ -113,7 +113,7 @@ static void check_exception_table(struct ex_regs *regs)
> >               (((regs->rflags >> 16) & 1) << 8);
> >      asm("mov %0, %%gs:4" : : "r"(ex_val));
> >
> > -    for (ex = &exception_table_start; ex != &exception_table_end; ++ex) {
> > +    for (ex = &exception_table_start; ex != (void*)&exception_table_end; ++ex) {
> >          if (ex->rip == regs->rip) {
> >              regs->rip = ex->handler;
> >              return;
> >
>
> That looks like quite an ugly hack to me - and if clang gets a little
> bit smarter, I'm pretty sure it will optimize this away, too.
>
I agree. I was thinking about this actually and this patch looks like
it'll work. I'll generate a new version of the patches.

diff --git a/lib/x86/desc.c b/lib/x86/desc.c
index 451f504..4002203 100644
--- a/lib/x86/desc.c
+++ b/lib/x86/desc.c
@@ -113,7 +113,7 @@ static void check_exception_table(struct ex_regs *regs)
                (((regs->rflags >> 16) & 1) << 8);
     asm("mov %0, %%gs:4" : : "r"(ex_val));

-    for (ex = &exception_table_start; ex != &exception_table_end; ++ex) {
+    for (ex = &exception_table_start; ex < &exception_table_end; ++ex) {
         if (ex->rip == regs->rip) {
             regs->rip = ex->handler;
             return;


> Could you please check if something like this works, too:
>
> diff --git a/lib/x86/desc.c b/lib/x86/desc.c
> index 451f504..0e9779b 100644
> --- a/lib/x86/desc.c
> +++ b/lib/x86/desc.c
> @@ -41,7 +41,8 @@ struct ex_record {
>      unsigned long handler;
>  };
>
> -extern struct ex_record exception_table_start, exception_table_end;
> +extern struct ex_record exception_table_start;
> +extern long exception_table_size;
>
>  static const char* exception_mnemonic(int vector)
>  {
> @@ -108,12 +109,13 @@ static void check_exception_table(struct ex_regs
> *regs)
>  {
>      struct ex_record *ex;
>      unsigned ex_val;
> +    int cnt = exception_table_size / sizeof(struct ex_record);
>
>      ex_val = regs->vector | (regs->error_code << 16) |
>                 (((regs->rflags >> 16) & 1) << 8);
>      asm("mov %0, %%gs:4" : : "r"(ex_val));
>
> -    for (ex = &exception_table_start; ex != &exception_table_end; ++ex) {
> +    for (ex = &exception_table_start; cnt-- > 0; ++ex) {
>          if (ex->rip == regs->rip) {
>              regs->rip = ex->handler;
>              return;
> diff --git a/x86/flat.lds b/x86/flat.lds
> index a278b56..108fad5 100644
> --- a/x86/flat.lds
> +++ b/x86/flat.lds
> @@ -9,6 +9,7 @@ SECTIONS
>            exception_table_start = .;
>            *(.data.ex)
>           exception_table_end = .;
> +          exception_table_size = exception_table_end -
> exception_table_start;
>           }
>      . = ALIGN(16);
>      .rodata : { *(.rodata) }
>
>  Thomas

  reply	other threads:[~2019-10-15  8:06 UTC|newest]

Thread overview: 15+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-10-12  7:44 [kvm-unit-tests PATCH 1/2] Use a status enum for reporting pass/fail Bill Wendling
2019-10-12  7:44 ` [kvm-unit-tests PATCH 2/2] x86: use pointer for end of exception table Bill Wendling
2019-10-13  7:18   ` [kvm-unit-tests PATCH 1/1] " Bill Wendling
2019-10-15  7:41     ` Thomas Huth
2019-10-15  8:06       ` Bill Wendling [this message]
2019-10-12  8:20 ` [kvm-unit-tests PATCH 2/2] Use a status enum for reporting pass/fail Bill Wendling
2019-10-14 16:26 ` [kvm-unit-tests PATCH 1/2] " Sean Christopherson
2019-10-14 18:23   ` Bill Wendling
2019-10-15 20:46 ` [kvm-unit-tests v2 PATCH 0/2] Clang compilation fixes Bill Wendling
2019-10-15 20:46   ` [kvm-unit-tests v2 PATCH 1/2] lib: use a status enum for reporting pass/fail Bill Wendling
2019-10-15 20:46   ` [kvm-unit-tests v2 PATCH 2/2] x86: don't compare two global objects' addrs for inequality Bill Wendling
2019-10-16  5:53     ` Thomas Huth
2019-10-21 15:33     ` Paolo Bonzini
2019-10-21 15:32 ` [kvm-unit-tests PATCH 1/2] Use a status enum for reporting pass/fail Paolo Bonzini
2019-10-29 18:51   ` Bill Wendling

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='CAGG=3QVzF+Obz4ONuV-GPwz8v-St0VbkbDf2J9S3dS3o09pNzg@mail.gmail.com' \
    --to=morbo@google.com \
    --cc=alexandru.elisei@arm.com \
    --cc=jmattson@google.com \
    --cc=kvm@vger.kernel.org \
    --cc=pbonzini@redhat.com \
    --cc=thuth@redhat.com \
    /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.