]> rtime.felk.cvut.cz Git - l4.git/blob - kernel/fiasco/src/kern/ia32/32/vm_vmx_asm.S
Update
[l4.git] / kernel / fiasco / src / kern / ia32 / 32 / vm_vmx_asm.S
1 /**
2  * Function resume_vm_vmx, arguments:
3  *  - eax: Pointer to registers (layout specific...)
4  */
5         .p2align(4)
6         .globl resume_vm_vmx
7         .globl vm_vmx_exit_vec
8 resume_vm_vmx:
9         // save callee saved regs
10         push    %edi
11         push    %esi
12         push    %ebx
13         push    %ebp
14         push    %ds
15         push    %es
16         push    %gs
17         push    %fs
18
19         push    %eax            // store pointer to register struct
20         mov     $0x6c14, %eax   // save esp in vmcs
21         vmwrite %esp, %eax
22         mov     (%esp), %esp
23
24         // load guest GPs
25         mov      16(%esp), %edi
26         mov      20(%esp), %esi
27         mov      24(%esp), %ebp
28         mov      32(%esp), %ebx
29         mov      36(%esp), %edx
30         mov      40(%esp), %ecx
31         mov      44(%esp), %eax
32
33         vmresume
34         jnz     1f
35         vmlaunch
36 1: // error path
37         mov     $0x6c14, %ebx  // restore stack pointer
38         vmread  %ebx, %esp
39         mov     $1, %eax       // flag error condition for the caller
40         add     $20, %esp      // pushed regs pointer and gs+fs+ds+es
41         pop     %ebp
42         pop     %ebx
43         pop     %esi
44         pop     %edi
45         ret
46
47 vm_vmx_exit_vec:
48         push    %eax
49         mov     4(%esp), %eax   // get previously saved register struct pointer
50
51         // eax is saved below
52         mov     %edi, 16(%eax)
53         mov     %esi, 20(%eax)
54         mov     %ebp, 24(%eax)
55         mov     %ebx, 32(%eax)
56         mov     %edx, 36(%eax)
57         mov     %ecx, 40(%eax)
58         pop     %ecx            // guest EAX to ECX
59         mov     %ecx, 44(%eax)
60
61         add     $4, %esp        // adjust stack after regs pointer push on stack
62         
63         // restore callee saved registers
64         pop     %fs
65         pop     %gs
66         pop     %es
67         pop     %ds
68         pop     %ebp
69         pop     %ebx
70         pop     %esi
71         pop     %edi
72
73         xor     %eax, %eax
74         ret