view loader/wrapper.S @ 34025:e7f393cb9d0f

Get rid of X11_FULLSCREEN. It seems likely the code does not compile when it is not defined anyway, it is unclear what its purpose is, and lastly vos changing there behaviour depending on whether some otherwise completely unrelated vo (e.g. vo_gl) is enabled seems like really bad idea.
author reimar
date Mon, 19 Sep 2011 22:11:12 +0000
parents 32725ca88fed
children
line wrap: on
line source

#include "config.h"

#define GLUE(a, b) a ## b
#define JOIN(a, b) GLUE(a, b)
#define MANGLE(s)  JOIN(EXTERN_ASM, s)

.data
.globl MANGLE(caller_return)
MANGLE(caller_return):
	.long 0
.globl MANGLE(report_entry)
MANGLE(report_entry):
	.long MANGLE(null_call)
.globl MANGLE(report_ret)
MANGLE(report_ret):
	.long MANGLE(null_call)
.global MANGLE(wrapper_target)
MANGLE(wrapper_target):
	.long MANGLE(null_call)

.text
.globl MANGLE(null_call)
	.type MANGLE(null_call), @function
	.balign 16,0x90
MANGLE(null_call):
	ret
.globl MANGLE(wrapper)
	.type MANGLE(wrapper), @function
	.balign 16,0x90
MANGLE(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 *MANGLE(report_entry)	# report entry

	test %eax, %eax
	jnz .Ldone

	leave			# restore %esp, %ebp
	popf			# restore flags
	popa			# restore registers

	popl MANGLE(caller_return)	# switch return addresses
	pushl $.Lwrapper_return

	jmp *MANGLE(wrapper_target)	# wrapper_target should return at .Lwrapper_return

	.balign 16, 0x90
.Lwrapper_return:
	pushl MANGLE(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 *MANGLE(report_ret)	# report the return information (same args)
.Ldone:

	leave
	popf
	popa
	ret