[gdb/syscalls] Generate aarch64-linux.xml.in in update-linux-from-src.sh

Message ID 20241126142224.2399-1-tdevries@suse.de
State New
Headers
Series [gdb/syscalls] Generate aarch64-linux.xml.in in update-linux-from-src.sh |

Checks

Context Check Description
linaro-tcwg-bot/tcwg_gdb_build--master-aarch64 success Build passed
linaro-tcwg-bot/tcwg_gdb_build--master-arm success Build passed
linaro-tcwg-bot/tcwg_gdb_check--master-arm success Test passed
linaro-tcwg-bot/tcwg_gdb_check--master-aarch64 success Test passed

Commit Message

Tom de Vries Nov. 26, 2024, 2:22 p.m. UTC
  Currently aarch64-linux.xml.in is skipped by update-linux-from-src.sh:
...
$ ./update-linux-from-src.sh ~/upstream/linux-stable.git/
Skipping aarch64-linux.xml.in, no syscall.tbl
  ...
$
...
and instead we use update-linux.sh.

This works fine, but requires an aarch64 system with recent system headers,
which makes it harder to pick up the latest changes in the linux kernel.

Fix this by updating ./update-linux-from-src.sh to:
- build the linux kernel headers for aarch64
- use update-linux.sh with those headers to generate
  aarch64-linux.xml.in.

Regenerating aarch64-linux.xml.in using current trunk of linux-stable gives me
these changes:
...
+  <syscall name="setxattrat" number="463"/>
+  <syscall name="getxattrat" number="464"/>
+  <syscall name="listxattrat" number="465"/>
+  <syscall name="removexattrat" number="466"/>
...
which are the same changes I see for the other architectures.

Note that the first step, building the linux kernel headers is a cross build
and should work on any architecture.

But the second step, update-linux.sh uses plain gcc rather than a cross-gcc,
so there is scope for problems, but we seem to get away with this on
x86_64-linux.

So, while we could constrain this to only generate aarch64-linux.xml.in on
aarch64-linux, I'm leaving this unconstrained.

For aarch64-linux.xml.in, this doesn't matter much to me because I got an
aarch64-linux system.

But I don't have a longaarch system, and the same approach seems to work
there.  I'm leaving this for follow-up patch though.

Tested on aarch64-linux and x86_64-linux.  Verified with shellcheck.
---
 gdb/syscalls/update-linux-from-src.sh | 50 ++++++++++++++++++++++++++-
 gdb/syscalls/update-linux.sh          |  2 +-
 2 files changed, 50 insertions(+), 2 deletions(-)


base-commit: dfc65d0579444ec020b309637654cbe17cb9dc60
  

Patch

diff --git a/gdb/syscalls/update-linux-from-src.sh b/gdb/syscalls/update-linux-from-src.sh
index d07cbbd9b44..35d78995eaa 100755
--- a/gdb/syscalls/update-linux-from-src.sh
+++ b/gdb/syscalls/update-linux-from-src.sh
@@ -20,6 +20,8 @@ 
 # Used to generate .xml.in files, like so:
 # $ ./update-linux-from-src.sh ~/linux-stable.git
 
+pwd=$(pwd -P)
+
 parse_args ()
 {
     if [ $# -lt 1 ]; then
@@ -36,6 +38,51 @@  parse_args ()
     fi
 }
 
+gen_from_kernel_headers ()
+{
+    local f
+    f="$1"
+    local arch
+    arch="$2"
+
+    echo "Generating $f"
+
+    local tmpdir
+    tmpdir=$(mktemp -d)
+    trap 'rm -Rf $tmpdir/*' EXIT
+
+    local build
+    build="$tmpdir"/build
+    local install
+    install="$tmpdir"/install
+    local usr
+    usr="$install"/usr
+    local include
+    include="$usr"/include
+
+    mkdir -p "$build" "$usr"
+
+    (
+	cd "$build" || exit 1
+
+	make \
+	    -f "$d"/Makefile \
+	    ARCH="$arch" \
+	    INSTALL_HDR_PATH="$usr" \
+	    headers_install \
+	    > "$build"/header_install.log \
+	    2>&1
+
+	"$pwd"/update-linux.sh \
+	    "$pwd"/"$f" \
+	    -nostdinc \
+	    -isystem "$include"
+    )
+
+    trap '' EXIT
+    rm -Rf "$tmpdir"
+}
+
 pre ()
 {
     local f
@@ -274,7 +321,8 @@  regen ()
 	    return
 	    ;;
 	aarch64-linux.xml.in)
-	    echo "Skipping $f, no syscall.tbl"
+	    # No syscall.tbl.
+	    gen_from_kernel_headers "$f" arm64
 	    return
 	    ;;
 	arm-linux.xml.in)
diff --git a/gdb/syscalls/update-linux.sh b/gdb/syscalls/update-linux.sh
index 066572cbec9..127d92192d1 100755
--- a/gdb/syscalls/update-linux.sh
+++ b/gdb/syscalls/update-linux.sh
@@ -67,7 +67,7 @@  EOF
 
     echo '<syscalls_info>'
 
-    echo '#include <sys/syscall.h>' \
+    echo '#include <asm/unistd.h>' \
 	| gcc -E - -dD "$@" \
 	| grep -E '#define __NR_' \
 	| while read -r line; do