mirror of
https://github.com/apache/nuttx.git
synced 2026-05-27 03:05:40 +08:00
thread.py: fix bug that ARM-A TCB info register[2]
Signed-off-by: anjiahao <anjiahao@xiaomi.com>
This commit is contained in:
+30
-8
@@ -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():
|
||||||
|
|||||||
Reference in New Issue
Block a user