}
-
-static addr_t create_new_shadow_pt() {
- void * host_pde = 0;
-
- host_pde = V3_VAddr(V3_AllocPages(1));
- memset(host_pde, 0, PAGE_SIZE);
-
- return (addr_t)host_pde;
-}
-
-
-static void inject_guest_pf(struct guest_info * info, addr_t fault_addr, pf_error_t error_code) {
- if (info->enable_profiler) {
- info->profiler.guest_pf_cnt++;
- }
-
- info->ctrl_regs.cr2 = fault_addr;
- v3_raise_exception_with_error(info, PF_EXCEPTION, *(uint_t *)&error_code);
-}
-
-
-static int is_guest_pf(pt_access_status_t guest_access, pt_access_status_t shadow_access) {
- /* basically the reasoning is that there can be multiple reasons for a page fault:
- If there is a permissions failure for a page present in the guest _BUT_
- the reason for the fault was that the page is not present in the shadow,
- _THEN_ we have to map the shadow page in and reexecute, this will generate
- a permissions fault which is _THEN_ valid to send to the guest
- _UNLESS_ both the guest and shadow have marked the page as not present
-
- whew...
- */
- if (guest_access != PT_ACCESS_OK) {
- // Guest Access Error
-
- if ((shadow_access != PT_ACCESS_NOT_PRESENT) &&
- (guest_access != PT_ACCESS_NOT_PRESENT)) {
- // aka (guest permission error)
- return 1;
- }
-
- if ((shadow_access == PT_ACCESS_NOT_PRESENT) &&
- (guest_access == PT_ACCESS_NOT_PRESENT)) {
- // Page tables completely blank, handle guest first
- return 1;
- }
-
- // Otherwise we'll handle the guest fault later...?
- }
-
- return 0;
-}
-
-
-
-
-
-
-
-
-
-
int v3_handle_shadow_invlpg(struct guest_info * info) {
uchar_t instr[15];
struct x86_instr dec_instr;
}
}
+
+
+
+static addr_t create_new_shadow_pt() {
+ void * host_pde = 0;
+
+ host_pde = V3_VAddr(V3_AllocPages(1));
+ memset(host_pde, 0, PAGE_SIZE);
+
+ return (addr_t)host_pde;
+}
+
+
+static void inject_guest_pf(struct guest_info * info, addr_t fault_addr, pf_error_t error_code) {
+ if (info->enable_profiler) {
+ info->profiler.guest_pf_cnt++;
+ }
+
+ info->ctrl_regs.cr2 = fault_addr;
+ v3_raise_exception_with_error(info, PF_EXCEPTION, *(uint_t *)&error_code);
+}
+
+
+static int is_guest_pf(pt_access_status_t guest_access, pt_access_status_t shadow_access) {
+ /* basically the reasoning is that there can be multiple reasons for a page fault:
+ If there is a permissions failure for a page present in the guest _BUT_
+ the reason for the fault was that the page is not present in the shadow,
+ _THEN_ we have to map the shadow page in and reexecute, this will generate
+ a permissions fault which is _THEN_ valid to send to the guest
+ _UNLESS_ both the guest and shadow have marked the page as not present
+
+ whew...
+ */
+ if (guest_access != PT_ACCESS_OK) {
+ // Guest Access Error
+
+ if ((shadow_access != PT_ACCESS_NOT_PRESENT) &&
+ (guest_access != PT_ACCESS_NOT_PRESENT)) {
+ // aka (guest permission error)
+ return 1;
+ }
+
+ if ((shadow_access == PT_ACCESS_NOT_PRESENT) &&
+ (guest_access == PT_ACCESS_NOT_PRESENT)) {
+ // Page tables completely blank, handle guest first
+ return 1;
+ }
+
+ // Otherwise we'll handle the guest fault later...?
+ }
+
+ return 0;
+}
+
+
// We assume that shdw_pg_state.guest_cr3 is pointing to the page tables we want to activate
// We also assume that the CPU mode has not changed during this page table transition
-static int activate_shadow_pt_32(struct guest_info * info) {
+static inline int activate_shadow_pt_32(struct guest_info * info) {
struct cr3_32 * shadow_cr3 = (struct cr3_32 *)&(info->ctrl_regs.cr3);
struct cr3_32 * guest_cr3 = (struct cr3_32 *)&(info->shdw_pg_state.guest_cr3);
int cached = 0;
pte32_t * guest_pt);
-static int handle_shadow_pagefault_32(struct guest_info * info, addr_t fault_addr, pf_error_t error_code) {
+static inline int handle_shadow_pagefault_32(struct guest_info * info, addr_t fault_addr, pf_error_t error_code) {
pde32_t * guest_pd = NULL;
pde32_t * shadow_pd = CR3_TO_PDE32_VA(info->ctrl_regs.cr3);
addr_t guest_cr3 = CR3_TO_PDE32_PA(info->shdw_pg_state.guest_cr3);
/* If we start to optimize we should look up the guest pages in the cache... */
-static int handle_shadow_invlpg_32(struct guest_info * info, addr_t vaddr) {
+static inline int handle_shadow_invlpg_32(struct guest_info * info, addr_t vaddr) {
pde32_t * shadow_pd = (pde32_t *)CR3_TO_PDE32_VA(info->ctrl_regs.cr3);
pde32_t * shadow_pde = (pde32_t *)&shadow_pd[PDE32_INDEX(vaddr)];
shadow_pte->present = 0;
}
-
-
return 0;
}
-static int activate_shadow_pt_32pae(struct guest_info * info) {
+static inline int activate_shadow_pt_32pae(struct guest_info * info) {
PrintError("Activating 32 bit PAE page tables not implemented\n");
return -1;
}
* *
*/
-static int handle_shadow_pagefault_32pae(struct guest_info * info, addr_t fault_addr, pf_error_t error_code) {
+static inline int handle_shadow_pagefault_32pae(struct guest_info * info, addr_t fault_addr, pf_error_t error_code) {
PrintError("32 bit PAE shadow paging not implemented\n");
return -1;
}
-static int handle_shadow_invlpg_32pae(struct guest_info * info, addr_t vaddr) {
+static inline int handle_shadow_invlpg_32pae(struct guest_info * info, addr_t vaddr) {
PrintError("32 bit PAE shadow paging not implemented\n");
return -1;
}
-static int activate_shadow_pt_64(struct guest_info * info) {
+static inline int activate_shadow_pt_64(struct guest_info * info) {
// struct cr3_64 * shadow_cr3 = (struct cr3_64 *)&(info->ctrl_regs.cr3);
return -1;
* *
*/
-static int handle_shadow_pagefault_64(struct guest_info * info, addr_t fault_addr, pf_error_t error_code) {
+static inline int handle_shadow_pagefault_64(struct guest_info * info, addr_t fault_addr, pf_error_t error_code) {
pt_access_status_t guest_access;
pt_access_status_t shadow_access;
int ret;
}
-static int handle_shadow_invlpg_64(struct guest_info * info, addr_t vaddr) {
+static inline int handle_shadow_invlpg_64(struct guest_info * info, addr_t vaddr) {
PrintError("64 bit shadow paging not implemented\n");
return -1;
}