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