Commit 0685f217 authored by Ram Pai's avatar Ram Pai Committed by Michael Ellerman

powerpc: cleanup AMR, IAMR when a key is allocated or freed

Cleanup the bits corresponding to a key in the AMR, and IAMR
register, when the key is newly allocated/activated or is freed.
We dont want some residual bits cause the hardware enforce
unintended behavior when the key is activated or freed.
Reviewed-by: default avatarThiago Jung Bauermann <bauerman@linux.vnet.ibm.com>
Signed-off-by: default avatarRam Pai <linuxram@us.ibm.com>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
parent 4d70b698
...@@ -58,6 +58,8 @@ static inline bool mm_pkey_is_allocated(struct mm_struct *mm, int pkey) ...@@ -58,6 +58,8 @@ static inline bool mm_pkey_is_allocated(struct mm_struct *mm, int pkey)
__mm_pkey_is_allocated(mm, pkey)); __mm_pkey_is_allocated(mm, pkey));
} }
extern void __arch_activate_pkey(int pkey);
extern void __arch_deactivate_pkey(int pkey);
/* /*
* Returns a positive, 5-bit key on success, or -1 on failure. * Returns a positive, 5-bit key on success, or -1 on failure.
* Relies on the mmap_sem to protect against concurrency in mm_pkey_alloc() and * Relies on the mmap_sem to protect against concurrency in mm_pkey_alloc() and
...@@ -85,6 +87,12 @@ static inline int mm_pkey_alloc(struct mm_struct *mm) ...@@ -85,6 +87,12 @@ static inline int mm_pkey_alloc(struct mm_struct *mm)
ret = ffz((u32)mm_pkey_allocation_map(mm)); ret = ffz((u32)mm_pkey_allocation_map(mm));
__mm_pkey_allocated(mm, ret); __mm_pkey_allocated(mm, ret);
/*
* Enable the key in the hardware
*/
if (ret > 0)
__arch_activate_pkey(ret);
return ret; return ret;
} }
...@@ -96,6 +104,10 @@ static inline int mm_pkey_free(struct mm_struct *mm, int pkey) ...@@ -96,6 +104,10 @@ static inline int mm_pkey_free(struct mm_struct *mm, int pkey)
if (!mm_pkey_is_allocated(mm, pkey)) if (!mm_pkey_is_allocated(mm, pkey))
return -EINVAL; return -EINVAL;
/*
* Disable the key in the hardware
*/
__arch_deactivate_pkey(pkey);
__mm_pkey_free(mm, pkey); __mm_pkey_free(mm, pkey);
return 0; return 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment