From: Khalid Aziz <khalid.a...@oracle.com>
Date: Wed, 25 Jan 2017 12:57:16 -0700

> +static inline void enable_adi(void)
> +{
 ...
> +     __asm__ __volatile__(
> +             "rdpr %%pstate, %%g1\n\t"
> +             "or %%g1, %0, %%g1\n\t"
> +             "wrpr %%g1, %%g0, %%pstate\n\t"
> +             ".word 0x83438000\n\t"  /* rd %mcdper, %g1 */
> +             ".word 0xaf900001\n\t"  /* wrpr  %g0, %g1, %pmcdper */
> +             :
> +             : "i" (PSTATE_MCDE)
> +             : "g1");
> +}

This is _crazy_ expensive.

This is 4 privileged register operations, every single one incurs a full
pipline flush and virtual cpu thread yield.

And we do this around _every_ single userspace access from the kernel
when the thread has ADI enabled.

I think if the kernel manages the ADI metadata properly, you can get rid
of all of this.

On etrap, you change ESTATE_PSTATE{1,2} to have the MCDE bit enabled.
Then the kernel always runs with ADI enabled.

Furthermore, since the %mcdper register should be set to whatever the
current task has asked for, you should be able to avoid touching it
as well assuming that traps do not change %mcdper's value.

Then you don't need to do anything special during userspace accesses
which seems to be the way this was designed to be used.

Reply via email to