Message ID | 20111107095603.1997.39898.stgit@mars.in.ibm.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
于 2011年11月07日 17:56, Mahesh J Salgaonkar 写道: > From: Mahesh Salgaonkar<mahesh@linux.vnet.ibm.com> > > Introduce a PT_NOTE program header that points to physical address of > vmcoreinfo_note buffer declared in kernel/kexec.c. The vmcoreinfo > note buffer is populated during crash_fadump() at the time of system > crash. > > Signed-off-by: Mahesh Salgaonkar<mahesh@linux.vnet.ibm.com> > --- > arch/powerpc/kernel/fadump.c | 29 +++++++++++++++++++++++++++++ > 1 files changed, 29 insertions(+), 0 deletions(-) > > diff --git a/arch/powerpc/kernel/fadump.c b/arch/powerpc/kernel/fadump.c > index 70d6287..e68ee3a 100644 > --- a/arch/powerpc/kernel/fadump.c > +++ b/arch/powerpc/kernel/fadump.c > @@ -816,6 +816,19 @@ static void setup_crash_memory_ranges(void) > } > } > > +/* > + * If the given physical address falls within the boot memory region then > + * return the relocated address that points to the dump region reserved > + * for saving initial boot memory contents. > + */ > +static inline unsigned long relocate(unsigned long paddr) > +{ > + if (paddr> RMR_START&& paddr< fw_dump.boot_memory_size) > + return fdm.rmr_region.destination_address + paddr; > + else > + return paddr; > +} Although they are static functions, it is still better to name them with "fadump_" prefix... Thanks.
diff --git a/arch/powerpc/kernel/fadump.c b/arch/powerpc/kernel/fadump.c index 70d6287..e68ee3a 100644 --- a/arch/powerpc/kernel/fadump.c +++ b/arch/powerpc/kernel/fadump.c @@ -816,6 +816,19 @@ static void setup_crash_memory_ranges(void) } } +/* + * If the given physical address falls within the boot memory region then + * return the relocated address that points to the dump region reserved + * for saving initial boot memory contents. + */ +static inline unsigned long relocate(unsigned long paddr) +{ + if (paddr > RMR_START && paddr < fw_dump.boot_memory_size) + return fdm.rmr_region.destination_address + paddr; + else + return paddr; +} + static int create_elfcore_headers(char *bufp) { struct elfhdr *elf; @@ -847,6 +860,22 @@ static int create_elfcore_headers(char *bufp) (elf->e_phnum)++; + /* setup ELF PT_NOTE for vmcoreinfo */ + phdr = (struct elf_phdr *)bufp; + bufp += sizeof(struct elf_phdr); + phdr->p_type = PT_NOTE; + phdr->p_flags = 0; + phdr->p_vaddr = 0; + phdr->p_align = 0; + + phdr->p_paddr = relocate(paddr_vmcoreinfo_note()); + phdr->p_offset = phdr->p_paddr; + phdr->p_memsz = vmcoreinfo_max_size; + phdr->p_filesz = vmcoreinfo_max_size; + + /* Increment number of program headers. */ + (elf->e_phnum)++; + /* setup PT_LOAD sections. */ for (i = 0; i < crash_mem_ranges; i++) {