]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - scripts/kallsyms.c
drm/i915/dsi: Init panel-enable GPIO to low when the LCD is initially off (v2)
[linux.git] / scripts / kallsyms.c
index baa2fa5692b08a48c90be12110a2d5e1548728ff..fb55f262f42d6cee3f14475637b29d44028df97c 100644 (file)
@@ -18,6 +18,7 @@
  *
  */
 
+#include <stdbool.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -56,9 +57,9 @@ static struct addr_range percpu_range = {
 
 static struct sym_entry *table;
 static unsigned int table_size, table_cnt;
-static int all_symbols = 0;
-static int absolute_percpu = 0;
-static int base_relative = 0;
+static int all_symbols;
+static int absolute_percpu;
+static int base_relative;
 
 static int token_profit[0x10000];
 
@@ -79,8 +80,83 @@ static char *sym_name(const struct sym_entry *s)
        return (char *)s->sym + 1;
 }
 
-static int check_symbol_range(const char *sym, unsigned long long addr,
-                             struct addr_range *ranges, int entries)
+static bool is_ignored_symbol(const char *name, char type)
+{
+       static const char * const ignored_symbols[] = {
+               /*
+                * Symbols which vary between passes. Passes 1 and 2 must have
+                * identical symbol lists. The kallsyms_* symbols below are
+                * only added after pass 1, they would be included in pass 2
+                * when --all-symbols is specified so exclude them to get a
+                * stable symbol list.
+                */
+               "kallsyms_addresses",
+               "kallsyms_offsets",
+               "kallsyms_relative_base",
+               "kallsyms_num_syms",
+               "kallsyms_names",
+               "kallsyms_markers",
+               "kallsyms_token_table",
+               "kallsyms_token_index",
+               /* Exclude linker generated symbols which vary between passes */
+               "_SDA_BASE_",           /* ppc */
+               "_SDA2_BASE_",          /* ppc */
+               NULL
+       };
+
+       static const char * const ignored_prefixes[] = {
+               "$",                    /* local symbols for ARM, MIPS, etc. */
+               ".LASANPC",             /* s390 kasan local symbols */
+               "__crc_",               /* modversions */
+               "__efistub_",           /* arm64 EFI stub namespace */
+               NULL
+       };
+
+       static const char * const ignored_suffixes[] = {
+               "_from_arm",            /* arm */
+               "_from_thumb",          /* arm */
+               "_veneer",              /* arm */
+               NULL
+       };
+
+       const char * const *p;
+
+       /* Exclude symbols which vary between passes. */
+       for (p = ignored_symbols; *p; p++)
+               if (!strcmp(name, *p))
+                       return true;
+
+       for (p = ignored_prefixes; *p; p++)
+               if (!strncmp(name, *p, strlen(*p)))
+                       return true;
+
+       for (p = ignored_suffixes; *p; p++) {
+               int l = strlen(name) - strlen(*p);
+
+               if (l >= 0 && !strcmp(name + l, *p))
+                       return true;
+       }
+
+       if (type == 'U' || type == 'u')
+               return true;
+       /* exclude debugging symbols */
+       if (type == 'N' || type == 'n')
+               return true;
+
+       if (toupper(type) == 'A') {
+               /* Keep these useful absolute symbols */
+               if (strcmp(name, "__kernel_syscall_via_break") &&
+                   strcmp(name, "__kernel_syscall_via_epc") &&
+                   strcmp(name, "__kernel_sigtramp") &&
+                   strcmp(name, "__gp"))
+                       return true;
+       }
+
+       return false;
+}
+
+static void check_symbol_range(const char *sym, unsigned long long addr,
+                              struct addr_range *ranges, int entries)
 {
        size_t i;
        struct addr_range *ar;
@@ -90,14 +166,12 @@ static int check_symbol_range(const char *sym, unsigned long long addr,
 
                if (strcmp(sym, ar->start_sym) == 0) {
                        ar->start = addr;
-                       return 0;
+                       return;
                } else if (strcmp(sym, ar->end_sym) == 0) {
                        ar->end = addr;
-                       return 0;
+                       return;
                }
        }
-
-       return 1;
 }
 
 static int read_symbol(FILE *in, struct sym_entry *s)
@@ -118,37 +192,15 @@ static int read_symbol(FILE *in, struct sym_entry *s)
                return -1;
        }
 
+       if (is_ignored_symbol(sym, stype))
+               return -1;
+
        /* Ignore most absolute/undefined (?) symbols. */
        if (strcmp(sym, "_text") == 0)
                _text = s->addr;
-       else if (check_symbol_range(sym, s->addr, text_ranges,
-                                   ARRAY_SIZE(text_ranges)) == 0)
-               /* nothing to do */;
-       else if (toupper(stype) == 'A')
-       {
-               /* Keep these useful absolute symbols */
-               if (strcmp(sym, "__kernel_syscall_via_break") &&
-                   strcmp(sym, "__kernel_syscall_via_epc") &&
-                   strcmp(sym, "__kernel_sigtramp") &&
-                   strcmp(sym, "__gp"))
-                       return -1;
 
-       }
-       else if (toupper(stype) == 'U')
-               return -1;
-       /*
-        * Ignore generated symbols such as:
-        *  - mapping symbols in ARM ELF files ($a, $t, and $d)
-        *  - MIPS ELF local symbols ($L123 instead of .L123)
-        */
-       else if (sym[0] == '$')
-               return -1;
-       /* exclude debugging symbols */
-       else if (stype == 'N' || stype == 'n')
-               return -1;
-       /* exclude s390 kasan local symbols */
-       else if (!strncmp(sym, ".LASANPC", 8))
-               return -1;
+       check_symbol_range(sym, s->addr, text_ranges, ARRAY_SIZE(text_ranges));
+       check_symbol_range(sym, s->addr, &percpu_range, 1);
 
        /* include the type field in the symbol name, so that it gets
         * compressed together */
@@ -164,17 +216,14 @@ static int read_symbol(FILE *in, struct sym_entry *s)
 
        s->percpu_absolute = 0;
 
-       /* Record if we've found __per_cpu_start/end. */
-       check_symbol_range(sym, s->addr, &percpu_range, 1);
-
        return 0;
 }
 
-static int symbol_in_range(struct sym_entry *s, struct addr_range *ranges,
-                          int entries)
+static int symbol_in_range(const struct sym_entry *s,
+                          const struct addr_range *ranges, int entries)
 {
        size_t i;
-       struct addr_range *ar;
+       const struct addr_range *ar;
 
        for (i = 0; i < entries; ++i) {
                ar = &ranges[i];
@@ -186,40 +235,8 @@ static int symbol_in_range(struct sym_entry *s, struct addr_range *ranges,
        return 0;
 }
 
-static int symbol_valid(struct sym_entry *s)
+static int symbol_valid(const struct sym_entry *s)
 {
-       /* Symbols which vary between passes.  Passes 1 and 2 must have
-        * identical symbol lists.  The kallsyms_* symbols below are only added
-        * after pass 1, they would be included in pass 2 when --all-symbols is
-        * specified so exclude them to get a stable symbol list.
-        */
-       static char *special_symbols[] = {
-               "kallsyms_addresses",
-               "kallsyms_offsets",
-               "kallsyms_relative_base",
-               "kallsyms_num_syms",
-               "kallsyms_names",
-               "kallsyms_markers",
-               "kallsyms_token_table",
-               "kallsyms_token_index",
-
-       /* Exclude linker generated symbols which vary between passes */
-               "_SDA_BASE_",           /* ppc */
-               "_SDA2_BASE_",          /* ppc */
-               NULL };
-
-       static char *special_prefixes[] = {
-               "__crc_",               /* modversions */
-               "__efistub_",           /* arm64 EFI stub namespace */
-               NULL };
-
-       static char *special_suffixes[] = {
-               "_veneer",              /* arm */
-               "_from_arm",            /* arm */
-               "_from_thumb",          /* arm */
-               NULL };
-
-       int i;
        const char *name = sym_name(s);
 
        /* if --all-symbols is not specified, then symbols outside the text
@@ -241,25 +258,6 @@ static int symbol_valid(struct sym_entry *s)
                        return 0;
        }
 
-       /* Exclude symbols which vary between passes. */
-       for (i = 0; special_symbols[i]; i++)
-               if (strcmp(name, special_symbols[i]) == 0)
-                       return 0;
-
-       for (i = 0; special_prefixes[i]; i++) {
-               int l = strlen(special_prefixes[i]);
-
-               if (strncmp(name, special_prefixes[i], l) == 0)
-                       return 0;
-       }
-
-       for (i = 0; special_suffixes[i]; i++) {
-               int l = strlen(name) - strlen(special_suffixes[i]);
-
-               if (l >= 0 && strcmp(name + l, special_suffixes[i]) == 0)
-                       return 0;
-       }
-
        return 1;
 }
 
@@ -305,7 +303,7 @@ static void read_map(FILE *in)
        }
 }
 
-static void output_label(char *label)
+static void output_label(const char *label)
 {
        printf(".globl %s\n", label);
        printf("\tALGN\n");
@@ -314,7 +312,7 @@ static void output_label(char *label)
 
 /* uncompress a compressed symbol. When this function is called, the best table
  * might still be compressed itself, so the function needs to be recursive */
-static int expand_symbol(unsigned char *data, int len, char *result)
+static int expand_symbol(const unsigned char *data, int len, char *result)
 {
        int c, rlen, total=0;
 
@@ -339,7 +337,7 @@ static int expand_symbol(unsigned char *data, int len, char *result)
        return total;
 }
 
-static int symbol_absolute(struct sym_entry *s)
+static int symbol_absolute(const struct sym_entry *s)
 {
        return s->percpu_absolute;
 }
@@ -477,7 +475,7 @@ static void write_src(void)
 /* table lookup compression functions */
 
 /* count all the possible tokens in a symbol */
-static void learn_symbol(unsigned char *symbol, int len)
+static void learn_symbol(const unsigned char *symbol, int len)
 {
        int i;
 
@@ -486,7 +484,7 @@ static void learn_symbol(unsigned char *symbol, int len)
 }
 
 /* decrease the count for all the possible tokens in a symbol */
-static void forget_symbol(unsigned char *symbol, int len)
+static void forget_symbol(const unsigned char *symbol, int len)
 {
        int i;
 
@@ -503,7 +501,8 @@ static void build_initial_tok_table(void)
                learn_symbol(table[i].sym, table[i].len);
 }
 
-static void *find_token(unsigned char *str, int len, unsigned char *token)
+static unsigned char *find_token(unsigned char *str, int len,
+                                const unsigned char *token)
 {
        int i;
 
@@ -516,7 +515,7 @@ static void *find_token(unsigned char *str, int len, unsigned char *token)
 
 /* replace a given token in all the valid symbols. Use the sampled symbols
  * to update the counts */
-static void compress_symbols(unsigned char *str, int idx)
+static void compress_symbols(const unsigned char *str, int idx)
 {
        unsigned int i, len, size;
        unsigned char *p1, *p2;
@@ -661,16 +660,6 @@ static int may_be_linker_script_provide_symbol(const struct sym_entry *se)
        return 0;
 }
 
-static int prefix_underscores_count(const char *str)
-{
-       const char *tail = str;
-
-       while (*tail == '_')
-               tail++;
-
-       return tail - str;
-}
-
 static int compare_symbols(const void *a, const void *b)
 {
        const struct sym_entry *sa;
@@ -699,8 +688,8 @@ static int compare_symbols(const void *a, const void *b)
                return wa - wb;
 
        /* sort by the number of prefix underscores */
-       wa = prefix_underscores_count(sym_name(sa));
-       wb = prefix_underscores_count(sym_name(sb));
+       wa = strspn(sym_name(sa), "_");
+       wb = strspn(sym_name(sb), "_");
        if (wa != wb)
                return wa - wb;