Loading fastboot/bootimg_utils.cpp +20 −16 Original line number Diff line number Diff line Loading @@ -34,20 +34,20 @@ #include <stdlib.h> #include <string.h> static void bootimg_set_cmdline_v3(boot_img_hdr_v3* h, const std::string& cmdline) { static void bootimg_set_cmdline_v3_and_above(boot_img_hdr_v3* h, const std::string& cmdline) { if (cmdline.size() >= sizeof(h->cmdline)) die("command line too large: %zu", cmdline.size()); strcpy(reinterpret_cast<char*>(h->cmdline), cmdline.c_str()); } void bootimg_set_cmdline(boot_img_hdr_v2* h, const std::string& cmdline) { if (h->header_version == 3) { return bootimg_set_cmdline_v3(reinterpret_cast<boot_img_hdr_v3*>(h), cmdline); if (h->header_version >= 3) { return bootimg_set_cmdline_v3_and_above(reinterpret_cast<boot_img_hdr_v3*>(h), cmdline); } if (cmdline.size() >= sizeof(h->cmdline)) die("command line too large: %zu", cmdline.size()); strcpy(reinterpret_cast<char*>(h->cmdline), cmdline.c_str()); } static boot_img_hdr_v3* mkbootimg_v3(const std::vector<char>& kernel, static void mkbootimg_v3_and_above(const std::vector<char>& kernel, const std::vector<char>& ramdisk, const boot_img_hdr_v2& src, std::vector<char>* out) { #define V3_PAGE_SIZE 4096 Loading @@ -65,22 +65,27 @@ static boot_img_hdr_v3* mkbootimg_v3(const std::vector<char>& kernel, hdr->ramdisk_size = ramdisk.size(); hdr->os_version = src.os_version; hdr->header_size = sizeof(boot_img_hdr_v3); hdr->header_version = 3; hdr->header_version = src.header_version; if (src.header_version >= 4) { auto hdr_v4 = reinterpret_cast<boot_img_hdr_v4*>(hdr); hdr_v4->signature_size = 0; } memcpy(hdr->magic + V3_PAGE_SIZE, kernel.data(), kernel.size()); memcpy(hdr->magic + V3_PAGE_SIZE + kernel_actual, ramdisk.data(), ramdisk.size()); return hdr; } boot_img_hdr_v2* mkbootimg(const std::vector<char>& kernel, const std::vector<char>& ramdisk, const std::vector<char>& second, const std::vector<char>& dtb, size_t base, const boot_img_hdr_v2& src, std::vector<char>* out) { if (src.header_version == 3) { void mkbootimg(const std::vector<char>& kernel, const std::vector<char>& ramdisk, const std::vector<char>& second, const std::vector<char>& dtb, size_t base, const boot_img_hdr_v2& src, std::vector<char>* out) { if (src.header_version >= 3) { if (!second.empty() || !dtb.empty()) { die("Second stage bootloader and dtb not supported in v3 boot image\n"); die("Second stage bootloader and dtb not supported in v%d boot image\n", src.header_version); } return reinterpret_cast<boot_img_hdr_v2*>(mkbootimg_v3(kernel, ramdisk, src, out)); mkbootimg_v3_and_above(kernel, ramdisk, src, out); return; } const size_t page_mask = src.page_size - 1; Loading Loading @@ -122,5 +127,4 @@ boot_img_hdr_v2* mkbootimg(const std::vector<char>& kernel, const std::vector<ch second.size()); memcpy(hdr->magic + hdr->page_size + kernel_actual + ramdisk_actual + second_actual, dtb.data(), dtb.size()); return hdr; } fastboot/bootimg_utils.h +4 −3 Original line number Diff line number Diff line Loading @@ -35,7 +35,8 @@ #include <string> #include <vector> boot_img_hdr_v2* mkbootimg(const std::vector<char>& kernel, const std::vector<char>& ramdisk, const std::vector<char>& second, const std::vector<char>& dtb, size_t base, const boot_img_hdr_v2& src, std::vector<char>* out); void mkbootimg(const std::vector<char>& kernel, const std::vector<char>& ramdisk, const std::vector<char>& second, const std::vector<char>& dtb, size_t base, const boot_img_hdr_v2& src, std::vector<char>* out); void bootimg_set_cmdline(boot_img_hdr_v2* h, const std::string& cmdline); fastboot/fastboot.cpp +5 −3 Original line number Diff line number Diff line Loading @@ -523,10 +523,12 @@ static std::vector<char> LoadBootableImage(const std::string& kernel, const std: fprintf(stderr,"creating boot image...\n"); std::vector<char> out; boot_img_hdr_v2* boot_image_data = mkbootimg(kernel_data, ramdisk_data, second_stage_data, dtb_data, g_base_addr, g_boot_img_hdr, &out); mkbootimg(kernel_data, ramdisk_data, second_stage_data, dtb_data, g_base_addr, g_boot_img_hdr, &out); if (!g_cmdline.empty()) bootimg_set_cmdline(boot_image_data, g_cmdline); if (!g_cmdline.empty()) { bootimg_set_cmdline(reinterpret_cast<boot_img_hdr_v2*>(out.data()), g_cmdline); } fprintf(stderr, "creating boot image - %zu bytes\n", out.size()); return out; } Loading Loading
fastboot/bootimg_utils.cpp +20 −16 Original line number Diff line number Diff line Loading @@ -34,20 +34,20 @@ #include <stdlib.h> #include <string.h> static void bootimg_set_cmdline_v3(boot_img_hdr_v3* h, const std::string& cmdline) { static void bootimg_set_cmdline_v3_and_above(boot_img_hdr_v3* h, const std::string& cmdline) { if (cmdline.size() >= sizeof(h->cmdline)) die("command line too large: %zu", cmdline.size()); strcpy(reinterpret_cast<char*>(h->cmdline), cmdline.c_str()); } void bootimg_set_cmdline(boot_img_hdr_v2* h, const std::string& cmdline) { if (h->header_version == 3) { return bootimg_set_cmdline_v3(reinterpret_cast<boot_img_hdr_v3*>(h), cmdline); if (h->header_version >= 3) { return bootimg_set_cmdline_v3_and_above(reinterpret_cast<boot_img_hdr_v3*>(h), cmdline); } if (cmdline.size() >= sizeof(h->cmdline)) die("command line too large: %zu", cmdline.size()); strcpy(reinterpret_cast<char*>(h->cmdline), cmdline.c_str()); } static boot_img_hdr_v3* mkbootimg_v3(const std::vector<char>& kernel, static void mkbootimg_v3_and_above(const std::vector<char>& kernel, const std::vector<char>& ramdisk, const boot_img_hdr_v2& src, std::vector<char>* out) { #define V3_PAGE_SIZE 4096 Loading @@ -65,22 +65,27 @@ static boot_img_hdr_v3* mkbootimg_v3(const std::vector<char>& kernel, hdr->ramdisk_size = ramdisk.size(); hdr->os_version = src.os_version; hdr->header_size = sizeof(boot_img_hdr_v3); hdr->header_version = 3; hdr->header_version = src.header_version; if (src.header_version >= 4) { auto hdr_v4 = reinterpret_cast<boot_img_hdr_v4*>(hdr); hdr_v4->signature_size = 0; } memcpy(hdr->magic + V3_PAGE_SIZE, kernel.data(), kernel.size()); memcpy(hdr->magic + V3_PAGE_SIZE + kernel_actual, ramdisk.data(), ramdisk.size()); return hdr; } boot_img_hdr_v2* mkbootimg(const std::vector<char>& kernel, const std::vector<char>& ramdisk, const std::vector<char>& second, const std::vector<char>& dtb, size_t base, const boot_img_hdr_v2& src, std::vector<char>* out) { if (src.header_version == 3) { void mkbootimg(const std::vector<char>& kernel, const std::vector<char>& ramdisk, const std::vector<char>& second, const std::vector<char>& dtb, size_t base, const boot_img_hdr_v2& src, std::vector<char>* out) { if (src.header_version >= 3) { if (!second.empty() || !dtb.empty()) { die("Second stage bootloader and dtb not supported in v3 boot image\n"); die("Second stage bootloader and dtb not supported in v%d boot image\n", src.header_version); } return reinterpret_cast<boot_img_hdr_v2*>(mkbootimg_v3(kernel, ramdisk, src, out)); mkbootimg_v3_and_above(kernel, ramdisk, src, out); return; } const size_t page_mask = src.page_size - 1; Loading Loading @@ -122,5 +127,4 @@ boot_img_hdr_v2* mkbootimg(const std::vector<char>& kernel, const std::vector<ch second.size()); memcpy(hdr->magic + hdr->page_size + kernel_actual + ramdisk_actual + second_actual, dtb.data(), dtb.size()); return hdr; }
fastboot/bootimg_utils.h +4 −3 Original line number Diff line number Diff line Loading @@ -35,7 +35,8 @@ #include <string> #include <vector> boot_img_hdr_v2* mkbootimg(const std::vector<char>& kernel, const std::vector<char>& ramdisk, const std::vector<char>& second, const std::vector<char>& dtb, size_t base, const boot_img_hdr_v2& src, std::vector<char>* out); void mkbootimg(const std::vector<char>& kernel, const std::vector<char>& ramdisk, const std::vector<char>& second, const std::vector<char>& dtb, size_t base, const boot_img_hdr_v2& src, std::vector<char>* out); void bootimg_set_cmdline(boot_img_hdr_v2* h, const std::string& cmdline);
fastboot/fastboot.cpp +5 −3 Original line number Diff line number Diff line Loading @@ -523,10 +523,12 @@ static std::vector<char> LoadBootableImage(const std::string& kernel, const std: fprintf(stderr,"creating boot image...\n"); std::vector<char> out; boot_img_hdr_v2* boot_image_data = mkbootimg(kernel_data, ramdisk_data, second_stage_data, dtb_data, g_base_addr, g_boot_img_hdr, &out); mkbootimg(kernel_data, ramdisk_data, second_stage_data, dtb_data, g_base_addr, g_boot_img_hdr, &out); if (!g_cmdline.empty()) bootimg_set_cmdline(boot_image_data, g_cmdline); if (!g_cmdline.empty()) { bootimg_set_cmdline(reinterpret_cast<boot_img_hdr_v2*>(out.data()), g_cmdline); } fprintf(stderr, "creating boot image - %zu bytes\n", out.size()); return out; } Loading