Author: eliot Date: 2010-11-03 10:10:35 -0700 (Wed, 03 Nov 2010) New Revision: 2330 Modified: branches/Cog/platforms/Cross/plugins/BochsIA32Plugin/sqBochsIA32Plugin.cpp branches/Cog/platforms/win32/plugins/FilePlugin/sqWin32FilePrims.c branches/Cog/processors/IA32/bochs/cpu/cpu.cc branches/Cog/unixbuild/HowToBuild Log: Merge http://lists.squeakfoundation.org/pipermail/vm-dev/2010-April/004187.html fix (EOF testing on win32). Add execution protection to Bochs IA32 simulator plugin. Update unix build info for ubuntu. Modified: branches/Cog/platforms/Cross/plugins/BochsIA32Plugin/sqBochsIA32Plugin.cpp =================================================================== --- branches/Cog/platforms/Cross/plugins/BochsIA32Plugin/sqBochsIA32Plugin.cpp 2010-10-13 18:39:14 UTC (rev 2329) +++ branches/Cog/platforms/Cross/plugins/BochsIA32Plugin/sqBochsIA32Plugin.cpp 2010-11-03 17:10:35 UTC (rev 2330) @@ -92,8 +92,8 @@ int singleStepCPUInSizeMinAddressReadWrite(void *cpu, - void *memory, ulong byteSize, - ulong minReadAddr, ulong minWriteAddr) + void *memory, ulong byteSize, + ulong minAddr, ulong minWriteMaxExecAddr) { BX_CPU_C *anx86 = (BX_CPU_C *)cpu; @@ -101,33 +101,36 @@ return BadCPUInstance; theMemory = (unsigned char *)memory; theMemorySize = byteSize; - minReadAddress = minReadAddr; - minWriteAddress = minWriteAddr; - if (anx86->gen_reg[BX_32BIT_REG_EIP].dword.erx >= theMemorySize) - return MemoryBoundsError; + minReadAddress = minAddr; + minWriteAddress = minWriteMaxExecAddr; +#if 0 + if (anx86->gen_reg[BX_32BIT_REG_EIP].dword.erx >= minWriteMaxExecAddr) + return anx86->gen_reg[BX_32BIT_REG_EIP].dword.erx >= byteSize + ? MemoryBoundsError + : ExecutionError; +#endif if ((theErrorAcorn = setjmp(anx86->jmp_buf_env)) != 0) { anx86->gen_reg[BX_32BIT_REG_EIP].dword.erx = anx86->prev_rip; return theErrorAcorn; } blidx = 0; - bx_cpu.sregs[BX_SEG_REG_CS].cache.u.segment.limit_scaled = + bx_cpu.sregs[BX_SEG_REG_CS].cache.u.segment.limit_scaled = minWriteMaxExecAddr - 1; bx_cpu.sregs[BX_SEG_REG_DS].cache.u.segment.limit_scaled = bx_cpu.sregs[BX_SEG_REG_SS].cache.u.segment.limit_scaled = byteSize; - bx_cpu.sregs[BX_SEG_REG_CS].cache.u.segment.limit = + bx_cpu.sregs[BX_SEG_REG_CS].cache.u.segment.limit = minWriteMaxExecAddr >> 16; bx_cpu.sregs[BX_SEG_REG_DS].cache.u.segment.limit = bx_cpu.sregs[BX_SEG_REG_SS].cache.u.segment.limit = byteSize >> 16; anx86->eipFetchPtr = theMemory; - anx86->eipPageWindowSize = theMemorySize; + anx86->eipPageWindowSize = minWriteMaxExecAddr; anx86->cpu_single_step(); return blidx == 0 ? 0 : SomethingLoggedError; } int - runCPUInSizeMinAddressReadWrite(void *cpu, - void *memory, ulong byteSize, - ulong minReadAddr, ulong minWriteAddr) + runCPUInSizeMinAddressReadWrite(void *cpu, void *memory, ulong byteSize, + ulong minAddr, ulong minWriteMaxExecAddr) { BX_CPU_C *anx86 = (BX_CPU_C *)cpu; @@ -135,24 +138,28 @@ return BadCPUInstance; theMemory = (unsigned char *)memory; theMemorySize = byteSize; - minReadAddress = minReadAddr; - minWriteAddress = minWriteAddr; - if (anx86->gen_reg[BX_32BIT_REG_EIP].dword.erx >= theMemorySize) - return MemoryBoundsError; + minReadAddress = minAddr; + minWriteAddress = minWriteMaxExecAddr; +#if 0 + if (anx86->gen_reg[BX_32BIT_REG_EIP].dword.erx >= minWriteMaxExecAddr) + return anx86->gen_reg[BX_32BIT_REG_EIP].dword.erx >= byteSize + ? MemoryBoundsError + : ExecutionError; +#endif if ((theErrorAcorn = setjmp(anx86->jmp_buf_env)) != 0) { anx86->gen_reg[BX_32BIT_REG_EIP].dword.erx = anx86->prev_rip; return theErrorAcorn; } blidx = 0; - bx_cpu.sregs[BX_SEG_REG_CS].cache.u.segment.limit_scaled = + bx_cpu.sregs[BX_SEG_REG_CS].cache.u.segment.limit_scaled = minWriteMaxExecAddr - 1; bx_cpu.sregs[BX_SEG_REG_DS].cache.u.segment.limit_scaled = bx_cpu.sregs[BX_SEG_REG_SS].cache.u.segment.limit_scaled = byteSize; - bx_cpu.sregs[BX_SEG_REG_CS].cache.u.segment.limit = + bx_cpu.sregs[BX_SEG_REG_CS].cache.u.segment.limit = minWriteMaxExecAddr >> 16; bx_cpu.sregs[BX_SEG_REG_DS].cache.u.segment.limit = bx_cpu.sregs[BX_SEG_REG_SS].cache.u.segment.limit = byteSize >> 16; anx86->eipFetchPtr = theMemory; - anx86->eipPageWindowSize = theMemorySize; + anx86->eipPageWindowSize = minWriteMaxExecAddr; bx_pc_system.kill_bochs_request = 0; anx86->cpu_loop(0 /* = "run forever" until exception or interupt */); if (anx86->stop_reason != STOP_NO_REASON) { @@ -415,12 +422,7 @@ last_read_address = (bx_address)-1; } -// Cut-down parts of cpu/cpu.cc -void BX_CPU_C::prefetch(void) -{ -} - // Cut-down parts of memory/misc_mem.cc for cpu/debugstuff.cc bx_bool BX_MEM_C::dbg_fetch_mem(BX_CPU_C *cpu, bx_phy_address addr, unsigned len, Bit8u *buf) { Modified: branches/Cog/platforms/win32/plugins/FilePlugin/sqWin32FilePrims.c =================================================================== --- branches/Cog/platforms/win32/plugins/FilePlugin/sqWin32FilePrims.c 2010-10-13 18:39:14 UTC (rev 2329) +++ branches/Cog/platforms/win32/plugins/FilePlugin/sqWin32FilePrims.c 2010-11-03 17:10:35 UTC (rev 2330) @@ -83,7 +83,7 @@ if (!sqFileValid(f)) FAIL(); ofs.offset = 0; ofs.dwLow = SetFilePointer(FILE_HANDLE(f), 0, &ofs.dwHigh, FILE_CURRENT); - return ofs.offset == sqFileSize(f); + return ofs.offset >= sqFileSize(f); } sqInt sqFileClose(SQFile *f) { Modified: branches/Cog/processors/IA32/bochs/cpu/cpu.cc =================================================================== --- branches/Cog/processors/IA32/bochs/cpu/cpu.cc 2010-10-13 18:39:14 UTC (rev 2329) +++ branches/Cog/processors/IA32/bochs/cpu/cpu.cc 2010-11-03 17:10:35 UTC (rev 2330) @@ -677,7 +677,6 @@ // * ROM boundary: 2k (dont care since we are only reading) // * segment boundary: any -#if !COG void BX_CPU_C::prefetch(void) { bx_address laddr = BX_CPU_THIS_PTR get_laddr(BX_SEG_REG_CS, RIP); @@ -708,6 +707,7 @@ } } +#if !COG bx_address lpf = LPFOf(laddr); unsigned TLB_index = BX_TLB_INDEX_OF(lpf, 0); bx_TLB_entry *tlbEntry = &BX_CPU_THIS_PTR TLB.entry[TLB_index]; @@ -715,9 +715,9 @@ if ((tlbEntry->lpf == lpf) && !(tlbEntry->accessBits & USER_PL)) { pAddr = A20ADDR(tlbEntry->ppf | pageOffset); -#if BX_SupportGuest2HostTLB +# if BX_SupportGuest2HostTLB fetchPtr = (Bit8u*) (tlbEntry->hostPageAddr); -#endif +# endif } else { if (BX_CPU_THIS_PTR cr0.get_PG()) { @@ -749,15 +749,15 @@ } } -#if BX_SUPPORT_ICACHE +# if BX_SUPPORT_ICACHE BX_CPU_THIS_PTR currPageWriteStampPtr = pageWriteStampTable.getPageWriteStampPtr(pAddr); Bit32u pageWriteStamp = *(BX_CPU_THIS_PTR currPageWriteStampPtr); pageWriteStamp &= ~ICacheWriteStampFetchModeMask; // Clear out old fetch mode bits pageWriteStamp |= BX_CPU_THIS_PTR fetchModeMask; // And add new ones pageWriteStampTable.setPageWriteStamp(pAddr, pageWriteStamp); -#endif +# endif +#endif /* !COG */ } -#endif void BX_CPU_C::boundaryFetch(const Bit8u *fetchPtr, unsigned remainingInPage, bxInstruction_c *i) { Modified: branches/Cog/unixbuild/HowToBuild =================================================================== --- branches/Cog/unixbuild/HowToBuild 2010-10-13 18:39:14 UTC (rev 2329) +++ branches/Cog/unixbuild/HowToBuild 2010-11-03 17:10:35 UTC (rev 2330) @@ -9,6 +9,10 @@ 3. Open a shell, cd into the unixbuild/bld directory and execute ../../platforms/unix/config/configure CFLAGS="-g -O2 -msse2 -D_GNU_SOURCE -DNDEBUG -DITIMER_HEARTBEAT=1 -DNO_VM_PROFILE=1 -DCOGMTVM=0 -DDEBUGVM=0" LIBS=-lpthread make install prefix=WhereYouWantTheVmToGo + + N.B. On Ubuntu *do not* supply "LIBS=-lpthread", i.e. use + ../../platforms/unix/config/configure CFLAGS="-g -O2 -msse2 -D_GNU_SOURCE -DNDEBUG -DITIMER_HEARTBEAT=1 -DNO_VM_PROFILE=1 -DCOGMTVM=0 -DDEBUGVM=0" + 4. At the end of it you'll get a new VM in the path provided via -prefix |
Free forum by Nabble | Edit this page |