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:
parent
fde78be2b4
commit
e50295d337
@ -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
|
||||||
|
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(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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user