From: Khalid Aziz <khalid.aziz@xxxxxxxxxx> 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. -- To unsubscribe from this list: send the line "unsubscribe linux-doc" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html