This patch adds a new cmd_errno to convert the include/linux/errno.h content into declare_err! macros for better maintainability and readability. Signed-off-by: Yiyang Wu <toolmanp@xxxxxxx> --- rust/.gitignore | 1 + rust/Makefile | 14 ++++++++++- rust/kernel/error.rs | 58 +++----------------------------------------- 3 files changed, 18 insertions(+), 55 deletions(-) diff --git a/rust/.gitignore b/rust/.gitignore index d3829ffab80b..ba71ef4a9239 100644 --- a/rust/.gitignore +++ b/rust/.gitignore @@ -5,6 +5,7 @@ bindings_helpers_generated.rs doctests_kernel_generated.rs doctests_kernel_generated_kunit.c uapi_generated.rs +errno_generated.rs exports_*_generated.h doc/ test/ diff --git a/rust/Makefile b/rust/Makefile index dd76dc27d666..f5a1680fe59c 100644 --- a/rust/Makefile +++ b/rust/Makefile @@ -22,6 +22,8 @@ always-$(CONFIG_RUST) += exports_alloc_generated.h exports_helpers_generated.h \ always-$(CONFIG_RUST) += uapi/uapi_generated.rs obj-$(CONFIG_RUST) += uapi.o +always-$(CONFIG_RUST) += kernel/errno_generated.rs + ifdef CONFIG_RUST_BUILD_ASSERT_ALLOW obj-$(CONFIG_RUST) += build_error.o else @@ -289,6 +291,15 @@ $(obj)/uapi/uapi_generated.rs: $(src)/uapi/uapi_helper.h \ $(src)/bindgen_parameters FORCE $(call if_changed_dep,bindgen) +quiet_cmd_errno = EXPORTS $@ + cmd_errno = \ + $(CC) $(c_flags) -E -CC -dD $< \ + | sed -E 's/\#define\s*([A-Z0-9]+)\s+([0-9]+)\s+\/\*\s*(.*)\s\*\//declare_err!(\1, "\3.");/' \ + | grep -E '^declare_err.*$$' > $@ + +$(obj)/kernel/errno_generated.rs: $(srctree)/include/linux/errno.h FORCE + $(call if_changed,errno) + # See `CFLAGS_REMOVE_helpers.o` above. In addition, Clang on C does not warn # with `-Wmissing-declarations` (unlike GCC), so it is not strictly needed here # given it is `libclang`; but for consistency, future Clang changes and/or @@ -420,7 +431,8 @@ $(obj)/uapi.o: $(src)/uapi/lib.rs \ $(obj)/kernel.o: private rustc_target_flags = --extern alloc \ --extern build_error --extern macros --extern bindings --extern uapi -$(obj)/kernel.o: $(src)/kernel/lib.rs $(obj)/alloc.o $(obj)/build_error.o \ +$(obj)/kernel.o: $(src)/kernel/lib.rs $(obj)/kernel/errno_generated.rs \ + $(obj)/alloc.o $(obj)/build_error.o \ $(obj)/libmacros.so $(obj)/bindings.o $(obj)/uapi.o FORCE +$(call if_changed_rule,rustc_library) diff --git a/rust/kernel/error.rs b/rust/kernel/error.rs index 6f1587a2524e..bb16b40a8d19 100644 --- a/rust/kernel/error.rs +++ b/rust/kernel/error.rs @@ -23,60 +23,10 @@ macro_rules! declare_err { pub const $err: super::Error = super::Error(-(crate::bindings::$err as i32)); }; } - - declare_err!(EPERM, "Operation not permitted."); - declare_err!(ENOENT, "No such file or directory."); - declare_err!(ESRCH, "No such process."); - declare_err!(EINTR, "Interrupted system call."); - declare_err!(EIO, "I/O error."); - declare_err!(ENXIO, "No such device or address."); - declare_err!(E2BIG, "Argument list too long."); - declare_err!(ENOEXEC, "Exec format error."); - declare_err!(EBADF, "Bad file number."); - declare_err!(ECHILD, "No child processes."); - declare_err!(EAGAIN, "Try again."); - declare_err!(ENOMEM, "Out of memory."); - declare_err!(EACCES, "Permission denied."); - declare_err!(EFAULT, "Bad address."); - declare_err!(ENOTBLK, "Block device required."); - declare_err!(EBUSY, "Device or resource busy."); - declare_err!(EEXIST, "File exists."); - declare_err!(EXDEV, "Cross-device link."); - declare_err!(ENODEV, "No such device."); - declare_err!(ENOTDIR, "Not a directory."); - declare_err!(EISDIR, "Is a directory."); - declare_err!(EINVAL, "Invalid argument."); - declare_err!(ENFILE, "File table overflow."); - declare_err!(EMFILE, "Too many open files."); - declare_err!(ENOTTY, "Not a typewriter."); - declare_err!(ETXTBSY, "Text file busy."); - declare_err!(EFBIG, "File too large."); - declare_err!(ENOSPC, "No space left on device."); - declare_err!(ESPIPE, "Illegal seek."); - declare_err!(EROFS, "Read-only file system."); - declare_err!(EMLINK, "Too many links."); - declare_err!(EPIPE, "Broken pipe."); - declare_err!(EDOM, "Math argument out of domain of func."); - declare_err!(ERANGE, "Math result not representable."); - declare_err!(ERESTARTSYS, "Restart the system call."); - declare_err!(ERESTARTNOINTR, "System call was interrupted by a signal and will be restarted."); - declare_err!(ERESTARTNOHAND, "Restart if no handler."); - declare_err!(ENOIOCTLCMD, "No ioctl command."); - declare_err!(ERESTART_RESTARTBLOCK, "Restart by calling sys_restart_syscall."); - declare_err!(EPROBE_DEFER, "Driver requests probe retry."); - declare_err!(EOPENSTALE, "Open found a stale dentry."); - declare_err!(ENOPARAM, "Parameter not supported."); - declare_err!(EBADHANDLE, "Illegal NFS file handle."); - declare_err!(ENOTSYNC, "Update synchronization mismatch."); - declare_err!(EBADCOOKIE, "Cookie is stale."); - declare_err!(ENOTSUPP, "Operation is not supported."); - declare_err!(ETOOSMALL, "Buffer or request is too small."); - declare_err!(ESERVERFAULT, "An untranslatable error occurred."); - declare_err!(EBADTYPE, "Type not supported by server."); - declare_err!(EJUKEBOX, "Request initiated, but will not complete before timeout."); - declare_err!(EIOCBQUEUED, "iocb queued, will get completion event."); - declare_err!(ERECALLCONFLICT, "Conflict with recalled state."); - declare_err!(ENOGRACE, "NFS file lock reclaim refused."); + include!(concat!( + env!("OBJTREE"), + "/rust/kernel/errno_generated.rs" + )); } /// Generic integer kernel error. -- 2.46.0