[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <90b290db-22fb-432c-aa94-73e85aee0d11@zytor.com>
Date: Sat, 17 Aug 2024 16:51:10 -0700
From: "H. Peter Anvin" <hpa@...or.com>
To: Andrew Cooper <andrew.cooper3@...rix.com>, Xin Li <xin@...or.com>,
linux-kernel@...r.kernel.org
Cc: tglx@...utronix.de, mingo@...hat.com, bp@...en8.de,
dave.hansen@...ux.intel.com, x86@...nel.org, peterz@...radead.org,
seanjc@...gle.com
Subject: Re: [PATCH v1 2/3] x86/msr: Switch between WRMSRNS and WRMSR with the
alternatives mechanism
On 8/16/24 15:59, H. Peter Anvin wrote:
>
> RDMSR is a bit trickier. I think the best option there is to set up a
> new trap fixup handler type that amounts to "get the address from
> the stack, apply a specific offset, and invoke the fixup handler for
> that address:
>
>
> case EX_TYPE_UPLEVEL: {
> /* Let reg hold the unsigned number of machine
> * words to pop off the stack before the return
> * address, and imm the signed offset from the
> * return address to the desired trap point.
> *
> * pointer in units of machine words, and imm the
> * signed offset from this stack word...
> */
> unsigned long *sp = (unsigned long *)regs->sp + reg;
> regs->ip = *sp++ + (int16_t)imm;
> regs->sp = (unsigned long)sp;
> goto again; /* Loop back to the beginning */
> }
>
> Again, "obviously correct" code attached.
>
Here is an untested patch implemented the above functionality, tidied up
and wrapped in a macro as _ASM_EXTABLE_FUNC_REWIND().
-hpa
View attachment "0001-x86-extable-implement-EX_TYPE_FUNC_REWIND.patch" of type "text/x-patch" (6901 bytes)
Powered by blists - more mailing lists