/* ** Copyright (C) 2011 EADS France, Fabrice Desclaux ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License along ** with this program; if not, write to the Free Software Foundation, Inc., ** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef CODENAT_H #define CODENAT_H #ifdef __APPLE__ #define __BYTE_ORDER __BYTE_ORDER__ #elif defined(__NetBSD__) #define __BYTE_ORDER _BYTE_ORDER #define __BIG_ENDIAN _BIG_ENDIAN #define __LITTLE_ENDIAN _LITTLE_ENDIAN #endif #define Endian16_Swap(value) \ ((((uint16_t)((value) & 0x00FF)) << 8) | \ (((uint16_t)((value) & 0xFF00)) >> 8)) #define Endian32_Swap(value) \ ((((uint32_t)((value) & 0x000000FF)) << 24) | \ (((uint32_t)((value) & 0x0000FF00)) << 8) | \ (((uint32_t)((value) & 0x00FF0000)) >> 8) | \ (((uint32_t)((value) & 0xFF000000)) >> 24)) #define Endian64_Swap(value) \ (((((uint64_t)value)<<56) & 0xFF00000000000000ULL) | \ ((((uint64_t)value)<<40) & 0x00FF000000000000ULL) | \ ((((uint64_t)value)<<24) & 0x0000FF0000000000ULL) | \ ((((uint64_t)value)<< 8) & 0x000000FF00000000ULL) | \ ((((uint64_t)value)>> 8) & 0x00000000FF000000ULL) | \ ((((uint64_t)value)>>24) & 0x0000000000FF0000ULL) | \ ((((uint64_t)value)>>40) & 0x000000000000FF00ULL) | \ ((((uint64_t)value)>>56) & 0x00000000000000FFULL)) LIST_HEAD(code_bloc_list_head, code_bloc_node); LIST_HEAD(memory_breakpoint_info_head, memory_breakpoint_info); #define BREAKPOINT_READ 1 #define BREAKPOINT_WRITE 2 #define BREAK_SIGALARM 1<<5 #define MAX_MEMORY_PAGE_POOL_TAB 0x100000 #define MEMORY_PAGE_POOL_MASK_BIT 12 #define PAGE_SIZE (1<exception_flags |= EXCEPT_INT_DIV_BY_ZERO; \ return 0; \ } \ r = a/b; \ return r; \ } #define UMOD(sizeA) \ uint ## sizeA ## _t umod ## sizeA (vm_cpu_t* vmcpu, uint ## sizeA ## _t a, uint ## sizeA ## _t b) \ { \ uint ## sizeA ## _t r; \ if (b == 0) { \ vmcpu->exception_flags |= EXCEPT_INT_DIV_BY_ZERO; \ return 0; \ } \ r = a%b; \ return r; \ } #define IDIV(sizeA) \ int ## sizeA ## _t idiv ## sizeA (vm_cpu_t* vmcpu, int ## sizeA ## _t a, int ## sizeA ## _t b) \ { \ int ## sizeA ## _t r; \ if (b == 0) { \ vmcpu->exception_flags |= EXCEPT_INT_DIV_BY_ZERO; \ return 0; \ } \ r = a/b; \ return r; \ } #define IMOD(sizeA) \ int ## sizeA ## _t imod ## sizeA (vm_cpu_t* vmcpu, int ## sizeA ## _t a, int ## sizeA ## _t b) \ { \ int ## sizeA ## _t r; \ if (b == 0) { \ vmcpu->exception_flags |= EXCEPT_INT_DIV_BY_ZERO; \ return 0; \ } \ r = a%b; \ return r; \ } void hexdump(char* m, unsigned int l); struct code_bloc_node * create_code_bloc_node(uint64_t ad_start, uint64_t ad_stop); void add_code_bloc(vm_mngr_t* vm_mngr, struct code_bloc_node* cbp); struct memory_page_node * create_memory_page_node(uint64_t ad, unsigned int size, unsigned int access);//memory_page* mp); void init_memory_page_pool(vm_mngr_t* vm_mngr); void init_code_bloc_pool(vm_mngr_t* vm_mngr); void reset_memory_page_pool(vm_mngr_t* vm_mngr); void reset_code_bloc_pool(vm_mngr_t* vm_mngr); void dump_code_bloc_pool(vm_mngr_t* vm_mngr); void add_memory_page(vm_mngr_t* vm_mngr, struct memory_page_node* mpn_a); void init_memory_breakpoint(vm_mngr_t* vm_mngr); void reset_memory_breakpoint(vm_mngr_t* vm_mngr); void add_memory_breakpoint(vm_mngr_t* vm_mngr, uint64_t ad, uint64_t size, unsigned int access); void remove_memory_breakpoint(vm_mngr_t* vm_mngr, uint64_t ad, unsigned int access); void add_memory_page(vm_mngr_t* vm_mngr, struct memory_page_node* mpn); void check_write_code_bloc(vm_mngr_t* vm_mngr, uint64_t my_size, uint64_t addr); char* dump(vm_mngr_t* vm_mngr); void dump_memory_breakpoint_pool(vm_mngr_t* vm_mngr); PyObject* addr2BlocObj(vm_mngr_t* vm_mngr, uint64_t addr); /********************************************/ unsigned int get_memory_page_max_address(void); unsigned int get_memory_page_max_user_address(void); int is_mpn_in_tab(vm_mngr_t* vm_mngr, struct memory_page_node* mpn_a); void _func_free(void); void _func_alloc(void); unsigned int _get_memory_page_max_address_py(void); unsigned int _get_memory_page_max_user_address_py(void); unsigned int _get_memory_page_from_min_ad_py(unsigned int size); void _func_malloc_memory_page(void); void _func_free_memory_page(void); void _func_virtualalloc_memory_page(void); void _func_virtualfree_memory_page(void); void _func_loadlib_fake(void); void _func_getproc_fake(void); void func_free(void); void func_alloc(void); unsigned int get_memory_page_max_address_py(void); unsigned int get_memory_page_max_user_address_py(void); unsigned int get_memory_page_from_min_ad_py(unsigned int size); struct memory_page_node * get_memory_page_from_address(vm_mngr_t*, uint64_t ad); void func_malloc_memory_page(void); void func_free_memory_page(void); void func_virtualalloc_memory_page(void); void func_virtualfree_memory_page(void); void func_loadlib_fake(void); void func_getproc_fake(void); unsigned int cpuid(unsigned int a, unsigned int reg_num); double int2double(unsigned int m); double fadd(double a, double b); double fsub(double a, double b); double fmul(double a, double b); double fdiv(double a, double b); double ftan(double a); double frndint(double a); double fsin(double a); double fcos(double a); double fscale(double a, double b); double f2xm1(double a); double fsqrt(double a); double fabs(double a); double fprem(double a, double b); double fchs(double a); double fyl2x(double a, double b); double fpatan(double a, double b); unsigned int fprem_lsb(double a, double b); unsigned int fcom_c0(double a, double b); unsigned int fcom_c1(double a, double b); unsigned int fcom_c2(double a, double b); unsigned int fcom_c3(double a, double b); unsigned int fxam_c0(double a); unsigned int fxam_c1(double a); unsigned int fxam_c2(double a); unsigned int fxam_c3(double a); double mem_32_to_double(unsigned int m); double mem_64_to_double(uint64_t m); double int_16_to_double(unsigned int m); double int_32_to_double(unsigned int m); double int_64_to_double(uint64_t m); int16_t double_to_int_16(double d); int32_t double_to_int_32(double d); int64_t double_to_int_64(double d); double fadd(double a, double b); unsigned int double_to_mem_32(double d); uint64_t double_to_mem_64(double d); unsigned int access_segment(unsigned int d); unsigned int access_segment_ok(unsigned int d); unsigned int load_segment_limit(unsigned int d); unsigned int load_segment_limit_ok(unsigned int d); unsigned int load_tr_segment_selector(unsigned int d); #define shift_right_arith_08(a, b)\ ((((char)(a)) >> ((int)(b)&0x1f))&0xff) #define shift_right_arith_16(a, b)\ ((((short)(a)) >> ((int)(b)&0x1f))&0xffff) #define shift_right_arith_32(a, b)\ ((((int)(a)) >> ((int)(b)&0x1f))&0xffffffff) #define shift_right_logic_08(a, b)\ ((((unsigned char)(a)) >> ((unsigned int)(b)&0x1f))&0xff) #define shift_right_logic_16(a, b)\ ((((unsigned short)(a)) >> ((unsigned int)(b)&0x1f))&0xffff) #define shift_right_logic_32(a, b)\ ((((unsigned int)(a)) >> ((unsigned int)(b)&0x1f))&0xffffffff) #define shift_right_logic_64(a, b)\ ((((int64_t)(a)) >> ((int64_t)(b)&0x3f))&0xffffffffffffffff) #define shift_left_logic_08(a, b)\ (((a)<<((b)&0x1f))&0xff) #define shift_left_logic_16(a, b)\ (((a)<<((b)&0x1f))&0xffff) #define shift_left_logic_32(a, b)\ (((a)<<((b)&0x1f))&0xffffffff) #define shift_left_logic_64(a, b)\ (((a)<<((b)&0x3f))&0xffffffffffffffff) #endif