All of lore.kernel.org
 help / color / mirror / Atom feed
From: Peter Zijlstra <peterz@infradead.org>
To: Josh Poimboeuf <jpoimboe@redhat.com>
Cc: x86@kernel.org, linux-kernel@vger.kernel.org,
	mark.rutland@arm.com, dvyukov@google.com, seanjc@google.com,
	pbonzini@redhat.com, mbenes@suse.cz
Subject: Re: [RFC][PATCH 07/22] x86,extable: Extend extable functionality
Date: Fri, 5 Nov 2021 08:54:00 +0100	[thread overview]
Message-ID: <20211105075400.GG174703@worktop.programming.kicks-ass.net> (raw)
In-Reply-To: <20211104214935.xl54xlr3snwmtyna@treble>

On Thu, Nov 04, 2021 at 02:49:35PM -0700, Josh Poimboeuf wrote:
> On Thu, Nov 04, 2021 at 05:47:36PM +0100, Peter Zijlstra wrote:
> > +asm(
> > +"	.macro extable_type_reg type:req reg:req\n"
> > +"	.set regnr, 0\n"
> > +"	.irp rs,rax,rcx,rdx,rbx,rsp,rbp,rsi,rdi,r8,r9,r10,r11,r12,r13,r14,r15\n"
> > +"	.ifc \\reg, %\\rs\n"
> > +"	.long \\type + (regnr << 8)\n"
> > +"	.endif\n"
> > +"	.set regnr, regnr+1\n"
> > +"	.endr\n"
> > +"	.set regnr, 0\n"
> > +"	.irp rs,eax,ecx,edx,ebx,esp,ebp,esi,edi,r8d,r9d,r10d,r11d,r12d,r13d,r14d,r15d\n"
> > +"	.ifc \\reg, %\\rs\n"
> > +"	.long \\type + (regnr << 8)\n"
> > +"	.endif\n"
> > +"	.set regnr, regnr+1\n"
> > +"	.endr\n"
> > +"	.endm\n"
> > +);
> 
> How about some error checking to detect a typo, or a forgotten '%':
> 
> diff --git a/arch/x86/include/asm/asm.h b/arch/x86/include/asm/asm.h
> index 5d0ff8c60983..95bb23082b87 100644
> --- a/arch/x86/include/asm/asm.h
> +++ b/arch/x86/include/asm/asm.h
> @@ -154,9 +154,11 @@
>  
>  asm(
>  "	.macro extable_type_reg type:req reg:req\n"
> +"	.set found, 0\n"
>  "	.set regnr, 0\n"
>  "	.irp rs,rax,rcx,rdx,rbx,rsp,rbp,rsi,rdi,r8,r9,r10,r11,r12,r13,r14,r15\n"
>  "	.ifc \\reg, %\\rs\n"
> +"	.set found, found+1\n"
>  "	.long \\type + (regnr << 8)\n"
>  "	.endif\n"
>  "	.set regnr, regnr+1\n"
> @@ -164,10 +166,14 @@ asm(
>  "	.set regnr, 0\n"
>  "	.irp rs,eax,ecx,edx,ebx,esp,ebp,esi,edi,r8d,r9d,r10d,r11d,r12d,r13d,r14d,r15d\n"
>  "	.ifc \\reg, %\\rs\n"
> +"	.set found, found+1\n"
>  "	.long \\type + (regnr << 8)\n"
>  "	.endif\n"
>  "	.set regnr, regnr+1\n"
>  "	.endr\n"
> +"	.if (found != 1)\n"
> +"	.error \"extable_type_reg: bad register argument\"\n"
> +"	.endif\n"
>  "	.endm\n"
>  );

Ooh, nice! I'd actually triggered that once. At the time it was objtool
complaining .extable size wasn't a multiple of 12. Took me a while to
figure out which one had gone missing.

> > +#define EX_FLAG_CLR_AX			EX_TYPE_FLAG(1)
> > +#define EX_FLAG_CLR_DX			EX_TYPE_FLAG(2)
> > +#define EX_FLAG_CLR_AX_DX		EX_TYPE_FLAG(3)
> 
> I'd like to buy two vowels: CL̲E̲AR

Yes, can do. The macro name was longer earlier on, but in this form we
can add the two characters.

> (I hope that Wheel of Fortune reference isn't too US-centric.)

Sadly not, TV was infested with crap like that here in .nl as well.

> > +static inline unsigned long *pt_regs_nr(struct pt_regs *regs, int nr)
> > +{
> > +	/* because having pt_regs in machine order was too much to ask */
> > +	switch (nr) {
> > +	case 0:		return &regs->ax;
> > +	case 1:		return &regs->cx;
> > +	case 2:		return &regs->dx;
> > +	case 3:		return &regs->bx;
> > +	case 4:		return &regs->sp;
> > +	case 5:		return &regs->bp;
> > +	case 6:		return &regs->si;
> > +	case 7:		return &regs->di;
> > +#ifdef CONFIG_X86_64
> > +	case 8:		return &regs->r8;
> > +	case 9:		return &regs->r9;
> > +	case 10:	return &regs->r10;
> > +	case 11:	return &regs->r11;
> > +	case 12:	return &regs->r12;
> > +	case 13:	return &regs->r13;
> > +	case 14:	return &regs->r14;
> > +	case 15:	return &regs->r15;
> > +#endif
> > +	default:	return NULL;
> > +	}
> > +}
> 
> Instead of all this craziness, why not just admit defeat and put them in
> pt_regs order in the 'extable_type_reg' macro?

That makes the macro different between 32bit and 64bit :/ Also, I just
found another, extant, copy of this function, so I can get rid of it and
use that one, see get_reg_offset() in insn-eval.c

> > +static bool ex_handler_imm_reg(const struct exception_table_entry *fixup,
> > +			       struct pt_regs *regs, int reg, int imm)
> > +{
> > +	*pt_regs_nr(regs, reg) = (long)imm;
> > +	return ex_handler_default(fixup, regs);
> > +}
> > +
> > +#define EX_TYPE_MASK	0x000000FF
> > +#define EX_REG_MASK	0x00000F00
> > +#define EX_FLAG_MASK	0x0000F000
> > +#define EX_IMM_MASK	0xFFFF0000
> 
> To avoid mismatches these should probably be in the header file next to
> EX_TYPE_*_SHIFT?

Can do.

> > +
> >  int ex_get_fixup_type(unsigned long ip)
> >  {
> >  	const struct exception_table_entry *e = search_exception_tables(ip);
> >  
> > -	return e ? e->type : EX_TYPE_NONE;
> > +	return e ? FIELD_GET(EX_TYPE_MASK, e->type) : EX_TYPE_NONE;
> 
> Maybe the 'type' field should be renamed, to better represent its new
> use, and to try to discourage direct access.  Not that I have any good
> ideas.  Some not-so-good ideas: "handler", "flags", "_type".

How about the non-descript: "data" ?

  reply	other threads:[~2021-11-05  7:54 UTC|newest]

Thread overview: 59+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-11-04 16:47 [RFC][PATCH 00/22] x86: Remove anonymous out-of-line fixups Peter Zijlstra
2021-11-04 16:47 ` [RFC][PATCH 01/22] bitfield.h: Fix "type of reg too small for mask" test Peter Zijlstra
2021-11-04 16:47 ` [RFC][PATCH 02/22] x86,mmx_32: Remove .fixup usage Peter Zijlstra
2021-11-04 18:00   ` Borislav Petkov
2021-11-05 11:20     ` David Laight
2021-11-04 20:22   ` Josh Poimboeuf
2021-11-05  8:05     ` Peter Zijlstra
2021-11-04 16:47 ` [RFC][PATCH 03/22] x86,copy_user_64: " Peter Zijlstra
2021-11-04 16:47 ` [RFC][PATCH 04/22] x86,copy_mc_64: " Peter Zijlstra
2021-11-04 16:47 ` [RFC][PATCH 05/22] x86,entry_64: " Peter Zijlstra
2021-11-04 16:47 ` [RFC][PATCH 06/22] x86,entry_32: " Peter Zijlstra
2021-11-04 20:39   ` Josh Poimboeuf
2021-11-05  7:43     ` Peter Zijlstra
2021-11-04 16:47 ` [RFC][PATCH 07/22] x86,extable: Extend extable functionality Peter Zijlstra
2021-11-04 21:49   ` Josh Poimboeuf
2021-11-05  7:54     ` Peter Zijlstra [this message]
2021-11-05 10:16       ` Mark Rutland
2021-11-05 17:32   ` Sean Christopherson
2021-11-05 18:45     ` Peter Zijlstra
2021-11-05 19:17       ` Sean Christopherson
2021-11-05 19:32         ` Peter Zijlstra
2021-11-05 19:47           ` Sean Christopherson
2021-11-05 20:15             ` Peter Zijlstra
2021-11-05 20:26               ` Peter Zijlstra
2021-11-05 22:30                 ` Sean Christopherson
2021-11-04 16:47 ` [RFC][PATCH 08/22] x86,msr: Remove .fixup usage Peter Zijlstra
2021-11-04 16:47 ` [RFC][PATCH 09/22] x86,futex: " Peter Zijlstra
2021-11-04 16:47 ` [RFC][PATCH 10/22] x86,uaccess: " Peter Zijlstra
2021-11-04 22:28   ` Josh Poimboeuf
2021-11-04 16:47 ` [RFC][PATCH 11/22] x86,xen: " Peter Zijlstra
2021-11-04 22:31   ` Josh Poimboeuf
2021-11-05  7:56     ` Peter Zijlstra
2021-11-04 16:47 ` [RFC][PATCH 12/22] x86,fpu: " Peter Zijlstra
2021-11-04 16:47 ` [RFC][PATCH 13/22] x86,segment: " Peter Zijlstra
2021-11-04 16:47 ` [RFC][PATCH 14/22] x86,ftrace: " Peter Zijlstra
2021-11-04 22:35   ` Josh Poimboeuf
2021-11-05  7:57     ` Peter Zijlstra
2021-11-04 16:47 ` [RFC][PATCH 15/22] x86,vmx: " Peter Zijlstra
2021-11-04 18:50   ` Paolo Bonzini
2021-11-05 18:17   ` Sean Christopherson
2021-11-05 18:52     ` Peter Zijlstra
2021-11-05 20:58     ` Peter Zijlstra
2021-11-05 22:29       ` Sean Christopherson
2021-11-06  7:05     ` Paolo Bonzini
2021-11-06  8:36       ` Peter Zijlstra
2021-11-07 19:13         ` Paolo Bonzini
2021-11-06  8:28     ` Peter Zijlstra
2021-11-04 16:47 ` [RFC][PATCH 16/22] x86,checksum_32: " Peter Zijlstra
2021-11-04 16:47 ` [RFC][PATCH 17/22] x86,sgx: " Peter Zijlstra
2021-11-04 16:47 ` [RFC][PATCH 18/22] x86,kvm: " Peter Zijlstra
2021-11-04 18:50   ` Paolo Bonzini
2021-11-05  7:58     ` Peter Zijlstra
2021-11-04 16:47 ` [RFC][PATCH 19/22] x86,usercopy_32: Simplify Peter Zijlstra
2021-11-04 16:47 ` [RFC][PATCH 20/22] x86,usercopy: Remove .fixup usage Peter Zijlstra
2021-11-04 16:47 ` [RFC][PATCH 21/22] x86,word-at-a-time: " Peter Zijlstra
2021-11-04 23:33   ` Josh Poimboeuf
2021-11-05  8:04     ` Peter Zijlstra
2021-11-04 16:47 ` [RFC][PATCH 22/22] x86: Remove .fixup section Peter Zijlstra
2021-11-04 23:00   ` Josh Poimboeuf

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=20211105075400.GG174703@worktop.programming.kicks-ass.net \
    --to=peterz@infradead.org \
    --cc=dvyukov@google.com \
    --cc=jpoimboe@redhat.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mark.rutland@arm.com \
    --cc=mbenes@suse.cz \
    --cc=pbonzini@redhat.com \
    --cc=seanjc@google.com \
    --cc=x86@kernel.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.