From: Russell Currey <ruscur@russell.cc> To: linuxppc-dev@lists.ozlabs.org Cc: ajd@linux.ibm.com, kernel-hardening@lists.openwall.com, npiggin@gmail.com, kbuild test robot <lkp@intel.com>, joel@jms.id.au, Russell Currey <ruscur@russell.cc>, dja@axtens.net Subject: [PATCH v6 6/7] powerpc/mm: implement set_memory_attr() Date: Tue, 10 Mar 2020 12:03:37 +1100 [thread overview] Message-ID: <20200310010338.21205-7-ruscur@russell.cc> (raw) In-Reply-To: <20200310010338.21205-1-ruscur@russell.cc> From: Christophe Leroy <christophe.leroy@c-s.fr> In addition to the set_memory_xx() functions which allows to change the memory attributes of not (yet) used memory regions, implement a set_memory_attr() function to: - set the final memory protection after init on currently used kernel regions. - enable/disable kernel memory regions in the scope of DEBUG_PAGEALLOC. Unlike the set_memory_xx() which can act in three step as the regions are unused, this function must modify 'on the fly' as the kernel is executing from them. At the moment only PPC32 will use it and changing page attributes on the fly is not an issue. Signed-off-by: Christophe Leroy <christophe.leroy@c-s.fr> Reported-by: kbuild test robot <lkp@intel.com> [ruscur: cast "data" to unsigned long instead of int] Signed-off-by: Russell Currey <ruscur@russell.cc> --- arch/powerpc/include/asm/set_memory.h | 2 ++ arch/powerpc/mm/pageattr.c | 33 +++++++++++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/arch/powerpc/include/asm/set_memory.h b/arch/powerpc/include/asm/set_memory.h index 64011ea444b4..b040094f7920 100644 --- a/arch/powerpc/include/asm/set_memory.h +++ b/arch/powerpc/include/asm/set_memory.h @@ -29,4 +29,6 @@ static inline int set_memory_x(unsigned long addr, int numpages) return change_memory_attr(addr, numpages, SET_MEMORY_X); } +int set_memory_attr(unsigned long addr, int numpages, pgprot_t prot); + #endif diff --git a/arch/powerpc/mm/pageattr.c b/arch/powerpc/mm/pageattr.c index 748fa56d9db0..60139fedc6cc 100644 --- a/arch/powerpc/mm/pageattr.c +++ b/arch/powerpc/mm/pageattr.c @@ -77,3 +77,36 @@ int change_memory_attr(unsigned long addr, int numpages, long action) return apply_to_page_range(&init_mm, start, sz, change_page_attr, (void *)action); } + +/* + * Set the attributes of a page: + * + * This function is used by PPC32 at the end of init to set final kernel memory + * protection. It includes changing the maping of the page it is executing from + * and data pages it is using. + */ +static int set_page_attr(pte_t *ptep, unsigned long addr, void *data) +{ + pgprot_t prot = __pgprot((unsigned long)data); + + spin_lock(&init_mm.page_table_lock); + + set_pte_at(&init_mm, addr, ptep, pte_modify(*ptep, prot)); + flush_tlb_kernel_range(addr, addr + PAGE_SIZE); + + spin_unlock(&init_mm.page_table_lock); + + return 0; +} + +int set_memory_attr(unsigned long addr, int numpages, pgprot_t prot) +{ + unsigned long start = ALIGN_DOWN(addr, PAGE_SIZE); + unsigned long sz = numpages * PAGE_SIZE; + + if (!numpages) + return 0; + + return apply_to_page_range(&init_mm, start, sz, set_page_attr, + (void *)pgprot_val(prot)); +} -- 2.25.1
WARNING: multiple messages have this Message-ID (diff)
From: Russell Currey <ruscur@russell.cc> To: linuxppc-dev@lists.ozlabs.org Cc: Christophe Leroy <christophe.leroy@c-s.fr>, joel@jms.id.au, mpe@ellerman.id.au, ajd@linux.ibm.com, dja@axtens.net, npiggin@gmail.com, kernel-hardening@lists.openwall.com, kbuild test robot <lkp@intel.com>, Russell Currey <ruscur@russell.cc> Subject: [PATCH v6 6/7] powerpc/mm: implement set_memory_attr() Date: Tue, 10 Mar 2020 12:03:37 +1100 [thread overview] Message-ID: <20200310010338.21205-7-ruscur@russell.cc> (raw) In-Reply-To: <20200310010338.21205-1-ruscur@russell.cc> From: Christophe Leroy <christophe.leroy@c-s.fr> In addition to the set_memory_xx() functions which allows to change the memory attributes of not (yet) used memory regions, implement a set_memory_attr() function to: - set the final memory protection after init on currently used kernel regions. - enable/disable kernel memory regions in the scope of DEBUG_PAGEALLOC. Unlike the set_memory_xx() which can act in three step as the regions are unused, this function must modify 'on the fly' as the kernel is executing from them. At the moment only PPC32 will use it and changing page attributes on the fly is not an issue. Signed-off-by: Christophe Leroy <christophe.leroy@c-s.fr> Reported-by: kbuild test robot <lkp@intel.com> [ruscur: cast "data" to unsigned long instead of int] Signed-off-by: Russell Currey <ruscur@russell.cc> --- arch/powerpc/include/asm/set_memory.h | 2 ++ arch/powerpc/mm/pageattr.c | 33 +++++++++++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/arch/powerpc/include/asm/set_memory.h b/arch/powerpc/include/asm/set_memory.h index 64011ea444b4..b040094f7920 100644 --- a/arch/powerpc/include/asm/set_memory.h +++ b/arch/powerpc/include/asm/set_memory.h @@ -29,4 +29,6 @@ static inline int set_memory_x(unsigned long addr, int numpages) return change_memory_attr(addr, numpages, SET_MEMORY_X); } +int set_memory_attr(unsigned long addr, int numpages, pgprot_t prot); + #endif diff --git a/arch/powerpc/mm/pageattr.c b/arch/powerpc/mm/pageattr.c index 748fa56d9db0..60139fedc6cc 100644 --- a/arch/powerpc/mm/pageattr.c +++ b/arch/powerpc/mm/pageattr.c @@ -77,3 +77,36 @@ int change_memory_attr(unsigned long addr, int numpages, long action) return apply_to_page_range(&init_mm, start, sz, change_page_attr, (void *)action); } + +/* + * Set the attributes of a page: + * + * This function is used by PPC32 at the end of init to set final kernel memory + * protection. It includes changing the maping of the page it is executing from + * and data pages it is using. + */ +static int set_page_attr(pte_t *ptep, unsigned long addr, void *data) +{ + pgprot_t prot = __pgprot((unsigned long)data); + + spin_lock(&init_mm.page_table_lock); + + set_pte_at(&init_mm, addr, ptep, pte_modify(*ptep, prot)); + flush_tlb_kernel_range(addr, addr + PAGE_SIZE); + + spin_unlock(&init_mm.page_table_lock); + + return 0; +} + +int set_memory_attr(unsigned long addr, int numpages, pgprot_t prot) +{ + unsigned long start = ALIGN_DOWN(addr, PAGE_SIZE); + unsigned long sz = numpages * PAGE_SIZE; + + if (!numpages) + return 0; + + return apply_to_page_range(&init_mm, start, sz, set_page_attr, + (void *)pgprot_val(prot)); +} -- 2.25.1
next prev parent reply other threads:[~2020-03-10 1:16 UTC|newest] Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top 2020-03-10 1:03 [PATCH v6 0/7] set_memory() routines and STRICT_MODULE_RWX Russell Currey 2020-03-10 1:03 ` Russell Currey 2020-03-10 1:03 ` [PATCH v6 1/7] powerpc/mm: Implement set_memory() routines Russell Currey 2020-03-10 1:03 ` Russell Currey 2020-03-11 6:03 ` Daniel Axtens 2020-03-11 6:03 ` Daniel Axtens 2020-03-31 1:49 ` Russell Currey 2020-03-31 1:49 ` Russell Currey 2020-03-10 1:03 ` [PATCH v6 2/7] powerpc/kprobes: Mark newly allocated probes as RO Russell Currey 2020-03-10 1:03 ` Russell Currey 2020-03-10 1:03 ` [PATCH v6 3/7] powerpc/mm/ptdump: debugfs handler for W+X checks at runtime Russell Currey 2020-03-10 1:03 ` Russell Currey 2020-03-10 1:03 ` [PATCH v6 4/7] powerpc: Set ARCH_HAS_STRICT_MODULE_RWX Russell Currey 2020-03-10 1:03 ` Russell Currey 2020-03-10 1:03 ` [PATCH v6 5/7] powerpc/configs: Enable STRICT_MODULE_RWX in skiroot_defconfig Russell Currey 2020-03-10 1:03 ` Russell Currey 2020-03-10 1:03 ` Russell Currey [this message] 2020-03-10 1:03 ` [PATCH v6 6/7] powerpc/mm: implement set_memory_attr() Russell Currey 2020-03-11 6:09 ` Daniel Axtens 2020-03-11 6:09 ` Daniel Axtens 2020-03-10 1:03 ` [PATCH v6 7/7] powerpc/32: use set_memory_attr() Russell Currey 2020-03-10 1:03 ` Russell Currey
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20200310010338.21205-7-ruscur@russell.cc \ --to=ruscur@russell.cc \ --cc=ajd@linux.ibm.com \ --cc=dja@axtens.net \ --cc=joel@jms.id.au \ --cc=kernel-hardening@lists.openwall.com \ --cc=linuxppc-dev@lists.ozlabs.org \ --cc=lkp@intel.com \ --cc=npiggin@gmail.com \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.