magiskboot: add support for lz4 compressed dt (extra)

- legacy devices brought up to Android 10 may now use a compressed dt in a hdr_v0 AOSP dt variant extra section, so detect, decompress and recompress this
- so far these have only been done using lz4 compression (latest format revision magic), e.g. LOS 17.1 victara (Moto X)
This commit is contained in:
osm0sis 2020-05-25 01:09:36 -03:00 committed by John Wu
parent fde78be2b4
commit e50295d337
2 changed files with 20 additions and 3 deletions

View File

@ -255,6 +255,7 @@ void boot_img::parse_image(uint8_t *addr) {
k_fmt = check_fmt(kernel, hdr->kernel_size()); k_fmt = check_fmt(kernel, hdr->kernel_size());
r_fmt = check_fmt(ramdisk, hdr->ramdisk_size()); r_fmt = check_fmt(ramdisk, hdr->ramdisk_size());
e_fmt = check_fmt(extra, hdr->extra_size());
// Check MTK // Check MTK
if (k_fmt == MTK) { if (k_fmt == MTK) {
@ -280,6 +281,7 @@ void boot_img::parse_image(uint8_t *addr) {
fprintf(stderr, "KERNEL_FMT [%s]\n", fmt2name[k_fmt]); fprintf(stderr, "KERNEL_FMT [%s]\n", fmt2name[k_fmt]);
fprintf(stderr, "RAMDISK_FMT [%s]\n", fmt2name[r_fmt]); fprintf(stderr, "RAMDISK_FMT [%s]\n", fmt2name[r_fmt]);
fprintf(stderr, "EXTRA_FMT [%s]\n", fmt2name[e_fmt]);
} }
static int find_dtb_offset(uint8_t *buf, int sz) { static int find_dtb_offset(uint8_t *buf, int sz) {
@ -371,7 +373,13 @@ int unpack(const char *image, bool nodecomp, bool hdr) {
dump(boot.second, boot.hdr->second_size(), SECOND_FILE); dump(boot.second, boot.hdr->second_size(), SECOND_FILE);
// Dump extra // Dump extra
dump(boot.extra, boot.hdr->extra_size(), EXTRA_FILE); if (!nodecomp && COMPRESSED(boot.e_fmt)) {
int fd = creat(EXTRA_FILE, 0644);
decompress(boot.e_fmt, fd, boot.extra, boot.hdr->extra_size());
close(fd);
} else {
dump(boot.extra, boot.hdr->extra_size(), EXTRA_FILE);
}
// Dump recovery_dtbo // Dump recovery_dtbo
dump(boot.recovery_dtbo, boot.hdr->recovery_dtbo_size(), RECV_DTBO_FILE); dump(boot.recovery_dtbo, boot.hdr->recovery_dtbo_size(), RECV_DTBO_FILE);
@ -483,7 +491,15 @@ void repack(const char* src_img, const char* out_img, bool nocomp) {
// extra // extra
off.extra = lseek(fd, 0, SEEK_CUR); off.extra = lseek(fd, 0, SEEK_CUR);
if (access(EXTRA_FILE, R_OK) == 0) { if (access(EXTRA_FILE, R_OK) == 0) {
boot.hdr->extra_size() = restore(fd, EXTRA_FILE); size_t raw_size;
void *raw_buf;
mmap_ro(EXTRA_FILE, raw_buf, raw_size);
if (!nocomp && !COMPRESSED_ANY(check_fmt(raw_buf, raw_size)) && COMPRESSED(boot.e_fmt)) {
boot.hdr->extra_size() = compress(boot.e_fmt, fd, raw_buf, raw_size);
} else {
boot.hdr->extra_size() = xwrite(fd, raw_buf, raw_size);
}
munmap(raw_buf, raw_size);
file_align(); file_align();
} }

View File

@ -303,9 +303,10 @@ struct boot_img {
// Flags to indicate the state of current boot image // Flags to indicate the state of current boot image
uint16_t flags = 0; uint16_t flags = 0;
// The format of kernel and ramdisk // The format of kernel, ramdisk and extra
format_t k_fmt; format_t k_fmt;
format_t r_fmt; format_t r_fmt;
format_t e_fmt;
/*************************************************** /***************************************************
* Following pointers points within the mmap region * Following pointers points within the mmap region