[PATCH v9 14/24] s390/tools: Use arm64 headers
Steffen Eiden
seiden at linux.ibm.com
Wed Sep 30 10:34:29 PDT 2026
Introduce a flexible system for sharing ARM64 headers with s390 KVM.
Selected arm64 headers or snippet of headers will be reachable by s390
code through asm/header.h.
Add copy-arm64h.awk that detects ARM64_S390_COMMON markers and extracts
marked section into a generated header consumable by s390. Falls back to
full file copy when no markers are found.
Transform copied includes by replacing '#include <asm/...>' with
'#include <arm64/...>' and similar for uapi headers to ensure
correct path resolution on s390 and allow for a clear separation of s390
asm headers and arm64 asm headers.
Integrate this extraction into the s390/kapi target, conditional on
CONFIG_KVM.
Signed-off-by: Steffen Eiden <seiden at linux.ibm.com>
---
arch/s390/include/uapi/Kbuild | 6 ++
arch/s390/tools/Makefile | 6 +-
arch/s390/tools/Makefile.arm64h | 55 ++++++++++++++++++
arch/s390/tools/copy-arm64h-full.awk | 50 +++++++++++++++++
arch/s390/tools/copy-arm64h.awk | 83 ++++++++++++++++++++++++++++
5 files changed, 199 insertions(+), 1 deletion(-)
create mode 100644 arch/s390/include/uapi/Kbuild
create mode 100644 arch/s390/tools/Makefile.arm64h
create mode 100644 arch/s390/tools/copy-arm64h-full.awk
create mode 100644 arch/s390/tools/copy-arm64h.awk
diff --git a/arch/s390/include/uapi/Kbuild b/arch/s390/include/uapi/Kbuild
new file mode 100644
index 000000000000..81dcaaf42c40
--- /dev/null
+++ b/arch/s390/include/uapi/Kbuild
@@ -0,0 +1,6 @@
+# SPDX-License-Identifier: GPL-2.0
+
+# The ARM64 uapi headers under generated/uapi/arm64/ are private copies used
+# internally by the s390 KVM ARM64 implementation. They contain #line
+# directives and rewritten include paths and must not be shipped to userspace.
+no-export-headers += arm64/%
diff --git a/arch/s390/tools/Makefile b/arch/s390/tools/Makefile
index f2862364fb42..d0aa7e076bad 100644
--- a/arch/s390/tools/Makefile
+++ b/arch/s390/tools/Makefile
@@ -3,12 +3,16 @@
# Makefile for s390 specific build tools
#
+include $(srctree)/arch/s390/tools/Makefile.arm64h
+
kapi := arch/$(ARCH)/include/generated/asm
kapi-hdrs-y := $(kapi)/facility-defs.h $(kapi)/dis-defs.h
+kapi-hdrs-$(CONFIG_KVM) += $(ARM64_TARGETS)
+
PHONY += kapi
-kapi: $(kapi-hdrs-y)
+kapi: $(kapi-hdrs-y) $(kapi-hdrs-m)
hostprogs += gen_facilities
hostprogs += gen_opcode_table
diff --git a/arch/s390/tools/Makefile.arm64h b/arch/s390/tools/Makefile.arm64h
new file mode 100644
index 000000000000..f3f8e9d9bdd8
--- /dev/null
+++ b/arch/s390/tools/Makefile.arm64h
@@ -0,0 +1,55 @@
+# SPDX-License-Identifier: GPL-2.0
+#
+# Share ARM64 headers with s390 KVM
+#
+
+arm64api := $(objtree)/arch/$(ARCH)/include/generated/arm64
+arm64uapi := $(objtree)/arch/$(ARCH)/include/generated/uapi/arm64
+
+# List of ARM64 headers to share with s390 KVM
+# Format: [uapi:]header.h or header-gen.h
+#
+# * header.h - from arch/arm64/include/asm/ to arm64/
+# * uapi:header.h - from arch/arm64/include/uapi/asm/ to uapi/arm64/
+# * header-gen.h - generated as header-gen.h from ARM64 header header.h
+# If a header contains partial markers (#if ARM64_S390_COMMON == 1) only this part will be copied.
+# If the file does not contain any markers the whole file will be copied.
+ARM64_SHARED_HEADERS := \
+ brk-imm.h \
+ esr.h \
+ kvm_arm.h \
+ kvm_emulate-gen.h \
+ kvm_host.h \
+ ptrace-gen.h \
+ sysreg-gen.h \
+ uapi:hwcap.h \
+ uapi:kvm.h \
+ uapi:ptrace.h \
+ uapi:sve_context.h
+
+filechk_gen_arm_hdr = \
+ $(AWK) -f $(src)/copy-arm64h.awk $< || \
+ $(AWK) -f $(src)/copy-arm64h-full.awk $< || \
+ { echo "Error: Unbalanced ARM64_S390_COMMON markers in $<" >&2; exit 1; }
+
+arm64-type = $(firstword $(subst :, ,$(1)))
+arm64-base = $(or $(word 2,$(subst :, ,$(1))),$(1))
+arm64-src-base = $(patsubst %-gen.h,%.h,$(call arm64-base,$(1)))
+
+arm64-src = $(srctree)/arch/arm64/include/$(if $(filter uapi,$(call arm64-type,$(1))),uapi/)asm/$(call arm64-src-base,$(1))
+arm64-dst = $(if $(filter uapi,$(call arm64-type,$(1))),$(arm64uapi),$(arm64api))/$(call arm64-base,$(1))
+
+$(foreach hdr,$(ARM64_SHARED_HEADERS),\
+ $(eval $(call arm64-dst,$(hdr)): $(call arm64-src,$(hdr)) $(src)/copy-arm64h.awk $(src)/copy-arm64h-full.awk FORCE))
+
+ARM64_TARGETS := $(sort $(foreach hdr,$(ARM64_SHARED_HEADERS),$(call arm64-dst,$(hdr))))
+$(ARM64_TARGETS):
+ $(call filechk,gen_arm_hdr)
+
+filechk_gen_sysreg_arm64 = \
+ $(AWK) -f $(srctree)/arch/arm64/tools/gen-sysreg.awk $(srctree)/arch/arm64/tools/sysreg
+
+$(arm64api)/sysreg-defs.h: $(srctree)/arch/arm64/tools/gen-sysreg.awk $(srctree)/arch/arm64/tools/sysreg FORCE
+ $(call filechk,gen_sysreg_arm64)
+
+ARM64_TARGETS += $(arm64api)/sysreg-defs.h
diff --git a/arch/s390/tools/copy-arm64h-full.awk b/arch/s390/tools/copy-arm64h-full.awk
new file mode 100644
index 000000000000..ad7bb98dc4a6
--- /dev/null
+++ b/arch/s390/tools/copy-arm64h-full.awk
@@ -0,0 +1,50 @@
+#!/usr/bin/awk -f
+# SPDX-License-Identifier: GPL-2.0
+#
+# Process entire ARM64 headers for sharing with s390 KVM
+#
+# Usage: copy-arm64h-full.awk <input_file>
+#
+# This processes the entire file (unlike copy-arm64h.awk which only extracts marked sections)
+
+BEGIN {
+ max_guard_line = 25
+ guard_found = 0
+ header_added = 0
+}
+
+# Find and process the include guard in the first few lines
+NR <= max_guard_line && !guard_found && /^#ifndef [A-Z_0-9]+$/ {
+ guard_name = $2
+ guard_found = 1
+ print "/* This header was copied from " FILENAME " */"
+ print ""
+ # Map subsequent lines back to the original ARM64 source file so that
+ # compiler diagnostics point there rather than at the generated copy.
+ print "#line " NR " \"" FILENAME "\""
+ print
+ header_added = 1
+ next
+}
+
+# Transform include directives
+/^#include <uapi\/asm\// {
+ sub(/<uapi\/asm\//, "<uapi/arm64/")
+ print
+ next
+}
+
+/^#include <asm\// {
+ sub(/<asm\//, "<arm64/")
+ print
+ next
+}
+
+/ARM64_S390_COMMON/ {
+ exit 1
+}
+
+# Pass through all other lines
+{
+ print
+}
diff --git a/arch/s390/tools/copy-arm64h.awk b/arch/s390/tools/copy-arm64h.awk
new file mode 100644
index 000000000000..9a338d71bba2
--- /dev/null
+++ b/arch/s390/tools/copy-arm64h.awk
@@ -0,0 +1,83 @@
+#!/usr/bin/awk -f
+# SPDX-License-Identifier: GPL-2.0
+#
+# Extract marked sections from ARM64 headers for sharing with s390 KVM
+#
+# Usage: copy-arm64h.awk <input_file>
+#
+# Extracts all sections between start/end markers. If no markers found, signals for fallback.
+BEGIN {
+ # Constants
+ start_pattern = "^#if ARM64_S390_COMMON == 1$"
+ end_pattern = "^#endif \\/\\* ARM64_S390_COMMON == 1 \\*\\/$"
+ max_guard_line = 25
+
+ # State variables
+ copying = found_marker = error = 0
+ guard_name = ""
+ file_header_done = 0
+ depth = 0
+}
+
+NR <= max_guard_line && !guard_name && /^#ifndef [A-Za-z0-9_]+$/ {
+ guard_name = $2
+ next
+}
+
+NR > max_guard_line && !guard_name && !file_header_done {
+ print "error: no include guard found in first " max_guard_line " lines" > "/dev/stderr"
+ file_header_done = 1
+ error = 1; exit
+}
+
+$0 ~ start_pattern {
+ if (copying) { error = 1; exit }
+ if (!found_marker) {
+ print "/*"
+ print " * This header was automatically generated from " FILENAME
+ print " * Do not modify this file directly."
+ print " */"
+ print "#ifndef " guard_name
+ print "#define " guard_name
+ print ""
+ }
+ depth = copying= found_marker = 1
+ # Map subsequent lines back to the original ARM64 source file so that
+ # compiler diagnostics point there rather than at the generated copy.
+ print "#line " (NR + 1) " \"" FILENAME "\""
+ next
+}
+
+guard_name && !found_marker {
+ next
+}
+
+$0 ~ /^[ \t]*#[ \t]*endif/ {
+ depth--
+ if (depth == 0) {
+ if ($0 ~ end_pattern ) {
+ copying = 0
+ next
+ }
+ error = 1; exit
+ }
+}
+
+/ARM64_S390_COMMON/ { error = 1; exit }
+
+copying {
+ if ($0 ~ /^[ \t]*#[ \t]*if(def|ndef)?([ \t]|$)/) depth++
+ gsub(/#include <asm\//, "#include <arm64/")
+ gsub(/#include <uapi\/asm\//, "#include <uapi/arm64/")
+ print
+ next
+}
+
+END {
+ if (error) exit 1
+ if (found_marker) {
+ print ""
+ print "#endif /* " guard_name " */"
+ }
+ exit !found_marker || copying
+}
--
2.53.0
More information about the linux-arm-kernel
mailing list