#include <palacios/vmm_sym_swap.h>
#include <palacios/vmm_list.h>
-
+#include <palacios/vm_guest.h>
#ifdef CONFIG_SYMBIOTIC_SWAP_TELEMETRY
#include <palacios/vmm_telemetry.h>
swap_state->flushes++;
#endif
+ if (!ht_iter) {
+ PrintError("NULL iterator in swap flush!! Probably will crash soon...\n");
+ }
+
while (ht_iter->entry) {
struct shadow_pointer * tmp_shdw_ptr = NULL;
struct shadow_pointer * shdw_ptr = NULL;
// we can leave the list_head structures and reuse them for the next round
list_for_each_entry_safe(shdw_ptr, tmp_shdw_ptr, shdw_ptr_list, node) {
+ if (shdw_ptr == NULL) {
+ PrintError("Null shadow pointer in swap flush!! Probably crashing soon...\n");
+ }
+
// Trigger faults for next shadow access
shdw_ptr->shadow_pte->present = 0;
// Delete entry from list
list_del(&(shdw_ptr->node));
- V3_Free(shdw_ptr);
+ V3_Free(shdw_ptr);
}
v3_htable_iter_advance(ht_iter);
}
+ V3_Free(ht_iter);
+
return 0;
}
int v3_get_vaddr_perms(struct guest_info * info, addr_t vaddr, pte32_t * guest_pte, pf_error_t * page_perms) {
- uint32_t pte_val = *(uint32_t *)guest_pte;
+ uint64_t pte_val = (uint64_t)*(uint32_t *)guest_pte;
// symcall to check if page is in cache or on swap disk
if (v3_sym_call3(info, SYMCALL_MEM_LOOKUP, (uint64_t *)&vaddr, (uint64_t *)&pte_val, (uint64_t *)page_perms) == -1) {
return -1;
}
- V3_Print("page perms = %x\n", *(uint32_t *)page_perms);
+ // V3_Print("page perms = %x\n", *(uint32_t *)page_perms);
return 0;
}