blob: 4d1d833a7d386c5f07851245d2bfe62eecba6b6e [file] [log] [blame]
#
# There are multiple ways that CPU architectured can be named.
# KERN_ARCH is what is used when specifying ARCH=xxx when building the
# kernel.
#
# GCE_ARCH is what gets used when setting specifying the architecture
# when creating the GCE image using the --architecture flag
# ARCH (after being canonicalized by this function) is defined by
# the Debian architecture port names[1] and is used internally
# by gce-xfstests and kvm-xfstests. So for example, when we add
# support for support for Power architectures, the ARCH name that should
# be used is ppc64 or ppc64el.
#
function set_my_arch () {
if test -n "${MY_ARCH:=}" ; then
return
fi
local arch=$(uname -m)
case $arch in
aarch64) MY_ARCH=arm64 ;;
i386|i686) MY_ARCH=i386 ;;
x86_64) MY_ARCH=amd64 ;;
*) MY_ARCH=$arch ;;
esac
}
function set_default_arch ()
{
if test -n "${ARCH:=}" ; then
return
fi
if test -n "${DEFAULT_ARCH:=}" ; then
ARCH="$DEFAULT_ARCH"
else
set_my_arch
ARCH="$MY_ARCH"
fi
}
# This function takes as input a user-supplied architecture (which
# generally should be a Debian port name, but users might use
# a $(uname -m) instead.
#
function set_canonicalized_arch () {
case "$1" in
arm64|aarch64)
ARCH="arm64"
GCE_ARCH="ARM64"
KERN_ARCH="arm64"
;;
i386)
ARCH="i386"
GCE_ARCH=""
KERN_ARCH="i386"
;;
x86-64|x86_64|X86_64|amd64)
ARCH="amd64"
GCE_ARCH="X86_64"
KERN_ARCH="x86_64"
;;
riscv64)
ARCH="riscv64"
GCE_ARCH=""
KERN_ARCH="riscv"
;;
*)
echo "Architecture $1 not supported"
exit 1
;;
esac
}
function set_cross_compile ()
{
set_my_arch
case "$ARCH" in
arm64)
if test "$MY_ARCH" != arm64 ; then
CROSS_COMPILE=aarch64-linux-gnu-
fi
;;
esac
}
function get_kernel_file_info () {
local is_gs=
KERNEL_ARCH=
KERNEL_VERSION=
KERNEL="$1"
case "$KERNEL" in
gs://*)
is_gs=yes
;;
esac
if test -n "$is_gs" ; then
local f=$(mktemp --tmpdir gs_stat_XXXXXX)
if gsutil stat "$KERNEL" > "$f" ; then
cat "$f" | sed -e '1,/^ Metadata:/d' | \
sed -e '/^ [A-Z]/,$d' > "$f.new"
mv "$f.new" "$f"
else
rm -f "$f"
exit 1
fi
KERNEL_ARCH=$(cat "$f" | grep arch= | sed -e 's/^ *arch=//' -e 's/: *$//')
KERNEL_VERSION=$(cat "$f" | grep ver= | sed -e 's/^ *ver=//' -e 's/: *$//')
rm -f "$f"
else
if test ! -f "$KERNEL" ; then
echo "get-kernel-arch: file not found: $KERNEL" >&2
exit 1
fi
info=$(file -m "$DIR/util/kernel-magic" "$KERNEL" | sed -e "s;$KERNEL: ;;")
case "$info" in
"Linux kernel"*)
KERNEL_ARCH=$(echo $info | tr A-Z a-z |awk '{print $3}')
d=$(dirname $(dirname $(dirname $(dirname "$KERNEL"))))
if test -f "$d/.git_version" ; then
KERNEL_VERSION=$(cat "$d/.git_version")
fi
if test -f "$d/.config" ; then
if test "$KERNEL_ARCH" = "x86" ; then
KERNEL_ARCH=$(head "$d/.config" | grep "^#.*Kernel Configuration" | \
awk '{print $2}' | sed -e 's;Linux/;;')
if test "$KERNEL_ARCH" = "x86_64" ; then
KERNEL_ARCH=amd64
fi
fi
fi
;;
"Debian binary package"*)
KERNEL_ARCH=$(dpkg -I "$KERNEL" | grep "^ Architecture: " | \
awk '{print $2}')
KERNEL_VERSION=$(dpkg -I "$KERNEL" | grep "^ Version: " | \
awk '{print $2}')
;;
*)
echo "get-kernel-arch $i is not a kernel" >&2
echo "$info"
exit 1
esac
fi
}