[commit] r2330 - Merge http://lists.squeakfoundation.org/pipermail/vm-dev/2010-April/004187.html

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

[commit] r2330 - Merge http://lists.squeakfoundation.org/pipermail/vm-dev/2010-April/004187.html

commits-3
 
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