/* * Copyright (c) 2018 The Fuchsia Authors * * SPDX-License-Identifier: BSD-3-Clause */ #include #include #include #include static int do_zircon_bootconfig(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { const char* sysconfig; const char* zircon_a; const char* zircon_b; const char* zircon_r; const char* zircon_boot; struct kvstore kvs; int rc; if (argc != 5) { return -1; } sysconfig = argv[1]; zircon_a = argv[2]; zircon_b = argv[3]; zircon_r = argv[4]; uint8_t buffer[ZX_SYSCONFIG_KVSTORE_SIZE]; rc = kvs_load(&kvs, buffer, sizeof(buffer)); if (rc < 0) { rc = store_read_ops((unsigned char*)sysconfig, buffer, ZX_SYSCONFIG_BOOT_DEFAULT_OFFSET, sizeof(buffer)); if (rc) { printf("do_sysconfig: store_read_ops failed for %s\n", sysconfig); return 0; } rc = kvs_load(&kvs, buffer, sizeof(buffer)); if (rc < 0) { printf("do_sysconfig: kvs_load failed for %s (%d)\n", sysconfig, rc); return 0; } } const char* boot_part = kvs_get(&kvs, "boot", NULL); if (!boot_part) { printf("boot partition not set\n"); return -1; } if (!strcmp(boot_part, "a")) { zircon_boot = zircon_a; } else if (!strcmp(boot_part, "b")) { zircon_boot = zircon_b; } else if (!strcmp(boot_part, "r")) { zircon_boot = zircon_r; } else { printf("invalid boot partition %s, booting to recovery\n", boot_part); zircon_boot = zircon_r; } printf("zircon_bootconfig setting boot_part to %s\n", zircon_boot); setenv("boot_part", zircon_boot); return 0; } U_BOOT_CMD( zircon_bootconfig, 5, 0, do_zircon_bootconfig, "sets Zircon boot partition based on information in sysconfig partition", " argv: zircon_bootconfig " " \n" " This command reads the Zircon boot configuration from partition ,\n" " The environment variable \"boot_part\" is set to one of the partition names\n" " , or based on the\n" " configuration in the sysconfig partition.\n" );