On Fri, 15 Sept 2023 at 18:02, Viktor Prutyanov <vik...@daynix.com> wrote: > > DMP supports 42 physical memory runs at most. So, merge adjacent > physical memory ranges from QEMU ELF when possible to minimize total > number of runs. > > Signed-off-by: Viktor Prutyanov <vik...@daynix.com> > --- > contrib/elf2dmp/main.c | 56 ++++++++++++++++++++++++++++++++++++------ > 1 file changed, 48 insertions(+), 8 deletions(-) > > diff --git a/contrib/elf2dmp/main.c b/contrib/elf2dmp/main.c > index b7e3930164..b4683575fd 100644 > --- a/contrib/elf2dmp/main.c > +++ b/contrib/elf2dmp/main.c > @@ -20,6 +20,7 @@ > #define PE_NAME "ntoskrnl.exe" > > #define INITIAL_MXCSR 0x1f80 > +#define MAX_NUMBER_OF_RUNS 42 > > typedef struct idt_desc { > uint16_t offset1; /* offset bits 0..15 */ > @@ -234,6 +235,42 @@ static int fix_dtb(struct va_space *vs, QEMU_Elf *qe) > return 1; > } > > +static void try_merge_runs(struct pa_space *ps, > + WinDumpPhyMemDesc64 *PhysicalMemoryBlock) > +{ > + unsigned int merge_cnt = 0, run_idx = 0; > + > + PhysicalMemoryBlock->NumberOfRuns = 0; > + > + for (size_t idx = 0; idx < ps->block_nr; idx++) { > + struct pa_block *blk = ps->block + idx; > + struct pa_block *next = blk + 1; > + > + PhysicalMemoryBlock->NumberOfPages += blk->size / ELF2DMP_PAGE_SIZE; > + > + if (idx + 1 != ps->block_nr && blk->paddr + blk->size == > next->paddr) { > + printf("Block #%lu 0x%"PRIx64"+:0x%"PRIx64" and %u previous will > be" > + " merged\n", idx, blk->paddr, blk->size, merge_cnt); > + merge_cnt++; > + } else { > + struct pa_block *first_merged = blk - merge_cnt; > + > + printf("Block #%lu 0x%"PRIx64"+:0x%"PRIx64" and %u previous will > be" > + " merged to 0x%"PRIx64"+:0x%"PRIx64" (run #%u)\n", > + idx, blk->paddr, blk->size, merge_cnt, > first_merged->paddr, > + blk->paddr + blk->size - first_merged->paddr, run_idx); > + PhysicalMemoryBlock->Run[run_idx] = (WinDumpPhyMemRun64) { > + .BasePage = first_merged->paddr / ELF2DMP_PAGE_SIZE, > + .PageCount = (blk->paddr + blk->size - first_merged->paddr) / > + ELF2DMP_PAGE_SIZE, > + };
Hi; this fails to build on 32-bit hosts because in both these printf() statements the format string uses "%lu" to print a size_t. This doesn't work if size_t is not a 'long'. The right format operator is "%zu". I have squashed in the relevant change to this patch in target-arm.next. thanks -- PMM