From: HATAYAMA Daisuke <d.hatayama@xxxxxxxxxxxxxx> Setting values of the arguments of calc_kaslr_offset() should be done at the end of the function. Currently, they are set in the middle where their values could still be changed according to get_kaslr_offset_from_vmcoreinfo(). This behavior will be problematic in the later commits when we implement a trial-and-error approach because the value of kaslr_offset could be passed to the outside of calc_kaslr_offset() unexpectedly. Thus, fix this first. Signed-off-by: HATAYAMA Daisuke <d.hatayama@xxxxxxxxxxx> --- kaslr_helper.c | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/kaslr_helper.c b/kaslr_helper.c index fe5909c..acbb5c2 100644 --- a/kaslr_helper.c +++ b/kaslr_helper.c @@ -394,10 +394,11 @@ quit: #define PTI_USER_PGTABLE_MASK (1 << PTI_USER_PGTABLE_BIT) #define CR3_PCID_MASK 0xFFFull int -calc_kaslr_offset(ulong *kaslr_offset, ulong *phys_base) +calc_kaslr_offset(ulong *ko, ulong *pb) { uint64_t cr3 = 0, idtr = 0, pgd = 0, idtr_paddr; ulong divide_error_vmcore; + ulong kaslr_offset, phys_base; ulong kaslr_offset_kdump, phys_base_kdump; int ret = FALSE; int verbose = CRASHDEBUG(1)? 1: 0; @@ -445,9 +446,9 @@ calc_kaslr_offset(ulong *kaslr_offset, ulong *phys_base) /* Now we can calculate kaslr_offset and phys_base */ divide_error_vmcore = get_vec0_addr(idtr_paddr); - *kaslr_offset = divide_error_vmcore - st->divide_error_vmlinux; - *phys_base = idtr_paddr - - (st->idt_table_vmlinux + *kaslr_offset - __START_KERNEL_map); + kaslr_offset = divide_error_vmcore - st->divide_error_vmlinux; + phys_base = idtr_paddr - + (st->idt_table_vmlinux + kaslr_offset - __START_KERNEL_map); if (CRASHDEBUG(1)) { fprintf(fp, "calc_kaslr_offset: idtr=%lx\n", idtr); @@ -465,9 +466,9 @@ calc_kaslr_offset(ulong *kaslr_offset, ulong *phys_base) * from vmcoreinfo */ if (get_kaslr_offset_from_vmcoreinfo( - *kaslr_offset, &kaslr_offset_kdump, &phys_base_kdump)) { - *kaslr_offset = kaslr_offset_kdump; - *phys_base = phys_base_kdump; + kaslr_offset, &kaslr_offset_kdump, &phys_base_kdump)) { + kaslr_offset = kaslr_offset_kdump; + phys_base = phys_base_kdump; } else if (CRASHDEBUG(1)) { fprintf(fp, "kaslr_helper: failed to determine which kernel was running at crash,\n"); fprintf(fp, "kaslr_helper: asssuming the kdump 1st kernel.\n"); @@ -475,10 +476,13 @@ calc_kaslr_offset(ulong *kaslr_offset, ulong *phys_base) if (CRASHDEBUG(1)) { fprintf(fp, "calc_kaslr_offset: kaslr_offset=%lx\n", - *kaslr_offset); - fprintf(fp, "calc_kaslr_offset: phys_base=%lx\n", *phys_base); + kaslr_offset); + fprintf(fp, "calc_kaslr_offset: phys_base=%lx\n", phys_base); } + *ko = kaslr_offset; + *pb = phys_base; + ret = TRUE; quit: vt->kernel_pgd[0] = 0; -- 1.8.3.1 -- Crash-utility mailing list Crash-utility@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/crash-utility