-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathcheck-module-firmware
More file actions
executable file
·116 lines (95 loc) · 3.21 KB
/
Copy pathcheck-module-firmware
File metadata and controls
executable file
·116 lines (95 loc) · 3.21 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
#!/usr/bin/env python3
#
# Parse a c file and try to figure out if a MODULE_FIRMWARE alias is missing
#
# import os
import re
import sys
def read_line(fh):
"""
Return complete (continued) lines
"""
prev_line = ''
cont = False
for line in fh:
# Strip newlines and such
line = line.rstrip()
# Make sure that lines ending with \ continue
if cont:
line = prev_line + ' ' + line.lstrip()
if line.endswith('\\'):
cont = True
prev_line = line[:-1].rstrip()
continue
cont = False
yield line.replace('\t', ' ' * 8)
RE_INCLUDE = re.compile(r'^\s*#\s*include\s+"([^"]+)"')
def read_file(infile):
lines = []
with open(infile, encoding='utf-8') as fh:
for line in read_line(fh):
lines.append(line.strip())
# Read local includes
# m = RE_INCLUDE.match(line)
# if m:
# h = os.path.join(os.path.dirname(infile), m.group(1))
# return read_file(h))
return lines
RE_DEFINE = re.compile(r'^\s*#\s*define\s+([^\s]+)\s+(.*)')
def resolve_fname(name, lines):
name = name.replace('*', '\\*')
for line in lines:
m = re.match(r'^\s*#define\s+{}\s+(.*)'.format(name), line)
if m:
return m.group(1)
return name
RE_REQ_FW = re.compile(r'\b(request_firmware|firmware_request_nowarn|' +
r'firmware_request_platform|request_firmware_nowait|' +
r'request_firmware_direct|request_firmware_into_buf|' +
'request_partial_firmware_into_buf)\\((.*)\\);')
RE_MOD_FW = re.compile(r'MODULE_FIRMWARE\((.*)\);')
def process_file(infile):
lines = read_file(infile)
mod_fws = {}
errs = []
# First pass: Parse MODULE_FIRMWARE
for line in lines:
m = RE_MOD_FW.search(line)
if m:
name = m.group(1)
if name in mod_fws:
errs.append(f' Duplicate MODULE_FIRMWARE for ${name}')
mod_fws[name] = 1
for line in lines:
# Check for firmware request calls
m = RE_REQ_FW.search(line)
if m:
args = m.group(2).split(',')
if len(args) < 3:
continue
if m.group(1) == 'request_firmware_nowait':
name = args[2]
else:
name = args[1]
name = name.strip()
if name in mod_fws:
continue
if name.startswith('"') and name.endswith('"'):
errs.append(f' Missing MODULE_FIRMWARE for {name}')
continue
rname = resolve_fname(name, lines)
if rname != name:
if rname in mod_fws:
continue
if rname.startswith('"') and rname.endswith('"'):
errs.append(f' Missing MODULE_FIRMWARE for {rname}')
continue
errs.append(f' To check {name}')
# elif name != '__func__':
# chk_fws[name] = 1
# continue
if errs:
print(f'\n-- {infile}')
print("\n".join(errs))
for f in sys.argv[1:]:
process_file(f)