10e1b240aSKuan-Ying Lee# SPDX-License-Identifier: GPL-2.0 20e1b240aSKuan-Ying Lee# 30e1b240aSKuan-Ying Lee# Copyright (c) 2023 MediaTek Inc. 40e1b240aSKuan-Ying Lee# 50e1b240aSKuan-Ying Lee# Authors: 60e1b240aSKuan-Ying Lee# Kuan-Ying Lee <Kuan-Ying.Lee@mediatek.com> 70e1b240aSKuan-Ying Lee# 80e1b240aSKuan-Ying Lee 90e1b240aSKuan-Ying Leeimport gdb 100e1b240aSKuan-Ying Leefrom linux import utils, constants 110e1b240aSKuan-Ying Lee 120e1b240aSKuan-Ying Leeif constants.LX_CONFIG_STACKDEPOT: 130e1b240aSKuan-Ying Lee stack_record_type = utils.CachedType('struct stack_record') 140e1b240aSKuan-Ying Lee DEPOT_STACK_ALIGN = 4 150e1b240aSKuan-Ying Lee 160e1b240aSKuan-Ying Leedef stack_depot_fetch(handle): 170e1b240aSKuan-Ying Lee global DEPOT_STACK_ALIGN 180e1b240aSKuan-Ying Lee global stack_record_type 190e1b240aSKuan-Ying Lee 200e1b240aSKuan-Ying Lee stack_depot_disabled = gdb.parse_and_eval('stack_depot_disabled') 210e1b240aSKuan-Ying Lee 220e1b240aSKuan-Ying Lee if stack_depot_disabled: 230e1b240aSKuan-Ying Lee raise gdb.GdbError("stack_depot_disabled\n") 240e1b240aSKuan-Ying Lee 250e1b240aSKuan-Ying Lee handle_parts_t = gdb.lookup_type("union handle_parts") 260e1b240aSKuan-Ying Lee parts = handle.cast(handle_parts_t) 270e1b240aSKuan-Ying Lee offset = parts['offset'] << DEPOT_STACK_ALIGN 28*125e9987SKuan-Ying Lee pools_num = gdb.parse_and_eval('pools_num') 290e1b240aSKuan-Ying Lee 30*125e9987SKuan-Ying Lee if parts['pool_index'] > pools_num: 31*125e9987SKuan-Ying Lee gdb.write("pool index %d out of bounds (%d) for stack id 0x%08x\n" % (parts['pool_index'], pools_num, handle)) 320e1b240aSKuan-Ying Lee return gdb.Value(0), 0 330e1b240aSKuan-Ying Lee 340e1b240aSKuan-Ying Lee stack_pools = gdb.parse_and_eval('stack_pools') 350e1b240aSKuan-Ying Lee 360e1b240aSKuan-Ying Lee try: 370e1b240aSKuan-Ying Lee pool = stack_pools[parts['pool_index']] 380e1b240aSKuan-Ying Lee stack = (pool + gdb.Value(offset).cast(utils.get_size_t_type())).cast(stack_record_type.get_type().pointer()) 390e1b240aSKuan-Ying Lee size = int(stack['size'].cast(utils.get_ulong_type())) 400e1b240aSKuan-Ying Lee return stack['entries'], size 410e1b240aSKuan-Ying Lee except Exception as e: 420e1b240aSKuan-Ying Lee gdb.write("%s\n" % e) 430e1b240aSKuan-Ying Lee return gdb.Value(0), 0 440e1b240aSKuan-Ying Lee 450e1b240aSKuan-Ying Leedef stack_depot_print(handle): 460e1b240aSKuan-Ying Lee if not constants.LX_CONFIG_STACKDEPOT: 470e1b240aSKuan-Ying Lee raise gdb.GdbError("CONFIG_STACKDEPOT is not enabled") 480e1b240aSKuan-Ying Lee 490e1b240aSKuan-Ying Lee entries, nr_entries = stack_depot_fetch(handle) 500e1b240aSKuan-Ying Lee if nr_entries > 0: 510e1b240aSKuan-Ying Lee for i in range(0, nr_entries): 520e1b240aSKuan-Ying Lee try: 530e1b240aSKuan-Ying Lee gdb.execute("x /i 0x%x" % (int(entries[i]))) 540e1b240aSKuan-Ying Lee except Exception as e: 550e1b240aSKuan-Ying Lee gdb.write("%s\n" % e) 56