aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Bestas <mikeioannina@gmail.com>2017-01-01 18:45:41 +0200
committerLouis Popi <theh2o64@gmail.com>2017-01-07 19:17:33 +0100
commit2df88b1d804779c231bd3b3a5442149b6d474e4d (patch)
treef8e86f85ea327dfa1a0e5ed454e73fbc7edf58cb
parent6878315e3d93a0d51ce990d798d77b6feb2cb891 (diff)
releasetools: Allow asserting baseband version
Change-Id: I101c0f7497014a43bd4cc1e3261de352d5aa0c52
-rw-r--r--recovery/recovery_updater.cpp70
-rwxr-xr-xreleasetools.py16
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)