Palacios Public Git Repository

To checkout Palacios execute

  git clone http://v3vee.org/palacios/palacios.web/palacios.git
This will give you the master branch. You probably want the devel branch or one of the release branches. To switch to the devel branch, simply execute
  cd palacios
  git checkout --track -b devel origin/devel
The other branches are similar.


3094d3dde6fb88275028be18e9f45f4f9f4373ed
[palacios.git] / palacios / src / palacios / svm_npt.h
1 #ifndef V3_CONFIG_SVM
2
3
4 static int handle_svm_nested_pagefault(struct guest_info * info, addr_t fault_addr, void *pfinfo,
5                                        addr_t *actual_start, addr_t *actual_end) 
6 {
7     PrintError(info->vm_info, info, "Cannot do nested page fault as SVM is not enabled.\n");
8     return -1;
9 }
10 static int handle_svm_invalidate_nested_addr(struct guest_info * info, addr_t inv_addr,
11                                              addr_t *actual_start, addr_t *actual_end) 
12 {
13     PrintError(info->vm_info, info, "Cannot do invalidate nested addr as SVM is not enabled.\n");
14     return -1;
15 }
16 static int handle_svm_invalidate_nested_addr_range(struct guest_info * info, 
17                                                    addr_t inv_addr_start, addr_t inv_addr_end,
18                                                    addr_t *actual_start, addr_t *actual_end) 
19 {
20     PrintError(info->vm_info, info, "Cannot do invalidate nested addr range as SVM is not enabled.\n");
21     return -1;
22 }
23
24 #else
25
26 static int handle_svm_nested_pagefault(struct guest_info * info, addr_t fault_addr, void *pfinfo,
27                                        addr_t *actual_start, addr_t *actual_end) 
28 {
29     pf_error_t error_code = *((pf_error_t *) pfinfo);
30     v3_cpu_mode_t mode = v3_get_host_cpu_mode();
31
32
33     PrintDebug(info->vm_info, info, "Nested PageFault: fault_addr=%p, error_code=%u\n", (void *)fault_addr, *(uint_t *)&error_code);
34
35     switch(mode) {
36         case REAL:
37         case PROTECTED:
38           return handle_passthrough_pagefault_32(info, fault_addr, error_code, actual_start, actual_end);
39             
40         case PROTECTED_PAE:
41           return handle_passthrough_pagefault_32pae(info, fault_addr, error_code, actual_start, actual_end);
42             
43         case LONG:
44         case LONG_32_COMPAT:
45           return handle_passthrough_pagefault_64(info, fault_addr, error_code, actual_start, actual_end);   
46             
47         default:
48             PrintError(info->vm_info, info, "Unknown CPU Mode\n");
49             break;
50     }
51     return -1;
52 }
53
54
55 static int handle_svm_invalidate_nested_addr(struct guest_info * info, addr_t inv_addr,
56                                              addr_t *actual_start, addr_t *actual_end) {
57
58 #ifdef __V3_64BIT__
59     v3_cpu_mode_t mode = LONG;
60 #else 
61 #error Compilation for 32 bit target detected
62     v3_cpu_mode_t mode = PROTECTED;
63 #endif
64
65     switch(mode) {
66         case REAL:
67         case PROTECTED:
68           return invalidate_addr_32(info, inv_addr, actual_start, actual_end);
69
70         case PROTECTED_PAE:
71           return invalidate_addr_32pae(info, inv_addr, actual_start, actual_end);
72
73         case LONG:
74         case LONG_32_COMPAT:
75           return invalidate_addr_64(info, inv_addr, actual_start, actual_end);      
76         
77         default:
78             PrintError(info->vm_info, info, "Unknown CPU Mode\n");
79             break;
80     }
81
82     return -1;
83 }
84
85 static int handle_svm_invalidate_nested_addr_range(struct guest_info * info, 
86                                                    addr_t inv_addr_start, addr_t inv_addr_end,
87                                                    addr_t *actual_start, addr_t *actual_end) 
88 {
89     
90 #ifdef __V3_64BIT__
91     v3_cpu_mode_t mode = LONG;
92 #else 
93 #error Compilation for 32 bit target detected
94     v3_cpu_mode_t mode = PROTECTED;
95 #endif
96
97     switch(mode) {
98         case REAL:
99         case PROTECTED:
100           return invalidate_addr_32_range(info, inv_addr_start, inv_addr_end, actual_start, actual_end);
101
102         case PROTECTED_PAE:
103           return invalidate_addr_32pae_range(info, inv_addr_start, inv_addr_end, actual_start, actual_end);
104
105         case LONG:
106         case LONG_32_COMPAT:
107           return invalidate_addr_64_range(info, inv_addr_start, inv_addr_end, actual_start, actual_end);  
108         
109         default:
110             PrintError(info->vm_info, info, "Unknown CPU Mode\n");
111             break;
112     }
113
114     return -1;
115 }
116
117 #endif