]> rtime.felk.cvut.cz Git - l4.git/blob - kernel/fiasco/src/kern/ia32/64/vm_svm_asm.S
update
[l4.git] / kernel / fiasco / src / kern / ia32 / 64 / vm_svm_asm.S
1         .p2align(4)
2         .globl  resume_vm_svm
3 resume_vm_svm:
4         
5         // save callee saved regs
6         push    %rbx
7         push    %r12
8         push    %r13
9         push    %r14
10         push    %r15
11         push    %rbp
12
13         mov     %rdi, %rax      // first arg goes to rax for vm*
14         push    %rsi            // store pointer to register struct
15
16         clgi
17
18         sti
19         nop
20
21         // restore guest GP regs
22         mov       0(%rsi), %r15
23         mov       8(%rsi), %r14
24         mov      16(%rsi), %r13
25         mov      24(%rsi), %r12
26         mov      32(%rsi), %r11
27         mov      40(%rsi), %r10
28         mov      48(%rsi), %r9
29         mov      56(%rsi), %r8
30         mov      64(%rsi), %rdi
31         // skip rsi for now
32         mov      80(%rsi), %rbp
33         mov      96(%rsi), %rbx
34         mov     104(%rsi), %rdx
35         mov     112(%rsi), %rcx
36         mov      72(%rsi), %rsi
37
38         // TODO: Debugregs
39
40         // rax used as implicit operand for vm* instructions
41         vmload
42         vmrun
43         vmsave
44
45         push    %rsi
46         mov     8(%rsp), %rsi   // get previously saved register struct pointer
47
48         mov     %r15,  0(%rsi)
49         mov     %r14,  8(%rsi)
50         mov     %r13, 16(%rsi)
51         mov     %r12, 24(%rsi)
52         mov     %r11, 32(%rsi)
53         mov     %r10, 40(%rsi)
54         mov     %r9,  48(%rsi)
55         mov     %r8,  56(%rsi)
56         mov     %rdi, 64(%rsi)
57         // skip rsi for now
58         mov     %rbp, 80(%rsi)
59         mov     %rbx, 96(%rsi)
60         mov     %rdx,104(%rsi)
61         mov     %rcx,112(%rsi)
62         mov     (%rsp), %rcx
63         mov     %rcx, 72(%rsi)
64
65         cli
66         nop
67         stgi
68
69         add     $16, %rsp
70         
71         // restore callee saved registers
72         pop     %rbp
73         pop     %r15
74         pop     %r14
75         pop     %r13
76         pop     %r12
77         pop     %rbx
78
79         ret