thread.py: fix bug that ARM-A TCB info register[2]

Signed-off-by: anjiahao <anjiahao@xiaomi.com>
This commit is contained in:
anjiahao
2024-08-26 20:29:03 +08:00
committed by Xiang Xiao
parent b5e7f8a40f
commit db1e97405a
+30 -8
View File
@@ -31,10 +31,13 @@ UINT16_MAX = 0xFFFF
SEM_TYPE_MUTEX = 4 SEM_TYPE_MUTEX = 4
saved_regs = None saved_regs = None
regoffset = None
def save_regs(): def save_regs():
global saved_regs global saved_regs
global regoffset
tcbinfo = gdb.parse_and_eval("g_tcbinfo") tcbinfo = gdb.parse_and_eval("g_tcbinfo")
if saved_regs: if saved_regs:
@@ -42,25 +45,41 @@ def save_regs():
arch = gdb.selected_frame().architecture() arch = gdb.selected_frame().architecture()
saved_regs = [] saved_regs = []
i = 0 i = 0
if not regoffset:
regoffset = [
int(tcbinfo["reg_off"]["p"][i])
for i in range(tcbinfo["regs_num"])
if tcbinfo["reg_off"]["p"][i] != UINT16_MAX
]
for reg in arch.registers(): for reg in arch.registers():
if i >= tcbinfo["regs_num"]: if i >= len(regoffset):
break break
saved_regs.append(gdb.parse_and_eval("$%s" % reg.name)) ret = gdb.parse_and_eval("$%s" % reg.name)
saved_regs.append(ret)
i += 1 i += 1
def restore_regs(): def restore_regs():
tcbinfo = gdb.parse_and_eval("g_tcbinfo") tcbinfo = gdb.parse_and_eval("g_tcbinfo")
global saved_regs global saved_regs
global regoffset
if not saved_regs: if not saved_regs:
return return
arch = gdb.selected_frame().architecture() arch = gdb.selected_frame().architecture()
i = 0 i = 0
regoffset = [
int(tcbinfo["reg_off"]["p"][i])
for i in range(tcbinfo["regs_num"])
if tcbinfo["reg_off"]["p"][i] != UINT16_MAX
]
for reg in arch.registers(): for reg in arch.registers():
if i >= tcbinfo["regs_num"]: if i >= len(regoffset):
break break
gdb.execute(f"set ${reg.name}={int(saved_regs[i])}") gdb.execute(f"set ${reg.name}={int(saved_regs[i])}")
@@ -84,6 +103,8 @@ class SetRegs(gdb.Command):
super(SetRegs, self).__init__("setregs", gdb.COMMAND_USER) super(SetRegs, self).__init__("setregs", gdb.COMMAND_USER)
def invoke(self, arg, from_tty): def invoke(self, arg, from_tty):
global regoffset
parser = argparse.ArgumentParser( parser = argparse.ArgumentParser(
description="Set registers to the specified values" description="Set registers to the specified values"
) )
@@ -116,11 +137,12 @@ class SetRegs(gdb.Command):
save_regs() save_regs()
arch = gdb.selected_frame().architecture() arch = gdb.selected_frame().architecture()
regoffset = [ if not regoffset:
int(tcbinfo["reg_off"]["p"][i]) regoffset = [
for i in range(tcbinfo["regs_num"]) int(tcbinfo["reg_off"]["p"][i])
if tcbinfo["reg_off"]["p"][i] != UINT16_MAX for i in range(tcbinfo["regs_num"])
] if tcbinfo["reg_off"]["p"][i] != UINT16_MAX
]
i = 0 i = 0
for reg in arch.registers(): for reg in arch.registers():