From be4c25600b5ab5e65c614222e92bbdac9a27617f Mon Sep 17 00:00:00 2001 From: arpi Date: Sun, 24 Nov 2002 21:45:23 +0000 Subject: - qtx (quicktime's macos emulation layer) debugging/emulation environment :) - some fixes in loadlibrary, to allow multiple loads/lookups git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@8270 b3059339-0415-0410-9bf9-f77b7e298cf2 --- loader/wrapper.S | 83 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 loader/wrapper.S (limited to 'loader/wrapper.S') diff --git a/loader/wrapper.S b/loader/wrapper.S new file mode 100644 index 0000000000..60028e670d --- /dev/null +++ b/loader/wrapper.S @@ -0,0 +1,83 @@ +.section .data +.globl caller_return +caller_return: + .long 0 +.globl report_entry +report_entry: + .long null_call +.globl report_ret +report_ret: + .long null_call +.global wrapper_target +wrapper_target: + .long null_call + +.section .text +.globl null_call + .type null_call, @function + .align 16,0x90 +null_call: + ret +.globl wrapper + .type wrapper, @function + .align 16,0x90 +wrapper: + pusha # store registers (EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI) + pushf # store flags + + push %ebp # set up a stack frame + movl %esp, %ebp + + leal 4(%ebp), %eax # push flags addr + push %eax + leal 8(%ebp), %eax # push registers addr + push %eax + + leal 40(%ebp), %edx + movl (%ebp), %eax + subl %edx, %eax + push %eax + push %edx + + call *report_entry # report entry + + test %eax, %eax + jnz .Ldone + + leave # restore %esp, %ebp + popf # restore flags + popa # restore registers + + popl caller_return # switch return addresses + pushl $.Lwrapper_return + + jmp *wrapper_target # wrapper_target should return at .Lwrapper_return + + .align 16, 0x90 +.Lwrapper_return: + pushl caller_return # restore the original return address + pusha # more for reference sake here + pushf + + push %ebp # set up a stack frame + movl %esp, %ebp + + leal 4(%ebp), %eax # push flags addr + push %eax + leal 8(%ebp), %eax # push registers addr + push %eax + + leal 40(%ebp), %edx # push stack top address (relative to our entry) + movl (%ebp), %eax + subl %edx, %eax # calculate difference between entry and previous frame + push %eax + push %edx + + call *report_ret # report the return information (same args) +.Ldone: + + leave + popf + popa + ret + \ No newline at end of file -- cgit v1.2.3