Save all registers for LoadSeg

This prevents crashes when calling a struct-returning function triggers a LoadSeg
(the address for the returned struct is passed via A0)
This commit is contained in:
Wolfgang Thaller 2018-05-01 19:37:13 +02:00
parent bb894a87c5
commit b86da1d406
1 changed files with 17 additions and 3 deletions

View File

@ -7,16 +7,30 @@ PATCHEDLOADSEG:
# (arguments for function)
# (return address)
# (return address from trap (== address in jt entry))
movel %sp@, %sp@-
movem.l %a0-%a1/%d0-%d2, -(%sp)
subq #4, %sp
move.l 24(%sp), -(%sp)
# Stack now:
# (arguments for function)
# (return address)
# (don't care)
# (return address from trap (== address in jt entry))
# (don't care any more -- address in jt entry)
# (saved registers)
# (4 bvtes of space for return value)
# (address in jt entry)
jsr RETRO68LOADSEGMENT
# Stack now:
# (arguments for function)
# (return address)
# (don't care -- address in jt entry)
# (saved registers)
# (address of loaded function)
move.l (%sp)+, 20(%sp)
movem.l (%sp)+, %a0-%a1/%d0-%d2
# Stack now:
# (arguments for function)
# (return address)