linuxppc-dev.lists.ozlabs.org archive mirror
 help / color / mirror / Atom feed
From: Jordan Niethe <jniethe5@gmail.com>
To: linuxppc-dev@lists.ozlabs.org
Cc: ajd@linux.ibm.com, cmr@codefail.de,
	kbuild test robot <lkp@intel.com>,
	npiggin@gmail.com, aneesh.kumar@linux.ibm.com,
	naveen.n.rao@linux.ibm.com, Jordan Niethe <jniethe5@gmail.com>,
	dja@axtens.net
Subject: [PATCH v11 8/9] powerpc/mm: implement set_memory_attr()
Date: Thu, 29 Apr 2021 13:16:01 +1000	[thread overview]
Message-ID: <20210429031602.2606654-9-jniethe5@gmail.com> (raw)
In-Reply-To: <20210429031602.2606654-1-jniethe5@gmail.com>

From: Christophe Leroy <christophe.leroy@csgroup.eu>

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@csgroup.eu>
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>
Signed-off-by: Jordan Niethe <jniethe5@gmail.com>
---
 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 d1cd69b1a43a..a738e86f34bd 100644
--- a/arch/powerpc/include/asm/set_memory.h
+++ b/arch/powerpc/include/asm/set_memory.h
@@ -7,4 +7,6 @@ int set_memory_rw(unsigned long addr, int numpages);
 int set_memory_nx(unsigned long addr, int numpages);
 int set_memory_x(unsigned long addr, int numpages);
 
+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 3b4aa72e555e..9098066bc113 100644
--- a/arch/powerpc/mm/pageattr.c
+++ b/arch/powerpc/mm/pageattr.c
@@ -103,3 +103,36 @@ int set_memory_x(unsigned long addr, int numpages)
 {
 	return change_memory_attr(addr, numpages, pte_mkexec);
 }
+
+/*
+ * 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 <= 0)
+		return 0;
+
+	return apply_to_existing_page_range(&init_mm, start, sz, set_page_attr,
+					    (void *)pgprot_val(prot));
+}
-- 
2.25.1


  parent reply	other threads:[~2021-04-29  3:20 UTC|newest]

Thread overview: 21+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-04-29  3:15 [PATCH v11 0/9] powerpc: Further Strict RWX support Jordan Niethe
2021-04-29  3:15 ` [PATCH v11 1/9] powerpc/mm: Implement set_memory() routines Jordan Niethe
2021-04-29  7:32   ` Christophe Leroy
2021-05-03  5:02     ` Jordan Niethe
2021-04-29  3:15 ` [PATCH v11 2/9] powerpc/lib/code-patching: Set up Strict RWX patching earlier Jordan Niethe
2021-04-29  4:53   ` Christophe Leroy
2021-05-05  5:22     ` Jordan Niethe
2021-04-29  3:15 ` [PATCH v11 3/9] powerpc: Always define MODULES_{VADDR,END} Jordan Niethe
2021-04-29  5:04   ` Christophe Leroy
2021-05-03  5:39     ` Jordan Niethe
2021-05-03  5:57       ` Christophe Leroy
2021-05-03  6:16         ` Jordan Niethe
2021-05-03  6:22           ` Christophe Leroy
2021-05-03  6:26             ` Jordan Niethe
2021-05-03  6:32               ` Christophe Leroy
2021-04-29  3:15 ` [PATCH v11 4/9] powerpc/kprobes: Mark newly allocated probes as ROX Jordan Niethe
2021-04-29  3:15 ` [PATCH v11 5/9] powerpc/bpf: Remove bpf_jit_free() Jordan Niethe
2021-04-29  3:15 ` [PATCH v11 6/9] powerpc/bpf: Write protect JIT code Jordan Niethe
2021-04-29  3:16 ` [PATCH v11 7/9] powerpc: Set ARCH_HAS_STRICT_MODULE_RWX Jordan Niethe
2021-04-29  3:16 ` Jordan Niethe [this message]
2021-04-29  3:16 ` [PATCH v11 9/9] powerpc/32: use set_memory_attr() Jordan Niethe

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=20210429031602.2606654-9-jniethe5@gmail.com \
    --to=jniethe5@gmail.com \
    --cc=ajd@linux.ibm.com \
    --cc=aneesh.kumar@linux.ibm.com \
    --cc=cmr@codefail.de \
    --cc=dja@axtens.net \
    --cc=linuxppc-dev@lists.ozlabs.org \
    --cc=lkp@intel.com \
    --cc=naveen.n.rao@linux.ibm.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: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).