X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/475eb62ac657b1f90903930e170369175278ab19..220a6109b767302515959ba7b80a36cfd9fd94ca:/src/mc/mc_private.h diff --git a/src/mc/mc_private.h b/src/mc/mc_private.h index 259afeedcc..1147044e5b 100644 --- a/src/mc/mc_private.h +++ b/src/mc/mc_private.h @@ -31,6 +31,7 @@ #include "xbt/parmap.h" #include "mc_mmu.h" #include "mc_page_store.h" +#include "mc_interface.h" SG_BEGIN_DECL() @@ -39,17 +40,41 @@ typedef struct s_mc_function_index_item s_mc_function_index_item_t, *mc_function /****************************** Snapshots ***********************************/ -#define NB_REGIONS 3 /* binary data (data + BSS) (type = 2), libsimgrid data (data + BSS) (type = 1), std_heap (type = 0)*/ +#define NB_REGIONS 3 /* binary data (data + BSS) (type = 2), libsimgrid data (data + BSS) (type = 1), std_heap (type = 0)*/ +/** @brief Copy/snapshot of a given memory region + * + * Two types of region snapshots exist: + * + */ typedef struct s_mc_mem_region{ - // Real address: + /** @brief Virtual address of the region in the simulated process */ void *start_addr; - // Copy of the datra: + + /** @brief Permanent virtual address of the region + * + * This is usually the same address as the simuilated process address. + * However, when using SMPI privatization of global variables, + * each SMPI process has its own set of global variables stored + * at a different virtual address. The scheduler maps those region + * on the region of the global variables. + * + * */ + void *permanent_addr; + + /** @brief Copy of the snapshot for flat snapshots regions (NULL otherwise) */ void *data; - // Size of the data region: + + /** @brief Size of the data region in bytes */ size_t size; - // For per-page snapshots, this is an array to the number of + + /** @brief Pages indices in the page store for per-page snapshots (NULL otherwise) */ size_t* page_numbers; + } s_mc_mem_region_t, *mc_mem_region_t; static inline __attribute__ ((always_inline)) @@ -81,17 +106,29 @@ typedef struct s_mc_snapshot{ xbt_dynar_t to_ignore; uint64_t hash; xbt_dynar_t ignored_data; -} s_mc_snapshot_t, *mc_snapshot_t; +} s_mc_snapshot_t; -mc_mem_region_t mc_get_snapshot_region(void* addr, mc_snapshot_t snapshot); +/** @brief Process index used when no process is available + * + * The expected behaviour is that if a process index is needed it will fail. + * */ +#define MC_NO_PROCESS_INDEX -1 + +/** @brief Process index when any process is suitable + * + * We could use a special negative value in the future. + */ +#define MC_ANY_PROCESS_INDEX 0 + +mc_mem_region_t mc_get_snapshot_region(void* addr, mc_snapshot_t snapshot, int process_index); static inline __attribute__ ((always_inline)) -mc_mem_region_t mc_get_region_hinted(void* addr, mc_snapshot_t snapshot, mc_mem_region_t region) +mc_mem_region_t mc_get_region_hinted(void* addr, mc_snapshot_t snapshot, int process_index, mc_mem_region_t region) { if (mc_region_contain(region, addr)) return region; else - return mc_get_snapshot_region(addr, snapshot); + return mc_get_snapshot_region(addr, snapshot, process_index); } /** Information about a given stack frame @@ -111,6 +148,7 @@ typedef struct s_mc_stack_frame { typedef struct s_mc_snapshot_stack{ xbt_dynar_t local_variables; xbt_dynar_t stack_frames; // mc_stack_frame_t + int process_index; }s_mc_snapshot_stack_t, *mc_snapshot_stack_t; typedef struct s_mc_global_t{ @@ -130,7 +168,6 @@ typedef struct s_mc_checkpoint_ignore_region{ static void* mc_snapshot_get_heap_end(mc_snapshot_t snapshot); -mc_snapshot_t SIMIX_pre_mc_snapshot(smx_simcall_t simcall); mc_snapshot_t MC_take_snapshot(int num_state); void MC_restore_snapshot(mc_snapshot_t); void MC_free_snapshot(mc_snapshot_t); @@ -139,9 +176,9 @@ int mc_important_snapshot(mc_snapshot_t snapshot); size_t* mc_take_page_snapshot_region(void* data, size_t page_count, uint64_t* pagemap, size_t* reference_pages); void mc_free_page_snapshot_region(size_t* pagenos, size_t page_count); -void mc_restore_page_snapshot_region(mc_mem_region_t region, size_t page_count, uint64_t* pagemap, mc_mem_region_t reference_region); +void mc_restore_page_snapshot_region(void* start_addr, size_t page_count, size_t* pagenos, uint64_t* pagemap, size_t* reference_pagenos); -mc_mem_region_t mc_region_new_sparse(int type, void *start_addr, size_t size, mc_mem_region_t ref_reg); +mc_mem_region_t mc_region_new_sparse(int type, void *start_addr, void* data_addr, size_t size, mc_mem_region_t ref_reg); void MC_region_destroy(mc_mem_region_t reg); void mc_region_restore_sparse(mc_mem_region_t reg, mc_mem_region_t ref_reg); void mc_softdirty_reset(); @@ -153,15 +190,15 @@ bool mc_snapshot_region_linear(mc_mem_region_t region) { void* mc_snapshot_read_fragmented(void* addr, mc_mem_region_t region, void* target, size_t size); -void* mc_snapshot_read(void* addr, mc_snapshot_t snapshot, void* target, size_t size); +void* mc_snapshot_read(void* addr, mc_snapshot_t snapshot, int process_index, void* target, size_t size); int mc_snapshot_region_memcmp( void* addr1, mc_mem_region_t region1, void* addr2, mc_mem_region_t region2, size_t size); int mc_snapshot_memcmp( void* addr1, mc_snapshot_t snapshot1, - void* addr2, mc_snapshot_t snapshot2, size_t size); + void* addr2, mc_snapshot_t snapshot2, int process_index, size_t size); -static void* mc_snapshot_read_pointer(void* addr, mc_snapshot_t snapshot); +static void* mc_snapshot_read_pointer(void* addr, mc_snapshot_t snapshot, int process_index); /** @brief State of the model-checker (global variables for the model checker) * @@ -198,7 +235,6 @@ void MC_wait_for_requests(void); void MC_show_deadlock(smx_simcall_t req); void MC_show_stack_safety(xbt_fifo_t stack); void MC_dump_stack_safety(xbt_fifo_t stack); -int SIMIX_pre_mc_random(smx_simcall_t simcall, int min, int max); extern xbt_fifo_t mc_stack; int get_search_interval(xbt_dynar_t list, void *ref, int *min, int *max); @@ -282,8 +318,8 @@ void MC_print_statistics(mc_stats_t); /* Normally the system should operate in std, for switching to raw mode */ /* you must wrap the code between MC_SET_RAW_MODE and MC_UNSET_RAW_MODE */ -extern void *std_heap; -extern void *mc_heap; +extern xbt_mheap_t std_heap; +extern xbt_mheap_t mc_heap; /* FIXME: Horrible hack! because the mmalloc library doesn't provide yet of */ @@ -351,7 +387,6 @@ extern __thread mc_comparison_times_t mc_comp_times; extern __thread double mc_snapshot_comparison_time; int snapshot_compare(void *state1, void *state2); -int SIMIX_pre_mc_compare_snapshots(smx_simcall_t simcall, mc_snapshot_t s1, mc_snapshot_t s2); void print_comparison_times(void); //#define MC_DEBUG 1 @@ -380,7 +415,7 @@ typedef struct s_mc_visited_state{ }s_mc_visited_state_t, *mc_visited_state_t; extern xbt_dynar_t visited_states; -int is_visited_state(void); +mc_visited_state_t is_visited_state(void); void visited_state_free(mc_visited_state_t state); void visited_state_free_voidp(void *s); @@ -483,8 +518,8 @@ typedef struct s_mc_location_list { mc_expression_t locations; } s_mc_location_list_t, *mc_location_list_t; -uintptr_t mc_dwarf_resolve_location(mc_expression_t expression, mc_object_info_t object_info, unw_cursor_t* c, void* frame_pointer_address, mc_snapshot_t snapshot); -uintptr_t mc_dwarf_resolve_locations(mc_location_list_t locations, mc_object_info_t object_info, unw_cursor_t* c, void* frame_pointer_address, mc_snapshot_t snapshot); +uintptr_t mc_dwarf_resolve_location(mc_expression_t expression, mc_object_info_t object_info, unw_cursor_t* c, void* frame_pointer_address, mc_snapshot_t snapshot, int process_index); +uintptr_t mc_dwarf_resolve_locations(mc_location_list_t locations, mc_object_info_t object_info, unw_cursor_t* c, void* frame_pointer_address, mc_snapshot_t snapshot, int process_index); void mc_dwarf_expression_clear(mc_expression_t expression); void mc_dwarf_expression_init(mc_expression_t expression, size_t len, Dwarf_Op* ops); @@ -514,7 +549,7 @@ struct s_dw_type{ dw_type_t full_type; // The same (but more complete) type }; -void* mc_member_resolve(const void* base, dw_type_t type, dw_type_t member, mc_snapshot_t snapshot); +void* mc_member_resolve(const void* base, dw_type_t type, dw_type_t member, mc_snapshot_t snapshot, int process_index); typedef struct s_dw_variable{ Dwarf_Off dwarf_offset; /* Global offset of the field. */ @@ -597,6 +632,7 @@ typedef struct s_mc_expression_state { void* frame_base; mc_snapshot_t snapshot; mc_object_info_t object_info; + int process_index; } s_mc_expression_state_t, *mc_expression_state_t; int mc_dwarf_execute_expression(size_t n, const Dwarf_Op* ops, mc_expression_state_t state); @@ -629,6 +665,7 @@ typedef struct s_mc_comm_pattern{ void *data; }s_mc_comm_pattern_t, *mc_comm_pattern_t; +extern xbt_dynar_t initial_communications_pattern; extern xbt_dynar_t communications_pattern; extern xbt_dynar_t incomplete_communications_pattern; @@ -680,7 +717,7 @@ void* mc_translate_address_region(uintptr_t addr, mc_mem_region_t region) * \return Translated address in the snapshot address space * */ static inline __attribute__((always_inline)) -void* mc_translate_address(uintptr_t addr, mc_snapshot_t snapshot) +void* mc_translate_address(uintptr_t addr, mc_snapshot_t snapshot, int process_index) { // If not in a process state/clone: @@ -688,7 +725,7 @@ void* mc_translate_address(uintptr_t addr, mc_snapshot_t snapshot) return (uintptr_t *) addr; } - mc_mem_region_t region = mc_get_snapshot_region((void*) addr, snapshot); + mc_mem_region_t region = mc_get_snapshot_region((void*) addr, snapshot, process_index); xbt_assert(mc_region_contain(region, (void*) addr), "Trying to read out of the region boundary."); @@ -716,15 +753,15 @@ static inline __attribute__ ((always_inline)) void* mc_snapshot_get_heap_end(mc_snapshot_t snapshot) { if(snapshot==NULL) xbt_die("snapshot is NULL"); - void** addr = &((xbt_mheap_t)std_heap)->breakval; - return mc_snapshot_read_pointer(addr, snapshot); + void** addr = &(std_heap->breakval); + return mc_snapshot_read_pointer(addr, snapshot, MC_ANY_PROCESS_INDEX); } static inline __attribute__ ((always_inline)) -void* mc_snapshot_read_pointer(void* addr, mc_snapshot_t snapshot) +void* mc_snapshot_read_pointer(void* addr, mc_snapshot_t snapshot, int process_index) { void* res; - return *(void**) mc_snapshot_read(addr, snapshot, &res, sizeof(void*)); + return *(void**) mc_snapshot_read(addr, snapshot, process_index, &res, sizeof(void*)); } /** @brief Read memory from a snapshot region @@ -743,7 +780,7 @@ void* mc_snapshot_read_region(void* addr, mc_mem_region_t region, void* target, uintptr_t offset = (char*) addr - (char*) region->start_addr; - xbt_assert(addr >= region->start_addr && (char*) addr+size <= (char*)region->start_addr+region->size, + xbt_assert(mc_region_contain(region, addr), "Trying to read out of the region boundary."); // Linear memory region: @@ -753,6 +790,7 @@ void* mc_snapshot_read_region(void* addr, mc_mem_region_t region, void* target, // Fragmented memory region: else if (region->page_numbers) { + // Last byte of the region: void* end = (char*) addr + size - 1; if( mc_same_page(addr, end) ) { // The memory is contained in a single page: @@ -778,4 +816,3 @@ void* mc_snapshot_read_pointer_region(void* addr, mc_mem_region_t region) SG_END_DECL() #endif -