diff options
| author | Michael Bestas <mikeioannina@gmail.com> | 2017-01-01 18:45:41 +0200 |
|---|---|---|
| committer | Louis Popi <theh2o64@gmail.com> | 2017-01-07 19:17:33 +0100 |
| commit | 2df88b1d804779c231bd3b3a5442149b6d474e4d (patch) | |
| tree | f8e86f85ea327dfa1a0e5ed454e73fbc7edf58cb | |
| parent | 6878315e3d93a0d51ce990d798d77b6feb2cb891 (diff) | |
releasetools: Allow asserting baseband version
Change-Id: I101c0f7497014a43bd4cc1e3261de352d5aa0c52
| -rw-r--r-- | recovery/recovery_updater.cpp | 70 | ||||
| -rwxr-xr-x | releasetools.py | 16 |
2 files changed, 86 insertions, 0 deletions
diff --git a/recovery/recovery_updater.cpp b/recovery/recovery_updater.cpp index 0b0200f..8a31c91 100644 --- a/recovery/recovery_updater.cpp +++ b/recovery/recovery_updater.cpp @@ -33,6 +33,12 @@ #define ALPHABET_LEN 256 #define KB 1024 +#define BASEBAND_PART_PATH "/dev/block/platform/7824900.sdhci/by-name/modem" +#define BASEBAND_VER_STR_START "QC_IMAGE_VERSION_STRING=MPSS.DPM." +#define BASEBAND_VER_STR_START_LEN 33 +#define BASEBAND_VER_BUF_LEN 255 +#define BASEBAND_SZ 64000 * KB /* MMAP 64M of BASEBAND, BASEBAND partition is 64M */ + #define TZ_PART_PATH "/dev/block/platform/7824900.sdhci/by-name/tz" #define TZ_VER_STR "QC_IMAGE_VERSION_STRING=" #define TZ_VER_STR_LEN 24 @@ -117,6 +123,39 @@ static char * bm_search(const char *str, size_t str_len, const char *pat, return NULL; } +static int get_baseband_version(char *ver_str, size_t len) { + int ret = 0; + int fd; + char *baseband_data = NULL; + char *offset = NULL; + + fd = open(BASEBAND_PART_PATH, O_RDONLY); + if (fd < 0) { + ret = errno; + goto err_ret; + } + + baseband_data = (char *) mmap(NULL, BASEBAND_SZ, PROT_READ, MAP_PRIVATE, fd, 0); + if (baseband_data == (char *)-1) { + ret = errno; + goto err_fd_close; + } + + /* Do Boyer-Moore search across BASEBAND data */ + offset = bm_search(baseband_data, BASEBAND_SZ, BASEBAND_VER_STR_START, BASEBAND_VER_STR_START_LEN); + if (offset != NULL) { + strncpy(ver_str, offset + BASEBAND_VER_STR_START_LEN, len); + } else { + ret = -ENOENT; + } + + munmap(baseband_data, BASEBAND_SZ); +err_fd_close: + close(fd); +err_ret: + return ret; +} + static int get_tz_version(char *ver_str, size_t len) { int ret = 0; int fd; @@ -150,6 +189,36 @@ err_ret: return ret; } +/* verify_baseband("BASEBAND_VERSION", "BASEBAND_VERSION", ...) */ +Value * VerifyBasebandFn(const char *name, State *state, int argc, Expr *argv[]) { + char current_baseband_version[BASEBAND_VER_BUF_LEN]; + char *baseband_version; + int i, ret; + + ret = get_baseband_version(current_baseband_version, BASEBAND_VER_BUF_LEN); + if (ret) { + return ErrorAbort(state, kVendorFailure, "%s() failed to read current BASEBAND version: %d", + name, ret); + } + + for (i = 0; i < argc; i++) { + baseband_version = Evaluate(state, argv[i]); + if (baseband_version < 0) { + return ErrorAbort(state, kArgsParsingFailure, "%s() error parsing arguments: %d", + name, baseband_version); + } + + uiPrintf(state, "Comparing BASEBAND version %s to %s", + baseband_version, current_baseband_version); + if (strncmp(baseband_version, current_baseband_version, strlen(baseband_version)) == 0) { + return StringValue(strdup("1")); + } + } + + uiPrintf(state, "ERROR: It appears you are running an unsupported baseband."); + return StringValue(strdup("0")); +} + /* verify_trustzone("TZ_VERSION", "TZ_VERSION", ...) */ Value * VerifyTrustZoneFn(const char *name, State *state, int argc, Expr *argv[]) { char current_tz_version[TZ_VER_BUF_LEN]; @@ -180,5 +249,6 @@ Value * VerifyTrustZoneFn(const char *name, State *state, int argc, Expr *argv[] } void Register_librecovery_updater_cm() { + RegisterFunction("cm.verify_baseband", VerifyBasebandFn); RegisterFunction("cm.verify_trustzone", VerifyTrustZoneFn); } diff --git a/releasetools.py b/releasetools.py index 31bf958..f8b3810 100755 --- a/releasetools.py +++ b/releasetools.py @@ -48,10 +48,12 @@ def GetRadioFiles(z): return out def FullOTA_Assertions(info): + AddBasebandAssertion(info) AddTrustZoneAssertion(info) return def IncrementalOTA_Assertions(info): + AddBasebandAssertion(info) AddTrustZoneAssertion(info) return @@ -108,6 +110,20 @@ def FullOTA_InstallEnd(info): def IncrementalOTA_InstallEnd(info): InstallRadioFiles(info) +def AddBasebandAssertion(info): + # Presence of filesmap indicates packaged firmware + filesmap = LoadFilesMap(info.input_zip) + if filesmap != {}: + return + android_info = info.input_zip.read("OTA/android-info.txt") + m = re.search(r'require\s+version-baseband\s*=\s*(\S+)', android_info) + if m: + versions = m.group(1).split('|') + if len(versions) and '*' not in versions: + cmd = 'assert(cm.verify_baseband(' + ','.join(['"%s"' % baseband for baseband in versions]) + ') == "1");' + info.script.AppendExtra(cmd) + return + def AddTrustZoneAssertion(info): # Presence of filesmap indicates packaged firmware filesmap = LoadFilesMap(info.input_zip) |
