[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-ID: <20240102061700.3807-1-rdunlap@infradead.org>
Date: Mon, 1 Jan 2024 22:17:00 -0800
From: Randy Dunlap <rdunlap@...radead.org>
To: linux-kernel@...r.kernel.org
Cc: Randy Dunlap <rdunlap@...radead.org>,
Thomas Gleixner <tglx@...utronix.de>,
x86@...nel.org,
Jonathan Corbet <corbet@....net>,
linux-doc@...r.kernel.org
Subject: [RFC PATCH] kernel-doc: handle X86 DEFINE_IDTENTRY() variants
Teach scripts/kernel-doc to handle the various DEFINE_IDTENTRY*() flavors.
This corrects 2 kernel-doc warnings:
arch/x86/entry/common.c:211: warning: expecting prototype for int80_emulation(). Prototype was for DEFINE_IDTENTRY_RAW() instead
arch/x86/kernel/apic/apic.c:2170: warning: expecting prototype for spurious_interrupt(). Prototype was for DEFINE_IDTENTRY_IRQ() instead
The script uses 'uname -m' to determine if it is running on i386 or x86_64
or something else. It also uses "ARCH=<arch>" in the environment variables
to allow for overriding the processed ARCH.
Alternatively, we could remove the "/**" kernel-doc markers from those
2 functions. There are 60 uses of DEFINE_IDTENTRY*() that I see and
only 2 of them have kernel-doc comments.
Signed-off-by: Randy Dunlap <rdunlap@...radead.org>
Cc: Thomas Gleixner <tglx@...utronix.de>
Cc: x86@...nel.org
Cc: Jonathan Corbet <corbet@....net>
Cc: linux-doc@...r.kernel.org
---
scripts/kernel-doc | 87 +++++++++++++++++++++++++++++++++++++++++++
1 file changed, 87 insertions(+)
diff -- a/scripts/kernel-doc b/scripts/kernel-doc
--- a/scripts/kernel-doc
+++ b/scripts/kernel-doc
@@ -128,6 +128,7 @@ if ($#ARGV == -1) {
my $kernelversion;
my ($sphinx_major, $sphinx_minor, $sphinx_patch);
+my ($arch, $arch_is_x86, $arch_x86_64);
my $dohighlight = "";
@@ -439,6 +440,31 @@ sub get_kernel_version() {
return $version;
}
+# get the environment ARCH and x86 flavor
+sub get_arch() {
+
+ my $uname = `uname -m`;
+ chomp($uname);
+ $uname =~ s/i.86/i386/;
+ if ($uname eq "x86") {
+ $uname = "x86_64";
+ }
+
+ # allow ENV ARCH to override uname -m
+ if (defined($ENV{'ARCH'})) {
+ $arch = $ENV{'ARCH'};
+ if ($arch eq "i386" || $arch eq "x86_64") {
+ # use that
+ } else {
+ $arch = $uname;
+ }
+ } else {
+ $arch = $uname;
+ }
+ $arch_is_x86 = ($arch eq "i386") || ($arch eq "x86_64");
+ $arch_x86_64 = $arch eq "x86_64";
+}
+
#
sub print_lineno {
my $lineno = shift;
@@ -1867,6 +1893,62 @@ sub tracepoint_munge($) {
}
}
+# idtentry_munge() is only for x86 and can be different for i386 vs. x86_64.
+sub idtentry_munge($) {
+ my $file = shift;
+ my $idtentryname = "";
+ my $idtentryargs = "void";
+ $prototype =~ s/^\s+|\s+$//g; # remove both leading and trailing whitespace
+
+ if ($prototype =~ m/DEFINE_IDTENTRY\((.*?)\)/) {
+ $idtentryname = $1;
+ $idtentryargs = "struct pt_regs *regs";
+ } elsif ($prototype =~ m/DEFINE_IDTENTRY_ERRORCODE\((.*?)\)/) {
+ $idtentryname = $1;
+ $idtentryargs = "struct pt_regs *regs, unsigned long error_code";
+ } elsif ($prototype =~ m/DEFINE_IDTENTRY_RAW\((.*?)\)/) {
+ $idtentryname = $1;
+ $idtentryargs = "struct pt_regs *regs";
+ } elsif ($prototype =~ m/DEFINE_IDTENTRY_RAW_ERRORCODE\((.*?)\)/) {
+ $idtentryname = $1;
+ $idtentryargs = "struct pt_regs *regs, unsigned long error_code";
+ } elsif ($prototype =~ m/DEFINE_IDTENTRY_IRQ\((.*?)\)/) {
+ $idtentryname = $1;
+ $idtentryargs = "struct pt_regs *regs, u32 vector";
+ } elsif ($prototype =~ m/DEFINE_IDTENTRY_SYSVEC\((.*?)\)/) {
+ $idtentryname = $1;
+ $idtentryargs = "struct pt_regs *regs";
+ } elsif ($prototype =~ m/DEFINE_IDTENTRY_SYSVEC_SIMPLE\((.*?)\)/) {
+ $idtentryname = $1;
+ $idtentryargs = "struct pt_regs *regs";
+ } elsif ($prototype =~ m/DEFINE_IDTENTRY_IST\((.*?)\)/) { # same as _RAW
+ $idtentryname = $1;
+ $idtentryargs = "struct pt_regs *regs";
+ } elsif ($prototype =~ m/DEFINE_IDTENTRY_NOIST\((.*?)\)/) { # same as _RAW
+ $idtentryname = "noist_" . $1;
+ $idtentryargs = "struct pt_regs *regs";
+ } elsif ($prototype =~ m/DEFINE_IDTENTRY_DF\((.*?)\)/) { # same as _RAW_ERRORCODE
+ $idtentryname = $1;
+ $idtentryargs = $arch_x86_64 ? "struct pt_regs *regs, unsigned long error_code"
+ : "struct pt_regs *regs, unsigned long error_code, unsigned long address";
+ } elsif ($prototype =~ m/DEFINE_IDTENTRY_VC_KERNEL\((.*?)\)/) { # same as _RAW_ERRORCODE
+ $idtentryname = $1;
+ $idtentryargs = "struct pt_regs *regs, unsigned long error_code";
+ } elsif ($prototype =~ m/DEFINE_IDTENTRY_VC_USER\((.*?)\)/) { # same as _RAW_ERRORCODE
+ $idtentryname = $1;
+ $idtentryargs = "struct pt_regs *regs, unsigned long error_code";
+ }
+
+ $idtentryname =~ s/^\s+//; #strip leading whitespace
+ if ($idtentryname eq "") {
+ emit_warning("${file}:$.", "Unrecognized IDTENTRY macro: \n".
+ "$prototype\n");
+ } else {
+ $prototype = "void $idtentryname($idtentryargs)";
+ $identifier = "$idtentryname";
+ }
+}
+
sub syscall_munge() {
my $void = 0;
@@ -1931,6 +2013,9 @@ sub process_proto_function($$) {
{
tracepoint_munge($file);
}
+ if ($arch_is_x86 && $prototype =~ /DEFINE_IDTENTRY/) {
+ idtentry_munge($file);
+ }
dump_function($prototype, $file);
reset_state();
}
@@ -2374,6 +2459,8 @@ if ($output_mode eq "rst") {
$kernelversion = get_kernel_version();
+get_arch();
+
# generate a sequence of code that will splice in highlighting information
# using the s// operator.
for (my $k = 0; $k < @highlights; $k++) {
Powered by blists - more mailing lists