diff options
Diffstat (limited to 'scripts')
| -rw-r--r-- | scripts/coccinelle/api/devm_platform_ioremap_resource.cocci | 60 | ||||
| -rw-r--r-- | scripts/coccinelle/misc/add_namespace.cocci | 2 | ||||
| -rw-r--r-- | scripts/gdb/linux/dmesg.py | 16 | ||||
| -rw-r--r-- | scripts/gdb/linux/symbols.py | 8 | ||||
| -rw-r--r-- | scripts/gdb/linux/utils.py | 25 | ||||
| -rw-r--r-- | scripts/mod/modpost.c | 29 | ||||
| -rw-r--r-- | scripts/nsdeps | 4 | ||||
| -rw-r--r-- | scripts/recordmcount.h | 5 | 
8 files changed, 52 insertions, 97 deletions
| diff --git a/scripts/coccinelle/api/devm_platform_ioremap_resource.cocci b/scripts/coccinelle/api/devm_platform_ioremap_resource.cocci deleted file mode 100644 index 56a2e261d61d..000000000000 --- a/scripts/coccinelle/api/devm_platform_ioremap_resource.cocci +++ /dev/null @@ -1,60 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0 -/// Use devm_platform_ioremap_resource helper which wraps -/// platform_get_resource() and devm_ioremap_resource() together. -/// -// Confidence: High -// Copyright: (C) 2019 Himanshu Jha GPLv2. -// Copyright: (C) 2019 Julia Lawall, Inria/LIP6. GPLv2. -// Keywords: platform_get_resource, devm_ioremap_resource, -// Keywords: devm_platform_ioremap_resource - -virtual patch -virtual report - -@r depends on patch && !report@ -expression e1, e2, arg1, arg2, arg3; -identifier id; -@@ - -( -- id = platform_get_resource(arg1, IORESOURCE_MEM, arg2); -| -- struct resource *id = platform_get_resource(arg1, IORESOURCE_MEM, arg2); -) -  ... when != id -- e1 = devm_ioremap_resource(arg3, id); -+ e1 = devm_platform_ioremap_resource(arg1, arg2); -  ... when != id -? id = e2 - -@r1 depends on patch && !report@ -identifier r.id; -type T; -@@ - -- T *id; -  ...when != id - -@r2 depends on report && !patch@ -identifier id; -expression e1, e2, arg1, arg2, arg3; -position j0; -@@ - -( -  id = platform_get_resource(arg1, IORESOURCE_MEM, arg2); -| -  struct resource *id = platform_get_resource(arg1, IORESOURCE_MEM, arg2); -) -  ... when != id -  e1@j0 = devm_ioremap_resource(arg3, id); -  ... when != id -? id = e2 - -@script:python depends on report && !patch@ -e1 << r2.e1; -j0 << r2.j0; -@@ - -msg = "WARNING: Use devm_platform_ioremap_resource for %s" % (e1) -coccilib.report.print_report(j0[0], msg) diff --git a/scripts/coccinelle/misc/add_namespace.cocci b/scripts/coccinelle/misc/add_namespace.cocci index c832bb6445a8..99e93a6c2e24 100644 --- a/scripts/coccinelle/misc/add_namespace.cocci +++ b/scripts/coccinelle/misc/add_namespace.cocci @@ -6,6 +6,8 @@  /// add a missing namespace tag to a module source file.  /// +virtual report +  @has_ns_import@  declarer name MODULE_IMPORT_NS;  identifier virtual.ns; diff --git a/scripts/gdb/linux/dmesg.py b/scripts/gdb/linux/dmesg.py index 6d2e09a2ad2f..2fa7bb83885f 100644 --- a/scripts/gdb/linux/dmesg.py +++ b/scripts/gdb/linux/dmesg.py @@ -16,6 +16,8 @@ import sys  from linux import utils +printk_log_type = utils.CachedType("struct printk_log") +  class LxDmesg(gdb.Command):      """Print Linux kernel log buffer.""" @@ -42,9 +44,14 @@ class LxDmesg(gdb.Command):              b = utils.read_memoryview(inf, log_buf_addr, log_next_idx)              log_buf = a.tobytes() + b.tobytes() +        length_offset = printk_log_type.get_type()['len'].bitpos // 8 +        text_len_offset = printk_log_type.get_type()['text_len'].bitpos // 8 +        time_stamp_offset = printk_log_type.get_type()['ts_nsec'].bitpos // 8 +        text_offset = printk_log_type.get_type().sizeof +          pos = 0          while pos < log_buf.__len__(): -            length = utils.read_u16(log_buf[pos + 8:pos + 10]) +            length = utils.read_u16(log_buf, pos + length_offset)              if length == 0:                  if log_buf_2nd_half == -1:                      gdb.write("Corrupted log buffer!\n") @@ -52,10 +59,11 @@ class LxDmesg(gdb.Command):                  pos = log_buf_2nd_half                  continue -            text_len = utils.read_u16(log_buf[pos + 10:pos + 12]) -            text = log_buf[pos + 16:pos + 16 + text_len].decode( +            text_len = utils.read_u16(log_buf, pos + text_len_offset) +            text_start = pos + text_offset +            text = log_buf[text_start:text_start + text_len].decode(                  encoding='utf8', errors='replace') -            time_stamp = utils.read_u64(log_buf[pos:pos + 8]) +            time_stamp = utils.read_u64(log_buf, pos + time_stamp_offset)              for line in text.splitlines():                  msg = u"[{time:12.6f}] {line}\n".format( diff --git a/scripts/gdb/linux/symbols.py b/scripts/gdb/linux/symbols.py index 34e40e96dee2..7b7c2fafbc68 100644 --- a/scripts/gdb/linux/symbols.py +++ b/scripts/gdb/linux/symbols.py @@ -15,7 +15,7 @@ import gdb  import os  import re -from linux import modules +from linux import modules, utils  if hasattr(gdb, 'Breakpoint'): @@ -116,6 +116,12 @@ lx-symbols command."""              module_file = self._get_module_file(module_name)          if module_file: +            if utils.is_target_arch('s390'): +                # Module text is preceded by PLT stubs on s390. +                module_arch = module['arch'] +                plt_offset = int(module_arch['plt_offset']) +                plt_size = int(module_arch['plt_size']) +                module_addr = hex(int(module_addr, 0) + plt_offset + plt_size)              gdb.write("loading @{addr}: {filename}\n".format(                  addr=module_addr, filename=module_file))              cmdline = "add-symbol-file {filename} {addr}{sections}".format( diff --git a/scripts/gdb/linux/utils.py b/scripts/gdb/linux/utils.py index bc67126118c4..ea94221dbd39 100644 --- a/scripts/gdb/linux/utils.py +++ b/scripts/gdb/linux/utils.py @@ -92,15 +92,16 @@ def read_memoryview(inf, start, length):      return memoryview(inf.read_memory(start, length)) -def read_u16(buffer): +def read_u16(buffer, offset): +    buffer_val = buffer[offset:offset + 2]      value = [0, 0] -    if type(buffer[0]) is str: -        value[0] = ord(buffer[0]) -        value[1] = ord(buffer[1]) +    if type(buffer_val[0]) is str: +        value[0] = ord(buffer_val[0]) +        value[1] = ord(buffer_val[1])      else: -        value[0] = buffer[0] -        value[1] = buffer[1] +        value[0] = buffer_val[0] +        value[1] = buffer_val[1]      if get_target_endianness() == LITTLE_ENDIAN:          return value[0] + (value[1] << 8) @@ -108,18 +109,18 @@ def read_u16(buffer):          return value[1] + (value[0] << 8) -def read_u32(buffer): +def read_u32(buffer, offset):      if get_target_endianness() == LITTLE_ENDIAN: -        return read_u16(buffer[0:2]) + (read_u16(buffer[2:4]) << 16) +        return read_u16(buffer, offset) + (read_u16(buffer, offset + 2) << 16)      else: -        return read_u16(buffer[2:4]) + (read_u16(buffer[0:2]) << 16) +        return read_u16(buffer, offset + 2) + (read_u16(buffer, offset) << 16) -def read_u64(buffer): +def read_u64(buffer, offset):      if get_target_endianness() == LITTLE_ENDIAN: -        return read_u32(buffer[0:4]) + (read_u32(buffer[4:8]) << 32) +        return read_u32(buffer, offset) + (read_u32(buffer, offset + 4) << 32)      else: -        return read_u32(buffer[4:8]) + (read_u32(buffer[0:4]) << 32) +        return read_u32(buffer, offset + 4) + (read_u32(buffer, offset) << 32)  target_arch = None diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c index 442d5e2ad688..936d3ad23c83 100644 --- a/scripts/mod/modpost.c +++ b/scripts/mod/modpost.c @@ -166,7 +166,7 @@ struct symbol {  	struct module *module;  	unsigned int crc;  	int crc_valid; -	const char *namespace; +	char *namespace;  	unsigned int weak:1;  	unsigned int vmlinux:1;    /* 1 if symbol is defined in vmlinux */  	unsigned int kernel:1;     /* 1 if symbol is from kernel @@ -348,20 +348,18 @@ static enum export export_from_sec(struct elf_info *elf, unsigned int sec)  		return export_unknown;  } -static const char *sym_extract_namespace(const char **symname) +static char *sym_extract_namespace(const char **symname)  { -	size_t n; -	char *dupsymname; +	char *namespace = NULL; +	char *ns_separator; -	n = strcspn(*symname, "."); -	if (n < strlen(*symname) - 1) { -		dupsymname = NOFAIL(strdup(*symname)); -		dupsymname[n] = '\0'; -		*symname = dupsymname; -		return dupsymname + n + 1; +	ns_separator = strchr(*symname, '.'); +	if (ns_separator) { +		namespace = NOFAIL(strndup(*symname, ns_separator - *symname)); +		*symname = ns_separator + 1;  	} -	return NULL; +	return namespace;  }  /** @@ -375,7 +373,6 @@ static struct symbol *sym_add_exported(const char *name, const char *namespace,  	if (!s) {  		s = new_symbol(name, mod, export); -		s->namespace = namespace;  	} else {  		if (!s->preloaded) {  			warn("%s: '%s' exported twice. Previous export was in %s%s\n", @@ -386,6 +383,8 @@ static struct symbol *sym_add_exported(const char *name, const char *namespace,  			s->module = mod;  		}  	} +	free(s->namespace); +	s->namespace = namespace ? strdup(namespace) : NULL;  	s->preloaded = 0;  	s->vmlinux   = is_vmlinux(mod->name);  	s->kernel    = 0; @@ -672,7 +671,8 @@ static void handle_modversions(struct module *mod, struct elf_info *info,  	unsigned int crc;  	enum export export;  	bool is_crc = false; -	const char *name, *namespace; +	const char *name; +	char *namespace;  	if ((!is_vmlinux(mod->name) || mod->is_dot_o) &&  	    strstarts(symname, "__ksymtab")) @@ -747,6 +747,7 @@ static void handle_modversions(struct module *mod, struct elf_info *info,  			name = symname + strlen("__ksymtab_");  			namespace = sym_extract_namespace(&name);  			sym_add_exported(name, namespace, mod, export); +			free(namespace);  		}  		if (strcmp(symname, "init_module") == 0)  			mod->has_init = 1; @@ -2195,7 +2196,7 @@ static int check_exports(struct module *mod)  		else  			basename = mod->name; -		if (exp->namespace) { +		if (exp->namespace && exp->namespace[0]) {  			add_namespace(&mod->required_namespaces,  				      exp->namespace); diff --git a/scripts/nsdeps b/scripts/nsdeps index ac2b6031dd13..3754dac13b31 100644 --- a/scripts/nsdeps +++ b/scripts/nsdeps @@ -1,4 +1,4 @@ -#!/bin/bash +#!/bin/sh  # SPDX-License-Identifier: GPL-2.0  # Linux kernel symbol namespace import generator  # @@ -41,7 +41,7 @@ generate_deps() {  		for source_file in $mod_source_files; do  			sed '/MODULE_IMPORT_NS/Q' $source_file > ${source_file}.tmp  			offset=$(wc -l ${source_file}.tmp | awk '{print $1;}') -			cat $source_file | grep MODULE_IMPORT_NS | sort -u >> ${source_file}.tmp +			cat $source_file | grep MODULE_IMPORT_NS | LANG=C sort -u >> ${source_file}.tmp  			tail -n +$((offset +1)) ${source_file} | grep -v MODULE_IMPORT_NS >> ${source_file}.tmp  			if ! diff -q ${source_file} ${source_file}.tmp; then  				mv ${source_file}.tmp ${source_file} diff --git a/scripts/recordmcount.h b/scripts/recordmcount.h index 8f0a278ce0af..74eab03e31d4 100644 --- a/scripts/recordmcount.h +++ b/scripts/recordmcount.h @@ -389,11 +389,8 @@ static int nop_mcount(Elf_Shdr const *const relhdr,  			mcountsym = get_mcountsym(sym0, relp, str0);  		if (mcountsym == Elf_r_sym(relp) && !is_fake_mcount(relp)) { -			if (make_nop) { +			if (make_nop)  				ret = make_nop((void *)ehdr, _w(shdr->sh_offset) + _w(relp->r_offset)); -				if (ret < 0) -					return -1; -			}  			if (warn_on_notrace_sect && !once) {  				printf("Section %s has mcount callers being ignored\n",  				       txtname); | 
