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