[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
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
@@ -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)
@@ -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