xref: /openbmc/linux/scripts/gdb/linux/stackdepot.py (revision c900529f3d9161bfde5cca0754f83b4d3c3e0220)
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