Skip to content

Commit

Permalink
add merge_dto_to_main_dtb() func
Browse files Browse the repository at this point in the history
  • Loading branch information
sndnvaps committed Dec 11, 2024
1 parent 0227291 commit b729aa1
Show file tree
Hide file tree
Showing 13 changed files with 1,203 additions and 969 deletions.
1 change: 1 addition & 0 deletions Makefile.in
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ PURGATORY_EXTRA_CFLAGS = @PURGATORY_EXTRA_CFLAGS@
ASFLAGS = @ASFLAGS@ $($(ARCH)_ASFLAGS)
LDFLAGS = @LDFLAGS@ -static
LIBS = @LIBS@
STRIPFLAGS = @STRIPFLAGS@ --strip-all

# Utilities called by the makefiles
INSTALL = @INSTALL@
Expand Down
2 changes: 1 addition & 1 deletion build.sh
Original file line number Diff line number Diff line change
@@ -1 +1 @@
CC=clang CFLAGS="-I/usr/aarch64-linux-gnu/include" CLANG_TRIPLE=aarch64-linux-gnu- ./configure --host=aarch64-linux-gnu --prefix=$(pwd)/build --target=aarch64-linux-gnu
CC=clang STRIP=llvm-strip CXX=clang++ CFLAGS="-I/usr/aarch64-linux-gnu/include" CLANG_TRIPLE=aarch64-linux-gnu- ./configure --host=aarch64-linux-gnu --prefix=$(pwd)/build --target=aarch64-linux-gnu
1 change: 1 addition & 0 deletions configure.ac
Original file line number Diff line number Diff line change
Expand Up @@ -202,6 +202,7 @@ AC_SUBST([TARGET_CC])
AC_SUBST([TARGET_LD])
AC_SUBST([TARGET_CFLAGS])
AC_SUBST([ASFLAGS])
AC_SUBST([STRIPFLAGS])

AC_SUBST([ARCH])
AC_SUBST([SUBARCH])
Expand Down
1 change: 1 addition & 0 deletions kdump/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ $(KDUMP): CC=$(TARGET_CC)
$(KDUMP): $(KDUMP_OBJS)
@$(MKDIR) -p $(@D)
$(LINK.o) -o $@ $^ $(CFLAGS) $(LIBS)
$(STRIP) $(STRIPFLAGS) $@

$(KDUMP_MANPAGE): kdump/kdump.8
$(MKDIR) -p $(MANDIR)/man8
Expand Down
1 change: 1 addition & 0 deletions kexec/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,7 @@ KEXEC_MANPAGE = $(MANDIR)/man8/kexec.8
$(KEXEC): $(KEXEC_OBJS) $(UTIL_LIB)
@$(MKDIR) -p $(@D)
$(LINK.o) -o $@ $^ $(CFLAGS) $(LIBS)
$(STRIP) $(STRIPFLAGS) $@

$(KEXEC): CPPFLAGS+=-I$(srcdir)/kexec/arch/$(ARCH)/include

Expand Down
114 changes: 74 additions & 40 deletions kexec/arch/arm64/kexec-arm64.c
Original file line number Diff line number Diff line change
Expand Up @@ -702,71 +702,104 @@ struct dtbo_img load_dtboimg(void)
return dtbo_info;
}


struct dtb arm64_load_dtbo(void) {
struct dtb merge_dto_to_main_dtb(void)
{
struct dtb dtb_info = {};
struct dtbo_img dtbo_info = {};
void *fdto, *merged_fdt;
void *fdt_dtb;
void *dtboimg_buf = NULL;
int i = 0;
int dt_entry_count;
int offset;
int dtbo_entry_offset[DTBO_COUNT] = {0};
struct fdt_header *main_fdt_header = NULL;
struct fdt_header *merged_fdt = NULL;
size_t main_fdt_size;
struct dt_table_header *dtbo_table;
struct dt_table_entry *dt_entry;
uint32_t i;
int ret;
//set board_id = 0;
//set board_rev = 0;
uint32_t board_id = 0;
uint32_t board_rev = 0;

//dbgprintf("arm64_load_dtb: in line %d",__LINE__);
dtb_info = load_dtb();
if (dtb_info.buf == NULL) {
dtbo_error("load_dtb fail\n");
return dtb_info;
}
fdt_dtb = (void *)malloc(dtb_info.size);
fdt_dtb = dtb_info.buf;

//dbgprintf("arm64_load_dtbo: in line %d",__LINE__);
dtbo_info = load_dtboimg();
if (dtbo_info.buf == NULL) {
dtbo_error("load_dtbo fail\n");
return dtb_info;
}
dtboimg_buf = (void *)malloc(dtbo_info.size);
dtboimg_buf = dtbo_info.buf;
dtbo_table = (struct dt_table_header *)dtboimg_buf;

main_fdt_header = ufdt_install_blob((void *)dtb_info.buf, dtb_info.size);
main_fdt_size = dtb_info.size;

//dbgprintf("arm64_load_dtbo: in line %d",__LINE__);
memset((void *)dtbo_entry_offset, 0x0, sizeof(dtbo_entry_offset));
dt_entry_count = check_dtbo(dtbo_info.buf, dtbo_entry_offset);
dbgprintf("dt_entry_count= %d\n", dt_entry_count);
if (dt_entry_count < 0) {
dtbo_error("don't have match dtbo\n");
free(dtboimg_buf);

ret = fdt_check_header(fdt_dtb);
if (ret < 0) {
printf("DTBO: fdt_check_header(): %s\n", fdt_strerror(ret));
return dtb_info;
}
while (dtbo_idx[i] != 0xf5f5f5f5) {
if (dtbo_idx[i] > dt_entry_count) {
dtbo_error("androidboot.dtbo_idx is %d > dtboimg %d\n", dtbo_idx[i], dt_entry_count);
return dtb_info;
}
offset = dtbo_entry_offset[dtbo_idx[i]];
dbgprintf("offset= 0x%x\n", offset);
dbgprintf("dtbo_idx_%d overlay_size=0x%x\n", dtbo_idx[i], fdt_totalsize(dtboimg_buf + offset));
merged_fdt = ufdt_apply_overlay(main_fdt_header, main_fdt_size,
dtboimg_buf + offset, fdt_totalsize(dtboimg_buf + offset));
if (merged_fdt == NULL) {
dtbo_error(" merge fdt fail\n");
return dtb_info;

if (fdt32_to_cpu(dtbo_table->magic) != DT_TABLE_MAGIC) {
printf("DTBO: dtbo.img: %s\n", fdt_strerror(-FDT_ERR_BADMAGIC));
return dtb_info;
}
dt_entry = (struct dt_table_entry *)((unsigned long)dtbo_table
+ fdt32_to_cpu(dtbo_table->header_size));

for (i = 0; i < fdt32_to_cpu(dtbo_table->dt_entry_count); i++, dt_entry++) {
uint32_t id = fdt32_to_cpu(dt_entry->id);
uint32_t rev = fdt32_to_cpu(dt_entry->rev);

if ((id == board_id) && (rev == board_rev)) {
printf("DTBO: id: 0x%x, rev: 0x%x\n", id, rev);
break;
}
//merged_fdt_size = dtc_totalsize(merged_fdt);
}

dbgprintf("dtbo_idx_%d merge sucess, size=0x%x \n", dtbo_idx[i], fdt_totalsize(merged_fdt));
i++;
if (i == fdt32_to_cpu(dtbo_table->dt_entry_count)) {
printf("DTBO: Not found dtbo of board_rev 0x%x.\n", board_rev);
return dtb_info;
}

fdto = malloc(fdt32_to_cpu(dt_entry->dt_size));
memcpy((void *)fdto, (void *)((unsigned long)dtbo_table + fdt32_to_cpu(dt_entry->dt_offset)),
fdt32_to_cpu(dt_entry->dt_size));

ret = fdt_check_header(fdto);
if (ret < 0) {
printf("DTBO: overlay dtbo: %s", fdt_strerror(ret));
goto fdto_magic_err;
}
dtb_info.buf = (char *)merged_fdt;
dtb_info.size = fdt_totalsize(merged_fdt);

merged_fdt = ufdt_apply_overlay(fdt_dtb, fdt_totalsize(fdt_dtb),
fdto, fdt_totalsize(fdto));
if (!merged_fdt)
goto fdto_magic_err;

fdt_dtb = malloc(fdt_totalsize(merged_fdt));
memcpy(fdt_dtb, merged_fdt, fdt_totalsize(merged_fdt));
printf("DTBO: Merge Complete (size:%d)!\n", fdt_totalsize(fdt_dtb));

free(merged_fdt);
dtb_info.buf = (char *)malloc(fdt_totalsize(fdt_dtb));
dtb_info.buf = (char *)fdt_dtb;
dtb_info.size = fdt_totalsize(fdt_dtb);


fdto_magic_err:
free(fdto);

return dtb_info;
}



/**
* arm64_load_other_segments - Prepare the dtb, initrd and purgatory segments.
*/
Expand All @@ -791,7 +824,7 @@ int arm64_load_other_segments(struct kexec_info *info,
}

purgatory_sink = find_purgatory_sink(arm64_opts.console);
dbgprintf("%s:%d: purgatory sink: 0x%" PRIx64 "\n", __func__, __LINE__,
dbgprintf("%s:%d: purgatory sink: %#lx\n", __func__, __LINE__,
purgatory_sink);

//dbgprintf("arm64_load_other_segments: in line %d",__LINE__);
Expand All @@ -801,7 +834,8 @@ int arm64_load_other_segments(struct kexec_info *info,
dtb.buf = slurp_file(arm64_opts.dtb, &dtb.size);
if (arm64_opts.dtbo) {
//dbgprintf("arm64_load_other_segments: in line %d",__LINE__);
dtb = arm64_load_dtbo();
//dtb = arm64_load_dtbo();
dtb = merge_dto_to_main_dtb();
//dbgprintf("arm64_load_other_segments: in line %d",__LINE__);
dtb.name = "dtb_user";
}
Expand Down Expand Up @@ -837,7 +871,6 @@ int arm64_load_other_segments(struct kexec_info *info,
fprintf(stderr, "kexec: Empty ramdisk file.\n");
else {
/* Put the initrd after the kernel. */

initrd_base = add_buffer_phys_virt(info, initrd_buf,
initrd_size, initrd_size, 0,
hole_min, hole_max, 1, 0);
Expand Down Expand Up @@ -872,9 +905,9 @@ int arm64_load_other_segments(struct kexec_info *info,
fprintf(stderr, "kexec: Error: dtb too big.\n");
return EFAILED;
}

dtb_base = add_buffer_phys_virt(info, dtb.buf, dtb.size, dtb.size,
0, hole_min, hole_max, 1, 0);

/* dtb_base is valid if we got here. */

dbgprintf("dtb: base %lx, size %lxh (%ld)\n", dtb_base, dtb.size,
Expand All @@ -893,6 +926,7 @@ int arm64_load_other_segments(struct kexec_info *info,

elf_rel_set_symbol(&info->rhdr, "arm64_dtb_addr", &dtb_base,
sizeof(dtb_base));

return 0;
}

Expand Down
6 changes: 3 additions & 3 deletions kexec/arch/arm64/kexec-image-arm64.c
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ int image_arm64_load(int argc, char **argv, const char *kernel_buf,
dbgprintf("%s: PE format: %s\n", __func__,
(arm64_header_check_pe_sig(header) ? "yes" : "no"));

dbgprintf("%s: %d",__func__,__LINE__);
//dbgprintf("%s: %d",__func__,__LINE__);
/* create and initialize elf core header segment */
if (info->kexec_flags & KEXEC_ON_CRASH) {
result = load_crashdump_segments(info);
Expand All @@ -70,12 +70,12 @@ int image_arm64_load(int argc, char **argv, const char *kernel_buf,
goto exit;
}
}
dbgprintf("%s: %d",__func__,__LINE__);
//dbgprintf("%s: %d",__func__,__LINE__);
/* load the kernel */
add_segment_phys_virt(info, kernel_buf, kernel_size,
kernel_segment + arm64_mem.text_offset,
arm64_mem.image_size, 0);
dbgprintf("%s: %d",__func__,__LINE__);
//dbgprintf("%s: %d",__func__,__LINE__);
/* load additional data */
result = arm64_load_other_segments(info, kernel_segment
+ arm64_mem.text_offset);
Expand Down
31 changes: 31 additions & 0 deletions kexec/dt-ops.c
Original file line number Diff line number Diff line change
Expand Up @@ -143,3 +143,34 @@ int dtb_delete_property(char *dtb, const char *node, const char *prop)

return result;
}

int dtb_add_extra_regs(char **dtb, off_t *dtb_size) {
FILE *f;
uint32_t reg;
int off;

//delete fdt_node /memory/reg
dtb_delete_property(*dtb,"/memory", "reg");

off = fdt_path_offset(*dtb, "/memory");
if (off < 0)
{
fprintf(stderr, "DTB: Could not find memory node.\n");
return -1;
}

f = fopen("/proc/device-tree/memory/reg", "r");
if(!f)
{
fprintf(stderr, "DTB: Failed to open /proc/device-tree/memory/reg!\n");
return -1;
}

while (fread(&reg, sizeof(reg),1,f) == 1) {
dtb_set_property(dtb, dtb_size, "/memory", "reg", &reg, sizeof(reg));
}

fclose(f);

return 0;
}
2 changes: 2 additions & 0 deletions kexec/dt-ops.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,6 @@ int dtb_set_property(char **dtb, off_t *dtb_size, const char *node,

int dtb_delete_property(char *dtb, const char *node, const char *prop);

int dtb_add_extra_regs(char **dtb, off_t *dtb_size);

#endif
Loading

0 comments on commit b729aa1

Please sign in to comment.