Loading drivers/char/Kconfig +13 −0 Original line number Diff line number Diff line Loading @@ -6,6 +6,19 @@ menu "Character devices" source "drivers/tty/Kconfig" config DEVMEM bool "Memory device driver" default y help The memory driver provides two character devices, mem and kmem, which provide access to the system's memory. The mem device is a view of physical memory, and each byte in the device corresponds to the matching physical address. The kmem device is the same as mem, but the addresses correspond to the kernel's virtual address space rather than physical memory. These devices are standard parts of a Linux system and most users should say Y here. You might say N if very security conscience or memory is tight. config DEVKMEM bool "/dev/kmem virtual device support" default y Loading drivers/char/mem.c +17 −0 Original line number Diff line number Diff line Loading @@ -58,6 +58,7 @@ static inline int valid_mmap_phys_addr_range(unsigned long pfn, size_t size) } #endif #if defined(CONFIG_DEVMEM) || defined(CONFIG_DEVKMEM) #ifdef CONFIG_STRICT_DEVMEM static inline int range_is_allowed(unsigned long pfn, unsigned long size) { Loading @@ -83,7 +84,9 @@ static inline int range_is_allowed(unsigned long pfn, unsigned long size) return 1; } #endif #endif #ifdef CONFIG_DEVMEM void __weak unxlate_dev_mem_ptr(unsigned long phys, void *addr) { } Loading Loading @@ -216,6 +219,9 @@ static ssize_t write_mem(struct file *file, const char __user *buf, *ppos += written; return written; } #endif /* CONFIG_DEVMEM */ #if defined(CONFIG_DEVMEM) || defined(CONFIG_DEVKMEM) int __weak phys_mem_access_prot_allowed(struct file *file, unsigned long pfn, unsigned long size, pgprot_t *vma_prot) Loading Loading @@ -337,6 +343,7 @@ static int mmap_mem(struct file *file, struct vm_area_struct *vma) } return 0; } #endif /* CONFIG_DEVMEM */ #ifdef CONFIG_DEVKMEM static int mmap_kmem(struct file *file, struct vm_area_struct *vma) Loading Loading @@ -667,6 +674,8 @@ static loff_t null_lseek(struct file *file, loff_t offset, int orig) return file->f_pos = 0; } #if defined(CONFIG_DEVMEM) || defined(CONFIG_DEVKMEM) || defined(CONFIG_DEVPORT) /* * The memory devices use the full 32/64 bits of the offset, and so we cannot * check against negative addresses: they are ok. The return value is weird, Loading Loading @@ -700,10 +709,14 @@ static loff_t memory_lseek(struct file *file, loff_t offset, int orig) return ret; } #endif #if defined(CONFIG_DEVMEM) || defined(CONFIG_DEVKMEM) || defined(CONFIG_DEVPORT) static int open_port(struct inode *inode, struct file *filp) { return capable(CAP_SYS_RAWIO) ? 0 : -EPERM; } #endif #define zero_lseek null_lseek #define full_lseek null_lseek Loading @@ -712,6 +725,7 @@ static int open_port(struct inode *inode, struct file *filp) #define open_mem open_port #define open_kmem open_mem #ifdef CONFIG_DEVMEM static const struct file_operations mem_fops = { .llseek = memory_lseek, .read = read_mem, Loading @@ -720,6 +734,7 @@ static const struct file_operations mem_fops = { .open = open_mem, .get_unmapped_area = get_unmapped_area_mem, }; #endif #ifdef CONFIG_DEVKMEM static const struct file_operations kmem_fops = { Loading Loading @@ -782,7 +797,9 @@ static const struct memdev { const struct file_operations *fops; struct backing_dev_info *dev_info; } devlist[] = { #ifdef CONFIG_DEVMEM [1] = { "mem", 0, &mem_fops, &directly_mappable_cdev_bdi }, #endif #ifdef CONFIG_DEVKMEM [2] = { "kmem", 0, &kmem_fops, &directly_mappable_cdev_bdi }, #endif Loading Loading
drivers/char/Kconfig +13 −0 Original line number Diff line number Diff line Loading @@ -6,6 +6,19 @@ menu "Character devices" source "drivers/tty/Kconfig" config DEVMEM bool "Memory device driver" default y help The memory driver provides two character devices, mem and kmem, which provide access to the system's memory. The mem device is a view of physical memory, and each byte in the device corresponds to the matching physical address. The kmem device is the same as mem, but the addresses correspond to the kernel's virtual address space rather than physical memory. These devices are standard parts of a Linux system and most users should say Y here. You might say N if very security conscience or memory is tight. config DEVKMEM bool "/dev/kmem virtual device support" default y Loading
drivers/char/mem.c +17 −0 Original line number Diff line number Diff line Loading @@ -58,6 +58,7 @@ static inline int valid_mmap_phys_addr_range(unsigned long pfn, size_t size) } #endif #if defined(CONFIG_DEVMEM) || defined(CONFIG_DEVKMEM) #ifdef CONFIG_STRICT_DEVMEM static inline int range_is_allowed(unsigned long pfn, unsigned long size) { Loading @@ -83,7 +84,9 @@ static inline int range_is_allowed(unsigned long pfn, unsigned long size) return 1; } #endif #endif #ifdef CONFIG_DEVMEM void __weak unxlate_dev_mem_ptr(unsigned long phys, void *addr) { } Loading Loading @@ -216,6 +219,9 @@ static ssize_t write_mem(struct file *file, const char __user *buf, *ppos += written; return written; } #endif /* CONFIG_DEVMEM */ #if defined(CONFIG_DEVMEM) || defined(CONFIG_DEVKMEM) int __weak phys_mem_access_prot_allowed(struct file *file, unsigned long pfn, unsigned long size, pgprot_t *vma_prot) Loading Loading @@ -337,6 +343,7 @@ static int mmap_mem(struct file *file, struct vm_area_struct *vma) } return 0; } #endif /* CONFIG_DEVMEM */ #ifdef CONFIG_DEVKMEM static int mmap_kmem(struct file *file, struct vm_area_struct *vma) Loading Loading @@ -667,6 +674,8 @@ static loff_t null_lseek(struct file *file, loff_t offset, int orig) return file->f_pos = 0; } #if defined(CONFIG_DEVMEM) || defined(CONFIG_DEVKMEM) || defined(CONFIG_DEVPORT) /* * The memory devices use the full 32/64 bits of the offset, and so we cannot * check against negative addresses: they are ok. The return value is weird, Loading Loading @@ -700,10 +709,14 @@ static loff_t memory_lseek(struct file *file, loff_t offset, int orig) return ret; } #endif #if defined(CONFIG_DEVMEM) || defined(CONFIG_DEVKMEM) || defined(CONFIG_DEVPORT) static int open_port(struct inode *inode, struct file *filp) { return capable(CAP_SYS_RAWIO) ? 0 : -EPERM; } #endif #define zero_lseek null_lseek #define full_lseek null_lseek Loading @@ -712,6 +725,7 @@ static int open_port(struct inode *inode, struct file *filp) #define open_mem open_port #define open_kmem open_mem #ifdef CONFIG_DEVMEM static const struct file_operations mem_fops = { .llseek = memory_lseek, .read = read_mem, Loading @@ -720,6 +734,7 @@ static const struct file_operations mem_fops = { .open = open_mem, .get_unmapped_area = get_unmapped_area_mem, }; #endif #ifdef CONFIG_DEVKMEM static const struct file_operations kmem_fops = { Loading Loading @@ -782,7 +797,9 @@ static const struct memdev { const struct file_operations *fops; struct backing_dev_info *dev_info; } devlist[] = { #ifdef CONFIG_DEVMEM [1] = { "mem", 0, &mem_fops, &directly_mappable_cdev_bdi }, #endif #ifdef CONFIG_DEVKMEM [2] = { "kmem", 0, &kmem_fops, &directly_mappable_cdev_bdi }, #endif Loading