137 lines · 2.7 KB · Assembly
RawDownload
//// Assembly-language support code for vx32-to-x86-32 translation// #include "libvx32/asm.h"#include "libvx32/os.h" 	.text 	.globl	EXT(vx_run_S_start)EXT(vx_run_S_start): // Perform setup necessary for the emulation environment.// Args://	1. vxemu pointer//	.globl	EXT(vxrun_setup)EXT(vxrun_setup): 	// Load vxemu pointer	movl	4(%esp),%eax 	// Save the host's normal segment registers.	movw	%ss,%dx	movw	%dx,VXEMU_HOST_SS(%eax)	movw	%ds,VXEMU_HOST_DS(%eax)	movw	%es,VXEMU_HOST_ES(%eax)	movw	VSEG,VXEMU_HOST_VS(%eax) 	// Load the special vxemu segment into VSEG (%fs or %gs)	movw	VXEMU_EMUSEL(%eax),VSEG 	ret  // Start running translated vx32 code until something goes wrong -// usually, until we hit a piece of code that hasn't been translated yet.//// Args://	1. vxemu pointer//	2. translated code entrypoint at which to start running//	.p2align 4	.globl	EXT(vxrun)EXT(vxrun): 	// Save caller's host registers	pushl	%ebx	pushl	%esi	pushl	%edi	pushl	%ebp 	// Fetch translated code entrypoint arg	movl	(4*4)+4+4(%esp),%ebx 	// Save host esp	movl	%esp,VSEG:VXEMU_HOST_ESP 	// Restore vx32 env's eflags register	pushl	VSEG:VXEMU_EFLAGS	popfl 	// Set up segment registers for vx32 env	movl	VSEG:VXEMU_DATASEL,%ecx	movw	%cx,%ds	movw	%cx,%es	movw	%cx,%ss 	// Load vx32 env's registers	movl	VSEG:VXEMU_EAX,%eax	movl	VSEG:VXEMU_ECX,%ecx	movl	VSEG:VXEMU_EDX,%edx	// translated code will restore %EBX	movl	VSEG:VXEMU_ESP,%esp	movl	VSEG:VXEMU_EBP,%ebp	movl	VSEG:VXEMU_ESI,%esi	movl	VSEG:VXEMU_EDI,%edi 	// Run translated code	jmp	*%ebx  // Return from running translated code to the normal host environment.// Assumes EAX, EBX, ECX, and EDX have already been saved.// Assumes return code for vxrun is already in eax.//	.p2align 4	.globl	EXT(vxrun_return)EXT(vxrun_return): 	// Save remaining vx32 registers	movl	%esp,VSEG:VXEMU_ESP	movl	%ebp,VSEG:VXEMU_EBP	movl	%esi,VSEG:VXEMU_ESI	movl	%edi,VSEG:VXEMU_EDI 	// Restore host's normal segment registers	movw	VSEG:VXEMU_HOST_DS,%ds	movw	VSEG:VXEMU_HOST_ES,%es	movw	VSEG:VXEMU_HOST_SS,%ss 	// Switch back to host's stack	movl	VSEG:VXEMU_HOST_ESP,%esp 	// Save vx32 env's eflags register	pushfl	popl	VSEG:VXEMU_EFLAGS 	// Restore host's callee-save registers and return to caller	popl	%ebp	popl	%edi	popl	%esi	popl	%ebx	cld	ret  // Clean up after a stint of running VX code.// Args://	1. vxemu pointer//	.globl	EXT(vxrun_cleanup)EXT(vxrun_cleanup): 	// Load vxemu pointer	movl	4(%esp),%eax 	// Restore host's FS/GS register.	// (DS/ES/SS were already restored by vxrun_return.)	movw	VXEMU_HOST_VS(%eax),VSEG 	cld	ret	// Don't put anything here!// The signal handler knows that vxrun_cleanup// is at the bottom of this file.