Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net
Several cases of overlapping changes which were for the most part trivially resolvable. Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
@@ -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)
|
||||
@@ -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;
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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}
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user