From f44ebbe36b2c1603437edc57b534244e89bfcd9c Mon Sep 17 00:00:00 2001 From: "Nam T. Nguyen" Date: Thu, 12 Feb 2015 11:10:35 -0800 Subject: vboot_reference: Support MTD devices in dump_kernel_config This CL implements a read function that works with MTD devices in dump_kernel_config. BUG=chromium:457862 BRANCH=none TEST=make runtests TEST=try on storm_nand Change-Id: Id784d422de64e7918b163005c0b426d727d2115e Reviewed-on: https://chromium-review.googlesource.com/249271 Reviewed-by: Nam Nguyen Commit-Queue: Nam Nguyen Trybot-Ready: Nam Nguyen Tested-by: Nam Nguyen --- Makefile | 5 +++++ futility/dump_kernel_config_lib.c | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+) diff --git a/Makefile b/Makefile index 574e9616..08049720 100644 --- a/Makefile +++ b/Makefile @@ -164,6 +164,11 @@ ifneq (${PD_SYNC},) CFLAGS += -DPD_SYNC endif +ifneq (${USE_MTD},) +CFLAGS += -DUSE_MTD +LDLIBS += -lmtdutils +endif + # NOTE: We don't use these files but they are useful for other packages to # query about required compiling/linking flags. PC_IN_FILES = vboot_host.pc.in diff --git a/futility/dump_kernel_config_lib.c b/futility/dump_kernel_config_lib.c index 1baa2d58..c2d59433 100644 --- a/futility/dump_kernel_config_lib.c +++ b/futility/dump_kernel_config_lib.c @@ -18,6 +18,12 @@ #include "vboot_api.h" #include "vboot_host.h" +#ifdef USE_MTD +#include +#include +#include +#endif + typedef ssize_t (*ReadFullyFn)(void *ctx, void *buf, size_t count); static ssize_t ReadFullyWithRead(void *ctx, void *buf, size_t count) @@ -37,6 +43,14 @@ static ssize_t ReadFullyWithRead(void *ctx, void *buf, size_t count) return nr_read; } +#ifdef USE_MTD +static ssize_t ReadFullyWithMtdRead(void *ctx, void *buf, size_t count) +{ + MtdReadContext *mtd_ctx = (MtdReadContext*)ctx; + return mtd_read_data(mtd_ctx, buf, count); +} +#endif + /* Skip the stream by calling |read_fn| many times. Return 0 on success. */ static int SkipWithRead(void *ctx, ReadFullyFn read_fn, size_t count) { @@ -130,9 +144,32 @@ char *FindKernelConfig(const char *infile, uint64_t kernel_body_load_address) void *ctx = &fd; ReadFullyFn read_fn = ReadFullyWithRead; +#ifdef USE_MTD + struct stat stat_buf; + if (fstat(fd, &stat_buf)) { + VbExError("Cannot stat %s\n", infile); + return NULL; + } + + int is_mtd = (major(stat_buf.st_rdev) == MTD_CHAR_MAJOR); + if (is_mtd) { + ctx = mtd_read_descriptor(fd, infile); + if (!ctx) { + VbExError("Cannot read from MTD device %s\n", infile); + return NULL; + } + read_fn = ReadFullyWithMtdRead; + } +#endif + newstr = FindKernelConfigFromStream(ctx, read_fn, kernel_body_load_address); +#ifdef USE_MTD + if (is_mtd) { + mtd_read_close(ctx); + } +#endif close(fd); return newstr; -- cgit v1.2.1