1a6dbe372Spaul luse# SPDX-License-Identifier: BSD-3-Clause 2a6dbe372Spaul luse# Copyright (C) 2019 Intel Corporation. 369bec87aSMike Gerdts# Copyright (c) 2022, NVIDIA CORPORATION & AFFILIATES. All rights reserved. 4a6dbe372Spaul luse# 5a6dbe372Spaul luse 6f4d6841bSshahar salzmanimport gdb 7adc2ca50SMike Gerdtsimport gdb.printing 8f4d6841bSshahar salzman 9f4d6841bSshahar salzman 10f4d6841bSshahar salzmanclass SpdkTailqList(object): 11f4d6841bSshahar salzman 12f4d6841bSshahar salzman def __init__(self, list_pointer, list_member, tailq_name_list): 13f4d6841bSshahar salzman self.list_pointer = list_pointer 14f4d6841bSshahar salzman self.tailq_name_list = tailq_name_list 15f4d6841bSshahar salzman self.list_member = list_member 16f4d6841bSshahar salzman self.list = gdb.parse_and_eval(self.list_pointer) 17f4d6841bSshahar salzman 18f4d6841bSshahar salzman def __iter__(self): 19f4d6841bSshahar salzman curr = self.list['tqh_first'] 20f4d6841bSshahar salzman while curr: 21f4d6841bSshahar salzman yield self.list_member(curr) 22f4d6841bSshahar salzman for tailq_name in self.tailq_name_list: 23f4d6841bSshahar salzman curr = curr[tailq_name] 24f4d6841bSshahar salzman curr = curr['tqe_next'] 25f4d6841bSshahar salzman 26f4d6841bSshahar salzman 27f4d6841bSshahar salzmanclass SpdkNormalTailqList(SpdkTailqList): 28f4d6841bSshahar salzman 29f4d6841bSshahar salzman def __init__(self, list_pointer, list_member): 30f4d6841bSshahar salzman super(SpdkNormalTailqList, self).__init__(list_pointer, list_member, 31f4d6841bSshahar salzman ['tailq']) 32f4d6841bSshahar salzman 33f4d6841bSshahar salzman 34311d014dSKozlowski Mateuszclass SpdkRbTree(object): 35311d014dSKozlowski Mateusz 36311d014dSKozlowski Mateusz def __init__(self, tree_pointer, tree_member, tree_name_list): 37311d014dSKozlowski Mateusz self.tree_pointer = tree_pointer 38311d014dSKozlowski Mateusz self.tree_name_list = tree_name_list 39311d014dSKozlowski Mateusz self.tree_member = tree_member 40311d014dSKozlowski Mateusz self.tree = gdb.parse_and_eval(self.tree_pointer) 41311d014dSKozlowski Mateusz 42311d014dSKozlowski Mateusz def get_left_node(self, node): 43311d014dSKozlowski Mateusz return node['node']['rbe_left'] 44311d014dSKozlowski Mateusz 45311d014dSKozlowski Mateusz def get_right_node(self, node): 46311d014dSKozlowski Mateusz return node['node']['rbe_right'] 47311d014dSKozlowski Mateusz 48311d014dSKozlowski Mateusz def traverse_rb_tree(self, node): 49311d014dSKozlowski Mateusz if node: 50311d014dSKozlowski Mateusz self.rb_list.append(node) 51311d014dSKozlowski Mateusz self.traverse_rb_tree(self.get_left_node(node)) 52311d014dSKozlowski Mateusz self.traverse_rb_tree(self.get_right_node(node)) 53311d014dSKozlowski Mateusz 54311d014dSKozlowski Mateusz def __iter__(self): 55311d014dSKozlowski Mateusz self.rb_list = [] 56311d014dSKozlowski Mateusz tree_top = self.tree['rbh_root'] 57311d014dSKozlowski Mateusz if tree_top: 58311d014dSKozlowski Mateusz self.traverse_rb_tree(tree_top) 59311d014dSKozlowski Mateusz for rb_node in self.rb_list: 60311d014dSKozlowski Mateusz yield self.tree_member(rb_node) 61311d014dSKozlowski Mateusz else: 62311d014dSKozlowski Mateusz yield 63311d014dSKozlowski Mateusz 64311d014dSKozlowski Mateusz 65f4d6841bSshahar salzmanclass SpdkArr(object): 66f4d6841bSshahar salzman 67f4d6841bSshahar salzman def __init__(self, arr_pointer, num_elements, element_type): 68f4d6841bSshahar salzman self.arr_pointer = arr_pointer 69f4d6841bSshahar salzman self.num_elements = num_elements 70f4d6841bSshahar salzman self.element_type = element_type 71f4d6841bSshahar salzman 72f4d6841bSshahar salzman def __iter__(self): 7377a55a2fSshahar salzman for i in range(0, self.num_elements): 74f4d6841bSshahar salzman curr = (self.arr_pointer + i).dereference() 75f4d6841bSshahar salzman if (curr == 0x0): 76f4d6841bSshahar salzman continue 77f4d6841bSshahar salzman yield self.element_type(curr) 78f4d6841bSshahar salzman 79f4d6841bSshahar salzman 80f4d6841bSshahar salzmanclass SpdkPrintCommand(gdb.Command): 81f4d6841bSshahar salzman 82f4d6841bSshahar salzman def __init__(self, name, element_list): 83f4d6841bSshahar salzman self.element_list = element_list 84f4d6841bSshahar salzman gdb.Command.__init__(self, name, 85f4d6841bSshahar salzman gdb.COMMAND_DATA, 86f4d6841bSshahar salzman gdb.COMPLETE_SYMBOL, 87f4d6841bSshahar salzman True) 88f4d6841bSshahar salzman 89f4d6841bSshahar salzman def print_element_list(self, element_list): 90f4d6841bSshahar salzman first = True 91f4d6841bSshahar salzman for element in element_list: 92f4d6841bSshahar salzman if first: 93f4d6841bSshahar salzman first = False 94f4d6841bSshahar salzman else: 95f4d6841bSshahar salzman print("---------------") 96f4d6841bSshahar salzman print("\n" + str(element) + "\n") 97f4d6841bSshahar salzman 98f4d6841bSshahar salzman def invoke(self, arg, from_tty): 99f4d6841bSshahar salzman self.print_element_list(self.element_list) 100f4d6841bSshahar salzman 101f4d6841bSshahar salzman 102f4d6841bSshahar salzmanclass SpdkObject(object): 103f4d6841bSshahar salzman 104f4d6841bSshahar salzman def __init__(self, gdb_obj): 105f4d6841bSshahar salzman self.obj = gdb_obj 106f4d6841bSshahar salzman 107f4d6841bSshahar salzman def get_name(self): 108f4d6841bSshahar salzman return self.obj['name'] 109f4d6841bSshahar salzman 110f4d6841bSshahar salzman def __str__(self): 111f4d6841bSshahar salzman s = "SPDK object of type %s at %s" % (self.type_name, str(self.obj)) 112f4d6841bSshahar salzman s += '\n((%s*) %s)' % (self.type_name, str(self.obj)) 113f4d6841bSshahar salzman s += '\nname %s' % self.get_name() 114f4d6841bSshahar salzman return s 115f4d6841bSshahar salzman 116f4d6841bSshahar salzman 117f4d6841bSshahar salzmanclass IoDevice(SpdkObject): 118f4d6841bSshahar salzman 119f4d6841bSshahar salzman type_name = 'struct io_device' 120f4d6841bSshahar salzman 121f4d6841bSshahar salzman 122311d014dSKozlowski Mateuszclass IoDevices(SpdkRbTree): 123f4d6841bSshahar salzman 124f4d6841bSshahar salzman def __init__(self): 125311d014dSKozlowski Mateusz super(IoDevices, self).__init__('g_io_devices', IoDevice, ['rbh_root']) 126f4d6841bSshahar salzman 127f4d6841bSshahar salzman 128f4d6841bSshahar salzmanclass spdk_print_io_devices(SpdkPrintCommand): 129f4d6841bSshahar salzman 130f4d6841bSshahar salzman def __init__(self): 13169bec87aSMike Gerdts try: 132f4d6841bSshahar salzman io_devices = IoDevices() 13369bec87aSMike Gerdts except RuntimeError as e: 13469bec87aSMike Gerdts print("Cannot load IO devices: " + str(e)) 13569bec87aSMike Gerdts return 136f4d6841bSshahar salzman name = 'spdk_print_io_devices' 137f4d6841bSshahar salzman super(spdk_print_io_devices, self).__init__(name, io_devices) 138f4d6841bSshahar salzman 139f4d6841bSshahar salzman 140f4d6841bSshahar salzmanclass Bdev(SpdkObject): 141f4d6841bSshahar salzman 142f4d6841bSshahar salzman type_name = 'struct spdk_bdev' 143f4d6841bSshahar salzman 144f4d6841bSshahar salzman 145f4d6841bSshahar salzmanclass BdevMgrBdevs(SpdkTailqList): 146f4d6841bSshahar salzman 147f4d6841bSshahar salzman def __init__(self): 148f4d6841bSshahar salzman tailq_name_list = ['internal', 'link'] 149f4d6841bSshahar salzman super(BdevMgrBdevs, self).__init__('g_bdev_mgr->bdevs', Bdev, tailq_name_list) 150f4d6841bSshahar salzman 151f4d6841bSshahar salzman 152f4d6841bSshahar salzmanclass spdk_print_bdevs(SpdkPrintCommand): 153f4d6841bSshahar salzman name = 'spdk_print_bdevs' 154f4d6841bSshahar salzman 155f4d6841bSshahar salzman def __init__(self): 15669bec87aSMike Gerdts try: 157f4d6841bSshahar salzman bdevs = BdevMgrBdevs() 15869bec87aSMike Gerdts except RuntimeError as e: 15969bec87aSMike Gerdts print("Cannot load bdevs: " + str(e)) 16069bec87aSMike Gerdts return 161f4d6841bSshahar salzman super(spdk_print_bdevs, self).__init__(self.name, bdevs) 162f4d6841bSshahar salzman 163f4d6841bSshahar salzman 164f4d6841bSshahar salzmanclass spdk_find_bdev(spdk_print_bdevs): 165f4d6841bSshahar salzman 166f4d6841bSshahar salzman name = 'spdk_find_bdev' 167f4d6841bSshahar salzman 168f4d6841bSshahar salzman def invoke(self, arg, from_tty): 169f4d6841bSshahar salzman print(arg) 170f4d6841bSshahar salzman bdev_query = [bdev for bdev in self.element_list 171f4d6841bSshahar salzman if str(bdev.get_name()).find(arg) != -1] 172f4d6841bSshahar salzman if bdev_query == []: 173f4d6841bSshahar salzman print("Cannot find bdev with name %s" % arg) 174f4d6841bSshahar salzman return 175f4d6841bSshahar salzman 176f4d6841bSshahar salzman self.print_element_list(bdev_query) 177f4d6841bSshahar salzman 178f4d6841bSshahar salzman 179f4d6841bSshahar salzmanclass NvmfSubsystem(SpdkObject): 180f4d6841bSshahar salzman 181f4d6841bSshahar salzman type_name = 'struct spdk_nvmf_subsystem' 182f4d6841bSshahar salzman 183f4d6841bSshahar salzman def __init__(self, ptr): 184f4d6841bSshahar salzman self.ptr = ptr 185f4d6841bSshahar salzman gdb_obj = self.ptr.cast(gdb.lookup_type(self.type_name).pointer()) 186f4d6841bSshahar salzman super(NvmfSubsystem, self).__init__(gdb_obj) 187f4d6841bSshahar salzman 188f4d6841bSshahar salzman def get_name(self): 189f4d6841bSshahar salzman return self.obj['subnqn'] 190f4d6841bSshahar salzman 191f4d6841bSshahar salzman def get_id(self): 192f4d6841bSshahar salzman return int(self.obj['id']) 193f4d6841bSshahar salzman 194f4d6841bSshahar salzman def get_ns_list(self): 195f4d6841bSshahar salzman max_nsid = int(self.obj['max_nsid']) 196f4d6841bSshahar salzman ns_list = [] 19777a55a2fSshahar salzman for i in range(0, max_nsid): 198f4d6841bSshahar salzman nsptr = (self.obj['ns'] + i).dereference() 199f4d6841bSshahar salzman if nsptr == 0x0: 200f4d6841bSshahar salzman continue 201f4d6841bSshahar salzman ns = nsptr.cast(gdb.lookup_type('struct spdk_nvmf_ns').pointer()) 202f4d6841bSshahar salzman ns_list.append(ns) 203f4d6841bSshahar salzman return ns_list 204f4d6841bSshahar salzman 205f4d6841bSshahar salzman def __str__(self): 206f4d6841bSshahar salzman s = super(NvmfSubsystem, self).__str__() 207f4d6841bSshahar salzman s += '\nnqn %s' % self.get_name() 208f4d6841bSshahar salzman s += '\nID %d' % self.get_id() 209f4d6841bSshahar salzman for ns in self.get_ns_list(): 2101bab7cbcSLuo Yifan s += '\t%s' % str(ns) 211f4d6841bSshahar salzman return s 212f4d6841bSshahar salzman 213f4d6841bSshahar salzman 214f4d6841bSshahar salzmanclass SpdkNvmfTgtSubsystems(SpdkArr): 215f4d6841bSshahar salzman 216f4d6841bSshahar salzman def get_num_subsystems(self): 217f4d6841bSshahar salzman try: # version >= 18.11 218f4d6841bSshahar salzman return int(self.spdk_nvmf_tgt['max_subsystems']) 219f4d6841bSshahar salzman except RuntimeError: # version < 18.11 220f4d6841bSshahar salzman return int(self.spdk_nvmf_tgt['opts']['max_subsystems']) 221f4d6841bSshahar salzman 222f4d6841bSshahar salzman def __init__(self): 22369bec87aSMike Gerdts try: 224f4d6841bSshahar salzman self.spdk_nvmf_tgt = gdb.parse_and_eval("g_spdk_nvmf_tgt") 22569bec87aSMike Gerdts except RuntimeError as e: 22669bec87aSMike Gerdts print("Cannot load nvmf target subsystems: " + str(e)) 22769bec87aSMike Gerdts return 228f4d6841bSshahar salzman subsystems = gdb.parse_and_eval("g_spdk_nvmf_tgt->subsystems") 229f4d6841bSshahar salzman super(SpdkNvmfTgtSubsystems, self).__init__(subsystems, 230f4d6841bSshahar salzman self.get_num_subsystems(), 231f4d6841bSshahar salzman NvmfSubsystem) 232f4d6841bSshahar salzman 233f4d6841bSshahar salzman 234f4d6841bSshahar salzmanclass spdk_print_nvmf_subsystems(SpdkPrintCommand): 235f4d6841bSshahar salzman 236f4d6841bSshahar salzman def __init__(self): 237f4d6841bSshahar salzman name = 'spdk_print_nvmf_subsystems' 238f4d6841bSshahar salzman nvmf_tgt_subsystems = SpdkNvmfTgtSubsystems() 239f4d6841bSshahar salzman super(spdk_print_nvmf_subsystems, self).__init__(name, nvmf_tgt_subsystems) 240f4d6841bSshahar salzman 241f4d6841bSshahar salzman 242f4d6841bSshahar salzmanclass IoChannel(SpdkObject): 243f4d6841bSshahar salzman 244f4d6841bSshahar salzman type_name = 'struct spdk_io_channel' 245f4d6841bSshahar salzman 246f4d6841bSshahar salzman def get_ref(self): 247f4d6841bSshahar salzman 248f4d6841bSshahar salzman return int(self.obj['ref']) 249f4d6841bSshahar salzman 250f4d6841bSshahar salzman def get_device(self): 251f4d6841bSshahar salzman return self.obj['dev'] 252f4d6841bSshahar salzman 253f4d6841bSshahar salzman def get_device_name(self): 254f4d6841bSshahar salzman return self.obj['dev']['name'] 255f4d6841bSshahar salzman 256f4d6841bSshahar salzman def get_name(self): 257f4d6841bSshahar salzman return "" 258f4d6841bSshahar salzman 259f4d6841bSshahar salzman def __str__(self): 260f4d6841bSshahar salzman s = super(IoChannel, self).__str__() + '\n' 261f4d6841bSshahar salzman s += 'ref %d\n' % self.get_ref() 262f4d6841bSshahar salzman s += 'device %s (%s)\n' % (self.get_device(), self.get_device_name()) 263f4d6841bSshahar salzman return s 264f4d6841bSshahar salzman 265f4d6841bSshahar salzman 266311d014dSKozlowski Mateuszclass IoChannels(SpdkRbTree): 267f4d6841bSshahar salzman 268311d014dSKozlowski Mateusz def __init__(self, tree_obj): 269311d014dSKozlowski Mateusz self.tree_name_list = ['rbh_root'] 270311d014dSKozlowski Mateusz self.tree_member = IoChannel 271311d014dSKozlowski Mateusz self.tree = tree_obj 272f4d6841bSshahar salzman 273f4d6841bSshahar salzman 274f4d6841bSshahar salzmanclass SpdkThread(SpdkObject): 275f4d6841bSshahar salzman 276f4d6841bSshahar salzman type_name = 'struct spdk_thread' 277f4d6841bSshahar salzman 278f4d6841bSshahar salzman def __init__(self, gdb_obj): 279f4d6841bSshahar salzman super(SpdkThread, self).__init__(gdb_obj) 280f4d6841bSshahar salzman self.io_channels = IoChannels(self.obj['io_channels']) 281f4d6841bSshahar salzman 282f4d6841bSshahar salzman def __str__(self): 283f4d6841bSshahar salzman s = super(SpdkThread, self).__str__() + '\n' 284f4d6841bSshahar salzman s += "IO Channels:\n" 285f4d6841bSshahar salzman for io_channel in self.get_io_channels(): 286f4d6841bSshahar salzman channel_lines = str(io_channel).split('\n') 287*9943e42aSKonrad Sztyber s += '\n'.join('\t%s' % line for line in channel_lines if line != '') 288f4d6841bSshahar salzman s += '\n' 289f4d6841bSshahar salzman s += '\t---------------\n' 290f4d6841bSshahar salzman s += '\n' 291f4d6841bSshahar salzman return s 292f4d6841bSshahar salzman 293f4d6841bSshahar salzman def get_io_channels(self): 294f4d6841bSshahar salzman return self.io_channels 295f4d6841bSshahar salzman 296f4d6841bSshahar salzman 297f4d6841bSshahar salzmanclass SpdkThreads(SpdkNormalTailqList): 298f4d6841bSshahar salzman 299f4d6841bSshahar salzman def __init__(self): 300f4d6841bSshahar salzman super(SpdkThreads, self).__init__('g_threads', SpdkThread) 301f4d6841bSshahar salzman 302f4d6841bSshahar salzman 303f4d6841bSshahar salzmanclass spdk_print_threads(SpdkPrintCommand): 304f4d6841bSshahar salzman 305f4d6841bSshahar salzman def __init__(self): 306f4d6841bSshahar salzman name = "spdk_print_threads" 307f4d6841bSshahar salzman threads = SpdkThreads() 308f4d6841bSshahar salzman super(spdk_print_threads, self).__init__(name, threads) 309f4d6841bSshahar salzman 310f4d6841bSshahar salzman 311adc2ca50SMike Gerdtsclass SpdkSpinlockStackPrinter(object): 312adc2ca50SMike Gerdts 313adc2ca50SMike Gerdts def __init__(self, val): 314adc2ca50SMike Gerdts self.val = val 315adc2ca50SMike Gerdts 316adc2ca50SMike Gerdts def to_array(self): 317adc2ca50SMike Gerdts ret = [] 318adc2ca50SMike Gerdts count = self.val['depth'] 319adc2ca50SMike Gerdts for i in range(count): 320adc2ca50SMike Gerdts line = '' 321adc2ca50SMike Gerdts addr = self.val['addrs'][i] 322adc2ca50SMike Gerdts line += ' ' + str(addr) 323adc2ca50SMike Gerdts # Source and line (sal) only exists for objects with debug info 324adc2ca50SMike Gerdts sal = gdb.find_pc_line(int(addr)) 325adc2ca50SMike Gerdts try: 326adc2ca50SMike Gerdts line += ' ' + str(sal.symtab.filename) 327adc2ca50SMike Gerdts line += ':' + str(sal.line) 328adc2ca50SMike Gerdts except AttributeError as e: 329adc2ca50SMike Gerdts pass 330adc2ca50SMike Gerdts ret.append(line) 331adc2ca50SMike Gerdts return ret 332adc2ca50SMike Gerdts 333adc2ca50SMike Gerdts def to_string(self): 334adc2ca50SMike Gerdts return 'struct sspin_stack:\n' + '\n'.join(self.to_array()) 335adc2ca50SMike Gerdts 336adc2ca50SMike Gerdts def display_hint(self): 337adc2ca50SMike Gerdts return 'struct sspin_stack' 338adc2ca50SMike Gerdts 339adc2ca50SMike Gerdts 340adc2ca50SMike Gerdtsclass SpdkSpinlockPrinter(object): 341adc2ca50SMike Gerdts 342adc2ca50SMike Gerdts def __init__(self, val): 343adc2ca50SMike Gerdts self.val = val 344adc2ca50SMike Gerdts 345adc2ca50SMike Gerdts def to_string(self): 346adc2ca50SMike Gerdts thread = self.val['thread'] 347adc2ca50SMike Gerdts internal = self.val['internal'] 348adc2ca50SMike Gerdts s = 'struct spdk_spinlock:' 349adc2ca50SMike Gerdts s += '\n Locked by spdk_thread: ' 350adc2ca50SMike Gerdts if thread == 0: 351adc2ca50SMike Gerdts s += 'not locked' 352adc2ca50SMike Gerdts else: 353adc2ca50SMike Gerdts s += str(thread) 354adc2ca50SMike Gerdts if internal != 0: 355adc2ca50SMike Gerdts stacks = [ 356adc2ca50SMike Gerdts ['Initialized', 'init_stack'], 357adc2ca50SMike Gerdts ['Last locked', 'lock_stack'], 358adc2ca50SMike Gerdts ['Last unlocked', 'unlock_stack']] 359adc2ca50SMike Gerdts for stack in stacks: 360adc2ca50SMike Gerdts s += '\n ' + stack[0] + ' at:\n ' 361adc2ca50SMike Gerdts frames = SpdkSpinlockStackPrinter(internal[stack[1]]) 362adc2ca50SMike Gerdts s += '\n '.join(frames.to_array()) 363adc2ca50SMike Gerdts return s 364adc2ca50SMike Gerdts 365adc2ca50SMike Gerdts def display_hint(self): 366adc2ca50SMike Gerdts return 'struct spdk_spinlock' 367adc2ca50SMike Gerdts 368adc2ca50SMike Gerdts 369f4d6841bSshahar salzmanclass spdk_load_macros(gdb.Command): 370f4d6841bSshahar salzman 371f4d6841bSshahar salzman def __init__(self): 372f4d6841bSshahar salzman gdb.Command.__init__(self, 'spdk_load_macros', 373f4d6841bSshahar salzman gdb.COMMAND_DATA, 374f4d6841bSshahar salzman gdb.COMPLETE_SYMBOL, 375f4d6841bSshahar salzman True) 376f4d6841bSshahar salzman self.loaded = False 377f4d6841bSshahar salzman 378adc2ca50SMike Gerdts def load_pretty_printers(self): 379adc2ca50SMike Gerdts pp = gdb.printing.RegexpCollectionPrettyPrinter("spdk_library") 380adc2ca50SMike Gerdts pp.add_printer('sspin_stack', '^sspin_stack$', 381adc2ca50SMike Gerdts SpdkSpinlockStackPrinter) 382adc2ca50SMike Gerdts pp.add_printer('spdk_spinlock', '^spdk_spinlock$', SpdkSpinlockPrinter) 383adc2ca50SMike Gerdts gdb.printing.register_pretty_printer(gdb.current_objfile(), pp) 384adc2ca50SMike Gerdts 385f4d6841bSshahar salzman def invoke(self, arg, from_tty): 386f4d6841bSshahar salzman if arg == '--reload': 387f4d6841bSshahar salzman print('Reloading spdk information') 388f4d6841bSshahar salzman reload = True 389f4d6841bSshahar salzman else: 390f4d6841bSshahar salzman reload = False 391adc2ca50SMike Gerdts # These can only load once 392adc2ca50SMike Gerdts self.load_pretty_printers() 393f4d6841bSshahar salzman 394f4d6841bSshahar salzman if self.loaded and not reload: 395f4d6841bSshahar salzman return 396f4d6841bSshahar salzman 397f4d6841bSshahar salzman spdk_print_threads() 398f4d6841bSshahar salzman spdk_print_bdevs() 399f4d6841bSshahar salzman spdk_print_io_devices() 400f4d6841bSshahar salzman spdk_print_nvmf_subsystems() 401f4d6841bSshahar salzman spdk_find_bdev() 402f4d6841bSshahar salzman 403e7121a26SBen Walker 404f4d6841bSshahar salzmanspdk_load_macros() 405