return 1;
}
- if ((shadow_access == PT_ACCESS_NOT_PRESENT) &&
- (guest_access == PT_ACCESS_NOT_PRESENT)) {
+ /*
+ if ((shadow_access == PT_ACCESS_NOT_PRESENT) &&
+ (guest_access == PT_ACCESS_NOT_PRESENT)) {
+ // Page tables completely blank, handle guest first
+ return 1;
+ }
+ */
+
+ if (guest_access == PT_ACCESS_NOT_PRESENT) {
// Page tables completely blank, handle guest first
return 1;
}
-
+
// Otherwise we'll handle the guest fault later...?
}
PrintDebug("Access error injecting pf to guest (guest access error=%d) (pf error code=%d)\n",
guest_pte_access, *(uint_t*)&error_code);
#ifdef CONFIG_SYMBIOTIC_SWAP
- if (is_swapped_pte32(guest_pte)) {
+ if ((error_code.write == 0) && (is_swapped_pte32(guest_pte))) {
PrintError("Page fault on swapped out page (pte=%x)\n", *(uint32_t *)guest_pte);
addr_t swp_pg_addr = v3_get_swapped_pg_addr(info, shadow_pte, guest_pte);
*/
/* We need some way to check permissions.... */
-
+
shadow_pte->accessed = 1;
- shadow_pte->writable = 1;
+ shadow_pte->writable = 0;
+
+ if (fault_addr & 0xc0000000) {
+ shadow_pte->user_page = 0;
+ } else {
+ shadow_pte->user_page = 1;
+ }
+
shadow_pte->write_through = 0;
shadow_pte->cache_disable = 0;
shadow_pte->global_page = 0;
- shadow_pte->user_page = 1;
+
shadow_pte->present = 1;
shadow_pte->page_base_addr = swp_pg_addr;
if (shdw_ptr_list == NULL) {
shdw_ptr_list = (struct list_head *)V3_Malloc(sizeof(struct list_head *));
INIT_LIST_HEAD(shdw_ptr_list);
+ v3_htable_insert(swap_state->shdw_ptr_ht, (addr_t)*(uint32_t *)guest_pte, (addr_t)shdw_ptr_list);
}
shdw_ptr = (struct shadow_pointer *)V3_Malloc(sizeof(struct shadow_pointer));