From: Alessandro Carminati Refactor selected /dev/mem helpers to allow access from KUnit tests. This change: - makes page_is_allowed(), read_mem(), and write_mem() visible when KUnit is enabled - moves shared declarations into a new internal header - preserves existing behavior for non-KUnit builds Signed-off-by: Alessandro Carminati --- drivers/char/mem.c | 15 +++++++++++---- drivers/char/mem.h | 17 +++++++++++++++++ 2 files changed, 28 insertions(+), 4 deletions(-) create mode 100644 drivers/char/mem.h diff --git a/drivers/char/mem.c b/drivers/char/mem.c index 9aa589ea2ef5..f1d0a2c11819 100644 --- a/drivers/char/mem.c +++ b/drivers/char/mem.c @@ -31,6 +31,10 @@ #include #include +#include + +#include "mem.h" + #define DEVMEM_MINOR 1 #define DEVPORT_MINOR 4 @@ -57,16 +61,17 @@ static inline int valid_mmap_phys_addr_range(unsigned long pfn, size_t size) #endif #ifdef CONFIG_STRICT_DEVMEM -static inline int page_is_allowed(unsigned long pfn) +INLINE_VISIBLE_IF_KUNIT int page_is_allowed(unsigned long pfn) { return devmem_is_allowed(pfn); } #else -static inline int page_is_allowed(unsigned long pfn) +INLINE_VISIBLE_IF_KUNIT int page_is_allowed(unsigned long pfn) { return 1; } #endif +EXPORT_SYMBOL_IF_KUNIT(page_is_allowed); static inline bool should_stop_iteration(void) { @@ -104,7 +109,7 @@ static inline bool should_stop_iteration(void) * * %-ENOMEM - out of memory error for auxiliary kernel buffers supporting * the operation of copying content from the physical pages */ -static ssize_t read_mem(struct file *file, char __user *buf, +VISIBLE_IF_KUNIT ssize_t read_mem(struct file *file, char __user *buf, size_t count, loff_t *ppos) { phys_addr_t p = *ppos; @@ -190,6 +195,7 @@ static ssize_t read_mem(struct file *file, char __user *buf, kfree(bounce); return err; } +EXPORT_SYMBOL_IF_KUNIT(read_mem); /** * write_mem - write to physical memory (/dev/mem). @@ -234,7 +240,7 @@ static ssize_t read_mem(struct file *file, char __user *buf, * be copied from user-space * * %-EPERM - access to any of the required pages is not allowed */ -static ssize_t write_mem(struct file *file, const char __user *buf, +VISIBLE_IF_KUNIT ssize_t write_mem(struct file *file, const char __user *buf, size_t count, loff_t *ppos) { phys_addr_t p = *ppos; @@ -306,6 +312,7 @@ static ssize_t write_mem(struct file *file, const char __user *buf, *ppos += written; return written; } +EXPORT_SYMBOL_IF_KUNIT(write_mem); int __weak phys_mem_access_prot_allowed(struct file *file, unsigned long pfn, unsigned long size, pgprot_t *vma_prot) diff --git a/drivers/char/mem.h b/drivers/char/mem.h new file mode 100644 index 000000000000..dfeb5f1d5ec8 --- /dev/null +++ b/drivers/char/mem.h @@ -0,0 +1,17 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* + * Copyright (C) 2025 Red Hat inc Alessandro Carminati + */ + +#ifndef _LINUX_CHAR_MEM_H +#define _LINUX_CHAR_MEM_H + +#if IS_ENABLED(CONFIG_KUNIT) +ssize_t read_mem(struct file *file, char __user *buf, + size_t count, loff_t *ppos); +ssize_t write_mem(struct file *file, const char __user *buf, + size_t count, loff_t *ppos); +int page_is_allowed(unsigned long pfn); +#endif + +#endif /* _LINUX_CHAR_MEM_H */ -- 2.48.1