[PATCH] powerpc/mm: add devmem_is_allowed() for STRICT_DEVMEM checking

2011-06-14 Thread Steve Best


   Provide devmem_is_allowed() routine to restrict access to kernel
   memory from userspace.
   Set CONFIG_STRICT_DEVMEM config option to switch on checking.

Signed-off-by: Steve Best sfb...@us.ibm.com

diff --git a/arch/powerpc/Kconfig.debug b/arch/powerpc/Kconfig.debug
index e72dcf6..e1aab6b 100644
--- a/arch/powerpc/Kconfig.debug
+++ b/arch/powerpc/Kconfig.debug
@@ -283,4 +283,15 @@ config PPC_EARLY_DEBUG_CPM_ADDR
  platform probing is done, all platforms selected must
  share the same address.
 
+config STRICT_DEVMEM
+def_bool y
+prompt Filter access to /dev/mem
+---help---
+  This option restricts access to /dev/mem.  If this option is
+  disabled, you allow userspace access to all memory, including
+  kernel and userspace memory. 
+  Memory access is required for experts who want to debug the kernel.
+
+  If you are unsure, say Y.
+
 endmenu
diff --git a/arch/powerpc/include/asm/page.h b/arch/powerpc/include/asm/page.h
index 2cd664e..dc2ec96 100644
--- a/arch/powerpc/include/asm/page.h
+++ b/arch/powerpc/include/asm/page.h
@@ -261,6 +261,7 @@ extern void clear_user_page(void *page, unsigned long 
vaddr, struct page *pg);
 extern void copy_user_page(void *to, void *from, unsigned long vaddr,
struct page *p);
 extern int page_is_ram(unsigned long pfn);
+extern int devmem_is_allowed(unsigned long pfn);
 
 #ifdef CONFIG_PPC_SMLPAR
 void arch_free_page(struct page *page, int order);
diff --git a/arch/powerpc/mm/mem.c b/arch/powerpc/mm/mem.c
index 29d4dde..b1a6233 100644
--- a/arch/powerpc/mm/mem.c
+++ b/arch/powerpc/mm/mem.c
@@ -520,3 +520,21 @@ void update_mmu_cache(struct vm_area_struct *vma, unsigned 
long address,
hash_preload(vma-vm_mm, address, access, trap);
 #endif /* CONFIG_PPC_STD_MMU */
 }
+
+/*
+ * devmem_is_allowed() checks to see if /dev/mem access to a certain address
+ * is valid. The argument is a physical page number.
+ *
+ * On PowerPC, access has to be given to data regions used by X. We have to
+ * disallow access to device-exclusive MMIO regions and system RAM. 
+ */
+int devmem_is_allowed(unsigned long pfn)
+{
+if ((pfn = 57360 || pfn = 57392))
+return 1;
+if (iomem_is_exclusive(pfn  PAGE_SHIFT))
+return 0;
+if (!page_is_ram(pfn))
+return 1;
+return 0;
+}
___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev


Re: [PATCH] powerpc/mm: add devmem_is_allowed() for STRICT_DEVMEM checking

2011-06-14 Thread Steve Best

On Tue, 2011-06-14 at 12:30 -0500, Nathan Lynch wrote:
 Hi Steve,
 
 On Tue, 2011-06-14 at 12:58 -0400, Steve Best wrote:
  diff --git a/arch/powerpc/Kconfig.debug b/arch/powerpc/Kconfig.debug
  index e72dcf6..e1aab6b 100644
  --- a/arch/powerpc/Kconfig.debug
  +++ b/arch/powerpc/Kconfig.debug
  @@ -283,4 +283,15 @@ config PPC_EARLY_DEBUG_CPM_ADDR
platform probing is done, all platforms selected must
share the same address.
   
  +config STRICT_DEVMEM
  +def_bool y
 
 Default new config items to n, please.

ok
 
 
  --- a/arch/powerpc/mm/mem.c
  +++ b/arch/powerpc/mm/mem.c
  @@ -520,3 +520,21 @@ void update_mmu_cache(struct vm_area_struct *vma, 
  unsigned long address,
  hash_preload(vma-vm_mm, address, access, trap);
   #endif /* CONFIG_PPC_STD_MMU */
   }
  +
  +/*
  + * devmem_is_allowed() checks to see if /dev/mem access to a certain 
  address
  + * is valid. The argument is a physical page number.
  + *
  + * On PowerPC, access has to be given to data regions used by X. We have to
  + * disallow access to device-exclusive MMIO regions and system RAM. 
  + */
  +int devmem_is_allowed(unsigned long pfn)
  +{
  +if ((pfn = 57360 || pfn = 57392))
  +return 1;
 
 That seems... fragile.  Where do these numbers come from, and are they
 appropriate for all platforms and configurations?

This is the range I got from testing pseries blades and servers. maybe
there is a better way to get this range anyone know of a way?
 
 
-Steve

___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev


Re: [PATCH] powerpc/mm: add devmem_is_allowed() for STRICT_DEVMEM checking

2011-02-01 Thread Steve Best

On Mon, 2011-01-31 at 13:40 -0600, Scott Wood wrote:
 On Mon, 31 Jan 2011 14:16:00 -0500
 Steve Best sfb...@us.ibm.com wrote:
 
  Provide devmem_is_allowed() routine to restrict access to kernel
  memory from userspace.
  Set CONFIG_STRICT_DEVMEM config option to switch on checking.
  
  Signed-off-by: Steve Best sfb...@us.ibm.com
  
  diff --git a/arch/powerpc/Kconfig.debug b/arch/powerpc/Kconfig.debug
  index 2d38a50..6805d5d 100644
  --- a/arch/powerpc/Kconfig.debug
  +++ b/arch/powerpc/Kconfig.debug
  @@ -299,4 +299,16 @@ config PPC_EARLY_DEBUG_CPM_ADDR
platform probing is done, all platforms selected must
share the same address.
   
  +config STRICT_DEVMEM
  +def_bool y
  +prompt Filter access to /dev/mem
  +---help---
  +  This option restricts access to /dev/mem.  If this option is
  +  disabled, you allow userspace access to all memory, including
  +  kernel and userspace memory. Accidental memory access is likely
  +  to be disastrous.
  +  Memory access is required for experts who want to debug the 
  kernel.
  +
  +  If you are unsure, say Y.
  +
   endmenu
  diff --git a/arch/powerpc/include/asm/page.h 
  b/arch/powerpc/include/asm/page.h
  index 53b64be..f225032 100644
  --- a/arch/powerpc/include/asm/page.h
  +++ b/arch/powerpc/include/asm/page.h
  @@ -262,6 +262,11 @@ extern void copy_user_page(void *to, void *from, 
  unsigned long vaddr,
  struct page *p);
   extern int page_is_ram(unsigned long pfn);
   
  +static inline int devmem_is_allowed(unsigned long pfn)
  +{
  +return 0;
  +}
  +
 
 I don't see how this is a sane thing to turn on by default (you're not
 restricting it, BTW -- you're completely disabling it with that
 implementation of devmem_is_allowed).  It will break anything that
 uses /dev/mem to access I/O, 

could you expand on what I/O depends on /dev/mem, so I can take
that into account?

 possibly including desktoppy stuff like X
 servers, 

you are right just found out that X needs to access it. will 
take that into account
 as well as lots of stuff that goes on in embedded setups.

could you explain more about what needs access to /dev/mem in 
the embedded setups?

 
 You need to be root to access /dev/mem, and root has plenty of
 other options for causing disastrous results.  You don't just stumble
 onto /dev/mem by accident.
 
 -Scott

-Steve

___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev


[PATCH] powerpc/mm: add devmem_is_allowed() for STRICT_DEVMEM checking

2011-01-31 Thread Steve Best
Provide devmem_is_allowed() routine to restrict access to kernel
memory from userspace.
Set CONFIG_STRICT_DEVMEM config option to switch on checking.

Signed-off-by: Steve Best sfb...@us.ibm.com

diff --git a/arch/powerpc/Kconfig.debug b/arch/powerpc/Kconfig.debug
index 2d38a50..6805d5d 100644
--- a/arch/powerpc/Kconfig.debug
+++ b/arch/powerpc/Kconfig.debug
@@ -299,4 +299,16 @@ config PPC_EARLY_DEBUG_CPM_ADDR
  platform probing is done, all platforms selected must
  share the same address.
 
+config STRICT_DEVMEM
+def_bool y
+prompt Filter access to /dev/mem
+---help---
+  This option restricts access to /dev/mem.  If this option is
+  disabled, you allow userspace access to all memory, including
+  kernel and userspace memory. Accidental memory access is likely
+  to be disastrous.
+  Memory access is required for experts who want to debug the kernel.
+
+  If you are unsure, say Y.
+
 endmenu
diff --git a/arch/powerpc/include/asm/page.h b/arch/powerpc/include/asm/page.h
index 53b64be..f225032 100644
--- a/arch/powerpc/include/asm/page.h
+++ b/arch/powerpc/include/asm/page.h
@@ -262,6 +262,11 @@ extern void copy_user_page(void *to, void *from, unsigned 
long vaddr,
struct page *p);
 extern int page_is_ram(unsigned long pfn);
 
+static inline int devmem_is_allowed(unsigned long pfn)
+{
+return 0;
+}
+
 #ifdef CONFIG_PPC_SMLPAR
 void arch_free_page(struct page *page, int order);
 #define HAVE_ARCH_FREE_PAGE
___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev


Re: [PATCH] powerpc: Fix integer constant warning

2010-06-09 Thread Steve Best

On Tue, 2010-06-08 at 14:12 +0100, David Howells wrote:
 Steve Best sfb...@us.ibm.com wrote:
 
  -#define KERNELBASE (0xc000)
  +#define KERNELBASE (0xc000ULL)
 
 Is this the right fix?  The code producing the warning is subtracting
 0xc000 from a 32-bit number:

agree this fix needs more work, and can be dropped. Paul has another
patch that removes this file, since it is no longer used. I assume we'll
go with that patch.
 
   naca = ntohl(*((u_int32_t*) inbuf[0x0C])) - KERNELBASE;
 
 which seems distinctly odd.
 
 David

-Steve

___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev


[PATCH] powerpc: Fix integer constant warning

2010-06-07 Thread Steve Best
Fix ppc arch/powerpc/boot/addRamDisk.c:277: warning: integer constant
is too large for 'long' type

Signed-off-by: Steve Best sfb...@us.ibm.com

diff -purN linux.2.6.orig/arch/powerpc/boot/addRamDisk.c 
linux.2.6/arch/powerpc/boot/addRamDisk.c
--- linux.2.6.orig/arch/powerpc/boot/addRamDisk.c   2010-06-07 
15:20:41.763844095 -0400
+++ linux.2.6/arch/powerpc/boot/addRamDisk.c2010-06-07 15:27:15.165100339 
-0400
@@ -9,7 +9,7 @@
 
 #define ElfHeaderSize  (64 * 1024)
 #define ElfPages  (ElfHeaderSize / 4096)
-#define KERNELBASE (0xc000)
+#define KERNELBASE (0xc000ULL)
 #define _ALIGN_UP(addr,size)   (((addr)+((size)-1))(~((size)-1)))
 
 struct addr_range {
___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev