aboutsummaryrefslogtreecommitdiffstats
path: root/recipes-devtools/qc-image-unpacker/qc-image-unpacker/0002-Add-support-for-bootldr-images.patch
diff options
context:
space:
mode:
Diffstat (limited to 'recipes-devtools/qc-image-unpacker/qc-image-unpacker/0002-Add-support-for-bootldr-images.patch')
-rw-r--r--recipes-devtools/qc-image-unpacker/qc-image-unpacker/0002-Add-support-for-bootldr-images.patch239
1 files changed, 239 insertions, 0 deletions
diff --git a/recipes-devtools/qc-image-unpacker/qc-image-unpacker/0002-Add-support-for-bootldr-images.patch b/recipes-devtools/qc-image-unpacker/qc-image-unpacker/0002-Add-support-for-bootldr-images.patch
new file mode 100644
index 0000000..69be8a9
--- /dev/null
+++ b/recipes-devtools/qc-image-unpacker/qc-image-unpacker/0002-Add-support-for-bootldr-images.patch
@@ -0,0 +1,239 @@
+From edc81e94e416e45b49c698456c9c6e5cd2caa041 Mon Sep 17 00:00:00 2001
+From: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
+Date: Wed, 10 Nov 2021 01:14:53 +0300
+Subject: [PATCH 2/4] Add support for bootldr images
+
+Add support for BOOTLDR! images found e.g. in the Pixel2/2XL binary
+blobs archive. They are used with the msm8998 (SDM835) Snapdragon SoCs.
+
+Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
+---
+ src/bootldr_image.c | 132 ++++++++++++++++++++++++++++++++++++++++
+ src/bootldr_image.h | 50 +++++++++++++++
+ src/qc_image_unpacker.c | 7 +++
+ 3 files changed, 189 insertions(+)
+ create mode 100644 src/bootldr_image.c
+ create mode 100644 src/bootldr_image.h
+
+diff --git a/src/bootldr_image.c b/src/bootldr_image.c
+new file mode 100644
+index 000000000000..739f6eb2a9c6
+--- /dev/null
++++ b/src/bootldr_image.c
+@@ -0,0 +1,132 @@
++/*
++
++ qc_image_unpacker
++ -----------------------------------------
++
++ Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
++ Copyright 2019 - 2020 by CENSUS S.A. All Rights Reserved.
++ Copyright 2021 by Linaro Ltd.
++
++ Licensed under the Apache License, Version 2.0 (the "License");
++ you may not use this file except in compliance with the License.
++ You may obtain a copy of the License at
++
++ http://www.apache.org/licenses/LICENSE-2.0
++
++ Unless required by applicable law or agreed to in writing, software
++ distributed under the License is distributed on an "AS IS" BASIS,
++ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ See the License for the specific language governing permissions and
++ limitations under the License.
++
++*/
++
++#include "bootldr_image.h"
++
++#include "common.h"
++#include "utils.h"
++
++bool bootldr_image_detect(u1 *buf, size_t bufSz)
++{
++ bootldr_header_t *pBootLdrHeader;
++
++ if (bufSz < sizeof(bootldr_header_t))
++ return false;
++
++ pBootLdrHeader = (bootldr_header_t *)buf;
++
++ return (pBootLdrHeader->magic1 == BOOTLDR_IMG_MAGIC1) &&
++ (pBootLdrHeader->magic2 == BOOTLDR_IMG_MAGIC2);
++}
++
++bool bootldr_image_extract(u1 *buf, size_t bufSz, char *filePath, char *outputDir) {
++ bootldr_header_t *pBootLdrHeader;
++ bootldr_img_header_entry_t *pImgHeaderEntry;
++ u4 i = 0, j = 0, images, start_offset;
++ u1 *pImageEnd = NULL;
++ bool PnameTerminated = false;
++ char outPath[PATH_MAX], outFile[PATH_MAX];
++
++ if (bufSz < sizeof(bootldr_header_t)) {
++ LOGMSG(l_ERROR, "Invalid input size (%zu < %zu)", bufSz, sizeof(bootldr_header_t));
++ return false;
++ }
++
++ pBootLdrHeader = (bootldr_header_t *)buf;
++ if (pBootLdrHeader->magic1 != BOOTLDR_IMG_MAGIC1) {
++ LOGMSG(l_ERROR, "Invalid magic header (0x%x != 0x%x)", pBootLdrHeader->magic1, BOOTLDR_IMG_MAGIC1);
++ return false;
++ }
++
++ if (pBootLdrHeader->magic2 != BOOTLDR_IMG_MAGIC2) {
++ LOGMSG(l_ERROR, "Invalid magic header (0x%x != 0x%x)", pBootLdrHeader->magic2, BOOTLDR_IMG_MAGIC2);
++ return false;
++ }
++
++ pImgHeaderEntry = (bootldr_img_header_entry_t *)(buf + sizeof(bootldr_header_t));
++ images = pBootLdrHeader->images;
++ start_offset = pBootLdrHeader->start_offset;
++
++ if ((size_t)bufSz <= sizeof(bootldr_header_t) + images * sizeof(bootldr_img_header_entry_t)) {
++ LOGMSG(l_ERROR, "The size is smaller than image header size + entry size");
++ return false;
++ }
++
++ pImageEnd = buf + bufSz;
++
++ // Create output root directory to place extracted images
++ memset(outPath, 0, sizeof(outPath));
++ snprintf(outPath, sizeof(outPath), "%s/%s_images", outputDir, utils_fileBasename(filePath));
++ if (mkdir(outPath, 0755)) {
++ LOGMSG_P(l_ERROR, "mkdir(%s) failed", outPath);
++ return false;
++ }
++
++ LOGMSG(l_DEBUG, "Processing '%u' images", images);
++ for (i = 0; i < images; i++) {
++ int dstfd = -1;
++ PnameTerminated = false;
++ if (pImgHeaderEntry[i].ptn_name[0] == 0x00 ||
++ pImgHeaderEntry[i].size == 0)
++ break;
++
++ if (pImageEnd < buf + start_offset + pImgHeaderEntry[i].size) {
++ LOGMSG(l_ERROR, "Image size mismatch");
++ return false;
++ }
++
++ for (j = 0; j < BOOTLDR_PARTITION_NAME_SZ; j++) {
++ if (!(pImgHeaderEntry[i].ptn_name[j])) {
++ PnameTerminated = true;
++ break;
++ }
++ }
++ if (!PnameTerminated) {
++ LOGMSG(l_ERROR, "ptn_name string not terminated properly");
++ return false;
++ }
++
++ // Write output file
++ memset(outFile, 0, sizeof(outFile));
++ if (snprintf(outFile, sizeof(outFile), "%s/%s", outPath, pImgHeaderEntry[i].ptn_name) < 0) {
++ LOGMSG(l_ERROR, "Failed to construct output path string");
++ return false;
++ }
++ dstfd = open(outFile, O_CREAT | O_EXCL | O_RDWR, 0644);
++ if (dstfd == -1) {
++ LOGMSG_P(l_ERROR, "Couldn't create output file '%s' in input directory", outFile);
++ return false;
++ }
++
++ if (!utils_writeToFd(dstfd, buf + start_offset, pImgHeaderEntry[i].size)) {
++ close(dstfd);
++ return false;
++ }
++
++ close(dstfd);
++
++ start_offset += pImgHeaderEntry[i].size;
++ }
++
++ return true;
++}
+diff --git a/src/bootldr_image.h b/src/bootldr_image.h
+new file mode 100644
+index 000000000000..15e188491b79
+--- /dev/null
++++ b/src/bootldr_image.h
+@@ -0,0 +1,50 @@
++/*
++
++ qc_image_unpacker
++ -----------------------------------------
++
++ Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
++ Copyright 2019 - 2020 by CENSUS S.A. All Rights Reserved.
++ Copyright 2021 by Linaro Ltd.
++
++ Licensed under the Apache License, Version 2.0 (the "License");
++ you may not use this file except in compliance with the License.
++ You may obtain a copy of the License at
++
++ http://www.apache.org/licenses/LICENSE-2.0
++
++ Unless required by applicable law or agreed to in writing, software
++ distributed under the License is distributed on an "AS IS" BASIS,
++ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ See the License for the specific language governing permissions and
++ limitations under the License.
++
++*/
++
++#ifndef _BOOTLDR_IMAGE_H_
++#define _BOOTLDR_IMAGE_H_
++
++#include "common.h"
++
++#define BOOTLDR_IMG_MAGIC1 0x544f4f42
++#define BOOTLDR_IMG_MAGIC2 0x2152444c
++#define BOOTLDR_PARTITION_NAME_SZ 0x40
++//#define MAX_IMAGES_IN_BOOTLDRIMG 32
++
++typedef struct bootldr_header {
++ u4 magic1;
++ u4 magic2;
++ u4 images;
++ u4 start_offset;
++ u4 full_size;
++} bootldr_header_t;
++
++typedef struct bootldr_img_header_entry {
++ char ptn_name[BOOTLDR_PARTITION_NAME_SZ];
++ u4 size;
++} bootldr_img_header_entry_t;
++
++bool bootldr_image_detect(u1 *, size_t);
++bool bootldr_image_extract(u1 *, size_t, char *, char *);
++
++#endif
+diff --git a/src/qc_image_unpacker.c b/src/qc_image_unpacker.c
+index 44d737803ea0..ea7fd0779645 100644
+--- a/src/qc_image_unpacker.c
++++ b/src/qc_image_unpacker.c
+@@ -25,6 +25,7 @@
+
+ #include "common.h"
+ #include "log.h"
++#include "bootldr_image.h"
+ #include "meta_image.h"
+ #include "packed_image.h"
+ #include "utils.h"
+@@ -152,6 +153,12 @@ int main(int argc, char **argv) {
+ LOGMSG(l_ERROR, "Skipping '%s'", pFiles.files[f]);
+ goto next_file;
+ }
++ } else if (bootldr_image_detect(buf, (size_t)fileSz)) {
++ LOGMSG(l_DEBUG, "bootldr image header found");
++ if (!bootldr_image_extract(buf, (size_t)fileSz, pFiles.files[f], pRunArgs.outputDir)) {
++ LOGMSG(l_ERROR, "Skipping '%s'", pFiles.files[f]);
++ goto next_file;
++ }
+ } else {
+ LOGMSG(l_ERROR, "Invalid magic header 0x%x - skipping '%s'", *(u4*)buf,
+ pFiles.files[f]);
+--
+2.35.1
+