Skip to content

Commit d846c75

Browse files
committed
Add a CC accessor to tell the return address
1 parent 94aeb96 commit d846c75

File tree

6 files changed

+24
-1
lines changed

6 files changed

+24
-1
lines changed

qiling/cc/__init__.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,12 @@ def setReturnValue(self, val: int) -> None:
7070

7171
raise NotImplementedError
7272

73+
def getReturnAddress(self) -> int:
74+
"""Get function return address.
75+
"""
76+
77+
raise NotImplementedError
78+
7379
def setReturnAddress(self, addr: int) -> None:
7480
"""Set function return address.
7581

qiling/cc/arm.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,17 +21,22 @@ class QlArmBaseCC(QlCommonBaseCC):
2121
def getNumSlots(argbits: int) -> int:
2222
return 1
2323

24+
def getReturnAddress(self) -> int:
25+
return self.arch.regs.lr
26+
2427
def setReturnAddress(self, addr: int) -> None:
2528
self.arch.regs.lr = addr
2629

2730
def unwind(self, nslots: int) -> int:
2831
# TODO: cleanup?
29-
return self.arch.regs.lr
32+
return self.getReturnAddress()
33+
3034

3135
class aarch64(QlArmBaseCC):
3236
_retreg = UC_ARM64_REG_X0
3337
_argregs = make_arg_list(UC_ARM64_REG_X0, UC_ARM64_REG_X1, UC_ARM64_REG_X2, UC_ARM64_REG_X3, UC_ARM64_REG_X4, UC_ARM64_REG_X5, UC_ARM64_REG_X6, UC_ARM64_REG_X7)
3438

39+
3540
class aarch32(QlArmBaseCC):
3641
_retreg = UC_ARM_REG_R0
3742
_argregs = make_arg_list(UC_ARM_REG_R0, UC_ARM_REG_R1, UC_ARM_REG_R2, UC_ARM_REG_R3)

qiling/cc/intel.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@ class QlIntelBaseCC(QlCommonBaseCC):
1515
Supports arguments passing over registers and stack.
1616
"""
1717

18+
def getReturnAddress(self) -> int:
19+
return self.arch.stack_read(0)
20+
1821
def setReturnAddress(self, addr: int) -> None:
1922
self.arch.stack_push(addr)
2023

qiling/cc/mips.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@ class mipso32(QlCommonBaseCC):
1212
_shadow = 4
1313
_retaddr_on_stack = False
1414

15+
def getReturnAddress(self) -> int:
16+
return self.arch.regs.ra
17+
1518
def setReturnAddress(self, addr: int):
1619
self.arch.regs.ra = addr
1720

qiling/cc/ppc.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,5 +22,8 @@ class ppc(QlCommonBaseCC):
2222
def getNumSlots(argbits: int):
2323
return 1
2424

25+
def getReturnAddress(self) -> int:
26+
return self.arch.regs.lr
27+
2528
def setReturnAddress(self, addr: int):
2629
self.arch.regs.lr = addr

qiling/cc/riscv.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,5 +22,8 @@ class riscv(QlCommonBaseCC):
2222
def getNumSlots(argbits: int):
2323
return 1
2424

25+
def getReturnAddress(self) -> int:
26+
return self.arch.regs.ra
27+
2528
def setReturnAddress(self, addr: int):
2629
self.arch.regs.ra = addr

0 commit comments

Comments
 (0)