[Simit-arm-cvs] simit-arm/emulator armemul.cpp,1.5,1.6 armemul.h,1.5,1.6 emumem.h,1.6,1.7 ldst.cpp,1
Brought to you by:
weiqin04
From: Wei Q. <wei...@us...> - 2005-08-23 19:49:04
|
Update of /cvsroot/simit-arm/simit-arm/emulator In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv2151 Modified Files: armemul.cpp armemul.h emumem.h ldst.cpp loader.cpp loader.h loadfpe.cpp misc.h nwfpe.cpp nwfpe.h.in syscall.cpp syscall.h util.cpp Log Message: many updates Index: nwfpe.h.in =================================================================== RCS file: /cvsroot/simit-arm/simit-arm/emulator/nwfpe.h.in,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** nwfpe.h.in 20 May 2005 06:11:27 -0000 1.5 --- nwfpe.h.in 23 Aug 2005 19:48:56 -0000 1.6 *************** *** 13,17 **** #include <misc.h> ! #ifdef __COMPILE_SIMULATOR_ namespace simulator { class arm_simulator; --- 13,17 ---- #include <misc.h> ! #ifdef COMPILE_SIMULATOR namespace simulator { class arm_simulator; Index: loadfpe.cpp =================================================================== RCS file: /cvsroot/simit-arm/simit-arm/emulator/loadfpe.cpp,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** loadfpe.cpp 21 May 2005 20:28:48 -0000 1.5 --- loadfpe.cpp 23 Aug 2005 19:48:56 -0000 1.6 *************** *** 4,8 **** #include "nwfpe.h" ! #ifdef __COMPILE_SIMULATOR_ #include "armsim.hpp" #else --- 4,8 ---- #include "nwfpe.h" ! #ifdef COMPILE_SIMULATOR #include "armsim.hpp" #else Index: syscall.h =================================================================== RCS file: /cvsroot/simit-arm/simit-arm/emulator/syscall.h,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** syscall.h 20 May 2005 06:11:27 -0000 1.4 --- syscall.h 23 Aug 2005 19:48:56 -0000 1.5 *************** *** 21,25 **** ! #ifdef __COMPILE_SIMULATOR_ namespace simulator { class arm_simulator; --- 21,25 ---- ! #ifdef COMPILE_SIMULATOR namespace simulator { class arm_simulator; Index: misc.h =================================================================== RCS file: /cvsroot/simit-arm/simit-arm/emulator/misc.h,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** misc.h 20 May 2005 06:11:27 -0000 1.6 --- misc.h 23 Aug 2005 19:48:56 -0000 1.7 *************** *** 146,149 **** --- 146,151 ---- void dump_int64_smart(uint64_t, FILE *); + int lmb32(unsigned val); + /*target endianness*/ #define TARGET_LITTLE_ENDIAN 1 Index: nwfpe.cpp =================================================================== RCS file: /cvsroot/simit-arm/simit-arm/emulator/nwfpe.cpp,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** nwfpe.cpp 20 May 2005 06:11:27 -0000 1.5 --- nwfpe.cpp 23 Aug 2005 19:48:56 -0000 1.6 *************** *** 2,6 **** #include "nwfpe.h" ! #ifdef __COMPILE_SIMULATOR_ #include "armsim.hpp" #else --- 2,6 ---- #include "nwfpe.h" ! #ifdef COMPILE_SIMULATOR #include "armsim.hpp" #else *************** *** 42,46 **** /* restore CPSR */ ! #ifndef __COMPILE_SIMULATOR_ WRITE_CPSR(MEM_READ_WORD(fpe_stack+64)); #else --- 42,46 ---- /* restore CPSR */ ! #ifndef COMPILE_SIMULATOR WRITE_CPSR(MEM_READ_WORD(fpe_stack+64)); #else *************** *** 69,73 **** /* program counter set to the next instruction */ MEM_WRITE_WORD(fpe_stack+i*4, pc-4); ! #ifndef __COMPILE_SIMULATOR_ MEM_WRITE_WORD(fpe_stack+64, READ_CPSR); #else --- 69,73 ---- /* program counter set to the next instruction */ MEM_WRITE_WORD(fpe_stack+i*4, pc-4); ! #ifndef COMPILE_SIMULATOR MEM_WRITE_WORD(fpe_stack+64, READ_CPSR); #else *************** *** 84,88 **** WRITE_REG(15, FPE_ENTRY); ! #ifndef __COMPILE_SIMULATOR_ EMULATOR_STUB(fpe, inst); #endif --- 84,88 ---- WRITE_REG(15, FPE_ENTRY); ! #ifndef COMPILE_SIMULATOR EMULATOR_STUB(fpe, inst); #endif Index: armemul.cpp =================================================================== RCS file: /cvsroot/simit-arm/simit-arm/emulator/armemul.cpp,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** armemul.cpp 20 May 2005 06:11:26 -0000 1.5 --- armemul.cpp 23 Aug 2005 19:48:56 -0000 1.6 *************** *** 2,5 **** --- 2,6 ---- #include <csignal> #include <cstdio> + #include <cassert> #include "armemul.h" #include "decode.h" *************** *** 58,61 **** --- 59,64 ---- init_devices(dev_master); + syscall_buf = NULL; + reset(); } *************** *** 66,69 **** --- 69,76 ---- close_devices(dev_master); delete dev_master; + + if (syscall_buf) { + free(syscall_buf); + } } *************** *** 79,82 **** --- 86,94 ---- in_fpe = false; status = ST_RESET; + + if (syscall_buf) { + free(syscall_buf); + syscall_buf = false; + } } *************** *** 165,168 **** --- 177,188 ---- } + void arm_emulator::step() + { + arm_inst_t inst; + inst = fetch_inst(get_pc()); + execute(inst, get_pc()); + icount++; + } + void arm_emulator::init_registers() { *************** *** 189,193 **** int i; - fprintf(fp, "\n"); for(i = 0; i < INST_TOTAL; i++) { if(counters[i] > 0) { --- 209,212 ---- *************** *** 219,220 **** --- 238,263 ---- fputs(" nullified\n", fp); } + + void arm_emulator::syscall_realloc_buf(unsigned size) + { + assert(syscall_buf!=NULL); + syscall_buf = realloc(syscall_buf, size); + if (syscall_buf==NULL) { + fprintf(stderr, "Error: Out of host memory when allocating %d" + " bytes for a system call.\n", size); + exit(-1); + } + } + + void arm_emulator::syscall_alloc_buf(unsigned size) + { + if (syscall_buf!=NULL) + free(syscall_buf); + + syscall_buf = malloc(size); + if (syscall_buf==NULL) { + fprintf(stderr, "Error: Out of host memory when reallocating %d" + " bytes for a system call.\n", size); + exit(-1); + } + } Index: ldst.cpp =================================================================== RCS file: /cvsroot/simit-arm/simit-arm/emulator/ldst.cpp,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** ldst.cpp 20 May 2005 06:11:27 -0000 1.6 --- ldst.cpp 23 Aug 2005 19:48:56 -0000 1.7 *************** *** 537,541 **** { uint32_t start_addr, end_addr, address, i; ! int32_t j, pcount = popcount16(inst)*4; if (!PFLD && UFLD) { --- 537,541 ---- { uint32_t start_addr, end_addr, address, i; ! int32_t pcount = popcount16(inst)*4; if (!PFLD && UFLD) { *************** *** 561,568 **** /*ignore the last two bits of the address*/ ! address = end_addr - (end_addr & 0x3); ! j = inst<<16; i=15; ! while (j) { ! if (j<0) { word_t val; --- 561,568 ---- /*ignore the last two bits of the address*/ ! address = start_addr-(start_addr&0x3); ! i=0; ! while (i<16) { ! if (inst&(1<<i)) { word_t val; *************** *** 570,579 **** val = MEM_READ_WORD(address); WRITE_REG(i, val); ! address -= 4; } ! j = j<<1; i--; } ! assert(start_addr-(start_addr&0x3) == address+4); if (BITn(inst, 15) & BITn(inst, 22)) WRITE_CPSR(SPSR); --- 570,579 ---- val = MEM_READ_WORD(address); WRITE_REG(i, val); ! address += 4; } ! i++; } ! assert(address == end_addr - (end_addr & 0x3) + 4); if (BITn(inst, 15) & BITn(inst, 22)) WRITE_CPSR(SPSR); *************** *** 585,589 **** { uint32_t start_addr, end_addr, address, i; ! int32_t j, pcount = popcount16(inst)*4; if (!PFLD && UFLD) { --- 585,589 ---- { uint32_t start_addr, end_addr, address, i; ! int32_t pcount = popcount16(inst)*4; if (!PFLD && UFLD) { *************** *** 609,624 **** /*ignore the last two bits of the address*/ ! address = end_addr - (end_addr & 0x3); ! j = inst<<16; i=15; ! while (j) { ! if (j<0) { word_t val=READ_REG(i); MEM_WRITE_WORD(address, val); /*MEM_WRITE_WORD(address, READ_REG(i));*/ ! address -= 4; } ! j = j<<1; i--; } ! assert(start_addr - (start_addr&0x3) == address+4); EMULATOR_STUB(stm,inst); --- 609,624 ---- /*ignore the last two bits of the address*/ ! address = start_addr - (start_addr&0x3); ! i=0; ! while (i<16) { ! if (inst&(1<<i)) { word_t val=READ_REG(i); MEM_WRITE_WORD(address, val); /*MEM_WRITE_WORD(address, READ_REG(i));*/ ! address += 4; } ! i++; } ! assert(address == (end_addr - (end_addr & 0x3) + 4)); EMULATOR_STUB(stm,inst); Index: syscall.cpp =================================================================== RCS file: /cvsroot/simit-arm/simit-arm/emulator/syscall.cpp,v retrieving revision 1.7 retrieving revision 1.8 diff -C2 -d -r1.7 -r1.8 *** syscall.cpp 20 May 2005 06:11:27 -0000 1.7 --- syscall.cpp 23 Aug 2005 19:48:56 -0000 1.8 *************** *** 1,18 **** /*************************************************************************** ! syscall.c - description ! ------------------- ! begin : Wed Sep 26 2001 ! copyright : (C) 2001 CEA and Université Paris XI Orsay ! author : Gilles Mouchard ! email : gil...@lr..., gil...@ce... ***************************************************************************/ /*************************************************************************** [...1403 lines suppressed...] ! memcpy(emu->syscall_buf, &buf, sizeof(struct stat64)); ! MEM_WRITE_BLOCK(buf_addr, emu->syscall_buf, sizeof(struct stat64)); } ! ! SYSCALL_ADV_STAGE ! } ! ! SYSCALL_STAGE_1 ! { ! SYSCALL_RESET_STAGE ! RETURN(emu->syscall_iret); ! return emu->syscall_iret != -1; ! } ! ! SYSCALL_STAGE_FALSE ! #else ! RETURN(-1); return false; #endif Index: emumem.h =================================================================== RCS file: /cvsroot/simit-arm/simit-arm/emulator/emumem.h,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** emumem.h 20 May 2005 06:11:27 -0000 1.6 --- emumem.h 23 Aug 2005 19:48:56 -0000 1.7 *************** *** 11,15 **** #endif ! // exclusive option #ifdef EMUMEM_FAST #undef EMUMEM_SAFE --- 11,15 ---- #endif ! // exclusive options, either fast or safe #ifdef EMUMEM_FAST #undef EMUMEM_SAFE Index: util.cpp =================================================================== RCS file: /cvsroot/simit-arm/simit-arm/emulator/util.cpp,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** util.cpp 12 Nov 2004 06:32:59 -0000 1.2 --- util.cpp 23 Aug 2005 19:48:56 -0000 1.3 *************** *** 69,70 **** --- 69,79 ---- } + /* get the position of the left most bit of an integer, from 0-31, -1 for 0 */ + int lmb32(unsigned val) + { + int ii; + for (ii=31; ii>=0; ii++) + if (val&(1u<<ii)) return ii; + + return 0; + } Index: loader.cpp =================================================================== RCS file: /cvsroot/simit-arm/simit-arm/emulator/loader.cpp,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** loader.cpp 20 May 2005 06:11:27 -0000 1.4 --- loader.cpp 23 Aug 2005 19:48:56 -0000 1.5 *************** *** 20,24 **** #include "loader.h" ! #ifdef __COMPILE_SIMULATOR_ #include "armsim.hpp" #else --- 20,24 ---- #include "loader.h" ! #ifdef COMPILE_SIMULATOR #include "armsim.hpp" #else *************** *** 208,214 **** abrk -= abrk % 4096; ! set_brk(abrk); ! set_mmap_brk(MMAP_BASE); fname_cache = filename; --- 208,214 ---- abrk -= abrk % 4096; ! syscall_set_brk(abrk); ! syscall_set_mmap_brk(MMAP_BASE); fname_cache = filename; Index: armemul.h =================================================================== RCS file: /cvsroot/simit-arm/simit-arm/emulator/armemul.h,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** armemul.h 20 May 2005 06:11:26 -0000 1.5 --- armemul.h 23 Aug 2005 19:48:56 -0000 1.6 *************** *** 71,74 **** --- 71,76 ---- void debug(); + /* fetch and run one instruction */ + void step(); *************** *** 110,120 **** /* some system-call library variables */ ! arm_addr_t get_brk() const {return brk_point;} ! arm_addr_t get_mmap_brk() const {return mmap_brk_point;} /* set brk point for syscall emulation */ ! void set_brk(arm_addr_t addr) {brk_point = addr;} ! void set_mmap_brk(arm_addr_t addr) {mmap_brk_point = addr;} --- 112,124 ---- /* some system-call library variables */ ! arm_addr_t syscall_get_brk() const {return brk_point;} ! arm_addr_t syscall_get_mmap_brk() const {return mmap_brk_point;} /* set brk point for syscall emulation */ ! void syscall_set_brk(arm_addr_t addr) {brk_point = addr;} ! void syscall_set_mmap_brk(arm_addr_t addr) {mmap_brk_point = addr;} + void syscall_alloc_buf(unsigned size); + void syscall_realloc_buf(unsigned size); *************** *** 165,168 **** --- 169,185 ---- + /* some scratch variables for system call */ + int syscall_phase; + + // temporary variables for syscall.cpp to use + int syscall_iret; + void *syscall_buf; + + unsigned syscall_mem_size; + int syscall_open_len; + int syscall_open_addr; + int syscall_times_ret; + + private: Index: loader.h =================================================================== RCS file: /cvsroot/simit-arm/simit-arm/emulator/loader.h,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** loader.h 12 Nov 2004 06:32:59 -0000 1.2 --- loader.h 23 Aug 2005 19:48:56 -0000 1.3 *************** *** 21,25 **** ! #ifdef __COMPILE_SIMULATOR_ namespace simulator { class arm_simulator; --- 21,25 ---- ! #ifdef COMPILE_SIMULATOR namespace simulator { class arm_simulator; |