53 lines
1.7 KiB
C
53 lines
1.7 KiB
C
#pragma once
|
|
|
|
#include "nyx/snapshot/memory/block_list.h"
|
|
#include "nyx/snapshot/memory/shadow_memory.h"
|
|
#include <stdint.h>
|
|
|
|
struct kvm_dirty_gfn {
|
|
uint32_t flags;
|
|
uint32_t slot;
|
|
uint64_t offset;
|
|
};
|
|
|
|
typedef struct slot_s {
|
|
bool enabled; /* set if slot is not marked as read-only */
|
|
|
|
uint8_t region_id; /* shadow_memory region id */
|
|
uint64_t region_offset; /* shadow_memory region offset*/
|
|
|
|
void *bitmap;
|
|
|
|
uint64_t bitmap_size; // remove me later
|
|
uint64_t *stack;
|
|
uint64_t stack_ptr;
|
|
} slot_t;
|
|
|
|
typedef struct nyx_dirty_ring_s {
|
|
slot_t *kvm_region_slots;
|
|
uint8_t kvm_region_slots_num;
|
|
|
|
} nyx_dirty_ring_t;
|
|
|
|
/* must be called before KVM_SET_USER_MEMORY_REGION & KVM_CREATE_VCPU */
|
|
void nyx_dirty_ring_early_init(int kvm_fd, int vm_fd);
|
|
|
|
/* must be called right after KVM_CREATE_VCPU */
|
|
void nyx_dirty_ring_pre_init(int kvm_fd, int vm_fd);
|
|
|
|
nyx_dirty_ring_t *nyx_dirty_ring_init(shadow_memory_t *shadow_memory);
|
|
|
|
uint32_t nyx_snapshot_nyx_dirty_ring_restore(nyx_dirty_ring_t *self,
|
|
shadow_memory_t *shadow_memory_state,
|
|
snapshot_page_blocklist_t *blocklist);
|
|
|
|
void nyx_snapshot_nyx_dirty_ring_save_root_pages(nyx_dirty_ring_t *self,
|
|
shadow_memory_t *shadow_memory_state,
|
|
snapshot_page_blocklist_t *blocklist);
|
|
|
|
void nyx_snapshot_nyx_dirty_ring_flush(void);
|
|
|
|
void nyx_snapshot_nyx_dirty_ring_flush_and_collect(nyx_dirty_ring_t *self,
|
|
shadow_memory_t *shadow_memory_state,
|
|
snapshot_page_blocklist_t *blocklist);
|