[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <7820cd89-f25a-4934-9597-d53e861d6e92@amd.com>
Date: Fri, 18 Oct 2024 10:14:04 -0500
From: Tom Lendacky <thomas.lendacky@....com>
To: Borislav Petkov <bp@...en8.de>
Cc: linux-kernel@...r.kernel.org, x86@...nel.org,
Thomas Gleixner <tglx@...utronix.de>, Ingo Molnar <mingo@...hat.com>,
Dave Hansen <dave.hansen@...ux.intel.com>,
Michael Roth <michael.roth@....com>, Ashish Kalra <ashish.kalra@....com>
Subject: Re: [PATCH v3 2/8] x86/sev: Add support for the RMPREAD instruction
On 10/18/24 07:41, Borislav Petkov wrote:
> On Mon, Sep 30, 2024 at 10:22:10AM -0500, Tom Lendacky wrote:
>> diff --git a/arch/x86/virt/svm/sev.c b/arch/x86/virt/svm/sev.c
>> index 103a2dd6e81d..73d4f422829a 100644
>> --- a/arch/x86/virt/svm/sev.c
>> +++ b/arch/x86/virt/svm/sev.c
>> @@ -301,6 +301,17 @@ static int get_rmpentry(u64 pfn, struct rmpentry *entry)
>> {
>> struct rmpentry_raw *e;
>>
>> + if (cpu_feature_enabled(X86_FEATURE_RMPREAD)) {
>> + int ret;
>> +
>> + asm volatile(".byte 0xf2, 0x0f, 0x01, 0xfd"
>> + : "=a" (ret)
>> + : "a" (pfn << PAGE_SHIFT), "c" (entry)
>> + : "memory", "cc");
>> +
>> + return ret;
>> + }
>
> I think this should be:
>
> diff --git a/arch/x86/virt/svm/sev.c b/arch/x86/virt/svm/sev.c
> index 73d9295dd013..5500c5d64cba 100644
> --- a/arch/x86/virt/svm/sev.c
> +++ b/arch/x86/virt/svm/sev.c
> @@ -303,12 +303,11 @@ static int get_rmpentry(u64 pfn, struct rmpentry *entry)
> struct rmpentry_raw *e;
>
> if (cpu_feature_enabled(X86_FEATURE_RMPREAD)) {
> - int ret;
> + int ret = pfn << PAGE_SHIFT;
>
> asm volatile(".byte 0xf2, 0x0f, 0x01, 0xfd"
> - : "=a" (ret)
> - : "a" (pfn << PAGE_SHIFT), "c" (entry)
> - : "memory", "cc");
> + : "+a" (ret), "+c" (entry)
> + :: "memory", "cc");
>
> return ret;
> }
>
> because "The RCX register provides the effective address of a 16-byte data
> structure into which the RMP state is written."
>
> So your %rcx is both an input and an output operand and you need to do the "+"
> thing here too for that.
I don't think so. RCX does not change on output, the contents that RCX
points to changes, but the register value does not so the "+" is not
correct. The instruction doesn't take a memory location as part of
operands (like a MOV instruction could), which is why the "memory" clobber
is specified.
>
> Same for %rax.
For RAX, yes, if I set "ret" to the input value then I can use "+"
specification. But the way it's coded now is also correct.
Thanks,
Tom
>
Powered by blists - more mailing lists