]> rtime.felk.cvut.cz Git - l4.git/blob - kernel/fiasco/src/kern/ia32/64/vm_vmx_asm.S
update
[l4.git] / kernel / fiasco / src / kern / ia32 / 64 / vm_vmx_asm.S
1 /**
2  * Function resume_vm_vmx, arguments:
3  *  - rdi: 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    %rbx
11         push    %r12
12         push    %r13
13         push    %r14
14         push    %r15
15         push    %rbp
16
17         push    %rdi               // store pointer to register struct
18         mov     $0x6c14, %eax      // save rsp in vmcs
19         vmwrite %rsp, %rax
20         mov     (%rsp), %rsp
21
22         // load guest GP registers
23         mov       0(%rsp), %r15
24         mov       8(%rsp), %r14
25         mov      16(%rsp), %r13
26         mov      24(%rsp), %r12
27         mov      32(%rsp), %r11
28         mov      40(%rsp), %r10
29         mov      48(%rsp), %r9
30         mov      56(%rsp), %r8
31         mov      64(%rsp), %rdi
32         mov      72(%rsp), %rsi
33         mov      80(%rsp), %rbp
34         mov      96(%rsp), %rbx
35         mov     104(%rsp), %rdx
36         mov     112(%rsp), %rcx
37         mov     120(%rsp), %rax
38
39         vmresume
40         jnz 1f
41         vmlaunch
42 1:      // error path
43         mov     $0x6c14, %eax
44         vmread  %rax, %rsp
45         pushf
46         pop     %rax
47         add     $8, %rsp        // pushed regs pointer
48         pop     %rbp
49         pop     %r15
50         pop     %r14
51         pop     %r13
52         pop     %r12
53         pop     %rbx
54         ret
55
56 vm_vmx_exit_vec:
57         push    %rsi
58         mov     8(%rsp), %rsi     // get previously saved register struct pointer
59         mov     %r15,  0(%rsi)
60         mov     %r14,  8(%rsi)
61         mov     %r13, 16(%rsi)
62         mov     %r12, 24(%rsi)
63         mov     %r11, 32(%rsi)
64         mov     %r10, 40(%rsi)
65         mov     %r9,  48(%rsi)
66         mov     %r8,  56(%rsi)
67         mov     %rdi, 64(%rsi)
68         // skip rsi for now
69         mov     %rbp, 80(%rsi)
70         mov     %rbx, 96(%rsi)
71         mov     %rdx,104(%rsi)
72         mov     %rcx,112(%rsi)
73         mov     %rax,120(%rsi)
74         pop     %rcx
75         mov     %rcx, 72(%rsi)
76
77         add     $8, %rsp           // adjust stack after regs pointer push on stack
78
79         // restore callee saved registers
80         pop     %rbp
81         pop     %r15
82         pop     %r14
83         pop     %r13
84         pop     %r12
85         pop     %rbx
86
87         xor     %rax, %rax
88         ret
89