All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2 0/2] Add STRICT_DEVMEM support on RISC-V
@ 2020-06-22  6:33 Zong Li
  2020-06-22  6:33 ` [PATCH v2 1/2] riscv: Support CONFIG_STRICT_DEVMEM Zong Li
  2020-06-22  6:33 ` [PATCH v2 2/2] riscv: mm: refine the Makefile Zong Li
  0 siblings, 2 replies; 3+ messages in thread
From: Zong Li @ 2020-06-22  6:33 UTC (permalink / raw)
  To: paul.walmsley, palmer, mick, linux-riscv, linux-kernel; +Cc: Zong Li

This patch set adds devmem_is_allowed to support STRICT_DEVMEM. In
devmem_is_allowed, it invokes page_is_ram to check the specific
address whether registered as System RAM in iomem_resource. The resource
initialization is in kexec/kdump patch series which is reviewing,
page_is_ram checking is no use until it is merged.

Zong Li (2):
  riscv: Support CONFIG_STRICT_DEVMEM
  riscv: mm: refine the Makefile

 arch/riscv/Kconfig          |  1 +
 arch/riscv/include/asm/io.h |  2 ++
 arch/riscv/mm/Makefile      |  5 +----
 arch/riscv/mm/mmap.c        | 24 ++++++++++++++++++++++++
 4 files changed, 28 insertions(+), 4 deletions(-)
 create mode 100644 arch/riscv/mm/mmap.c

-- 
2.27.0


^ permalink raw reply	[flat|nested] 3+ messages in thread

* [PATCH v2 1/2] riscv: Support CONFIG_STRICT_DEVMEM
  2020-06-22  6:33 [PATCH v2 0/2] Add STRICT_DEVMEM support on RISC-V Zong Li
@ 2020-06-22  6:33 ` Zong Li
  2020-06-22  6:33 ` [PATCH v2 2/2] riscv: mm: refine the Makefile Zong Li
  1 sibling, 0 replies; 3+ messages in thread
From: Zong Li @ 2020-06-22  6:33 UTC (permalink / raw)
  To: paul.walmsley, palmer, mick, linux-riscv, linux-kernel; +Cc: Zong Li

Implement the 'devmem_is_allowed()' interface for RISC-V, like some of
other architectures have done. It will be called from range_is_allowed()
when userpsace attempts to access /dev/mem.

Access to exclusive IOMEM and kernel RAM is denied unless
CONFIG_STRICT_DEVMEM is set to 'n'.

Test it by devmem, the result as follows:

 - CONFIG_STRICT_DEVMEM=y
        $ devmem 0x10010000
        0x00000000
        $ devmem 0x80200000
        0x0000106F

 - CONFIG_STRICT_DEVMEM is not set
        $ devmem 0x10010000
        devmem: mmap: Operation not permitted
        $ devmem 0x80200000
        devmem: mmap: Operation not permitted

Changes in v2:
 - Move implementations out from mm/init.c. Suggested by Nick Kossifidis.

Signed-off-by: Zong Li <zong.li@sifive.com>
---
 arch/riscv/Kconfig          |  1 +
 arch/riscv/include/asm/io.h |  2 ++
 arch/riscv/mm/Makefile      |  1 +
 arch/riscv/mm/mmap.c        | 24 ++++++++++++++++++++++++
 4 files changed, 28 insertions(+)
 create mode 100644 arch/riscv/mm/mmap.c

diff --git a/arch/riscv/Kconfig b/arch/riscv/Kconfig
index 089293e4ad46..c6569939f7ba 100644
--- a/arch/riscv/Kconfig
+++ b/arch/riscv/Kconfig
@@ -17,6 +17,7 @@ config RISCV
 	select ARCH_HAS_BINFMT_FLAT
 	select ARCH_HAS_DEBUG_VIRTUAL if MMU
 	select ARCH_HAS_DEBUG_WX
+	select ARCH_HAS_DEVMEM_IS_ALLOWED
 	select ARCH_HAS_GCOV_PROFILE_ALL
 	select ARCH_HAS_GIGANTIC_PAGE
 	select ARCH_HAS_MMIOWB
diff --git a/arch/riscv/include/asm/io.h b/arch/riscv/include/asm/io.h
index 3835c3295dc5..04ac65ab93ce 100644
--- a/arch/riscv/include/asm/io.h
+++ b/arch/riscv/include/asm/io.h
@@ -147,4 +147,6 @@ __io_writes_outs(outs, u64, q, __io_pbr(), __io_paw())
 
 #include <asm-generic/io.h>
 
+extern int devmem_is_allowed(unsigned long pfn);
+
 #endif /* _ASM_RISCV_IO_H */
diff --git a/arch/riscv/mm/Makefile b/arch/riscv/mm/Makefile
index 363ef01c30b1..4530ad52f1d6 100644
--- a/arch/riscv/mm/Makefile
+++ b/arch/riscv/mm/Makefile
@@ -10,6 +10,7 @@ obj-y += extable.o
 obj-$(CONFIG_MMU) += fault.o pageattr.o
 obj-y += cacheflush.o
 obj-y += context.o
+obj-y += mmap.o
 
 ifeq ($(CONFIG_MMU),y)
 obj-$(CONFIG_SMP) += tlbflush.o
diff --git a/arch/riscv/mm/mmap.c b/arch/riscv/mm/mmap.c
new file mode 100644
index 000000000000..095fc82897b1
--- /dev/null
+++ b/arch/riscv/mm/mmap.c
@@ -0,0 +1,24 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Copyright (C) 2020 SiFive
+ */
+
+#ifdef CONFIG_STRICT_DEVMEM
+#include <linux/ioport.h>
+
+/*
+ * devmem_is_allowed() checks to see if /dev/mem access to a certain address
+ * is valid. The argument is a physical page number.
+ *
+ * Disallow access to system RAM as well as device-exclusive MMIO regions.
+ * This effectively disable read()/write() on /dev/mem.
+ */
+int devmem_is_allowed(unsigned long pfn)
+{
+	if (iomem_is_exclusive(pfn << PAGE_SHIFT))
+		return 0;
+	if (!page_is_ram(pfn))
+		return 1;
+	return 0;
+}
+#endif
-- 
2.27.0


^ permalink raw reply related	[flat|nested] 3+ messages in thread

* [PATCH v2 2/2] riscv: mm: refine the Makefile
  2020-06-22  6:33 [PATCH v2 0/2] Add STRICT_DEVMEM support on RISC-V Zong Li
  2020-06-22  6:33 ` [PATCH v2 1/2] riscv: Support CONFIG_STRICT_DEVMEM Zong Li
@ 2020-06-22  6:33 ` Zong Li
  1 sibling, 0 replies; 3+ messages in thread
From: Zong Li @ 2020-06-22  6:33 UTC (permalink / raw)
  To: paul.walmsley, palmer, mick, linux-riscv, linux-kernel; +Cc: Zong Li

Put all objects which selected by obj-y together.

Signed-off-by: Zong Li <zong.li@sifive.com>
---
 arch/riscv/mm/Makefile | 6 +-----
 1 file changed, 1 insertion(+), 5 deletions(-)

diff --git a/arch/riscv/mm/Makefile b/arch/riscv/mm/Makefile
index 4530ad52f1d6..7f95f66e135a 100644
--- a/arch/riscv/mm/Makefile
+++ b/arch/riscv/mm/Makefile
@@ -5,12 +5,8 @@ ifdef CONFIG_FTRACE
 CFLAGS_REMOVE_init.o = -pg
 endif
 
-obj-y += init.o
-obj-y += extable.o
+obj-y += init.o extable.o cacheflush.o context.o mmap.o
 obj-$(CONFIG_MMU) += fault.o pageattr.o
-obj-y += cacheflush.o
-obj-y += context.o
-obj-y += mmap.o
 
 ifeq ($(CONFIG_MMU),y)
 obj-$(CONFIG_SMP) += tlbflush.o
-- 
2.27.0


^ permalink raw reply related	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2020-06-22  6:34 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2020-06-22  6:33 [PATCH v2 0/2] Add STRICT_DEVMEM support on RISC-V Zong Li
2020-06-22  6:33 ` [PATCH v2 1/2] riscv: Support CONFIG_STRICT_DEVMEM Zong Li
2020-06-22  6:33 ` [PATCH v2 2/2] riscv: mm: refine the Makefile Zong Li

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.