1*0e1b240aSKuan-Ying Lee# SPDX-License-Identifier: GPL-2.0 2*0e1b240aSKuan-Ying Lee# 3*0e1b240aSKuan-Ying Lee# Copyright (c) 2023 MediaTek Inc. 4*0e1b240aSKuan-Ying Lee# 5*0e1b240aSKuan-Ying Lee# Authors: 6*0e1b240aSKuan-Ying Lee# Kuan-Ying Lee <Kuan-Ying.Lee@mediatek.com> 7*0e1b240aSKuan-Ying Lee# 8*0e1b240aSKuan-Ying Lee 9*0e1b240aSKuan-Ying Leeimport gdb 10*0e1b240aSKuan-Ying Leefrom linux import utils, constants 11*0e1b240aSKuan-Ying Lee 12*0e1b240aSKuan-Ying Leeif constants.LX_CONFIG_STACKDEPOT: 13*0e1b240aSKuan-Ying Lee stack_record_type = utils.CachedType('struct stack_record') 14*0e1b240aSKuan-Ying Lee DEPOT_STACK_ALIGN = 4 15*0e1b240aSKuan-Ying Lee 16*0e1b240aSKuan-Ying Leedef stack_depot_fetch(handle): 17*0e1b240aSKuan-Ying Lee global DEPOT_STACK_ALIGN 18*0e1b240aSKuan-Ying Lee global stack_record_type 19*0e1b240aSKuan-Ying Lee 20*0e1b240aSKuan-Ying Lee stack_depot_disabled = gdb.parse_and_eval('stack_depot_disabled') 21*0e1b240aSKuan-Ying Lee 22*0e1b240aSKuan-Ying Lee if stack_depot_disabled: 23*0e1b240aSKuan-Ying Lee raise gdb.GdbError("stack_depot_disabled\n") 24*0e1b240aSKuan-Ying Lee 25*0e1b240aSKuan-Ying Lee handle_parts_t = gdb.lookup_type("union handle_parts") 26*0e1b240aSKuan-Ying Lee parts = handle.cast(handle_parts_t) 27*0e1b240aSKuan-Ying Lee offset = parts['offset'] << DEPOT_STACK_ALIGN 28*0e1b240aSKuan-Ying Lee pool_index_cached = gdb.parse_and_eval('pool_index') 29*0e1b240aSKuan-Ying Lee 30*0e1b240aSKuan-Ying Lee if parts['pool_index'] > pool_index_cached: 31*0e1b240aSKuan-Ying Lee gdb.write("pool index %d out of bounds (%d) for stack id 0x%08x\n" % (parts['pool_index'], pool_index_cached, handle)) 32*0e1b240aSKuan-Ying Lee return gdb.Value(0), 0 33*0e1b240aSKuan-Ying Lee 34*0e1b240aSKuan-Ying Lee stack_pools = gdb.parse_and_eval('stack_pools') 35*0e1b240aSKuan-Ying Lee 36*0e1b240aSKuan-Ying Lee try: 37*0e1b240aSKuan-Ying Lee pool = stack_pools[parts['pool_index']] 38*0e1b240aSKuan-Ying Lee stack = (pool + gdb.Value(offset).cast(utils.get_size_t_type())).cast(stack_record_type.get_type().pointer()) 39*0e1b240aSKuan-Ying Lee size = int(stack['size'].cast(utils.get_ulong_type())) 40*0e1b240aSKuan-Ying Lee return stack['entries'], size 41*0e1b240aSKuan-Ying Lee except Exception as e: 42*0e1b240aSKuan-Ying Lee gdb.write("%s\n" % e) 43*0e1b240aSKuan-Ying Lee return gdb.Value(0), 0 44*0e1b240aSKuan-Ying Lee 45*0e1b240aSKuan-Ying Leedef stack_depot_print(handle): 46*0e1b240aSKuan-Ying Lee if not constants.LX_CONFIG_STACKDEPOT: 47*0e1b240aSKuan-Ying Lee raise gdb.GdbError("CONFIG_STACKDEPOT is not enabled") 48*0e1b240aSKuan-Ying Lee 49*0e1b240aSKuan-Ying Lee entries, nr_entries = stack_depot_fetch(handle) 50*0e1b240aSKuan-Ying Lee if nr_entries > 0: 51*0e1b240aSKuan-Ying Lee for i in range(0, nr_entries): 52*0e1b240aSKuan-Ying Lee try: 53*0e1b240aSKuan-Ying Lee gdb.execute("x /i 0x%x" % (int(entries[i]))) 54*0e1b240aSKuan-Ying Lee except Exception as e: 55*0e1b240aSKuan-Ying Lee gdb.write("%s\n" % e) 56