* Ram Pai: > On Thu, Nov 08, 2018 at 09:23:35PM +0100, Florian Weimer wrote: >> * Ram Pai: >> >> > Florian, >> > >> > I can. But I am struggling to understand the requirement. Why is >> > this needed? Are we proposing a enhancement to the sys_pkey_alloc(), >> > to be able to allocate keys that are initialied to disable-read >> > only? >> >> Yes, I think that would be a natural consequence. >> >> However, my immediate need comes from the fact that the AMR register can >> contain a flag combination that is not possible to represent with the >> existing PKEY_DISABLE_WRITE and PKEY_DISABLE_ACCESS flags. User code >> could write to AMR directly, so I cannot rule out that certain flag >> combinations exist there. >> >> So I came up with this: >> >> int >> pkey_get (int key) >> { >> if (key < 0 || key > PKEY_MAX) >> { >> __set_errno (EINVAL); >> return -1; >> } >> unsigned int index = pkey_index (key); >> unsigned long int amr = pkey_read (); >> unsigned int bits = (amr >> index) & 3; >> >> /* Translate from AMR values. PKEY_AMR_READ standing alone is not >> currently representable. */ >> if (bits & PKEY_AMR_READ) > > this should be > if (bits & (PKEY_AMR_READ|PKEY_AMR_WRITE)) This would return zero for PKEY_AMR_READ alone. >> return PKEY_DISABLE_ACCESS; > > >> else if (bits == PKEY_AMR_WRITE) >> return PKEY_DISABLE_WRITE; >> return 0; >> } It's hard to tell whether PKEY_DISABLE_ACCESS is better in this case. Which is why I want PKEY_DISABLE_READ. >> And this is not ideal. I would prefer something like this instead: >> >> switch (bits) >> { >> case PKEY_AMR_READ | PKEY_AMR_WRITE: >> return PKEY_DISABLE_ACCESS; >> case PKEY_AMR_READ: >> return PKEY_DISABLE_READ; >> case PKEY_AMR_WRITE: >> return PKEY_DISABLE_WRITE; >> case 0: >> return 0; >> } > > yes. > and on x86 it will be something like: > switch (bits) > { > case PKEY_PKRU_ACCESS : > return PKEY_DISABLE_ACCESS; > case PKEY_AMR_WRITE: > return PKEY_DISABLE_WRITE; > case 0: > return 0; > } x86 returns the PKRU bits directly, including the nonsensical case (PKEY_DISABLE_ACCESS | PKEY_DISABLE_WRITE). > But for this to work, why do you need to enhance the sys_pkey_alloc() > interface? Not that I am against it. Trying to understand if the > enhancement is really needed. sys_pkey_alloc performs an implicit pkey_set for the newly allocated key (that is, it updates the PKRU/AMR register). It makes sense to match the behavior of the userspace implementation. Thanks, Florian