summaryrefslogtreecommitdiffstats
path: root/bootloader.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'bootloader.cpp')
-rw-r--r--bootloader.cpp109
1 files changed, 12 insertions, 97 deletions
diff --git a/bootloader.cpp b/bootloader.cpp
index f6c0e9341..6b86c17a7 100644
--- a/bootloader.cpp
+++ b/bootloader.cpp
@@ -26,15 +26,12 @@
#include <fs_mgr.h>
#include <android-base/file.h>
+#include <android-base/unique_fd.h>
#include "bootloader.h"
#include "common.h"
-#include "mtdutils/mtdutils.h"
#include "roots.h"
-#include "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 bool read_misc_partition(const Volume* v, size_t offset, size_t size, std::string* out);
static bool write_misc_partition(const Volume* v, size_t offset, const std::string& in);
@@ -44,9 +41,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) {
std::string s;
if (!read_misc_partition(v, BOOTLOADER_MESSAGE_OFFSET_IN_MISC, sizeof(bootloader_message),
&s)) {
@@ -81,9 +76,7 @@ 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) {
std::string s(reinterpret_cast<const char*>(in), sizeof(*in));
bool success = write_misc_partition(v, BOOTLOADER_MESSAGE_OFFSET_IN_MISC, s);
return success ? 0 : -1;
@@ -92,84 +85,6 @@ int set_bootloader_message(const bootloader_message* in) {
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
// ------------------------------------
@@ -194,17 +109,17 @@ static void wait_for_device(const char* fn) {
static bool read_misc_partition(const Volume* v, size_t offset, size_t size, std::string* out) {
wait_for_device(v->blk_device);
- unique_fd fd(open(v->blk_device, O_RDONLY));
- if (fd.get() == -1) {
+ android::base::unique_fd fd(open(v->blk_device, O_RDONLY));
+ if (fd == -1) {
LOGE("Failed to open \"%s\": %s\n", v->blk_device, strerror(errno));
return false;
}
- if (lseek(fd.get(), static_cast<off_t>(offset), SEEK_SET) != static_cast<off_t>(offset)) {
+ if (lseek(fd, static_cast<off_t>(offset), SEEK_SET) != static_cast<off_t>(offset)) {
LOGE("Failed to lseek \"%s\": %s\n", v->blk_device, strerror(errno));
return false;
}
out->resize(size);
- if (!android::base::ReadFully(fd.get(), &(*out)[0], size)) {
+ if (!android::base::ReadFully(fd, &(*out)[0], size)) {
LOGE("Failed to read \"%s\": %s\n", v->blk_device, strerror(errno));
return false;
}
@@ -213,21 +128,21 @@ static bool read_misc_partition(const Volume* v, size_t offset, size_t size, std
static bool write_misc_partition(const Volume* v, size_t offset, const std::string& in) {
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 false;
}
- if (lseek(fd.get(), static_cast<off_t>(offset), SEEK_SET) != static_cast<off_t>(offset)) {
+ if (lseek(fd, static_cast<off_t>(offset), SEEK_SET) != static_cast<off_t>(offset)) {
LOGE("Failed to lseek \"%s\": %s\n", v->blk_device, strerror(errno));
return false;
}
- if (!android::base::WriteFully(fd.get(), in.data(), in.size())) {
+ if (!android::base::WriteFully(fd, in.data(), in.size())) {
LOGE("Failed to write \"%s\": %s\n", v->blk_device, strerror(errno));
return false;
}
- if (fsync(fd.get()) == -1) {
+ if (fsync(fd) == -1) {
LOGE("Failed to fsync \"%s\": %s\n", v->blk_device, strerror(errno));
return false;
}