diff --git a/boards/chromebook-x64.gni b/boards/chromebook-x64.gni new file mode 100644 index 0000000000000000000000000000000000000000..0419110383fd8de73f5e372c04c3d0d77fca0dfa --- /dev/null +++ b/boards/chromebook-x64.gni @@ -0,0 +1,18 @@ +# Copyright 2019 The Fuchsia Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +target_cpu = "x64" + +board_name = "pc" + +fuchsia_packages = [] + +update_kernels = [ "zbi.signed" ] + +use_vboot = true + +board_packages = [ + # Include all drivers for now. + "garnet/packages/prod/drivers", +] diff --git a/boards/x64.gni b/boards/x64.gni index 19ec223d194755f3d0d016a132c4b1684438bd7c..f9fc00e5b976c987ff71c122d36a1deda3177ab0 100644 --- a/boards/x64.gni +++ b/boards/x64.gni @@ -8,6 +8,8 @@ board_name = "pc" fuchsia_packages = [] +export_x64_sdk_images = true + board_packages = [ # Include all drivers for now. "garnet/packages/prod/drivers", diff --git a/build/images/BUILD.gn b/build/images/BUILD.gn index b7de3305c372da255e7d04035b7b0bb893890807..00549f6a5c3761250d15b0103327c04fcdaa5bf6 100644 --- a/build/images/BUILD.gn +++ b/build/images/BUILD.gn @@ -51,6 +51,9 @@ assert( meta_package_labels != [], "Missing meta_package_labels. Are you using a supported product configuration? " + "Check your args.gn file for an import of a product configuration, and consider " + "using one of the products in the `//products` or `//vendor/*/products` directories.") +assert(custom_signing_script == "" || !use_vboot, + "custom_signing_script and use_vboot cannot be used together!") + board_name_file = "$root_build_dir/board_name" write_file(board_name_file, "${board_name}") @@ -635,7 +638,9 @@ images += [ ] sdk = "fuchsia.zbi" updater = "zbi" - installer = "fuchsia.zbi" + if (!use_vboot) { + installer = "fuchsia.zbi" + } json = { name = "zircon-a" type = "zbi" @@ -646,7 +651,7 @@ images += [ # rebooting in the case we do not mexec a kernel.) bootserver_pave = [ "--boot" ] - if (custom_signing_script == "") { + if (custom_signing_script == "" && !use_vboot) { bootserver_pave += [ "--zircona", # TODO(ZX-2625): `dm reboot-recovery` boots from zircon-b instead of @@ -714,22 +719,36 @@ if (custom_signing_script != "") { }, ] } -} - -# The updater also wants the zedboot zbi as recovery. -images += [ - { +} else if (use_vboot) { + # ChromeOS vboot images. + vboot("signed") { + testonly = true + output_name = "fuchsia.zbi" deps = [ - "zedboot:zbi", - ] - sources = [ - "$root_out_dir/zedboot.zbi", + ":fuchsia", ] - updater = "zedboot" - installer = "zedboot.zbi" - }, -] + } + images += [ + { + deps = [ + ":signed", + ] + sdk = "zircon-a.signed" + updater = "zbi.signed" + installer = "fuchsia.zbi" + json = { + name = "zircon-a.signed" + type = "zbi.signed" + bootserver_pave = [ "--zircona" ] + } + public = [ + "IMAGE_ZIRCONA_SIGNEDZBI", + ] + }, + ] +} +# The updater also wants the zedboot zbi as recovery. if (custom_signing_script != "") { images += [ { @@ -742,6 +761,32 @@ if (custom_signing_script != "") { updater = "zedboot.signed" }, ] +} else if (use_vboot) { + images += [ + { + deps = [ + "zedboot:signed", + ] + sources = [ + "$root_out_dir/zedboot.vboot", + ] + updater = "zedboot.signed" + installer = "zedboot.zbi" + }, + ] +} else { + images += [ + { + deps = [ + "zedboot:zbi", + ] + sources = [ + "$root_out_dir/zedboot.zbi", + ] + updater = "zedboot" + installer = "zedboot.zbi" + }, + ] } ### @@ -933,8 +978,8 @@ images += [ }, ] -if (target_cpu != "arm64") { - # ChromeOS vboot images. +if (target_cpu != "arm64" && !use_vboot) { + # TODO(surajmalhotra): Remove this target once SDK no longer depends on it. vboot("vboot") { testonly = true output_name = "fuchsia" @@ -947,28 +992,11 @@ if (target_cpu != "arm64") { json = { name = "zircon-vboot" type = "vboot" - bootserver_pave = [ "--kernc" ] } deps = [ ":vboot", ] - installer = "zircon.vboot" sdk = "zircon.vboot" - updater = "kernc" - public = [ - "IMAGE_ZIRCON_VBOOT", - ] - }, - ] - - images += [ - { - deps = [ - "zedboot:vboot", - ] - sources = [ - "$root_out_dir/zedboot.vboot", - ] }, ] @@ -990,11 +1018,11 @@ if (target_cpu != "arm64") { json = { name = "efi" type = "blk" - bootserver_pave = [ "--efi" ] + bootserver_pave = [ "--bootloader" ] } installer = "fuchsia.esp.blk" sdk = "local.esp.blk" - updater = "efi" + updater = "bootloader" public = [ "IMAGE_ESP_RAW", ] diff --git a/build/images/boot.gni b/build/images/boot.gni index 07c6905c9608787a4be194c42348d4c2c693c703..2898577ecb4b67e63f009e66fc70d3f20b98eee3 100644 --- a/build/images/boot.gni +++ b/build/images/boot.gni @@ -6,6 +6,11 @@ import("//build/compiled_action.gni") import("//build/config/clang/clang.gni") import("//build/config/fuchsia/zircon.gni") +declare_args() { + # Use vboot images + use_vboot = false +} + # Build a "kernel partition" target for ChromeOS targets. # # Parameters diff --git a/build/images/zedboot/BUILD.gn b/build/images/zedboot/BUILD.gn index 582a688b6e96b37cecd67aa9c0b3b273c4064e04..183bc645f005946122567a46bc73ace60c3e0996 100644 --- a/build/images/zedboot/BUILD.gn +++ b/build/images/zedboot/BUILD.gn @@ -5,6 +5,7 @@ import("//build/config/fuchsia/zbi.gni") import("//build/images/boot.gni") import("//build/images/custom_signing.gni") +import("//build/images/custom_signing.gni") import("//build/images/json.gni") import("//build/images/manifest.gni") import("//build/images/zxcrypt.gni") @@ -158,7 +159,7 @@ zedboot_images += [ json = { name = "zircon-r" type = "zbi" - if (custom_signing_script == "") { + if (custom_signing_script == "" && !use_vboot) { bootserver_pave = [ "--zirconr" ] } } @@ -195,10 +196,8 @@ if (custom_signing_script != "") { } }, ] -} - -if (target_cpu != "arm64") { - vboot("vboot") { +} else if (use_vboot) { + vboot("signed") { output_name = "zedboot" deps = [ ":zbi", @@ -208,18 +207,21 @@ if (target_cpu != "arm64") { zedboot_images += [ { deps = [ - ":vboot", + ":signed", ] public = [ - "IMAGE_ZEDBOOT_VBOOT", + "IMAGE_ZIRCONR_SIGNEDZBI", ] json = { - name = "zedboot" - type = "vboot" + name = "zircon-r.signed" + type = "zbi.signed" + bootserver_pave = [ "--zirconr" ] } }, ] +} +if (target_cpu != "arm64" && !use_vboot) { esp("esp") { output_name = "zedboot" cmdline = "efi_cmdline.txt" @@ -249,13 +251,10 @@ group("zedboot") { deps = [ ":zbi", ] - if (target_cpu != "arm64") { - deps += [ - ":esp", - ":vboot", - ] + if (target_cpu != "arm64" && !use_vboot) { + deps += [ ":esp" ] } - if (custom_signing_script != "") { + if (custom_signing_script != "" || use_vboot) { deps += [ ":signed" ] } } diff --git a/garnet/bin/installer/install-fuchsia.sh b/garnet/bin/installer/install-fuchsia.sh index 20830fa14caa843a9b4e3211158a838df10b39e1..00c99946cde32249ac6f3f2bbacfed8ba12aa7e5 100755 --- a/garnet/bin/installer/install-fuchsia.sh +++ b/garnet/bin/installer/install-fuchsia.sh @@ -8,7 +8,7 @@ INSTALL_PATH="/install" PAVER="/boot/bin/install-disk-image" # TODO(raggi): template this from the build instead. -IMAGES="fvm.sparse.blk fuchsia.esp.blk fuchsia.zbi zircon.vboot" +IMAGES="fvm.sparse.blk fuchsia.esp.blk fuchsia.zbi zedboot.zbi" if [ ! -e "${PAVER}" ]; then echo "Paver \"install-disk-image\" is missing!" @@ -17,25 +17,18 @@ fi for file in $IMAGES; do img="${INSTALL_PATH}/${file}" - if [ ! -f "$img" ]; then - echo "Missing required image file: $img" >&2 - exit 1 - fi -done -for file in $IMAGES; do - img="${INSTALL_PATH}/${file}" + if [ ! -f ${img} ]; then + continue + fi typ="" case "$file" in - fvm*|*.fvm.blk|*.sparse.blk) + fvm.sparse.blk) typ="fvm" ;; - *esp.blk|*efi.blk) - typ="efi" - ;; - *.vboot) - typ="kernc" + fuchsia.esp.blk) + typ="bootloader" ;; fuchsia.zbi) typ="zircona" diff --git a/garnet/go/src/amber/system_updater/images b/garnet/go/src/amber/system_updater/images index eb68bc38ddf5a1a7c010ecc4a3105d3ade7264d4..95a81f62bf94d50498185c84f1caa7df5d614491 100644 --- a/garnet/go/src/amber/system_updater/images +++ b/garnet/go/src/amber/system_updater/images @@ -1,5 +1,4 @@ -efi -kernc +bootloader zbi zbi.signed zedboot diff --git a/garnet/go/src/amber/system_updater/processor.go b/garnet/go/src/amber/system_updater/processor.go index ede372753dc574a5775a65acb858f787d2d1547b..867d9fde0009f72d3b2f7660fa4569b9154625bb 100644 --- a/garnet/go/src/amber/system_updater/processor.go +++ b/garnet/go/src/amber/system_updater/processor.go @@ -165,10 +165,6 @@ func WriteImgs(imgs []string, imgsPath string) error { var c *exec.Cmd switch img { - case "efi": - c = exec.Command(diskImagerPath, "install-efi") - case "kernc": - c = exec.Command(diskImagerPath, "install-kernc") case "zbi", "zbi.signed": c = exec.Command(diskImagerPath, "install-zircona") case "zedboot", "zedboot.signed": diff --git a/garnet/go/src/amber/system_updater/test_images b/garnet/go/src/amber/system_updater/test_images index 9d3492adeeef572b13f0b4e08bbffa07306b02cd..54960172d3bf2e2031de5f6ea35583a439f1d8c5 100644 --- a/garnet/go/src/amber/system_updater/test_images +++ b/garnet/go/src/amber/system_updater/test_images @@ -1 +1 @@ -efi +bootloader diff --git a/sdk/BUILD.gn b/sdk/BUILD.gn index 8e2e47a57518372400d928c3391cb83cae57ee7a..7cf0e75eca97bcac846bda0327ef6ad738d0413a 100644 --- a/sdk/BUILD.gn +++ b/sdk/BUILD.gn @@ -8,6 +8,10 @@ import("//build/sdk/sdk.gni") import("//build/sdk/sdk_documentation.gni") import("config.gni") +declare_args() { + export_x64_sdk_images = false +} + # This default target is empty because there are multiple flavors of SDKs and # there is no "default" one. The empty target is still needed so that all the # other targets in this file are attached to the build graph. @@ -104,7 +108,7 @@ sdk("images") { deps = [ "//build/images:images_sdk", ] - if (target_cpu != "arm64") { + if (export_x64_sdk_images) { deps += [ "//build/images:fvm.sparse.blk_sdk", "//build/images:local.esp.blk_sdk", diff --git a/tools/devshell/mkzedboot b/tools/devshell/mkzedboot index 2b73bc7484f80b2f60a3adb0b487d5616670e695..2bf71d1b571becf8359de378ff4e7d1f6296f70e 100755 --- a/tools/devshell/mkzedboot +++ b/tools/devshell/mkzedboot @@ -84,12 +84,18 @@ echo "done" echo "Create new partitions... " # ESP needs to be a FAT compatible size -esp_size=$(((63*1024*1024)/512)) -vboot_size=$(((64*1024*1024)/512)) -esp_offset=2048 -vboot_offset=$(($esp_size + $esp_offset)) -"${FUCHSIA_BUILD_DIR}/tools/cgpt" add -s "${esp_size}" -t efi -b "${esp_offset}" -l esp "${USB_DEVICE}" -"${FUCHSIA_BUILD_DIR}/tools/cgpt" add -s "${vboot_size}" -t kernel -b "${vboot_offset}" -l zedboot "${USB_DEVICE}" +if [[ ! -z "${IMAGE_ZEDBOOT_ESP}" ]]; then + esp_size=$(((63*1024*1024)/512)) + esp_offset=2048 + "${FUCHSIA_BUILD_DIR}/tools/cgpt" add -s "${esp_size}" -t efi -b "${esp_offset}" -l esp "${USB_DEVICE}" +else + reserved_size=2048 + reserved_offset=2048 + vboot_size=$(((64*1024*1024)/512)) + vboot_offset=$(($reserved_offset + $reserved_size)) + "${FUCHSIA_BUILD_DIR}/tools/cgpt" add -s "${reserved_size}" -t reserved -b "${reserved_offset}" -l reserved "${USB_DEVICE}" + "${FUCHSIA_BUILD_DIR}/tools/cgpt" add -s "${vboot_size}" -t kernel -b "${vboot_offset}" -l zedboot "${USB_DEVICE}" +fi # NOTE: Ok, so here goes some stuff. I could have written a much smarter "dd" # (a thing that can operate on block-boundaries for seek and copy, but that @@ -119,20 +125,29 @@ if $include_install; then # We need to specify the install size in 512byte lba's: install_size=$(($install_size * 8192)) - install_min_offset=$(($esp_size + $esp_offset + $vboot_size)) + if [[ ! -z "${IMAGE_ZEDBOOT_ESP}" ]]; then + install_min_offset=$(($esp_size + $esp_offset)) + else + install_min_offset=$(($vboot_size + $vboot_offset)) + fi # Align the partition offset to a 4mb "block size" install_offset=$(( (($install_min_offset * 512) + 4194303) / 4194304)) # The lba offset of that is: install_lba_offset=$(($install_offset * 8192)) "${FUCHSIA_BUILD_DIR}/tools/cgpt" add -s "${install_size}" -t "48435546-4953-2041-494E-5354414C4C52" -b "${install_lba_offset}" -l install "${USB_DEVICE}" fi -"${FUCHSIA_BUILD_DIR}/tools/cgpt" add -i 2 -T 1 -S 1 -P 2 "${USB_DEVICE}" +if [[ ! -z "${IMAGE_ZIRCONR_SIGNEDZBI}" ]]; then + "${FUCHSIA_BUILD_DIR}/tools/cgpt" add -i 2 -T 1 -S 1 -P 2 "${USB_DEVICE}" +fi echo "done" -echo "Writing zedboot for EFI" -dd if="${FUCHSIA_BUILD_DIR}/${IMAGE_ZEDBOOT_ESP}" of="${USB_DEVICE}" seek=${esp_offset} -echo "Writing zedboot for Cros" -dd if="${FUCHSIA_BUILD_DIR}/${IMAGE_ZEDBOOT_VBOOT}" of="${USB_DEVICE}" seek=${vboot_offset} +if [[ ! -z "${IMAGE_ZEDBOOT_ESP}" ]]; then + echo "Writing zedboot for EFI" + dd if="${FUCHSIA_BUILD_DIR}/${IMAGE_ZEDBOOT_ESP}" of="${USB_DEVICE}" seek=${esp_offset} +else + echo "Writing zedboot for Cros" + dd if="${FUCHSIA_BUILD_DIR}/${IMAGE_ZIRCONR_SIGNEDZBI}" of="${USB_DEVICE}" seek=${vboot_offset} +fi if $include_install; then echo "Writing install partition" dd if="${FUCHSIA_BUILD_DIR}/${IMAGE_INSTALLER_RAW}" of="${USB_DEVICE}" seek=${install_offset} bs=4194304 diff --git a/zircon/system/core/netsvc/board-name.cpp b/zircon/system/core/netsvc/board-name.cpp index 40c0cfd266a34f75aeaedc38aae232c905eeb89d..3de5059ba79d30972cb9b45b8af5175bb144ce8f 100644 --- a/zircon/system/core/netsvc/board-name.cpp +++ b/zircon/system/core/netsvc/board-name.cpp @@ -134,7 +134,7 @@ bool check_board_name(const char* name, size_t length) { // Special case x64 to check if chromebook. if (!strcmp(real_board_name, "pc") && IsChromebook()) { - // strcpy(real_board_name, "chromebook-x64"); + strcpy(real_board_name, "chromebook-x64"); } return strncmp(real_board_name, name, length) == 0; diff --git a/zircon/system/core/netsvc/tftp.cpp b/zircon/system/core/netsvc/tftp.cpp index 2327c58b41855876c539ffe221aae0a47e60204a..d46a6bcb34245b52eb2c8cb3e723255401257268 100644 --- a/zircon/system/core/netsvc/tftp.cpp +++ b/zircon/system/core/netsvc/tftp.cpp @@ -245,12 +245,6 @@ static tftp_status paver_open_write(const char* filename, size_t size, file_info } else if (!strcmp(filename + NB_IMAGE_PREFIX_LEN, NB_BOOTLOADER_HOST_FILENAME)) { printf("netsvc: Running BOOTLOADER Paver\n"); argv[1] = "install-bootloader"; - } else if (!strcmp(filename + NB_IMAGE_PREFIX_LEN, NB_EFI_HOST_FILENAME)) { - printf("netsvc: Running EFI Paver\n"); - argv[1] = "install-efi"; - } else if (!strcmp(filename + NB_IMAGE_PREFIX_LEN, NB_KERNC_HOST_FILENAME)) { - printf("netsvc: Running KERN-C Paver\n"); - argv[1] = "install-kernc"; } else if (!strcmp(filename + NB_IMAGE_PREFIX_LEN, NB_ZIRCONA_HOST_FILENAME)) { printf("netsvc: Running ZIRCON-A Paver\n"); argv[1] = "install-zircona"; diff --git a/zircon/system/host/bootserver/bootserver.c b/zircon/system/host/bootserver/bootserver.c index 17383cb3d8741bf2ccf74a4215e8e2fb1596ab52..1829f222db1c3cbee544e6d5fc22bacca0c6c72c 100644 --- a/zircon/system/host/bootserver/bootserver.c +++ b/zircon/system/host/bootserver/bootserver.c @@ -206,12 +206,12 @@ void usage(void) { " --fvm <file> use the supplied file as a sparse FVM image (up to 4 times)\n" " --bootloader <file> use the supplied file as a BOOTLOADER image\n" " --efi <file> use the supplied file as an EFI image\n" - " --kernc <file> use the supplied file as a KERN-C CrOS image\n" " --zircona <file> use the supplied file as a ZIRCON-A ZBI\n" " --zirconb <file> use the supplied file as a ZIRCON-B ZBI\n" " --zirconr <file> use the supplied file as a ZIRCON-R ZBI\n" " --vbmetaa <file> use the supplied file as a AVB vbmeta_a image\n" " --vbmetab <file> use the supplied file as a AVB vbmeta_b image\n" + " --vbmetar <file> use the supplied file as a AVB vbmeta_r image\n" " --authorized-keys <file> use the supplied file as an authorized_keys file\n" " --netboot use the netboot protocol\n" " --tftp use the tftp protocol (default)\n" @@ -302,13 +302,12 @@ int main(int argc, char** argv) { const char* board_name = NULL; const char* board_name_file = NULL; const char* bootloader_image = NULL; - const char* efi_image = NULL; - const char* kernc_image = NULL; const char* zircona_image = NULL; const char* zirconb_image = NULL; const char* zirconr_image = NULL; const char* vbmetaa_image = NULL; const char* vbmetab_image = NULL; + const char* vbmetar_image = NULL; const char* authorized_keys = NULL; const char* fvm_images[MAX_FVM_IMAGES] = {NULL, NULL, NULL, NULL}; const char* kernel_fn = NULL; @@ -353,22 +352,6 @@ int main(int argc, char** argv) { return -1; } bootloader_image = argv[1]; - } else if (!strcmp(argv[1], "--efi")) { - argc--; - argv++; - if (argc <= 1) { - fprintf(stderr, "'--efi' option requires an argument (EFI image)\n"); - return -1; - } - efi_image = argv[1]; - } else if (!strcmp(argv[1], "--kernc")) { - argc--; - argv++; - if (argc <= 1) { - fprintf(stderr, "'--kernc' option requires an argument (KERN-C image)\n"); - return -1; - } - kernc_image = argv[1]; } else if (!strcmp(argv[1], "--zircona")) { argc--; argv++; @@ -405,10 +388,18 @@ int main(int argc, char** argv) { argc--; argv++; if (argc <= 1) { - fprintf(stderr, "'--vbmetab' option requires an argument (vbmeta_a image)\n"); + fprintf(stderr, "'--vbmetab' option requires an argument (vbmeta_b image)\n"); return -1; } vbmetab_image = argv[1]; + } else if (!strcmp(argv[1], "--vbmetar")) { + argc--; + argv++; + if (argc <= 1) { + fprintf(stderr, "'--vbmetar' option requires an argument (vbmeta_r image)\n"); + return -1; + } + vbmetar_image = argv[1]; } else if (!strcmp(argv[1], "--authorized-keys")) { argc--; argv++; @@ -528,8 +519,8 @@ int main(int argc, char** argv) { argc--; argv++; } - if (!kernel_fn && !bootloader_image && !efi_image && !kernc_image && !zircona_image && - !zirconb_image && !zirconr_image && !vbmetaa_image && !vbmetab_image && !fvm_images[0]) { + if (!kernel_fn && !bootloader_image && !zircona_image && !zirconb_image && !zirconr_image && + !vbmetaa_image && !vbmetab_image && !fvm_images[0]) { usage(); } if (!nodename) { @@ -672,12 +663,6 @@ int main(int argc, char** argv) { if (status == 0 && bootloader_image) { status = xfer(&ra, bootloader_image, NB_BOOTLOADER_FILENAME); } - if (status == 0 && efi_image) { - status = xfer(&ra, efi_image, NB_EFI_FILENAME); - } - if (status == 0 && kernc_image) { - status = xfer(&ra, kernc_image, NB_KERNC_FILENAME); - } if (status == 0 && zircona_image) { status = xfer(&ra, zircona_image, NB_ZIRCONA_FILENAME); } diff --git a/zircon/system/public/zircon/boot/netboot.h b/zircon/system/public/zircon/boot/netboot.h index 4b42f8185cb83e3096bd7b8139af90103038ff0a..35f5cb72ecf088a2f265e5816499120e7c1c3936 100644 --- a/zircon/system/public/zircon/boot/netboot.h +++ b/zircon/system/public/zircon/boot/netboot.h @@ -10,7 +10,7 @@ // clang-format off -#define BOOTLOADER_VERSION "0.7.14" +#define BOOTLOADER_VERSION "0.7.15" #define NB_MAGIC 0xAA774217 #define NB_DEBUGLOG_MAGIC 0xAEAE1123 @@ -63,10 +63,6 @@ #define NB_FVM_FILENAME NB_IMAGE_PREFIX NB_FVM_HOST_FILENAME #define NB_BOOTLOADER_HOST_FILENAME "bootloader.img" #define NB_BOOTLOADER_FILENAME NB_IMAGE_PREFIX NB_BOOTLOADER_HOST_FILENAME -#define NB_EFI_HOST_FILENAME "efi.img" -#define NB_EFI_FILENAME NB_IMAGE_PREFIX NB_EFI_HOST_FILENAME -#define NB_KERNC_HOST_FILENAME "kernc.img" -#define NB_KERNC_FILENAME NB_IMAGE_PREFIX NB_KERNC_HOST_FILENAME #define NB_ZIRCONA_HOST_FILENAME "zircona.img" #define NB_ZIRCONA_FILENAME NB_IMAGE_PREFIX NB_ZIRCONA_HOST_FILENAME #define NB_ZIRCONB_HOST_FILENAME "zirconb.img" @@ -77,6 +73,8 @@ #define NB_VBMETAA_FILENAME NB_IMAGE_PREFIX NB_VBMETAA_HOST_FILENAME #define NB_VBMETAB_HOST_FILENAME "vbmetab.img" #define NB_VBMETAB_FILENAME NB_IMAGE_PREFIX NB_VBMETAB_HOST_FILENAME +#define NB_VBMETAR_HOST_FILENAME "vbmetar.img" +#define NB_VBMETAR_FILENAME NB_IMAGE_PREFIX NB_VBMETAR_HOST_FILENAME #define NB_SSHAUTH_HOST_FILENAME "authorized_keys" #define NB_SSHAUTH_FILENAME NB_IMAGE_PREFIX NB_SSHAUTH_HOST_FILENAME #define NB_BOARD_NAME_HOST_FILENAME "board_name" diff --git a/zircon/system/public/zircon/hw/gpt.h b/zircon/system/public/zircon/hw/gpt.h index 5d18bc24972c5ba00d2c2a2a09ccded6cfbde29f..1675f56fa07df119152dedf6ad104511e78c915a 100644 --- a/zircon/system/public/zircon/hw/gpt.h +++ b/zircon/system/public/zircon/hw/gpt.h @@ -191,6 +191,15 @@ typedef struct gpt_entry { } #define GUID_VBMETA_B_NAME "vbmeta_b" +#define GUID_VBMETA_R_STRING "6A2460C3-CD11-4E8B-A880-12CCE268ED0A" +#define GUID_VBMETA_R_VALUE { \ + 0xc3, 0x60, 0x24, 0x6a, \ + 0x11, 0xcd, \ + 0x8b, 0x4e, \ + 0x80, 0xa8, 0x12, 0xcc, 0xe2, 0x68, 0xed, 0x0a \ +} +#define GUID_VBMETA_R_NAME "vbmeta_r" + #define GUID_CROS_KERNEL_STRING "FE3A2A5D-4F32-41A7-B725-ACCC3285A309" #define GUID_CROS_KERNEL_VALUE { \ 0x5d, 0x2a, 0x3a, 0xfe, \ diff --git a/zircon/system/uapp/disk-pave/disk-pave.cpp b/zircon/system/uapp/disk-pave/disk-pave.cpp index d409e004c701a05b0680ed0fa1c125a750f1b320..f6d5970f96e77b6c863df19b461585137c4aea63 100644 --- a/zircon/system/uapp/disk-pave/disk-pave.cpp +++ b/zircon/system/uapp/disk-pave/disk-pave.cpp @@ -19,7 +19,6 @@ namespace { -using paver::Arch; using paver::Command; using paver::Flags; @@ -27,13 +26,12 @@ void PrintUsage() { ERROR("install-disk-image <command> [options...]\n"); ERROR("Commands:\n"); ERROR(" install-bootloader : Install a BOOTLOADER partition to the device\n"); - ERROR(" install-efi : Install an EFI partition to the device\n"); - ERROR(" install-kernc : Install a KERN-C CrOS partition to the device\n"); ERROR(" install-zircona : Install a ZIRCON-A partition to the device\n"); ERROR(" install-zirconb : Install a ZIRCON-B partition to the device\n"); ERROR(" install-zirconr : Install a ZIRCON-R partition to the device\n"); ERROR(" install-vbmetaa : Install a VBMETA-A partition to the device\n"); ERROR(" install-vbmetab : Install a VBMETA-B partition to the device\n"); + ERROR(" install-vbmetar : Install a VBMETA-R partition to the device\n"); ERROR(" install-fvm : Install a sparse FVM to the device\n"); ERROR(" install-data-file : Install a file to DATA (--path required)\n"); ERROR(" wipe : Remove the FVM partition\n"); @@ -60,9 +58,9 @@ bool ParseFlags(int argc, char** argv, Flags* flags) { if (!strcmp(argv[0], "install-bootloader")) { flags->cmd = Command::kInstallBootloader; } else if (!strcmp(argv[0], "install-efi")) { - flags->cmd = Command::kInstallEfi; + flags->cmd = Command::kInstallBootloader; } else if (!strcmp(argv[0], "install-kernc")) { - flags->cmd = Command::kInstallKernc; + flags->cmd = Command::kInstallZirconA; } else if (!strcmp(argv[0], "install-zircona")) { flags->cmd = Command::kInstallZirconA; } else if (!strcmp(argv[0], "install-zirconb")) { @@ -73,6 +71,8 @@ bool ParseFlags(int argc, char** argv, Flags* flags) { flags->cmd = Command::kInstallVbMetaA; } else if (!strcmp(argv[0], "install-vbmetab")) { flags->cmd = Command::kInstallVbMetaB; + } else if (!strcmp(argv[0], "install-vbmetar")) { + flags->cmd = Command::kInstallVbMetaR; } else if (!strcmp(argv[0], "install-data-file")) { flags->cmd = Command::kInstallDataFile; } else if (!strcmp(argv[0], "install-fvm")) { @@ -87,11 +87,6 @@ bool ParseFlags(int argc, char** argv, Flags* flags) { // Parse options. flags->force = false; -#if defined(__x86_64__) - flags->arch = Arch::X64; -#elif defined(__aarch64__) - flags->arch = Arch::ARM64; -#endif flags->payload_fd.reset(STDIN_FILENO); while (argc > 0) { if (!strcmp(argv[0], "--file")) { diff --git a/zircon/system/ulib/paver/device-partitioner.cpp b/zircon/system/ulib/paver/device-partitioner.cpp index 99a5ed069f1251e3b0c6b45ddcc7d5ab5695865b..95eab4225f1b3d7841ce0c37e2cdecb4a2748d31 100644 --- a/zircon/system/ulib/paver/device-partitioner.cpp +++ b/zircon/system/ulib/paver/device-partitioner.cpp @@ -51,7 +51,7 @@ bool KernelFilterCallback(const gpt_partition_t& part, const uint8_t kern_type[G strncmp(cstring_name, partition_name.data(), partition_name.length()) == 0; } -bool FvmFilterCallback(const gpt_partition_t& part) { +bool IsFvmPartition(const gpt_partition_t& part) { const uint8_t partition_type[GPT_GUID_LEN] = GUID_FVM_VALUE; return memcmp(part.type, partition_type, GPT_GUID_LEN) == 0; } @@ -246,10 +246,6 @@ const char* PartitionName(Partition type) { switch (type) { case Partition::kBootloader: return "Bootloader"; - case Partition::kKernelC: - return "Kernel C"; - case Partition::kEfi: - return "EFI"; case Partition::kZirconA: return "Zircon A"; case Partition::kZirconB: @@ -260,6 +256,8 @@ const char* PartitionName(Partition type) { return "VBMeta A"; case Partition::kVbMetaB: return "VBMeta B"; + case Partition::kVbMetaR: + return "VBMeta R"; case Partition::kFuchsiaVolumeManager: return "Fuchsia Volume Manager"; default: @@ -608,7 +606,7 @@ zx_status_t GptDevicePartitioner::WipeFvm() { if (!p) { continue; } - if (!FvmFilterCallback(*p)) { + if (!IsFvmPartition(*p)) { continue; } @@ -664,7 +662,7 @@ zx_status_t EfiDevicePartitioner::AddPartition(Partition partition_type, fbl::un size_t optional_reserve_bytes = 0; switch (partition_type) { - case Partition::kEfi: { + case Partition::kBootloader: { const uint8_t efi_type[GPT_GUID_LEN] = GUID_EFI_VALUE; memcpy(type, efi_type, GPT_GUID_LEN); minimum_size_bytes = 20LU * (1 << 20); @@ -711,7 +709,7 @@ zx_status_t EfiDevicePartitioner::AddPartition(Partition partition_type, fbl::un zx_status_t EfiDevicePartitioner::FindPartition(Partition partition_type, fbl::unique_fd* out_fd) const { switch (partition_type) { - case Partition::kEfi: { + case Partition::kBootloader: { return gpt_->FindPartition(IsGigabootPartition, out_fd); } case Partition::kZirconA: { @@ -736,7 +734,7 @@ zx_status_t EfiDevicePartitioner::FindPartition(Partition partition_type, return gpt_->FindPartition(filter, out_fd); } case Partition::kFuchsiaVolumeManager: - return gpt_->FindPartition(FvmFilterCallback, out_fd); + return gpt_->FindPartition(IsFvmPartition, out_fd); default: ERROR("EFI partitioner cannot find unknown partition type\n"); @@ -804,13 +802,20 @@ zx_status_t CrosDevicePartitioner::AddPartition(Partition partition_type, size_t optional_reserve_bytes = 0; switch (partition_type) { - case Partition::kKernelC: { + case Partition::kZirconA: { const uint8_t kernc_type[GPT_GUID_LEN] = GUID_CROS_KERNEL_VALUE; memcpy(type, kernc_type, GPT_GUID_LEN); minimum_size_bytes = 64LU * (1 << 20); name = kZirconAName; break; } + case Partition::kZirconR: { + const uint8_t zircon_r_type[GPT_GUID_LEN] = GUID_ZIRCON_R_VALUE; + memcpy(type, zircon_r_type, GPT_GUID_LEN); + minimum_size_bytes = 24LU * (1 << 20); + name = kZirconRName; + break; + } case Partition::kFuchsiaVolumeManager: { const uint8_t fvm_type[GPT_GUID_LEN] = GUID_FVM_VALUE; memcpy(type, fvm_type, GPT_GUID_LEN); @@ -829,15 +834,22 @@ zx_status_t CrosDevicePartitioner::AddPartition(Partition partition_type, zx_status_t CrosDevicePartitioner::FindPartition(Partition partition_type, fbl::unique_fd* out_fd) const { switch (partition_type) { - case Partition::kKernelC: { + case Partition::kZirconA: { const auto filter = [](const gpt_partition_t& part) { const uint8_t guid[GPT_GUID_LEN] = GUID_CROS_KERNEL_VALUE; return KernelFilterCallback(part, guid, kZirconAName); }; return gpt_->FindPartition(filter, out_fd); } + case Partition::kZirconR: { + const auto filter = [](const gpt_partition_t& part) { + const uint8_t guid[GPT_GUID_LEN] = GUID_ZIRCON_R_VALUE; + return KernelFilterCallback(part, guid, kZirconRName); + }; + return gpt_->FindPartition(filter, out_fd); + } case Partition::kFuchsiaVolumeManager: - return gpt_->FindPartition(FvmFilterCallback, out_fd); + return gpt_->FindPartition(IsFvmPartition, out_fd); default: ERROR("Cros partitioner cannot find unknown partition type\n"); @@ -847,7 +859,7 @@ zx_status_t CrosDevicePartitioner::FindPartition(Partition partition_type, zx_status_t CrosDevicePartitioner::FinalizePartition(Partition partition_type) { // Special partition finalization is only necessary for Zircon partitions. - if (partition_type != Partition::kKernelC) { + if (partition_type != Partition::kZirconA) { return ZX_OK; } @@ -978,6 +990,11 @@ zx_status_t FixedDevicePartitioner::FindPartition(Partition partition_type, memcpy(type, vbmeta_b_type, GPT_GUID_LEN); break; } + case Partition::kVbMetaR: { + const uint8_t vbmeta_r_type[GPT_GUID_LEN] = GUID_VBMETA_R_VALUE; + memcpy(type, vbmeta_r_type, GPT_GUID_LEN); + break; + } case Partition::kFuchsiaVolumeManager: { const uint8_t fvm_type[GPT_GUID_LEN] = GUID_FVM_VALUE; memcpy(type, fvm_type, GPT_GUID_LEN); @@ -1082,6 +1099,11 @@ zx_status_t SkipBlockDevicePartitioner::FindPartition(Partition partition_type, memcpy(type, vbmeta_b_type, GPT_GUID_LEN); break; } + case Partition::kVbMetaR: { + const uint8_t vbmeta_r_type[GPT_GUID_LEN] = GUID_VBMETA_R_VALUE; + memcpy(type, vbmeta_r_type, GPT_GUID_LEN); + break; + } case Partition::kFuchsiaVolumeManager: { const uint8_t fvm_type[GPT_GUID_LEN] = GUID_FVM_VALUE; memcpy(type, fvm_type, GPT_GUID_LEN); diff --git a/zircon/system/ulib/paver/device-partitioner.h b/zircon/system/ulib/paver/device-partitioner.h index 25894a7b7a9c12d8907c398bb6895aef1ed11cc1..62feec0dc2db0ae710b9145a3e06cf43600d6f49 100644 --- a/zircon/system/ulib/paver/device-partitioner.h +++ b/zircon/system/ulib/paver/device-partitioner.h @@ -32,6 +32,7 @@ enum class Partition { kZirconR, kVbMetaA, kVbMetaB, + kVbMetaR, kFuchsiaVolumeManager, }; @@ -51,8 +52,6 @@ public: virtual ~DevicePartitioner() = default; - virtual bool IsCros() const = 0; - // Whether to use skip block interface or block interface for non-FVM // partitions. virtual bool UseSkipBlockInterface() const = 0; @@ -142,8 +141,6 @@ public: static zx_status_t Initialize(fbl::unique_fd devfs_root, fbl::unique_ptr<DevicePartitioner>* partitioner); - bool IsCros() const override { return false; } - bool UseSkipBlockInterface() const override { return false; } zx_status_t AddPartition(Partition partition_type, fbl::unique_fd* out_fd) override; @@ -169,8 +166,6 @@ public: static zx_status_t Initialize(fbl::unique_fd devfs_root, fbl::unique_ptr<DevicePartitioner>* partitioner); - bool IsCros() const override { return true; } - bool UseSkipBlockInterface() const override { return false; } zx_status_t AddPartition(Partition partition_type, fbl::unique_fd* out_fd) override; @@ -199,8 +194,6 @@ public: static zx_status_t Initialize(fbl::unique_fd devfs_root, fbl::unique_ptr<DevicePartitioner>* partitioner); - bool IsCros() const override { return false; } - bool UseSkipBlockInterface() const override { return false; } zx_status_t AddPartition(Partition partition_type, fbl::unique_fd* out_fd) override; @@ -230,8 +223,6 @@ public: static zx_status_t Initialize(fbl::unique_fd devfs_root, fbl::unique_ptr<DevicePartitioner>* partitioner); - bool IsCros() const override { return false; } - bool UseSkipBlockInterface() const override { return true; } zx_status_t AddPartition(Partition partition_type, fbl::unique_fd* out_fd) override; diff --git a/zircon/system/ulib/paver/include/lib/paver/paver.h b/zircon/system/ulib/paver/include/lib/paver/paver.h index 7eb80fc656668f672aa2dc8c1ec5f9ddd43fc478..4f8de9af19b5c8a88aa3da221f487f05bd4696bc 100644 --- a/zircon/system/ulib/paver/include/lib/paver/paver.h +++ b/zircon/system/ulib/paver/include/lib/paver/paver.h @@ -13,27 +13,19 @@ namespace paver { enum class Command { kUnknown, kInstallBootloader, - kInstallEfi, - kInstallKernc, kInstallZirconA, kInstallZirconB, kInstallZirconR, kInstallVbMetaA, kInstallVbMetaB, + kInstallVbMetaR, kInstallDataFile, kInstallFvm, kWipeFvm, }; -// Architecture of device being paved. Used for payload validation. -enum class Arch { - X64, - ARM64, -}; - struct Flags { Command cmd = Command::kUnknown; - Arch arch = Arch::X64; bool force = false; fbl::unique_fd payload_fd; char* path = nullptr; diff --git a/zircon/system/ulib/paver/paver.cpp b/zircon/system/ulib/paver/paver.cpp index 1a34d1f5e3da576f1126f6c65bde7344ee1cc827..aecbfaf536c137098c9ce673f492c1806cc7ddf2 100644 --- a/zircon/system/ulib/paver/paver.cpp +++ b/zircon/system/ulib/paver/paver.cpp @@ -59,10 +59,6 @@ static Partition PartitionType(const Command command) { switch (command) { case Command::kInstallBootloader: return Partition::kBootloader; - case Command::kInstallEfi: - return Partition::kEfi; - case Command::kInstallKernc: - return Partition::kKernelC; case Command::kInstallZirconA: return Partition::kZirconA; case Command::kInstallZirconB: @@ -73,6 +69,8 @@ static Partition PartitionType(const Command command) { return Partition::kVbMetaA; case Command::kInstallVbMetaB: return Partition::kVbMetaB; + case Command::kInstallVbMetaR: + return Partition::kVbMetaR; case Command::kInstallFvm: return Partition::kFuchsiaVolumeManager; default: @@ -352,6 +350,7 @@ zx_status_t WriteVmoToSkipBlock(const zx::vmo& vmo, size_t vmo_size, const fzl:: return ZX_OK; } +#if 0 // Checks first few bytes of buffer to ensure it is a ZBI. // Also validates architecture in kernel header matches the target. bool ValidateKernelZbi(const uint8_t* buffer, size_t size, Arch arch) { @@ -409,6 +408,7 @@ zx_status_t ValidateKernelPayload(const fzl::ResizeableVmoMapper& mapper, size_t return ZX_OK; } +#endif // Attempt to bind an FVM driver to a partition fd. fbl::unique_fd TryBindToFvmDriver(const fbl::unique_fd& partition_fd, zx::duration timeout) { @@ -948,8 +948,8 @@ zx_status_t FvmStreamPartitions(fbl::unique_fd partition_fd, fbl::unique_fd src_ } // Paves an image onto the disk. -zx_status_t PartitionPave(fbl::unique_ptr<DevicePartitioner> partitioner, fbl::unique_fd payload_fd, - Partition partition_type, Arch arch) { +zx_status_t PartitionPave(fbl::unique_ptr<DevicePartitioner> partitioner, + fbl::unique_fd payload_fd, Partition partition_type) { LOG("Paving partition.\n"); zx_status_t status; @@ -1010,10 +1010,6 @@ zx_status_t PartitionPave(fbl::unique_ptr<DevicePartitioner> partitioner, fbl::u ERROR("Failed to stream partition to VMO\n"); return status; } - if ((status = ValidateKernelPayload(mapper, payload_size, partition_type, arch)) != ZX_OK) { - ERROR("Failed to validate partition\n"); - return status; - } if (partitioner->UseSkipBlockInterface()) { fzl::FdioCaller caller(std::move(partition_fd)); status = WriteVmoToSkipBlock(mapper.vmo(), payload_size, caller, block_size_bytes); @@ -1185,45 +1181,19 @@ zx_status_t RealMain(Flags flags) { ERROR("Unable to initialize a partitioner."); return ZX_ERR_BAD_STATE; } - const bool is_cros_device = device_partitioner->IsCros(); - switch (flags.cmd) { case Command::kWipeFvm: return device_partitioner->WipeFvm(); case Command::kInstallFvm: case Command::kInstallVbMetaA: case Command::kInstallVbMetaB: - break; - case Command::kInstallBootloader: - if (flags.arch == Arch::X64 && !flags.force) { - LOG("SKIPPING BOOTLOADER install on x64 device, pass --force if desired.\n"); - Drain(std::move(flags.payload_fd)); - return ZX_OK; - } - break; - case Command::kInstallEfi: - if ((is_cros_device || flags.arch == Arch::ARM64) && !flags.force) { - LOG("SKIPPING EFI install on ARM64/CROS device, pass --force if desired.\n"); - Drain(std::move(flags.payload_fd)); - return ZX_OK; - } - break; - case Command::kInstallKernc: - if (!is_cros_device && !flags.force) { - LOG("SKIPPING KERNC install on non-CROS device, pass --force if desired.\n"); - Drain(std::move(flags.payload_fd)); - return ZX_OK; - } - break; + case Command::kInstallVbMetaR: case Command::kInstallZirconA: case Command::kInstallZirconB: case Command::kInstallZirconR: - if (is_cros_device && !flags.force) { - LOG("SKIPPING Zircon-{A/B/R} install on CROS device, pass --force if desired.\n"); - Drain(std::move(flags.payload_fd)); - return ZX_OK; - } - break; + case Command::kInstallBootloader: + return PartitionPave(std::move(device_partitioner), std::move(flags.payload_fd), + PartitionType(flags.cmd)); case Command::kInstallDataFile: return DataFilePave(std::move(device_partitioner), std::move(flags.payload_fd), flags.path); @@ -1231,8 +1201,6 @@ zx_status_t RealMain(Flags flags) { ERROR("Unsupported command."); return ZX_ERR_NOT_SUPPORTED; } - return PartitionPave(std::move(device_partitioner), std::move(flags.payload_fd), - PartitionType(flags.cmd), flags.arch); } } // namespace paver diff --git a/zircon/system/ulib/paver/test/device-partitioner-test.cpp b/zircon/system/ulib/paver/test/device-partitioner-test.cpp index ca8826586ba7a9303a5e1769d5a37de0b70feb49..6a4bfaa3a9aa04ac3c3d01df7a2f3737a7fed9be 100644 --- a/zircon/system/ulib/paver/test/device-partitioner-test.cpp +++ b/zircon/system/ulib/paver/test/device-partitioner-test.cpp @@ -325,17 +325,6 @@ END_TEST_CASE(CrosDevicePartitionerTests) namespace fixed { namespace { -bool IsCrosTest() { - BEGIN_TEST; - - fbl::unique_fd dev_fs(open("/dev", O_RDWR)); - fbl::unique_ptr<paver::DevicePartitioner> partitioner; - ASSERT_EQ(paver::FixedDevicePartitioner::Initialize(std::move(dev_fs), &partitioner), ZX_OK); - ASSERT_FALSE(partitioner->IsCros()); - - END_TEST; -} - bool UseBlockInterfaceTest() { BEGIN_TEST; @@ -457,7 +446,6 @@ bool GetBlockSizeTest() { } // namespace fixed BEGIN_TEST_CASE(FixedDevicePartitionerTests) -RUN_TEST(fixed::IsCrosTest) RUN_TEST(fixed::UseBlockInterfaceTest) RUN_TEST(fixed::AddPartitionTest) RUN_TEST(fixed::WipeFvmTest) @@ -469,21 +457,6 @@ END_TEST_CASE(FixedDevicePartitionerTests) namespace skipblock { namespace { -bool IsCrosTest() { - BEGIN_TEST; - - ASSERT_TRUE(Initialize()); - fbl::unique_ptr<SkipBlockDevice> device; - ASSERT_TRUE(SkipBlockDevice::Create(&device)); - - fbl::unique_ptr<paver::DevicePartitioner> partitioner; - ASSERT_EQ(paver::SkipBlockDevicePartitioner::Initialize(device->devfs_root(), &partitioner), - ZX_OK); - ASSERT_FALSE(partitioner->IsCros()); - - END_TEST; -} - bool UseSkipBlockInterfaceTest() { BEGIN_TEST; @@ -621,7 +594,6 @@ bool GetBlockSizeTest() { } // namespace skipblock BEGIN_TEST_CASE(SkipBlockDevicePartitionerTests) -RUN_TEST(skipblock::IsCrosTest) RUN_TEST(skipblock::UseSkipBlockInterfaceTest) RUN_TEST(skipblock::AddPartitionTest) RUN_TEST(skipblock::WipeFvmTest)