* [PATCH v3 1/3] x86/tools: objdump_reformat.awk: Ensure regex matches fwait
2023-11-29 22:17 [PATCH v3 0/3] x86: Support llvm-objdump in instruction decoder selftest Nathan Chancellor
@ 2023-11-29 22:17 ` Nathan Chancellor
2023-11-29 22:17 ` [PATCH v3 2/3] x86/tools: objdump_reformat.awk: Allow for spaces Nathan Chancellor
2023-11-29 22:17 ` [PATCH v3 3/3] x86/tools: Remove chkobjdump.awk Nathan Chancellor
2 siblings, 0 replies; 4+ messages in thread
From: Nathan Chancellor @ 2023-11-29 22:17 UTC (permalink / raw)
To: tglx, mingo, bp, dave.hansen
Cc: x86, ndesaulniers, keescook, samuelzeter, mhiramat, linux-kernel,
llvm, patches, Nathan Chancellor
From: Samuel Zeter <samuelzeter@gmail.com>
If there is "wait" mnemonic in the line being parsed, it is incorrectly
handled by the script, and an extra line of "fwait" in
objdump_reformat's output is inserted. As insn_decoder_test relies upon
the formatted output, the test fails.
This is reproducible when disassembling with llvm-objdump:
Pre-processed lines:
ffffffff81033e72: 9b wait
ffffffff81033e73: 48 c7 c7 89 50 42 82 movq
After objdump_reformat.awk:
ffffffff81033e72: 9b fwait
ffffffff81033e72: wait
ffffffff81033e73: 48 c7 c7 89 50 42 82 movq
The regex match now accepts spaces or tabs, along with the "fwait"
instruction.
Closes: https://github.com/ClangBuiltLinux/linux/issues/1364
Acked-by: Masami Hiramatsu <mhiramat@kernel.org>
Tested-by: Nathan Chancellor <nathan@kernel.org>
Reviewed-by: Kees Cook <keescook@chromium.org>
Tested-by: Kees Cook <keescook@chromium.org>
Signed-off-by: Samuel Zeter <samuelzeter@gmail.com>
Signed-off-by: Nathan Chancellor <nathan@kernel.org>
---
arch/x86/tools/objdump_reformat.awk | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/arch/x86/tools/objdump_reformat.awk b/arch/x86/tools/objdump_reformat.awk
index f418c91b71f0..276e572a6f60 100644
--- a/arch/x86/tools/objdump_reformat.awk
+++ b/arch/x86/tools/objdump_reformat.awk
@@ -12,7 +12,7 @@ BEGIN {
prev_hex = ""
prev_mnemonic = ""
bad_expr = "(\\(bad\\)|^rex|^.byte|^rep(z|nz)$|^lock$|^es$|^cs$|^ss$|^ds$|^fs$|^gs$|^data(16|32)$|^addr(16|32|64))"
- fwait_expr = "^9b "
+ fwait_expr = "^9b[ \t]*fwait"
fwait_str="9b\tfwait"
}
--
2.43.0
^ permalink raw reply related [flat|nested] 4+ messages in thread* [PATCH v3 2/3] x86/tools: objdump_reformat.awk: Allow for spaces
2023-11-29 22:17 [PATCH v3 0/3] x86: Support llvm-objdump in instruction decoder selftest Nathan Chancellor
2023-11-29 22:17 ` [PATCH v3 1/3] x86/tools: objdump_reformat.awk: Ensure regex matches fwait Nathan Chancellor
@ 2023-11-29 22:17 ` Nathan Chancellor
2023-11-29 22:17 ` [PATCH v3 3/3] x86/tools: Remove chkobjdump.awk Nathan Chancellor
2 siblings, 0 replies; 4+ messages in thread
From: Nathan Chancellor @ 2023-11-29 22:17 UTC (permalink / raw)
To: tglx, mingo, bp, dave.hansen
Cc: x86, ndesaulniers, keescook, samuelzeter, mhiramat, linux-kernel,
llvm, patches, Nathan Chancellor
From: Samuel Zeter <samuelzeter@gmail.com>
GNU objdump and LLVM objdump have differing output formats.
Specifically, GNU objump will format its output as: address:<tab>hex,
whereas LLVM objdump displays its output as address:<space>hex.
objdump_reformat.awk incorrectly handles this discrepancy due to
the unexpected space and as a result insn_decoder_test fails, as
its input is garbled.
The instruction line being tokenized now handles a space and colon,
or tab delimiter.
Closes: https://github.com/ClangBuiltLinux/linux/issues/1364
Acked-by: Masami Hiramatsu <mhiramat@kernel.org>
Tested-by: Nathan Chancellor <nathan@kernel.org>
Reviewed-by: Kees Cook <keescook@chromium.org>
Tested-by: Kees Cook <keescook@chromium.org>
Signed-off-by: Samuel Zeter <samuelzeter@gmail.com>
Signed-off-by: Nathan Chancellor <nathan@kernel.org>
---
arch/x86/tools/objdump_reformat.awk | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/arch/x86/tools/objdump_reformat.awk b/arch/x86/tools/objdump_reformat.awk
index 276e572a6f60..a4120d907277 100644
--- a/arch/x86/tools/objdump_reformat.awk
+++ b/arch/x86/tools/objdump_reformat.awk
@@ -22,7 +22,7 @@ BEGIN {
}
/^ *[0-9a-f]+:/ {
- if (split($0, field, "\t") < 3) {
+ if (split($0, field, /: |\t/) < 3) {
# This is a continuation of the same insn.
prev_hex = prev_hex field[2]
} else {
--
2.43.0
^ permalink raw reply related [flat|nested] 4+ messages in thread* [PATCH v3 3/3] x86/tools: Remove chkobjdump.awk
2023-11-29 22:17 [PATCH v3 0/3] x86: Support llvm-objdump in instruction decoder selftest Nathan Chancellor
2023-11-29 22:17 ` [PATCH v3 1/3] x86/tools: objdump_reformat.awk: Ensure regex matches fwait Nathan Chancellor
2023-11-29 22:17 ` [PATCH v3 2/3] x86/tools: objdump_reformat.awk: Allow for spaces Nathan Chancellor
@ 2023-11-29 22:17 ` Nathan Chancellor
2 siblings, 0 replies; 4+ messages in thread
From: Nathan Chancellor @ 2023-11-29 22:17 UTC (permalink / raw)
To: tglx, mingo, bp, dave.hansen
Cc: x86, ndesaulniers, keescook, samuelzeter, mhiramat, linux-kernel,
llvm, patches, Nathan Chancellor
This check is superfluous now that the minimum version of binutils to
build the kernel is 2.25. This also fixes an error seen with
llvm-objdump because it does not support '-v' prior to LLVM 13:
llvm-objdump: error: unknown argument '-v'
Closes: https://github.com/ClangBuiltLinux/linux/issues/1362
Link: https://github.com/llvm/llvm-project/commit/dde24a87c55f82d8c7b3bf3eafb10f2b9b2b9a01
Reviewed-by: Kees Cook <keescook@chromium.org>
Tested-by: Kees Cook <keescook@chromium.org>
Signed-off-by: Nathan Chancellor <nathan@kernel.org>
---
arch/x86/tools/Makefile | 2 +-
arch/x86/tools/chkobjdump.awk | 34 ----------------------------------
2 files changed, 1 insertion(+), 35 deletions(-)
diff --git a/arch/x86/tools/Makefile b/arch/x86/tools/Makefile
index 90e820ac9771..7278e2545c35 100644
--- a/arch/x86/tools/Makefile
+++ b/arch/x86/tools/Makefile
@@ -17,7 +17,7 @@ reformatter = $(srctree)/arch/x86/tools/objdump_reformat.awk
chkobjdump = $(srctree)/arch/x86/tools/chkobjdump.awk
quiet_cmd_posttest = TEST $@
- cmd_posttest = ($(OBJDUMP) -v | $(AWK) -f $(chkobjdump)) || $(OBJDUMP) -d -j .text $(objtree)/vmlinux | $(AWK) -f $(reformatter) | $(obj)/insn_decoder_test $(posttest_64bit) $(posttest_verbose)
+ cmd_posttest = $(OBJDUMP) -d -j .text $(objtree)/vmlinux | $(AWK) -f $(reformatter) | $(obj)/insn_decoder_test $(posttest_64bit) $(posttest_verbose)
quiet_cmd_sanitytest = TEST $@
cmd_sanitytest = $(obj)/insn_sanity $(posttest_64bit) -m 1000000
diff --git a/arch/x86/tools/chkobjdump.awk b/arch/x86/tools/chkobjdump.awk
deleted file mode 100644
index a4cf678cf5c8..000000000000
--- a/arch/x86/tools/chkobjdump.awk
+++ /dev/null
@@ -1,34 +0,0 @@
-# GNU objdump version checker
-#
-# Usage:
-# objdump -v | awk -f chkobjdump.awk
-BEGIN {
- # objdump version 2.19 or later is OK for the test.
- od_ver = 2;
- od_sver = 19;
-}
-
-/^GNU objdump/ {
- verstr = ""
- gsub(/\(.*\)/, "");
- for (i = 3; i <= NF; i++)
- if (match($(i), "^[0-9]")) {
- verstr = $(i);
- break;
- }
- if (verstr == "") {
- printf("Warning: Failed to find objdump version number.\n");
- exit 0;
- }
- split(verstr, ver, ".");
- if (ver[1] > od_ver ||
- (ver[1] == od_ver && ver[2] >= od_sver)) {
- exit 1;
- } else {
- printf("Warning: objdump version %s is older than %d.%d\n",
- verstr, od_ver, od_sver);
- print("Warning: Skipping posttest.");
- # Logic is inverted, because we just skip test without error.
- exit 0;
- }
-}
--
2.43.0
^ permalink raw reply related [flat|nested] 4+ messages in thread