summaryrefslogtreecommitdiffstats
path: root/bootloader.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'bootloader.cpp')
-rw-r--r--bootloader.cpp99
1 files changed, 7 insertions, 92 deletions
diff --git a/bootloader.cpp b/bootloader.cpp
index d80c5e793..783f56ea8 100644
--- a/bootloader.cpp
+++ b/bootloader.cpp
@@ -27,12 +27,9 @@
#include "bootloader.h"
#include "common.h"
-#include "mtdutils/mtdutils.h"
#include "roots.h"
-#include "unique_fd.h"
+#include <android-base/unique_fd.h>
-static int get_bootloader_message_mtd(bootloader_message* out, const Volume* v);
-static int set_bootloader_message_mtd(const bootloader_message* in, const Volume* v);
static int get_bootloader_message_block(bootloader_message* out, const Volume* v);
static int set_bootloader_message_block(const bootloader_message* in, const Volume* v);
@@ -42,9 +39,7 @@ int get_bootloader_message(bootloader_message* out) {
LOGE("Cannot load volume /misc!\n");
return -1;
}
- if (strcmp(v->fs_type, "mtd") == 0) {
- return get_bootloader_message_mtd(out, v);
- } else if (strcmp(v->fs_type, "emmc") == 0) {
+ 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);
@@ -57,93 +52,13 @@ int set_bootloader_message(const bootloader_message* in) {
LOGE("Cannot load volume /misc!\n");
return -1;
}
- if (strcmp(v->fs_type, "mtd") == 0) {
- return set_bootloader_message_mtd(in, v);
- } else if (strcmp(v->fs_type, "emmc") == 0) {
+ 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;
}
-// ------------------------------
-// for misc partitions on MTD
-// ------------------------------
-
-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(bootloader_message* out,
- const Volume* v) {
- size_t write_size;
- mtd_scan_partitions();
- const MtdPartition* part = mtd_find_partition_by_name(v->blk_device);
- if (part == nullptr || mtd_partition_info(part, nullptr, nullptr, &write_size)) {
- LOGE("failed to find \"%s\"\n", v->blk_device);
- return -1;
- }
-
- MtdReadContext* read = mtd_read_partition(part);
- if (read == nullptr) {
- LOGE("failed to open \"%s\": %s\n", v->blk_device, 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("failed to read \"%s\": %s\n", v->blk_device, strerror(errno));
- mtd_read_close(read);
- if (r != size) return -1;
-
- memcpy(out, &data[write_size * MISC_COMMAND_PAGE], sizeof(*out));
- return 0;
-}
-static int set_bootloader_message_mtd(const bootloader_message* in,
- const Volume* v) {
- size_t write_size;
- mtd_scan_partitions();
- const MtdPartition* part = mtd_find_partition_by_name(v->blk_device);
- if (part == nullptr || mtd_partition_info(part, nullptr, nullptr, &write_size)) {
- LOGE("failed to find \"%s\"\n", v->blk_device);
- return -1;
- }
-
- MtdReadContext* read = mtd_read_partition(part);
- if (read == nullptr) {
- LOGE("failed to open \"%s\": %s\n", v->blk_device, 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) LOGE("failed to read \"%s\": %s\n", v->blk_device, 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 == nullptr) {
- LOGE("failed to open \"%s\": %s\n", v->blk_device, strerror(errno));
- return -1;
- }
- if (mtd_write_data(write, data, size) != size) {
- LOGE("failed to write \"%s\": %s\n", v->blk_device, strerror(errno));
- mtd_write_close(write);
- return -1;
- }
- if (mtd_write_close(write)) {
- LOGE("failed to finish \"%s\": %s\n", v->blk_device, strerror(errno));
- return -1;
- }
-
- LOGI("Set boot command \"%s\"\n", in->command[0] != 255 ? in->command : "");
- return 0;
-}
-
-
// ------------------------------------
// for misc partitions on block devices
// ------------------------------------
@@ -191,8 +106,8 @@ static int get_bootloader_message_block(bootloader_message* out,
static int set_bootloader_message_block(const bootloader_message* in,
const Volume* v) {
wait_for_device(v->blk_device);
- unique_fd fd(open(v->blk_device, O_WRONLY | O_SYNC));
- if (fd.get() == -1) {
+ android::base::unique_fd fd(open(v->blk_device, O_WRONLY | O_SYNC));
+ if (fd == -1) {
LOGE("failed to open \"%s\": %s\n", v->blk_device, strerror(errno));
return -1;
}
@@ -201,7 +116,7 @@ static int set_bootloader_message_block(const bootloader_message* in,
const uint8_t* start = reinterpret_cast<const uint8_t*>(in);
size_t total = sizeof(*in);
while (written < total) {
- ssize_t wrote = TEMP_FAILURE_RETRY(write(fd.get(), start + written, total - written));
+ ssize_t wrote = TEMP_FAILURE_RETRY(write(fd, start + written, total - written));
if (wrote == -1) {
LOGE("failed to write %" PRId64 " bytes: %s\n",
static_cast<off64_t>(written), strerror(errno));
@@ -210,7 +125,7 @@ static int set_bootloader_message_block(const bootloader_message* in,
written += wrote;
}
- if (fsync(fd.get()) == -1) {
+ if (fsync(fd) == -1) {
LOGE("failed to fsync \"%s\": %s\n", v->blk_device, strerror(errno));
return -1;
}