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