diff options
Diffstat (limited to 'bootloader.cpp')
-rw-r--r-- | bootloader.cpp | 206 |
1 files changed, 54 insertions, 152 deletions
diff --git a/bootloader.cpp b/bootloader.cpp index 856a7d2b4..d23d1e9cd 100644 --- a/bootloader.cpp +++ b/bootloader.cpp @@ -22,50 +22,81 @@ extern "C" { #include "mtdutils/mtdutils.h" } +/* #include "roots.h" - +*/ #include <errno.h> #include <stdio.h> #include <string.h> #include <sys/stat.h> #include <unistd.h> -static char device_type = 'e'; // e for emmc or m for mtd, default is emmc -static char device_name[256]; +// fake Volume struct that allows us to use the AOSP code easily +struct Volume +{ + char fs_type[8]; + char blk_device[256]; +}; + +static Volume misc; + +void set_misc_device(const char* type, const char* name) { + strlcpy(misc.fs_type, type, sizeof(misc.fs_type)); + if (strlen(name) >= sizeof(misc.blk_device)) { + LOGE("New device name of '%s' is too large for bootloader.cpp\n", name); + } else { + strcpy(misc.blk_device, name); + } +} -/* static int get_bootloader_message_mtd(struct bootloader_message *out, const Volume* v); static int set_bootloader_message_mtd(const struct bootloader_message *in, const Volume* v); static int get_bootloader_message_block(struct bootloader_message *out, const Volume* v); static int set_bootloader_message_block(const struct bootloader_message *in, const Volume* v); -*/ + int get_bootloader_message(struct bootloader_message *out) { - //volume_for_path("/misc"); - if (device_name[0] == 0) { +#if 0 + Volume* v = volume_for_path("/misc"); + if (v == NULL) { LOGE("Cannot load volume /misc!\n"); return -1; } - if (device_type == 'm') { - return get_bootloader_message_mtd_name(out); - } else if (device_type == 'e') { - return get_bootloader_message_block_name(out); +#else + Volume* v = &misc; + if (v->fs_type[0] == 0) { + LOGI("Not using /misc, not defined in fstab.\n"); + return -1; } - LOGE("unknown misc partition fs_type \"%c\"\n", device_type); +#endif + if (strcmp(v->fs_type, "mtd") == 0) { + return get_bootloader_message_mtd(out, v); + } else if (strcmp(v->fs_type, "emmc") == 0) { + return get_bootloader_message_block(out, v); + } + LOGE("unknown misc partition fs_type \"%s\"\n", v->fs_type); return -1; } int set_bootloader_message(const struct bootloader_message *in) { - //volume_for_path("/misc"); - if (device_name[0] == 0) { +#if 0 + Volume* v = volume_for_path("/misc"); + if (v == NULL) { LOGE("Cannot load volume /misc!\n"); return -1; } - if (device_type == 'm') { - return set_bootloader_message_mtd_name(in, device_name); - } else if (device_type == 'e') { - return set_bootloader_message_block_name(in, device_name); +#else + Volume* v = &misc; + if (v->fs_type[0] == 0) { + LOGI("Not using /misc, not defined in fstab.\n"); + return -1; } - LOGE("unknown misc partition type \"%c\"\n", device_type); +#endif + if (strcmp(v->fs_type, "mtd") == 0) { + return set_bootloader_message_mtd(in, v); + } else if (strcmp(v->fs_type, "emmc") == 0) { + return set_bootloader_message_block(in, v); + } + LOGE("unknown misc partition fs_type \"%s\"\n", v->fs_type); return -1; } @@ -75,7 +106,7 @@ int set_bootloader_message(const struct bootloader_message *in) { static const int MISC_PAGES = 3; // number of pages to save static const int MISC_COMMAND_PAGE = 1; // bootloader command is this page -/* + static int get_bootloader_message_mtd(struct bootloader_message *out, const Volume* v) { size_t write_size; @@ -145,89 +176,7 @@ static int set_bootloader_message_mtd(const struct bootloader_message *in, LOGI("Set boot command \"%s\"\n", in->command[0] != 255 ? in->command : ""); return 0; } -*/ - -void set_device_type(char new_type) { - device_type = new_type; -} - -void set_device_name(const char* new_name) { - if (strlen(new_name) >= sizeof(device_name)) { - LOGE("New device name of '%s' is too large for bootloader.cpp\n", new_name); - } else { - strcpy(device_name, new_name); - } -} -int get_bootloader_message_mtd_name(struct bootloader_message *out) { - size_t write_size; - mtd_scan_partitions(); - const MtdPartition *part = mtd_find_partition_by_name(device_name); - if (part == NULL || mtd_partition_info(part, NULL, NULL, &write_size)) { - LOGE("Can't find %s\n", device_name); - return -1; - } - - MtdReadContext *read = mtd_read_partition(part); - if (read == NULL) { - LOGE("Can't open %s\n(%s)\n", device_name, strerror(errno)); - return -1; - } - - const ssize_t size = write_size * MISC_PAGES; - char data[size]; - ssize_t r = mtd_read_data(read, data, size); - if (r != size) LOGE("Can't read %s\n(%s)\n", device_name, strerror(errno)); - mtd_read_close(read); - if (r != size) return -1; - - memcpy(out, &data[write_size * MISC_COMMAND_PAGE], sizeof(*out)); - return 0; -} - -int set_bootloader_message_mtd_name(const struct bootloader_message *in, - const char* mtd_name) { - size_t write_size; - mtd_scan_partitions(); - const MtdPartition *part = mtd_find_partition_by_name(mtd_name); - if (part == NULL || mtd_partition_info(part, NULL, NULL, &write_size)) { - printf("Can't find %s\n", mtd_name); - return -1; - } - - MtdReadContext *read = mtd_read_partition(part); - if (read == NULL) { - printf("Can't open %s\n(%s)\n", mtd_name, strerror(errno)); - return -1; - } - - ssize_t size = write_size * MISC_PAGES; - char data[size]; - ssize_t r = mtd_read_data(read, data, size); - if (r != size) printf("Can't read %s\n(%s)\n", mtd_name, strerror(errno)); - mtd_read_close(read); - if (r != size) return -1; - - memcpy(&data[write_size * MISC_COMMAND_PAGE], in, sizeof(*in)); - - MtdWriteContext *write = mtd_write_partition(part); - if (write == NULL) { - printf("Can't open %s\n(%s)\n", mtd_name, strerror(errno)); - return -1; - } - if (mtd_write_data(write, data, size) != size) { - printf("Can't write %s\n(%s)\n", mtd_name, strerror(errno)); - mtd_write_close(write); - return -1; - } - if (mtd_write_close(write)) { - printf("Can't finish %s\n(%s)\n", mtd_name, strerror(errno)); - return -1; - } - - printf("Set boot command \"%s\"\n", in->command[0] != 255 ? in->command : ""); - return 0; -} // ------------------------------------ // for misc partitions on block devices @@ -249,7 +198,7 @@ static void wait_for_device(const char* fn) { printf("failed to stat %s\n", fn); } } -/* + static int get_bootloader_message_block(struct bootloader_message *out, const Volume* v) { wait_for_device(v->blk_device); @@ -297,54 +246,7 @@ static int set_bootloader_message_block(const struct bootloader_message *in, } return 0; } -*/ - -int get_bootloader_message_block_name(struct bootloader_message *out) { - wait_for_device(device_name); - FILE* f = fopen(device_name, "rb"); - if (f == NULL) { - LOGE("Can't open %s\n(%s)\n", device_name, strerror(errno)); - return -1; - } -#ifdef BOARD_RECOVERY_BLDRMSG_OFFSET - fseek(f, BOARD_RECOVERY_BLDRMSG_OFFSET, SEEK_SET); -#endif - struct bootloader_message temp; - int count = fread(&temp, sizeof(temp), 1, f); - if (count != 1) { - LOGE("Failed reading %s\n(%s)\n", device_name, strerror(errno)); - return -1; - } - if (fclose(f) != 0) { - LOGE("Failed closing %s\n(%s)\n", device_name, strerror(errno)); - return -1; - } - memcpy(out, &temp, sizeof(temp)); - return 0; -} -int set_bootloader_message_block_name(const struct bootloader_message *in, - const char* block_name) { - wait_for_device(block_name); - FILE* f = fopen(block_name, "rb+"); - if (f == NULL) { - printf("Can't open %s\n(%s)\n", block_name, strerror(errno)); - return -1; - } -#ifdef BOARD_RECOVERY_BLDRMSG_OFFSET - fseek(f, BOARD_RECOVERY_BLDRMSG_OFFSET, SEEK_SET); -#endif - int count = fwrite(in, sizeof(*in), 1, f); - if (count != 1) { - printf("Failed writing %s\n(%s)\n", block_name, strerror(errno)); - return -1; - } - if (fclose(f) != 0) { - printf("Failed closing %s\n(%s)\n", block_name, strerror(errno)); - return -1; - } - return 0; -} static const char *COMMAND_FILE = "/cache/recovery/command"; static const int MAX_ARG_LENGTH = 4096; @@ -361,11 +263,11 @@ get_args(int *argc, char ***argv) { get_bootloader_message(&boot); // this may fail, leaving a zeroed structure if (boot.command[0] != 0 && boot.command[0] != 255) { - LOGI("Boot command: %.*s\n", sizeof(boot.command), boot.command); + LOGI("Boot command: %.*s\n", (int)sizeof(boot.command), boot.command); } if (boot.status[0] != 0 && boot.status[0] != 255) { - LOGI("Boot status: %.*s\n", sizeof(boot.status), boot.status); + LOGI("Boot status: %.*s\n", (int)sizeof(boot.status), boot.status); } // --- if arguments weren't supplied, look in the bootloader control block |