[PATCH v3 2/8] kexec: generalize and rename get_kernel_stext_sym()

Pratyush Anand panand at redhat.com
Thu Oct 6 23:44:39 PDT 2016


On Thu, Oct 6, 2016 at 6:58 PM, Matthias Brugger <matthias.bgg at gmail.com> wrote:
> On 09/07/2016 06:33 AM, AKASHI Takahiro wrote:
>>
>> From: Pratyush Anand <panand at redhat.com>
>>
>> get_kernel_stext_sym() has been defined for both arm and i386. Other
>> architecture might need some other kernel symbol address. Therefore
>> rewrite
>> this function as generic function to get any kernel symbol address.
>>
>> More over, kallsyms is not arch specific representation, therefore have
>> common function for all arches.
>>
>> Signed-off-by: Pratyush Anand <panand at redhat.com>
>> [created symbols.c]
>> Signed-off-by: AKASHI Takahiro <takahiro.akashi at linaro.org>
>> ---
>>  kexec/Makefile                  |  1 +
>>  kexec/arch/arm/crashdump-arm.c  | 40
>> +---------------------------------------
>>  kexec/arch/i386/crashdump-x86.c | 32 +-------------------------------
>>  kexec/kexec.h                   |  2 ++
>>  kexec/symbols.c                 | 41
>> +++++++++++++++++++++++++++++++++++++++++
>>  5 files changed, 46 insertions(+), 70 deletions(-)
>>  create mode 100644 kexec/symbols.c
>>
>> diff --git a/kexec/Makefile b/kexec/Makefile
>> index 39f365f..2b4fb3d 100644
>> --- a/kexec/Makefile
>> +++ b/kexec/Makefile
>> @@ -26,6 +26,7 @@ KEXEC_SRCS_base += kexec/kernel_version.c
>>  KEXEC_SRCS_base += kexec/lzma.c
>>  KEXEC_SRCS_base += kexec/zlib.c
>>  KEXEC_SRCS_base += kexec/kexec-xen.c
>> +KEXEC_SRCS_base += kexec/symbols.c
>>
>>  KEXEC_GENERATED_SRCS += $(PURGATORY_HEX_C)
>>
>> diff --git a/kexec/arch/arm/crashdump-arm.c
>> b/kexec/arch/arm/crashdump-arm.c
>> index 4a89b5e..2bc898b 100644
>> --- a/kexec/arch/arm/crashdump-arm.c
>> +++ b/kexec/arch/arm/crashdump-arm.c
>> @@ -73,48 +73,10 @@ static struct crash_elf_info elf_info = {
>>
>>  extern unsigned long long user_page_offset;
>>
>> -/* Retrieve kernel _stext symbol virtual address from /proc/kallsyms */
>> -static unsigned long long get_kernel_stext_sym(void)
>> -{
>> -       const char *kallsyms = "/proc/kallsyms";
>> -       const char *stext = "_stext";
>> -       char sym[128];
>> -       char line[128];
>> -       FILE *fp;
>> -       unsigned long long vaddr = 0;
>> -       char type;
>> -
>> -       fp = fopen(kallsyms, "r");
>> -       if (!fp) {
>> -               fprintf(stderr, "Cannot open %s\n", kallsyms);
>> -               return 0;
>> -       }
>> -
>> -       while(fgets(line, sizeof(line), fp) != NULL) {
>> -               unsigned long long addr;
>> -
>> -               if (sscanf(line, "%Lx %c %s", &addr, &type, sym) != 3)
>> -                       continue;
>> -
>> -               if (strcmp(sym, stext) == 0) {
>> -                       dbgprintf("kernel symbol %s vaddr = %#llx\n",
>> stext, addr);
>> -                       vaddr = addr;
>> -                       break;
>> -               }
>> -       }
>> -
>> -       fclose(fp);
>> -
>> -       if (vaddr == 0)
>> -               fprintf(stderr, "Cannot get kernel %s symbol address\n",
>> stext);
>> -
>> -       return vaddr;
>> -}
>> -
>>  static int get_kernel_page_offset(struct kexec_info *info,
>>                 struct crash_elf_info *elf_info)
>>  {
>> -       unsigned long long stext_sym_addr = get_kernel_stext_sym();
>> +       unsigned long long stext_sym_addr = get_kernel_sym("stext");
>>         if (stext_sym_addr == 0) {
>>                 if (user_page_offset != (-1ULL)) {
>>                         elf_info->page_offset = user_page_offset;
>> diff --git a/kexec/arch/i386/crashdump-x86.c
>> b/kexec/arch/i386/crashdump-x86.c
>> index bbc0f35..664eb3b 100644
>> --- a/kexec/arch/i386/crashdump-x86.c
>> +++ b/kexec/arch/i386/crashdump-x86.c
>> @@ -102,36 +102,6 @@ static int get_kernel_paddr(struct kexec_info
>> *UNUSED(info),
>>         return -1;
>>  }
>>
>> -/* Retrieve kernel _stext symbol virtual address from /proc/kallsyms */
>> -static unsigned long long get_kernel_stext_sym(void)
>> -{
>> -       const char *kallsyms = "/proc/kallsyms";
>> -       const char *stext = "_stext";
>> -       char sym[128];
>> -       char line[128];
>> -       FILE *fp;
>> -       unsigned long long vaddr;
>> -       char type;
>> -
>> -       fp = fopen(kallsyms, "r");
>> -       if (!fp) {
>> -               fprintf(stderr, "Cannot open %s\n", kallsyms);
>> -               return 0;
>> -       }
>> -
>> -       while(fgets(line, sizeof(line), fp) != NULL) {
>> -               if (sscanf(line, "%Lx %c %s", &vaddr, &type, sym) != 3)
>> -                       continue;
>> -               if (strcmp(sym, stext) == 0) {
>> -                       dbgprintf("kernel symbol %s vaddr = %16llx\n",
>> stext, vaddr);
>> -                       return vaddr;
>> -               }
>> -       }
>> -
>> -       fprintf(stderr, "Cannot get kernel %s symbol address\n", stext);
>> -       return 0;
>> -}
>> -
>>  /* Retrieve info regarding virtual address kernel has been compiled for
>> and
>>   * size of the kernel from /proc/kcore. Current /proc/kcore parsing from
>>   * from kexec-tools fails because of malformed elf notes. A kernel patch
>> has
>> @@ -182,7 +152,7 @@ static int get_kernel_vaddr_and_size(struct kexec_info
>> *UNUSED(info),
>>
>>         /* Traverse through the Elf headers and find the region where
>>          * _stext symbol is located in. That's where kernel is mapped */
>> -       stext_sym = get_kernel_stext_sym();
>> +       stext_sym = get_kernel_sym("stext");
>
>
>
> I think this should be get_kernel_sym("_stext");

OK.

>
> Apart from that as Simon already mentioned, due to commit
> 9f62cbd ("kexec/arch/i386: Add support for KASLR memory randomization")
> this patch does not apply cleanly.
>

Will rebase with latest.

Thanks for your review.

~Pratyush



More information about the kexec mailing list