xref: /xnu-10002.41.9/san/tools/generate_dynamic_blacklist.py (revision 699cd48037512bf4380799317ca44ca453c82f57)
1*699cd480SApple OSS Distributions#!/usr/bin/env python
2*699cd480SApple OSS Distributions
3*699cd480SApple OSS Distributionsfrom __future__ import absolute_import
4*699cd480SApple OSS Distributionsimport sys
5*699cd480SApple OSS Distributions
6*699cd480SApple OSS Distributions
7*699cd480SApple OSS Distributionsdef type_map(x):
8*699cd480SApple OSS Distributions    return "TYPE_" + x.upper()
9*699cd480SApple OSS Distributions
10*699cd480SApple OSS Distributions
11*699cd480SApple OSS Distributionsdef print_preamble():
12*699cd480SApple OSS Distributions    print(r'struct blacklist_entry blacklist[] = {')
13*699cd480SApple OSS Distributions
14*699cd480SApple OSS Distributions
15*699cd480SApple OSS Distributionsdef print_entry(kext, func, type):
16*699cd480SApple OSS Distributions    strkext = '"' + kext + '"' if kext != "" else "NULL"
17*699cd480SApple OSS Distributions    strfunc = '"' + func + '"' if func != "" else "NULL"
18*699cd480SApple OSS Distributions
19*699cd480SApple OSS Distributions    strtype = "0"
20*699cd480SApple OSS Distributions    if type:
21*699cd480SApple OSS Distributions        strtype = type_map(type) if type != "" else "normal"
22*699cd480SApple OSS Distributions
23*699cd480SApple OSS Distributions    print("""	{{
24*699cd480SApple OSS Distributions		.kext_name = {},
25*699cd480SApple OSS Distributions		.func_name = {},
26*699cd480SApple OSS Distributions		.type_mask = {},
27*699cd480SApple OSS Distributions	}},""".format(strkext, strfunc, strtype))
28*699cd480SApple OSS Distributions
29*699cd480SApple OSS Distributions
30*699cd480SApple OSS Distributionsdef print_postamble(nentries, extra_entries):
31*699cd480SApple OSS Distributions    print('') # add space for new entries added at runtime
32*699cd480SApple OSS Distributions    print(r'	/* Unused entries that can be populated at runtime */')
33*699cd480SApple OSS Distributions
34*699cd480SApple OSS Distributions    for _ in range(extra_entries):
35*699cd480SApple OSS Distributions        print_entry("", "", None)
36*699cd480SApple OSS Distributions
37*699cd480SApple OSS Distributions    print("};\n")
38*699cd480SApple OSS Distributions
39*699cd480SApple OSS Distributions    print('static size_t blacklist_entries = {};'.format(nentries))
40*699cd480SApple OSS Distributions    print('static const size_t blacklist_max_entries = {};'.format(
41*699cd480SApple OSS Distributions        nentries + extra_entries))
42*699cd480SApple OSS Distributions
43*699cd480SApple OSS Distributions
44*699cd480SApple OSS Distributionsdef extract_symbol(line):
45*699cd480SApple OSS Distributions    fields = line.split(":")
46*699cd480SApple OSS Distributions    if len(fields) == 3:
47*699cd480SApple OSS Distributions        return [field.strip() for field in fields]
48*699cd480SApple OSS Distributions    raise Exception("Invalid exclusion rule: {}".format(line))
49*699cd480SApple OSS Distributions
50*699cd480SApple OSS Distributions
51*699cd480SApple OSS Distributionswith open(sys.argv[1]) as fd:
52*699cd480SApple OSS Distributions    nentries = 0
53*699cd480SApple OSS Distributions    extra_entries = 5
54*699cd480SApple OSS Distributions
55*699cd480SApple OSS Distributions    print_preamble()
56*699cd480SApple OSS Distributions
57*699cd480SApple OSS Distributions    for line in fd.readlines():
58*699cd480SApple OSS Distributions        line = line.strip()
59*699cd480SApple OSS Distributions        if line and not line.startswith("#"):
60*699cd480SApple OSS Distributions            kext, func, ty = extract_symbol(line)
61*699cd480SApple OSS Distributions            print_entry(kext, func, ty)
62*699cd480SApple OSS Distributions            nentries += 1
63*699cd480SApple OSS Distributions
64*699cd480SApple OSS Distributions    print_postamble(nentries, extra_entries)
65