From a1e03bc3bd0e322d8ae01aee2399bae689916add Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kai=20L=C3=BCke?= Date: Wed, 18 Sep 2019 23:16:50 +0200 Subject: [PATCH] Revert "Remove arm64 from supported board operations" This reverts commit 2467923d56134683a0fd4c58808cd361ea1f855c. --- build_library/build_image_util.sh | 9 +++++++++ build_library/check_root | 32 +++++++++++++++++++++++++++++-- build_library/ebuild_aci_util.sh | 1 + build_library/grub.cfg | 19 ++++++++++++++---- build_library/grub_install.sh | 26 +++++++++++++++++++++++++ build_library/oem_aci_util.sh | 1 + build_library/prod_image_util.sh | 7 +++++-- build_library/qemu_template.sh | 17 ++++++++++++++++ build_library/set_lsb_release | 5 +++++ build_library/vm_image_util.sh | 17 ++++++++++++++++ check_out_of_date.py | 8 +++++--- common.sh | 16 ++++++++++++++++ image_inject_bootchain | 2 ++ oem/openstack/glance_load.sh | 3 +++ setup_board | 2 +- 15 files changed, 153 insertions(+), 12 deletions(-) diff --git a/build_library/build_image_util.sh b/build_library/build_image_util.sh index 70603c9830..3dde0d6ec1 100755 --- a/build_library/build_image_util.sh +++ b/build_library/build_image_util.sh @@ -103,6 +103,8 @@ generate_update() { run_ldconfig() { local root_fs_dir=$1 case ${ARCH} in + arm64) + sudo qemu-aarch64 "${root_fs_dir}"/usr/sbin/ldconfig -r "${root_fs_dir}";; x86|amd64) sudo ldconfig -r "${root_fs_dir}";; *) @@ -113,6 +115,8 @@ run_ldconfig() { run_localedef() { local root_fs_dir="$1" loader=() case ${ARCH} in + arm64) + loader=( qemu-aarch64 -L "${root_fs_dir}" );; amd64) loader=( "${root_fs_dir}/usr/lib64/ld-linux-x86-64.so.2" \ --library-path "${root_fs_dir}/usr/lib64" );; @@ -456,6 +460,7 @@ finish_image() { # Only enable rootfs verification on supported boards. case "${FLAGS_board}" in amd64-usr) verity_offset=64 ;; + arm64-usr) verity_offset=512 ;; *) disable_read_write=${FLAGS_FALSE} ;; esac @@ -527,6 +532,7 @@ EOF # Magic alert! Root hash injection works by writing the hash value to a # known unused SHA256-sized location in the kernel image. # For amd64 the rdev error message is used. + # For arm64 an area between the EFI headers and the kernel text is used. # Our modified GRUB extracts the hash and adds it to the cmdline. printf %s "$(cat ${BUILD_DIR}/${image_name%.bin}_verity.txt)" | \ sudo dd of="${root_fs_dir}/boot/flatcar/vmlinuz-a" conv=notrunc \ @@ -564,6 +570,9 @@ EOF if [[ "${install_grub}" -eq 1 ]]; then local target local target_list="i386-pc x86_64-efi x86_64-xen" + if [[ ${BOARD} == "arm64-usr" ]]; then + target_list="arm64-efi" + fi local grub_args=() if [[ ${disable_read_write} -eq ${FLAGS_TRUE} ]]; then grub_args+=(--verity) diff --git a/build_library/check_root b/build_library/check_root index c3c4ee17a2..f2784460ec 100755 --- a/build_library/check_root +++ b/build_library/check_root @@ -33,7 +33,28 @@ IGNORE_MISSING = { "sys-apps/texinfo": [SonameAtom("x86_64", "libperl.so.5.26")], # https://bugs.gentoo.org/show_bug.cgi?id=554582 - "net-firewall/ebtables": [SonameAtom("x86_64", "libebt_802_3.so"), + "net-firewall/ebtables": [SonameAtom("arm_64", "libebt_802_3.so"), + SonameAtom("arm_64", "libebt_among.so"), + SonameAtom("arm_64", "libebt_arp.so"), + SonameAtom("arm_64", "libebt_arpreply.so"), + SonameAtom("arm_64", "libebt_ip.so"), + SonameAtom("arm_64", "libebt_ip6.so"), + SonameAtom("arm_64", "libebt_limit.so"), + SonameAtom("arm_64", "libebt_log.so"), + SonameAtom("arm_64", "libebt_mark.so"), + SonameAtom("arm_64", "libebt_mark_m.so"), + SonameAtom("arm_64", "libebt_nat.so"), + SonameAtom("arm_64", "libebt_nflog.so"), + SonameAtom("arm_64", "libebt_pkttype.so"), + SonameAtom("arm_64", "libebt_redirect.so"), + SonameAtom("arm_64", "libebt_standard.so"), + SonameAtom("arm_64", "libebt_stp.so"), + SonameAtom("arm_64", "libebt_ulog.so"), + SonameAtom("arm_64", "libebt_vlan.so"), + SonameAtom("arm_64", "libebtable_broute.so"), + SonameAtom("arm_64", "libebtable_filter.so"), + SonameAtom("arm_64", "libebtable_nat.so"), + SonameAtom("x86_64", "libebt_802_3.so"), SonameAtom("x86_64", "libebt_among.so"), SonameAtom("x86_64", "libebt_arp.so"), SonameAtom("x86_64", "libebt_arpreply.so"), @@ -56,7 +77,14 @@ IGNORE_MISSING = { SonameAtom("x86_64", "libebtable_nat.so")], # Ignore the Rust libraries in their own libdir. - "dev-libs/rustlib": [SonameAtom("x86_64", "librustc_data_structures.so"), + "dev-libs/rustlib": [SonameAtom("arm_64", "librustc_data_structures.so"), + SonameAtom("arm_64", "librustc_errors.so"), + SonameAtom("arm_64", "libserialize.so"), + SonameAtom("arm_64", "libstd.so"), + SonameAtom("arm_64", "libsyntax.so"), + SonameAtom("arm_64", "libsyntax_pos.so"), + SonameAtom("arm_64", "libterm.so"), + SonameAtom("x86_64", "librustc_data_structures.so"), SonameAtom("x86_64", "librustc_errors.so"), SonameAtom("x86_64", "libserialize.so"), SonameAtom("x86_64", "libstd.so"), diff --git a/build_library/ebuild_aci_util.sh b/build_library/ebuild_aci_util.sh index 691e35b115..4fc2a5eeff 100644 --- a/build_library/ebuild_aci_util.sh +++ b/build_library/ebuild_aci_util.sh @@ -40,6 +40,7 @@ ebuild_aci_write_manifest() { case "${BOARD}" in amd64-usr) appc_arch=amd64 ;; + arm64-usr) appc_arch=aarch64 ;; *) die_notrace "Cannot map \"${BOARD}\" to an appc arch" ;; esac diff --git a/build_library/grub.cfg b/build_library/grub.cfg index c229cf35cd..90c7675cb4 100644 --- a/build_library/grub.cfg +++ b/build_library/grub.cfg @@ -91,21 +91,32 @@ if [ -z "$linux_console" ]; then terminal_input console serial_com0 terminal_output console serial_com0 elif [ "$grub_platform" = efi ]; then - set linux_console="console=ttyS0,115200n8 console=tty0" + if [ "$grub_cpu" = arm64 ]; then + set linux_console="console=ttyAMA0,115200n8" + else + set linux_console="console=ttyS0,115200n8 console=tty0" + fi elif [ "$grub_platform" = xen ]; then set linux_console="console=hvc0" fi fi +set extra_options="" +if [ "$grub_cpu" = arm64 ]; then + set extra_options="acpi=force" +fi + set suf="" -# UEFI uses linuxefi/initrdefi instead of linux/initrd +# UEFI uses linuxefi/initrdefi instead of linux/initrd except for arm64 if [ "$grub_platform" = efi ]; then - set suf="efi" + if [ "$grub_cpu" != arm64 ]; then + set suf="efi" + fi fi # Assemble the options applicable to all the kernels below -set linux_cmdline="rootflags=rw mount.usrflags=ro consoleblank=0 $linux_root $linux_console $first_boot $randomize_disk_guid $oem $linux_append" +set linux_cmdline="rootflags=rw mount.usrflags=ro consoleblank=0 $linux_root $linux_console $first_boot $randomize_disk_guid $extra_options $oem $linux_append" # Re-implement grub_abort() since no command exposes it. function abort { diff --git a/build_library/grub_install.sh b/build_library/grub_install.sh index 06ca3c57a9..b046e981d0 100755 --- a/build_library/grub_install.sh +++ b/build_library/grub_install.sh @@ -48,6 +48,10 @@ CORE_MODULES=( normal search test fat part_gpt search_fs_uuid gzio search_part_l # Name of the core image, depends on target CORE_NAME= +# Whether the SDK's grub or the board root's grub is used. Once amd64 is +# fixed up the board root's grub will always be used. +BOARD_GRUB=0 + case "${FLAGS_target}" in i386-pc) CORE_MODULES+=( biosdisk serial ) @@ -60,11 +64,21 @@ case "${FLAGS_target}" in x86_64-xen) CORE_NAME="core.elf" ;; + arm64-efi) + CORE_MODULES+=( serial linux efi_gop getenv smbios efinet verify http tftp ) + CORE_NAME="core.efi" + BOARD_GRUB=1 + ;; *) die_notrace "Unknown GRUB target ${FLAGS_target}" ;; esac +if [[ $BOARD_GRUB -eq 1 ]]; then + info "Updating GRUB in ${BOARD_ROOT}" + emerge-${BOARD} --nodeps --select -qugKN sys-boot/grub + GRUB_SRC="${BOARD_ROOT}/usr/lib/grub/${FLAGS_target}" +fi [[ -d "${GRUB_SRC}" ]] || die "GRUB not installed at ${GRUB_SRC}" # In order for grub-setup-bios to properly detect the layout of the disk @@ -216,6 +230,18 @@ case "${FLAGS_target}" in sudo cp "${BUILD_LIBRARY_DIR}/menu.lst" \ "${ESP_DIR}/boot/grub/menu.lst" ;; + arm64-efi) + info "Installing default arm64 UEFI bootloader." + sudo mkdir -p "${ESP_DIR}/EFI/boot" + #FIXME(andrejro): shim not ported to aarch64 + sudo cp "${ESP_DIR}/${GRUB_DIR}/${CORE_NAME}" \ + "${ESP_DIR}/EFI/boot/bootaa64.efi" + if [[ -n "${FLAGS_copy_efi_grub}" ]]; then + # copying from vfat so ignore permissions + cp --no-preserve=mode "${ESP_DIR}/EFI/boot/bootaa64.efi" \ + "${FLAGS_copy_efi_grub}" + fi + ;; esac cleanup diff --git a/build_library/oem_aci_util.sh b/build_library/oem_aci_util.sh index 8cc9a7eca0..90fcd4d700 100644 --- a/build_library/oem_aci_util.sh +++ b/build_library/oem_aci_util.sh @@ -74,6 +74,7 @@ oem_aci_write_manifest() { case "${BOARD}" in amd64-usr) appc_arch=amd64 ;; + arm64-usr) appc_arch=aarch64 ;; *) die_notrace "Cannot map \"${BOARD}\" to an appc arch" ;; esac diff --git a/build_library/prod_image_util.sh b/build_library/prod_image_util.sh index 83400892c6..b3b707381d 100755 --- a/build_library/prod_image_util.sh +++ b/build_library/prod_image_util.sh @@ -85,7 +85,7 @@ create_prod_image() { # Assert that if this is supposed to be an official build that the # official update keys have been used. - if [[ ${COREOS_OFFICIAL:-0} -eq 1 ]]; then + if [[ ${COREOS_OFFICIAL:-0} -eq 1 && "${BOARD}" != arm64-usr ]]; then grep -q official \ "${root_fs_dir}"/var/db/pkg/coreos-base/coreos-au-key-*/USE \ || die_notrace "coreos-au-key is missing the 'official' use flag" @@ -141,8 +141,11 @@ EOF "${BUILD_DIR}/${image_kernel}" "${BUILD_DIR}/${image_pcr_policy}" "${BUILD_DIR}/${image_grub}" - "${BUILD_DIR}/${image_shim}" "${BUILD_DIR}/${image_kconfig}" ) + # FIXME(bgilbert): no shim on arm64 + if [[ -f "${BUILD_DIR}/${image_shim}" ]]; then + to_upload+=("${BUILD_DIR}/${image_shim}") + fi upload_image -d "${BUILD_DIR}/${image_name}.bz2.DIGESTS" "${to_upload[@]}" } diff --git a/build_library/qemu_template.sh b/build_library/qemu_template.sh index 3621956a53..a0c19da20a 100755 --- a/build_library/qemu_template.sh +++ b/build_library/qemu_template.sh @@ -153,6 +153,10 @@ else set -- -machine accel=kvm -cpu host -smp "${VM_NCPUS}" "$@" ;; amd64-usr+*) set -- -machine pc-q35-2.8 -cpu kvm64 -smp 1 -nographic "$@" ;; + arm64-usr+aarch64) + set -- -machine virt,accel=kvm,gic-version=3 -cpu host -smp "${VM_NCPUS}" -nographic "$@" ;; + arm64-usr+*) + set -- -machine virt -cpu cortex-a57 -smp 1 -nographic "$@" ;; *) die "Unsupported arch" ;; esac @@ -173,6 +177,10 @@ if [ -n "${VM_IMAGE}" ]; then case "${VM_BOARD}" in amd64-usr) set -- -drive if=virtio,file="${SCRIPT_DIR}/${VM_IMAGE}" "$@" ;; + arm64-usr) + set -- -drive if=none,id=blk,file="${SCRIPT_DIR}/${VM_IMAGE}" \ + -device virtio-blk-device,drive=blk "$@" + ;; *) die "Unsupported arch" ;; esac fi @@ -215,6 +223,15 @@ case "${VM_BOARD}" in -object rng-random,filename=/dev/urandom,id=rng0 -device virtio-rng-pci,rng=rng0 \ "$@" ;; + arm64-usr) + qemu-system-aarch64 \ + -name "$VM_NAME" \ + -m ${VM_MEMORY} \ + -netdev user,id=eth0,hostfwd=tcp::"${SSH_PORT}"-:22,hostname="${VM_NAME}" \ + -device virtio-net-device,netdev=eth0 \ + -object rng-random,filename=/dev/urandom,id=rng0 -device virtio-rng-pci,rng=rng0 \ + "$@" + ;; *) die "Unsupported arch" ;; esac diff --git a/build_library/set_lsb_release b/build_library/set_lsb_release index bf78837651..3cac245e19 100755 --- a/build_library/set_lsb_release +++ b/build_library/set_lsb_release @@ -31,7 +31,12 @@ OS_ID="flatcar" OS_ID_LIKE="coreos" OS_PRETTY_NAME="$OS_NAME $FLATCAR_VERSION (${OS_CODENAME})" +# temporarily point arm at a different appid until update support +# is completed in update_engine and the CoreUpdate service. FLATCAR_APPID="{e96281a6-d1af-4bde-9a0a-97b76e56dc57}" +if [[ "${FLAGS_board}" == arm64-* ]]; then + FLATCAR_APPID="{103867da-e3a2-4c92-b0b3-7fbd7f7d8b71}" +fi # DISTRIB_* are the standard lsb-release names sudo mkdir -p "${ROOT_FS_DIR}/usr/share/flatcar" "${ROOT_FS_DIR}/etc/flatcar" diff --git a/build_library/vm_image_util.sh b/build_library/vm_image_util.sh index edc4749e5a..83ca63082f 100644 --- a/build_library/vm_image_util.sh +++ b/build_library/vm_image_util.sh @@ -303,6 +303,9 @@ get_default_vm_type() { amd64-usr) echo "qemu" ;; + arm64-usr) + echo "qemu_uefi" + ;; *) return 1 ;; @@ -619,6 +622,7 @@ _write_cpio_disk() { local grub_arch case $BOARD in amd64-usr) grub_arch="x86_64-efi" ;; + arm64-usr) grub_arch="arm64-efi" ;; esac cp "${base_dir}/boot/flatcar/grub/${grub_arch}/core.efi" "${dst_dir}/${grub_name}" @@ -715,6 +719,19 @@ _write_qemu_uefi_conf() { cp "/usr/share/edk2-ovmf/OVMF_CODE.fd" "$(_dst_dir)/${flash_ro}" cp "/usr/share/edk2-ovmf/OVMF_VARS.fd" "$(_dst_dir)/${flash_rw}" ;; + arm64-usr) + # Get edk2 files into local build workspace. + info "Updating edk2 in /build/${BOARD}" + emerge-${BOARD} --nodeps --select -qugKN sys-firmware/edk2 + # Create 64MiB flash device image files. + dd if=/dev/zero bs=1M count=64 of="$(_dst_dir)/${flash_rw}" \ + status=none + cp "/build/${BOARD}/usr/share/edk2/QEMU_EFI.fd" \ + "$(_dst_dir)/${flash_ro}.work" + truncate --reference="$(_dst_dir)/${flash_rw}" \ + "$(_dst_dir)/${flash_ro}.work" + mv "$(_dst_dir)/${flash_ro}.work" "$(_dst_dir)/${flash_ro}" + ;; esac sed -e "s%^VM_PFLASH_RO=.*%VM_PFLASH_RO='${flash_ro}'%" \ diff --git a/check_out_of_date.py b/check_out_of_date.py index f0b99f072c..0f32991cab 100755 --- a/check_out_of_date.py +++ b/check_out_of_date.py @@ -67,11 +67,11 @@ def process_emerge_output(eout): def get_board_packages(board): - """ gets a list of packages used by a board. valid boards are amd64-usr, sdk, and bootstrap""" + """ gets a list of packages used by a board. valid boards are {arm,amd}64-usr, sdk, and bootstrap""" emerge_args = "--emptytree --pretend --verbose --unordered-display" if board == "sdk": cmd = "emerge {} @system sdk-depends sdk-extras".format(emerge_args) - elif board == "amd64-usr": + elif board == "amd64-usr" or board == "arm64-usr": cmd = "emerge-{} {} @system board-packages".format(board, emerge_args) elif board == "bootstrap": pkgs = exec_command_strict("/usr/lib64/catalyst/targets/stage1/build.py") @@ -92,6 +92,7 @@ def print_table(report, head, line_head, line_tail, tail, joiner, pkg_joiner): "upstream": ["Upstream"], "tag": "Tag", "sdk": ["sdk"], + "arm64-usr": ["arm64-usr"], "amd64-usr": ["amd64-usr"], "bootstrap": ["bootstrap"], "modified": "Modified"}) @@ -102,6 +103,7 @@ def print_table(report, head, line_head, line_tail, tail, joiner, pkg_joiner): pkg_joiner.join(entry.get("upstream",[])), entry.get("tag",""), pkg_joiner.join(entry.get("sdk", [])), + pkg_joiner.join(entry.get("arm64-usr", [])), pkg_joiner.join(entry.get("amd64-usr", [])), pkg_joiner.join(entry.get("bootstrap", [])), entry.get("modified","")]) + line_tail) @@ -138,7 +140,7 @@ def main(): subprocess.check_call(["git", "-C", args.upstream_path, "pull"]) pkg_lists = {} - sources = ["sdk", "bootstrap", "amd64-usr", "image"] + sources = ["sdk", "bootstrap", "amd64-usr", "arm64-usr", "image"] for i in sources: pkg_lists[i] = get_board_packages(i) diff --git a/common.sh b/common.sh index 4ad736ca20..5de0a2d359 100644 --- a/common.sh +++ b/common.sh @@ -928,10 +928,19 @@ BOAT } # The binfmt_misc support in the kernel is required. +# The aarch64 binaries should be executed through +# "/usr/bin/qemu-aarch64-static" setup_qemu_static() { local root_fs_dir="$1" case "${BOARD}" in amd64-usr) return 0;; + arm64-usr) + if [[ -f "${root_fs_dir}/sbin/ldconfig" ]]; then + sudo cp /usr/bin/qemu-aarch64 "${root_fs_dir}"/usr/bin/qemu-aarch64-static + else + die "Missing basic layout in target rootfs" + fi + ;; *) die "Unsupported arch" ;; esac } @@ -940,6 +949,13 @@ clean_qemu_static() { local root_fs_dir="$1" case "${BOARD}" in amd64-usr) return 0;; + arm64-usr) + if [[ -f "${root_fs_dir}/usr/bin/qemu-aarch64-static" ]]; then + sudo rm "${root_fs_dir}"/usr/bin/qemu-aarch64-static + else + die "File not found" + fi + ;; *) die "Unsupported arch" ;; esac } diff --git a/image_inject_bootchain b/image_inject_bootchain index 5c768ba86c..721f86da1d 100755 --- a/image_inject_bootchain +++ b/image_inject_bootchain @@ -77,9 +77,11 @@ if [[ -n "${FLAGS_kernel_path}" ]]; then do_copy "${FLAGS_kernel_path}" "/boot/flatcar/vmlinuz-a" fi +# FIXME(bgilbert): no shim on arm64 if [[ -n "${FLAGS_efi_grub_path}" ]]; then case "${BOARD}" in amd64-usr) image_name="grub.efi" ;; + arm64-usr) image_name="bootaa64.efi" ;; *) die "GRUB filename not known for this board" ;; esac diff --git a/oem/openstack/glance_load.sh b/oem/openstack/glance_load.sh index c6810a331f..162753bf6e 100755 --- a/oem/openstack/glance_load.sh +++ b/oem/openstack/glance_load.sh @@ -34,6 +34,9 @@ while [[ $# -gt 0 ]]; do amd64|amd64-usr) board="amd64-usr" ;; + arm64|arm64-usr) + board="arm64-usr" + ;; *) echo "Error: Unknown arg: $1" exit 1 diff --git a/setup_board b/setup_board index 7c7ce16f9b..140a14ac2d 100755 --- a/setup_board +++ b/setup_board @@ -59,7 +59,7 @@ DEFINE_string variant "" \ "Board variant." -# builds wrappers like equery-amd64-usr. +# builds wrappers like equery-arm-generic. # args: # $1: command to wrap # rest: extra arguments to pass to the command