|
Message-ID: <b72d7a3b-5ef1-9628-5091-9c3e390c2c28@c-s.fr> Date: Mon, 20 Jan 2020 09:35:04 +0100 From: Christophe Leroy <christophe.leroy@....fr> To: Russell Currey <ruscur@...sell.cc>, linuxppc-dev@...ts.ozlabs.org Cc: joel@....id.au, mpe@...erman.id.au, ajd@...ux.ibm.com, dja@...ens.net, npiggin@...il.com, kernel-hardening@...ts.openwall.com Subject: Re: [PATCH v6 1/5] powerpc/mm: Implement set_memory() routines Le 24/12/2019 à 06:55, Russell Currey a écrit : > The set_memory_{ro/rw/nx/x}() functions are required for STRICT_MODULE_RWX, > and are generally useful primitives to have. This implementation is > designed to be completely generic across powerpc's many MMUs. > > It's possible that this could be optimised to be faster for specific > MMUs, but the focus is on having a generic and safe implementation for > now. > > This implementation does not handle cases where the caller is attempting > to change the mapping of the page it is executing from, or if another > CPU is concurrently using the page being altered. These cases likely > shouldn't happen, but a more complex implementation with MMU-specific code > could safely handle them, so that is left as a TODO for now. > > Signed-off-by: Russell Currey <ruscur@...sell.cc> > --- > arch/powerpc/Kconfig | 1 + > arch/powerpc/include/asm/set_memory.h | 32 +++++++++++ > arch/powerpc/mm/Makefile | 1 + > arch/powerpc/mm/pageattr.c | 83 +++++++++++++++++++++++++++ > 4 files changed, 117 insertions(+) > create mode 100644 arch/powerpc/include/asm/set_memory.h > create mode 100644 arch/powerpc/mm/pageattr.c > > +static int __change_page_attr(pte_t *ptep, unsigned long addr, void *data) > +{ > + int action = *((int *)data); > + pte_t pte_val; pte_val is really not a good naming, because pte_val() is already a function which returns the value of a pte_t var. Here you should name it 'pte' as usual. Christophe > + > + // invalidate the PTE so it's safe to modify > + pte_val = ptep_get_and_clear(&init_mm, addr, ptep); > + flush_tlb_kernel_range(addr, addr + PAGE_SIZE); > + > + // modify the PTE bits as desired, then apply > + switch (action) { > + case SET_MEMORY_RO: > + pte_val = pte_wrprotect(pte_val); > + break; > + case SET_MEMORY_RW: > + pte_val = pte_mkwrite(pte_val); > + break; > + case SET_MEMORY_NX: > + pte_val = pte_exprotect(pte_val); > + break; > + case SET_MEMORY_X: > + pte_val = pte_mkexec(pte_val); > + break; > + default: > + WARN_ON(true); > + return -EINVAL; > + } > + > + set_pte_at(&init_mm, addr, ptep, pte_val); > + > + return 0; > +} > +
Powered by blists - more mailing lists
Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.