run32.S - vx32 - Local 9vx git repository for patches.
 (HTM) git clone git://r-36.net/vx32
 (DIR) Log
 (DIR) Files
 (DIR) Refs
       ---
       run32.S (2766B)
       ---
            1 //
            2 // Assembly-language support code for vx32-to-x86-32 translation
            3 //
            4 
            5 #include "libvx32/asm.h"
            6 #include "libvx32/os.h"
            7 
            8         .text
            9 
           10         .globl        EXT(vx_run_S_start)
           11 EXT(vx_run_S_start):
           12 
           13 // Perform setup necessary for the emulation environment.
           14 // Args:
           15 //        1. vxemu pointer
           16 //
           17         .globl        EXT(vxrun_setup)
           18 EXT(vxrun_setup):
           19 
           20         // Load vxemu pointer
           21         movl        4(%esp),%eax
           22 
           23         // Save the host's normal segment registers.
           24         movw        %ss,%dx
           25         movw        %dx,VXEMU_HOST_SS(%eax)
           26         movw        %ds,VXEMU_HOST_DS(%eax)
           27         movw        %es,VXEMU_HOST_ES(%eax)
           28         movw        VSEG,VXEMU_HOST_VS(%eax)
           29 
           30         // Load the special vxemu segment into VSEG (%fs or %gs)
           31         movw        VXEMU_EMUSEL(%eax),VSEG
           32 
           33         ret
           34 
           35 
           36 // Start running translated vx32 code until something goes wrong -
           37 // usually, until we hit a piece of code that hasn't been translated yet.
           38 //
           39 // Args:
           40 //        1. vxemu pointer
           41 //        2. translated code entrypoint at which to start running
           42 //
           43         .p2align 4
           44         .globl        EXT(vxrun)
           45 EXT(vxrun):
           46 
           47         // Save caller's host registers
           48         pushl        %ebx
           49         pushl        %esi
           50         pushl        %edi
           51         pushl        %ebp
           52 
           53         // Fetch translated code entrypoint arg
           54         movl        (4*4)+4+4(%esp),%ebx
           55 
           56         // Save host esp
           57         movl        %esp,VSEG:VXEMU_HOST_ESP
           58 
           59         // Restore vx32 env's eflags register
           60         pushl        VSEG:VXEMU_EFLAGS
           61         popfl
           62 
           63         // Set up segment registers for vx32 env
           64         movl        VSEG:VXEMU_DATASEL,%ecx
           65         movw        %cx,%ds
           66         movw        %cx,%es
           67         movw        %cx,%ss
           68 
           69         // Load vx32 env's registers
           70         movl        VSEG:VXEMU_EAX,%eax
           71         movl        VSEG:VXEMU_ECX,%ecx
           72         movl        VSEG:VXEMU_EDX,%edx
           73         // translated code will restore %EBX
           74         movl        VSEG:VXEMU_ESP,%esp
           75         movl        VSEG:VXEMU_EBP,%ebp
           76         movl        VSEG:VXEMU_ESI,%esi
           77         movl        VSEG:VXEMU_EDI,%edi
           78 
           79         // Run translated code
           80         jmp        *%ebx
           81 
           82 
           83 // Return from running translated code to the normal host environment.
           84 // Assumes EAX, EBX, ECX, and EDX have already been saved.
           85 // Assumes return code for vxrun is already in eax.
           86 //
           87         .p2align 4
           88         .globl        EXT(vxrun_return)
           89 EXT(vxrun_return):
           90 
           91         // Save remaining vx32 registers
           92         movl        %esp,VSEG:VXEMU_ESP
           93         movl        %ebp,VSEG:VXEMU_EBP
           94         movl        %esi,VSEG:VXEMU_ESI
           95         movl        %edi,VSEG:VXEMU_EDI
           96 
           97         // Restore host's normal segment registers
           98         movw        VSEG:VXEMU_HOST_DS,%ds
           99         movw        VSEG:VXEMU_HOST_ES,%es
          100         movw        VSEG:VXEMU_HOST_SS,%ss
          101 
          102         // Switch back to host's stack
          103         movl        VSEG:VXEMU_HOST_ESP,%esp
          104 
          105         // Save vx32 env's eflags register
          106         pushfl
          107         popl        VSEG:VXEMU_EFLAGS
          108 
          109         // Restore host's callee-save registers and return to caller
          110         popl        %ebp
          111         popl        %edi
          112         popl        %esi
          113         popl        %ebx
          114         cld
          115         ret
          116 
          117 
          118 // Clean up after a stint of running VX code.
          119 // Args:
          120 //        1. vxemu pointer
          121 //
          122         .globl        EXT(vxrun_cleanup)
          123 EXT(vxrun_cleanup):
          124 
          125         // Load vxemu pointer
          126         movl        4(%esp),%eax
          127 
          128         // Restore host's FS/GS register.
          129         // (DS/ES/SS were already restored by vxrun_return.)
          130         movw        VXEMU_HOST_VS(%eax),VSEG
          131 
          132         cld
          133         ret
          134         
          135 // Don't put anything here!
          136 // The signal handler knows that vxrun_cleanup
          137 // is at the bottom of this file.