xref: /xnu-10063.141.1/tools/lldbmacros/nvram.py (revision d8b80295118ef25ac3a784134bcf95cd8e88109f) !
1*d8b80295SApple OSS Distributionsfrom ioreg import *
2*d8b80295SApple OSS Distributions
3*d8b80295SApple OSS Distributions@lldb_command("shownvram")
4*d8b80295SApple OSS Distributionsdef PrintNvramVars(cmd_args=[]):
5*d8b80295SApple OSS Distributions    """
6*d8b80295SApple OSS Distributions    Print NVRAM variables.
7*d8b80295SApple OSS Distributions    """
8*d8b80295SApple OSS Distributions    dt_plane = GetRegistryPlane("IODeviceTree")
9*d8b80295SApple OSS Distributions    if dt_plane is None:
10*d8b80295SApple OSS Distributions        raise ValueError("Couldn't obtain a pointer to IODeviceTree")
11*d8b80295SApple OSS Distributions
12*d8b80295SApple OSS Distributions    # Registry API functions operate on "plane" global variable
13*d8b80295SApple OSS Distributions    global plane
14*d8b80295SApple OSS Distributions    prev_plane = plane
15*d8b80295SApple OSS Distributions    plane = dt_plane
16*d8b80295SApple OSS Distributions    options = FindRegistryObjectRecurse(kern.globals.gRegistryRoot, "options")
17*d8b80295SApple OSS Distributions    # Restore original plane after getting options
18*d8b80295SApple OSS Distributions    plane = prev_plane
19*d8b80295SApple OSS Distributions    if options is None:
20*d8b80295SApple OSS Distributions        print("Couldn't obtain options IORegistryEntry")
21*d8b80295SApple OSS Distributions        return
22*d8b80295SApple OSS Distributions
23*d8b80295SApple OSS Distributions    var_dict = kern.GetValueFromAddress('((IODTNVRAM*)' + hex(options) + ')->_varDict', 'OSDictionary *')
24*d8b80295SApple OSS Distributions    if var_dict is None:
25*d8b80295SApple OSS Distributions        print("Couldn't obtain varDict")
26*d8b80295SApple OSS Distributions        return
27*d8b80295SApple OSS Distributions
28*d8b80295SApple OSS Distributions    for x in range(var_dict.count):
29*d8b80295SApple OSS Distributions        name = var_dict.dictionary[x].key.string
30*d8b80295SApple OSS Distributions        value = var_dict.dictionary[x].value
31*d8b80295SApple OSS Distributions
32*d8b80295SApple OSS Distributions        # get value type
33*d8b80295SApple OSS Distributions        value_info = GetObjectTypeStr(value)
34*d8b80295SApple OSS Distributions        if value_info is None:
35*d8b80295SApple OSS Distributions            print("Couldn't obtain object type for name:", name, "value:", value)
36*d8b80295SApple OSS Distributions            continue
37*d8b80295SApple OSS Distributions        srch = re.search(r'vtable for ([A-Za-z].*)', value_info)
38*d8b80295SApple OSS Distributions        if not srch:
39*d8b80295SApple OSS Distributions            print("Couldn't find type in value_info:", value_info)
40*d8b80295SApple OSS Distributions            continue
41*d8b80295SApple OSS Distributions        value_type = srch.group(1)
42*d8b80295SApple OSS Distributions
43*d8b80295SApple OSS Distributions        if (value_type == 'OSString'):
44*d8b80295SApple OSS Distributions            print(name, '=', GetString(value))
45*d8b80295SApple OSS Distributions        elif (value_type == 'OSData'):
46*d8b80295SApple OSS Distributions            data_ptr = Cast(value.data, 'uint8_t *')
47*d8b80295SApple OSS Distributions            print (name, '= ', end ='')
48*d8b80295SApple OSS Distributions            data_buffer = ""
49*d8b80295SApple OSS Distributions            for i in range(value.length):
50*d8b80295SApple OSS Distributions                if ((data_ptr[i] >= 0x20 and data_ptr[i] <= 0x7e) and chr(data_ptr[i]) != '%'):
51*d8b80295SApple OSS Distributions                    data_buffer += chr(data_ptr[i])
52*d8b80295SApple OSS Distributions                else:
53*d8b80295SApple OSS Distributions                    data_buffer += "%%%02x" % data_ptr[i]
54*d8b80295SApple OSS Distributions            print (data_buffer)
55*d8b80295SApple OSS Distributions        elif (value_type == 'OSNumber'):
56*d8b80295SApple OSS Distributions            print(name, '=', GetNumber(value))
57*d8b80295SApple OSS Distributions        elif (value_type == 'OSBoolean'):
58*d8b80295SApple OSS Distributions            print(name, '=', GetBoolean(value))
59*d8b80295SApple OSS Distributions        else:
60*d8b80295SApple OSS Distributions            print("Invalid type:", value_type)