]> rtime.felk.cvut.cz Git - l4.git/blob - kernel/fiasco/src/kern/ia32/vm_factory-ia32.cpp
b06b8d39a2963caae8ca40b02cb72b006f79868c
[l4.git] / kernel / fiasco / src / kern / ia32 / vm_factory-ia32.cpp
1 IMPLEMENTATION [vmx && svm]:
2
3 #include "ram_quota.h"
4 #include "svm.h"
5 #include "vm_svm.h"
6 #include "vmx.h"
7 #include "vm_vmx.h"
8
9 PRIVATE static inline
10 template< typename VM >
11 VM *
12 Vm_factory::allocate(Ram_quota *quota)
13 {
14   if (void *t = Vm::allocator<VM>()->q_alloc(quota))
15     {
16       VM *a = new (t) VM(quota);
17       if (a->initialize())
18         return a;
19
20       delete a;
21     }
22
23   return 0;
24 }
25
26 IMPLEMENT
27 Vm *
28 Vm_factory::create(Ram_quota *quota, int *err)
29 {
30   *err = -L4_err::ENomem;
31   if (Svm::cpus.cpu(current_cpu()).svm_enabled())
32     return allocate<Vm_svm>(quota);
33   if (Vmx::cpus.cpu(current_cpu()).vmx_enabled())
34     return allocate<Vm_vmx>(quota);
35
36   *err = L4_err::ENodev;
37   return 0;
38 }
39