Optimize memory handling (#1963)
* optimize ram block handling Save the last element of the ram_list. This allows to faster find where to add new elements when they are not bigger then page size. * save ram_list freed this keeps the optimization for find_ram_offset() intact after snapshot restore. * cow only clear the tlb of affected pages * update flatview when possible Building each flatview new when the memory has changed is quite expensive when many MemoryRegions are used. This is an issue when using snapshots. * update benchmark for new api * save flatview in context this avoids rebuilding the flatview when restore a context. * init context flatview with zero * address_space_dispatch_clear remove subpage with higher priority * docutemnt the options for UC_CTL_CONTEXT_MODE Specialy stress that with UC_CTL_CONTEXT_MEMORY it is not possible to use the context with a different unicorn object.
This commit is contained in:
@@ -43,6 +43,7 @@ typedef struct {
|
||||
typedef struct RAMList {
|
||||
bool freed;
|
||||
RAMBlock *mru_block;
|
||||
RAMBlock *last_block;
|
||||
QLIST_HEAD(, RAMBlock) blocks;
|
||||
} RAMList;
|
||||
|
||||
|
||||
@@ -108,6 +108,8 @@ typedef MemoryRegion *(*uc_memory_mapping_t)(struct uc_struct *, hwaddr addr);
|
||||
|
||||
typedef void (*uc_memory_filter_t)(MemoryRegion *, int32_t);
|
||||
|
||||
typedef bool (*uc_flatview_copy_t)(struct uc_struct *, FlatView *, FlatView *, bool);
|
||||
|
||||
typedef void (*uc_readonly_mem_t)(MemoryRegion *mr, bool readonly);
|
||||
|
||||
typedef int (*uc_cpus_init)(struct uc_struct *, const char *);
|
||||
@@ -288,6 +290,7 @@ struct uc_struct {
|
||||
uc_args_uc_ram_size_ptr_t memory_map_ptr;
|
||||
uc_memory_mapping_t memory_mapping;
|
||||
uc_memory_filter_t memory_filter_subregions;
|
||||
uc_flatview_copy_t flatview_copy;
|
||||
uc_mem_unmap_t memory_unmap;
|
||||
uc_mem_unmap_t memory_moveout;
|
||||
uc_mem_unmap_t memory_movein;
|
||||
@@ -427,6 +430,9 @@ struct uc_context {
|
||||
uc_mode mode; // the mode of this context
|
||||
uc_arch arch; // the arch of this context
|
||||
int snapshot_level; // the memory snapshot level to restore
|
||||
bool ramblock_freed; // wheter there was a some ramblock freed
|
||||
RAMBlock *last_block;// The last element of the ramblock list
|
||||
FlatView *fv; // The current flatview of the memory
|
||||
char data[0]; // context
|
||||
};
|
||||
|
||||
|
||||
@@ -1018,6 +1018,16 @@ struct uc_tlb_entry {
|
||||
uc_prot perms;
|
||||
};
|
||||
|
||||
/*
|
||||
Variables to control which state should be stored in the context.
|
||||
Defaults to UC_CTL_CONTEXT_CPU. The options are used in a bitfield
|
||||
so to enable more then one content the binary or of the required
|
||||
contents can be use.
|
||||
The UC_CTL_CONTEXT_MEMORY stores some pointers to internal allocated
|
||||
memory. Therefor it's not possible to use this context with another
|
||||
unicorn object.
|
||||
*/
|
||||
|
||||
typedef enum uc_context_content {
|
||||
UC_CTL_CONTEXT_CPU = 1,
|
||||
UC_CTL_CONTEXT_MEMORY = 2,
|
||||
|
||||
Reference in New Issue
Block a user