On 4/15/21 1:00 PM, Borislav Petkov wrote:
> On Wed, Mar 24, 2021 at 12:04:09PM -0500, Brijesh Singh wrote:
>> diff --git a/arch/x86/mm/mem_encrypt.c b/arch/x86/mm/mem_encrypt.c
>> index 06394b6d56b2..7a0138cb3e17 100644
>> --- a/arch/x86/mm/mem_encrypt.c
>> +++ b/arch/x86/mm/mem_encrypt.c
>> @@ -644,3 +644,44 @@ rmpentry_t *lookup_page_in_rmptable(struct page *page, 
>> int *level)
>>      return entry;
>>  }
>>  EXPORT_SYMBOL_GPL(lookup_page_in_rmptable);
>> +
>> +int rmptable_psmash(struct page *page)
> psmash() should be enough like all those other wrappers around insns.

Noted.


>
>> +{
>> +    unsigned long spa = page_to_pfn(page) << PAGE_SHIFT;
>> +    int ret;
>> +
>> +    if (!static_branch_unlikely(&snp_enable_key))
>> +            return -ENXIO;
>> +
>> +    /* Retry if another processor is modifying the RMP entry. */
> Also, a comment here should say which binutils version supports the
> insn mnemonic so that it can be converted to "psmash" later. Ditto for
> rmpupdate below.
>
> Looking at the binutils repo, it looks like since version 2.36.
>
> /me rebuilds objdump...

Sure, I will add comment.

>> +    do {
>> +            asm volatile(".byte 0xF3, 0x0F, 0x01, 0xFF"
>> +                          : "=a"(ret)
>> +                          : "a"(spa)
>> +                          : "memory", "cc");
>> +    } while (ret == PSMASH_FAIL_INUSE);
>> +
>> +    return ret;
>> +}
>> +EXPORT_SYMBOL_GPL(rmptable_psmash);
>> +
>> +int rmptable_rmpupdate(struct page *page, struct rmpupdate *val)
> rmpupdate()
>
>> +{
>> +    unsigned long spa = page_to_pfn(page) << PAGE_SHIFT;
>> +    bool flush = true;
>> +    int ret;
>> +
>> +    if (!static_branch_unlikely(&snp_enable_key))
>> +            return -ENXIO;
>> +
>> +    /* Retry if another processor is modifying the RMP entry. */
>> +    do {
>> +            asm volatile(".byte 0xF2, 0x0F, 0x01, 0xFE"
>> +                         : "=a"(ret)
>> +                         : "a"(spa), "c"((unsigned long)val), "d"(flush)
>                                           ^^^^^^^^^^^^^^^
>
> what's the cast for?
No need to cast it. I will drop in next round.
> "d"(flush)?

Hmm, either it copied this function from pvalidate or old internal APM
may had the flush. I will fix it in the next rev. thanks for pointing it.


>
> There's nothing in the APM talking about RMPUPDATE taking an input arg
> in %rdx?
>

Reply via email to