ack/mach/i386/libdb/machdep.s
1991-11-08 15:44:30 +00:00

73 lines
1.5 KiB
ArmAsm

.define ___Get_PC, ___Set_PC, ___u_LiB
.sect .text; .sect .rom; .sect .data
! $Header$
! This is the machine-dependant part of the ACK debugger support.
! ___Get_PC takes a frame pointer (local base) argument and returns the
! return address from this frame.
! ___Set_PC takes a frame pointer (local base) argument plus a return
! address and sets the return address of this frame to the
! return address supplied.
! ___u_LiB saves the scratch registers and then calls ___uX_LiB;
! when ___uX_LiB returns, the scratch registers are restored.
! ___u_LiB is the solution chosen for the Intel 80386 back-end.
! Other back-ends could choose different solutions.
! The local base of ___uX_LiB is kind of special: because of ___u_LiB,
! the "interesting" return address of this particular stack-frame is found
! in a different place than the one of a normal stack-frame:
! the "interesting" return address is in fact the return address of
! ___u_LiB. Therefore, we save the local base of ___uX_LiB in sv_bp.
.sect .data
sv_bp:
.data4 0
.sect .text
___Get_PC:
mov ebx,esp
mov eax,4(ebx)
or eax,eax
je 1f
cmp (sv_bp),eax
je 2f
mov eax,4(eax)
1:
ret
2:
mov eax,28(eax)
ret
___Set_PC:
mov ebx,esp
mov eax,4(ebx)
mov ebx,8(ebx)
or eax,eax
je 1f
cmp (sv_bp),eax
je 2f
mov 4(eax),ebx
1:
ret
2:
mov 28(eax),ebx
ret
___u_LiB:
push eax
push ebx
push ecx
push edx
push (sv_bp)
mov eax,esp
sub eax,8
mov (sv_bp),eax ! this is the LB of __uX_LiB
call ___uX_LiB
pop (sv_bp)
pop edx
pop ecx
pop ebx
pop eax
ret