Skip to content

Commit

Permalink
powerpc/book3s64/pkeys: Reset userspace AMR correctly on exec
Browse files Browse the repository at this point in the history
On fork, we inherit from the parent and on exec, we should switch to default_amr values.

Also, avoid changing the AMR register value within the kernel. The kernel now runs with
different AMR values.

Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.ibm.com>
Reviewed-by: Sandipan Das <sandipan@linux.ibm.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/20201127044424.40686-13-aneesh.kumar@linux.ibm.com
  • Loading branch information
Aneesh Kumar K.V authored and Michael Ellerman committed Dec 3, 2020
1 parent f643fca commit d5fa30e
Show file tree
Hide file tree
Showing 3 changed files with 9 additions and 15 deletions.
2 changes: 2 additions & 0 deletions arch/powerpc/include/asm/book3s/64/pkeys.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
#include <asm/book3s/64/hash-pkey.h>

extern u64 __ro_after_init default_uamor;
extern u64 __ro_after_init default_amr;
extern u64 __ro_after_init default_iamr;

static inline u64 vmflag_to_pte_pkey_bits(u64 vm_flags)
{
Expand Down
6 changes: 5 additions & 1 deletion arch/powerpc/kernel/process.c
Original file line number Diff line number Diff line change
Expand Up @@ -1546,6 +1546,11 @@ void arch_setup_new_exec(void)
struct pt_regs *regs = task_stack_page(current) + THREAD_SIZE;
current->thread.regs = regs - 1;
}

#ifdef CONFIG_PPC_MEM_KEYS
current->thread.regs->amr = default_amr;
current->thread.regs->iamr = default_iamr;
#endif
}

#ifdef CONFIG_PPC64
Expand Down Expand Up @@ -1895,7 +1900,6 @@ void start_thread(struct pt_regs *regs, unsigned long start, unsigned long sp)
current->thread.load_tm = 0;
#endif /* CONFIG_PPC_TRANSACTIONAL_MEM */

thread_pkey_regs_init(&current->thread);
}
EXPORT_SYMBOL(start_thread);

Expand Down
16 changes: 2 additions & 14 deletions arch/powerpc/mm/book3s64/pkeys.c
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,8 @@ static u32 initial_allocation_mask __ro_after_init;
* Even if we allocate keys with sys_pkey_alloc(), we need to make sure
* other thread still find the access denied using the same keys.
*/
static u64 default_amr = ~0x0UL;
static u64 default_iamr = 0x5555555555555555UL;
u64 default_amr __ro_after_init = ~0x0UL;
u64 default_iamr __ro_after_init = 0x5555555555555555UL;
u64 default_uamor __ro_after_init;
/*
* Key used to implement PROT_EXEC mmap. Denies READ/WRITE
Expand Down Expand Up @@ -396,18 +396,6 @@ void thread_pkey_regs_restore(struct thread_struct *new_thread,
write_iamr(new_thread->iamr);
}

void thread_pkey_regs_init(struct thread_struct *thread)
{
if (!mmu_has_feature(MMU_FTR_PKEY))
return;

thread->amr = default_amr;
thread->iamr = default_iamr;

write_amr(default_amr);
write_iamr(default_iamr);
}

int execute_only_pkey(struct mm_struct *mm)
{
return mm->context.execute_only_pkey;
Expand Down

0 comments on commit d5fa30e

Please sign in to comment.