]> rtime.felk.cvut.cz Git - l4.git/blob - kernel/fiasco/src/kern/ia32/32/vm_svm_asm.S
update
[l4.git] / kernel / fiasco / src / kern / ia32 / 32 / vm_svm_asm.S
1 /**
2  * Function resume_vm_svm, arguments:
3  *  - eax: physical VMCB address
4  *  - edx: Pointer to registers (layout specific...)
5  *
6  * Note: To be called with interrupts disabled!
7  */
8
9         .p2align(4)
10         .globl  resume_vm_svm
11 resume_vm_svm:
12
13         // save callee saved regs
14         pushl %edi
15         pushl %esi
16         pushl %ebx
17         pushl %ebp
18
19         pushl %edx              // store pointer to register struct
20
21         clgi                    // super CLI
22
23         sti
24         mov 0x10(%edx), %edi
25         mov 0x14(%edx), %esi
26         mov 0x18(%edx), %ebp
27         mov 0x20(%edx), %ebx
28         mov 0x28(%edx), %ecx
29         mov 0x24(%edx), %edx
30         // EAX is in the vmcb
31
32         // TODO: Debugregs etc.
33
34         // eax used as implicit operand for vm* instructions
35         vmload
36         vmrun
37         vmsave
38
39         pushl %edx
40         movl 4(%esp), %edx     // get previously saved register struct pointer
41
42         movl %ecx, 0x28(%edx)
43         movl %ebx, 0x20(%edx)
44         movl %ebp, 0x18(%edx)
45         movl %esi, 0x14(%edx)
46         movl %edi, 0x10(%edx)
47
48         movl (%esp), %ecx      // guest EDX to ECX
49         movl %ecx, 0x24(%edx)
50
51         // TODO: restore task register, clear busy flag
52
53         cli
54         stgi
55
56         addl $8, %esp         // adjust stack after two pushs
57
58         // restore callee saved registers
59         popl %ebp
60         popl %ebx
61         popl %esi
62         popl %edi
63
64         ret