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