[Feature]add MT2731_MP2_MR2_SVN388 baseline version
Change-Id: Ief04314834b31e27effab435d3ca8ba33b499059
diff --git a/src/bsp/lk/lib/buildsig/buildsig.c b/src/bsp/lk/lib/buildsig/buildsig.c
new file mode 100644
index 0000000..54a676f
--- /dev/null
+++ b/src/bsp/lk/lib/buildsig/buildsig.c
@@ -0,0 +1,161 @@
+/*
+ * Copyright (c) 2013 Google, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files
+ * (the "Software"), to deal in the Software without restriction,
+ * including without limitation the rights to use, copy, modify, merge,
+ * publish, distribute, sublicense, and/or sell copies of the Software,
+ * and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+#include <lib/buildsig.h>
+
+#include <debug.h>
+#include <err.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <string.h>
+#include <compiler.h>
+#include <lib/version.h>
+
+#define MAGIC ((uint32_t)'BSIG')
+#define MAGIC2 (~MAGIC)
+#define MAGIC3 ((uint32_t)'BSG2')
+
+struct buildsig {
+ uint32_t magic;
+
+ const lk_version_t *version;
+
+ uint32_t magic2;
+
+ uint32_t buildtype;
+ uint32_t start;
+ uint32_t end;
+ uint32_t crc32;
+
+ uint32_t magic3;
+};
+
+extern char __rom_start;
+extern char __rom_end;
+
+const struct buildsig buildsig __SECTION(".text.boot") = {
+ .magic = MAGIC,
+ .version = &version,
+ .magic2 = MAGIC2,
+#if WITH_APP_BOOTLOADER
+ .buildtype = 1, /* TODO: pull from systemwide headers */
+#else
+ .buildtype = 0,
+#endif
+ .start = (uint32_t)&__rom_start,
+ .end = (uint32_t)&__rom_end,
+ .crc32 = 0, /* filled in via an external tool */
+ .magic3 = MAGIC3
+};
+
+status_t buildsig_search(const void *_ptr, size_t search_len, size_t max_len, const lk_version_t **version)
+{
+ if (max_len < search_len)
+ return ERR_INVALID_ARGS;
+
+ if (max_len < sizeof(lk_version_t))
+ return ERR_INVALID_ARGS;
+
+ /* search for the build signature on 4 byte boundaries */
+ const uint32_t *ptr = _ptr;
+ for (size_t pos = 0; pos < search_len / 4; pos++) {
+ const struct buildsig *sig = (void *)&ptr[pos];
+
+ /* see if the buildsig's magic matches */
+ if (sig->magic != MAGIC || sig->magic2 != MAGIC2)
+ continue;
+
+ /* make sure the pointer to the version struct makes sense */
+ if ((size_t)sig->version - (size_t)ptr > max_len - sizeof(lk_version_t))
+ continue;
+
+ /* validate the strings in the version struct make sense */
+ /* ensure they lie within the search area (ptr .. ptr+max_len) */
+#define VALIDSTR(str) \
+ (((size_t)(str) >= (size_t)ptr) && (((size_t)(str) - (size_t)ptr) < max_len))
+ if (!VALIDSTR(sig->version->arch))
+ continue;
+ if (!VALIDSTR(sig->version->platform))
+ continue;
+ if (!VALIDSTR(sig->version->target))
+ continue;
+ if (!VALIDSTR(sig->version->project))
+ continue;
+ if (!VALIDSTR(sig->version->buildid))
+ continue;
+#undef VALIDSTR
+
+ *version = sig->version;
+ return NO_ERROR;
+ }
+
+ return ERR_NOT_FOUND;
+}
+
+#if WITH_LIB_CONSOLE
+
+#include <lib/console.h>
+
+extern char __rom_start;
+
+static int cmd_buildsig(int argc, const cmd_args *argv)
+{
+ if (argc < 2) {
+//notenoughargs:
+ printf("not enough args\n");
+usage:
+ printf("usage: %s dump [offset]\n", argv[0].str);
+ return -1;
+ }
+
+ if (!strcmp(argv[1].str, "dump")) {
+ const void *offset = &__rom_start;
+ if (argc >= 3) {
+ offset = argv[2].p;
+ }
+
+ const lk_version_t *v;
+ status_t err = buildsig_search(offset, DEFAULT_BUILDSIG_SEARCH_LEN, 256*1024, &v);
+ if (err < 0) {
+ printf("could not find build signature\n");
+ return ERR_NOT_FOUND;
+ }
+
+ printf("found signature:\n");
+ printf("\tarch: %s\n\tplatform: %s\n\ttarget: %s\n\tproject: %s\n\tbuildid: %s\n",
+ v->arch, v->platform, v->target, v->project, v->buildid);
+ } else {
+ goto usage;
+ }
+
+ return NO_ERROR;
+}
+
+
+STATIC_COMMAND_START
+#if LK_DEBUGLEVEL > 1
+ STATIC_COMMAND("buildsig", "scan for and dump build signature", &cmd_buildsig)
+#endif
+STATIC_COMMAND_END(buildid);
+
+#endif
+