xref: /linux-6.15/scripts/gdb/linux/kasan.py (revision 0833952c)
1*0833952cSKuan-Ying Lee# SPDX-License-Identifier: GPL-2.0
2*0833952cSKuan-Ying Lee#
3*0833952cSKuan-Ying Lee# Copyright 2024 Canonical Ltd.
4*0833952cSKuan-Ying Lee#
5*0833952cSKuan-Ying Lee# Authors:
6*0833952cSKuan-Ying Lee#  Kuan-Ying Lee <[email protected]>
7*0833952cSKuan-Ying Lee#
8*0833952cSKuan-Ying Lee
9*0833952cSKuan-Ying Leeimport gdb
10*0833952cSKuan-Ying Leefrom linux import constants, mm
11*0833952cSKuan-Ying Lee
12*0833952cSKuan-Ying Leedef help():
13*0833952cSKuan-Ying Lee    t = """Usage: lx-kasan_mem_to_shadow [Hex memory addr]
14*0833952cSKuan-Ying Lee    Example:
15*0833952cSKuan-Ying Lee        lx-kasan_mem_to_shadow 0xffff000008eca008\n"""
16*0833952cSKuan-Ying Lee    gdb.write("Unrecognized command\n")
17*0833952cSKuan-Ying Lee    raise gdb.GdbError(t)
18*0833952cSKuan-Ying Lee
19*0833952cSKuan-Ying Leeclass KasanMemToShadow(gdb.Command):
20*0833952cSKuan-Ying Lee    """Translate memory address to kasan shadow address"""
21*0833952cSKuan-Ying Lee
22*0833952cSKuan-Ying Lee    p_ops = None
23*0833952cSKuan-Ying Lee
24*0833952cSKuan-Ying Lee    def __init__(self):
25*0833952cSKuan-Ying Lee        if constants.LX_CONFIG_KASAN_GENERIC or constants.LX_CONFIG_KASAN_SW_TAGS:
26*0833952cSKuan-Ying Lee            super(KasanMemToShadow, self).__init__("lx-kasan_mem_to_shadow", gdb.COMMAND_SUPPORT)
27*0833952cSKuan-Ying Lee
28*0833952cSKuan-Ying Lee    def invoke(self, args, from_tty):
29*0833952cSKuan-Ying Lee        if not constants.LX_CONFIG_KASAN_GENERIC or constants.LX_CONFIG_KASAN_SW_TAGS:
30*0833952cSKuan-Ying Lee            raise gdb.GdbError('CONFIG_KASAN_GENERIC or CONFIG_KASAN_SW_TAGS is not set')
31*0833952cSKuan-Ying Lee
32*0833952cSKuan-Ying Lee        argv = gdb.string_to_argv(args)
33*0833952cSKuan-Ying Lee        if len(argv) == 1:
34*0833952cSKuan-Ying Lee            if self.p_ops is None:
35*0833952cSKuan-Ying Lee                self.p_ops = mm.page_ops().ops
36*0833952cSKuan-Ying Lee            addr = int(argv[0], 16)
37*0833952cSKuan-Ying Lee            shadow_addr = self.kasan_mem_to_shadow(addr)
38*0833952cSKuan-Ying Lee            gdb.write('shadow addr: 0x%x\n' % shadow_addr)
39*0833952cSKuan-Ying Lee        else:
40*0833952cSKuan-Ying Lee            help()
41*0833952cSKuan-Ying Lee    def kasan_mem_to_shadow(self, addr):
42*0833952cSKuan-Ying Lee        return (addr >> self.p_ops.KASAN_SHADOW_SCALE_SHIFT) + self.p_ops.KASAN_SHADOW_OFFSET
43*0833952cSKuan-Ying Lee
44*0833952cSKuan-Ying LeeKasanMemToShadow()
45