mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	lib: add test module for CONFIG_DEBUG_VIRTUAL
Add a test module that allows testing that CONFIG_DEBUG_VIRTUAL works correctly, at least that it can catch invalid calls to virt_to_phys() against the non-linear kernel virtual address map. Link: http://lkml.kernel.org/r/20170808164035.26725-1-f.fainelli@gmail.com Signed-off-by: Florian Fainelli <f.fainelli@gmail.com> Cc: "Luis R. Rodriguez" <mcgrof@kernel.org> Cc: Kees Cook <keescook@chromium.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
		
							parent
							
								
									9888a588ea
								
							
						
					
					
						commit
						e4dace3615
					
				
					 3 changed files with 61 additions and 0 deletions
				
			
		| 
						 | 
					@ -1930,6 +1930,17 @@ config TEST_KMOD
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	  If unsure, say N.
 | 
						  If unsure, say N.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					config TEST_DEBUG_VIRTUAL
 | 
				
			||||||
 | 
						tristate "Test CONFIG_DEBUG_VIRTUAL feature"
 | 
				
			||||||
 | 
						depends on DEBUG_VIRTUAL
 | 
				
			||||||
 | 
						help
 | 
				
			||||||
 | 
						  Test the kernel's ability to detect incorrect calls to
 | 
				
			||||||
 | 
						  virt_to_phys() done against the non-linear part of the
 | 
				
			||||||
 | 
						  kernel's virtual address map.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						  If unsure, say N.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
source "samples/Kconfig"
 | 
					source "samples/Kconfig"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
source "lib/Kconfig.kgdb"
 | 
					source "lib/Kconfig.kgdb"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -62,6 +62,7 @@ obj-$(CONFIG_TEST_BITMAP) += test_bitmap.o
 | 
				
			||||||
obj-$(CONFIG_TEST_UUID) += test_uuid.o
 | 
					obj-$(CONFIG_TEST_UUID) += test_uuid.o
 | 
				
			||||||
obj-$(CONFIG_TEST_PARMAN) += test_parman.o
 | 
					obj-$(CONFIG_TEST_PARMAN) += test_parman.o
 | 
				
			||||||
obj-$(CONFIG_TEST_KMOD) += test_kmod.o
 | 
					obj-$(CONFIG_TEST_KMOD) += test_kmod.o
 | 
				
			||||||
 | 
					obj-$(CONFIG_TEST_DEBUG_VIRTUAL) += test_debug_virtual.o
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ifeq ($(CONFIG_DEBUG_KOBJECT),y)
 | 
					ifeq ($(CONFIG_DEBUG_KOBJECT),y)
 | 
				
			||||||
CFLAGS_kobject.o += -DDEBUG
 | 
					CFLAGS_kobject.o += -DDEBUG
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										49
									
								
								lib/test_debug_virtual.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										49
									
								
								lib/test_debug_virtual.c
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,49 @@
 | 
				
			||||||
 | 
					#include <linux/kernel.h>
 | 
				
			||||||
 | 
					#include <linux/module.h>
 | 
				
			||||||
 | 
					#include <linux/export.h>
 | 
				
			||||||
 | 
					#include <linux/mm.h>
 | 
				
			||||||
 | 
					#include <linux/vmalloc.h>
 | 
				
			||||||
 | 
					#include <linux/slab.h>
 | 
				
			||||||
 | 
					#include <linux/sizes.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <asm/page.h>
 | 
				
			||||||
 | 
					#ifdef CONFIG_MIPS
 | 
				
			||||||
 | 
					#include <asm/bootinfo.h>
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct foo {
 | 
				
			||||||
 | 
						unsigned int bar;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct foo *foo;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static int __init test_debug_virtual_init(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						phys_addr_t pa;
 | 
				
			||||||
 | 
						void *va;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						va = (void *)VMALLOC_START;
 | 
				
			||||||
 | 
						pa = virt_to_phys(va);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						pr_info("PA: %pa for VA: 0x%lx\n", &pa, (unsigned long)va);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						foo = kzalloc(sizeof(*foo), GFP_KERNEL);
 | 
				
			||||||
 | 
						if (!foo)
 | 
				
			||||||
 | 
							return -ENOMEM;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						pa = virt_to_phys(foo);
 | 
				
			||||||
 | 
						va = foo;
 | 
				
			||||||
 | 
						pr_info("PA: %pa for VA: 0x%lx\n", &pa, (unsigned long)va);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					module_init(test_debug_virtual_init);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void __exit test_debug_virtual_exit(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						kfree(foo);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					module_exit(test_debug_virtual_exit);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					MODULE_LICENSE("GPL");
 | 
				
			||||||
 | 
					MODULE_DESCRIPTION("Test module for CONFIG_DEBUG_VIRTUAL");
 | 
				
			||||||
		Loading…
	
		Reference in a new issue