[Vm-dev] Cog on Mac. Problems with mprotect()?

Igor Stasenko siguctua at gmail.com
Sun Dec 5 23:48:03 UTC 2010

I have no idea why mprotect() returns -1 (failure),
and then perror prints following:

mprotect(x,y,PROT_READ | PROT_WRITE | PROT_EXEC): Cannot allocate memory
mprotect(x,y,PROT_READ | PROT_WRITE): Invalid argument

While it looks like Cog VM runs stable at the same time. But it
crashing at crucial point of NB tests,
needless to say, that same tests are running on other platforms and
everything ok.

So, there is something wrong with it. The only question is what :)

While in general, i can run native code, generated by NB, which means
that memory execution is enabled,
something leads to memory access error during GC, in test which
checking if relocated native code will continue to run from
expected point as if it was not relocated.
What is strange with this thing, that i expected to see errors in my
code. But why it crashes in the middle of pow() function,
which is called from initializeMemoryFirstFree()??

Thread 0 Crashed:  Dispatch queue: com.apple.main-thread
0   libSystem.B.dylib             	0x98273176 __kill + 10
1   libSystem.B.dylib             	0x98273168 kill$UNIX2003 + 32
2   libSystem.B.dylib             	0x9830589d raise + 26
3   libSystem.B.dylib             	0x9831b9bc abort + 93
4   com.teleplace.Teleplace       	0x00090f86 error + 86
5   libSystem.B.dylib             	0x9827846b _sigtramp + 43
6   ???                           	0xffffffff 0 + 4294967295
7   com.teleplace.Teleplace       	0x0010d468 initializeMemoryFirstFree + 184
8   com.teleplace.Teleplace       	0x00113381 incCompBody + 1057
9   com.teleplace.Teleplace       	0x001229ec fullGC + 1356
10  ???                           	0x17203026 0 + 387985446
11  com.teleplace.Teleplace       	0x0014fe98 primitiveNativeCall + 216
12  com.teleplace.Teleplace       	0x00132422 executeNewMethod + 130
13  com.teleplace.Teleplace       	0x00133111
primitiveExecuteMethodArgsArray + 497
14  com.teleplace.Teleplace       	0x001365f6 interpret + 1078
15  com.teleplace.Teleplace       	0x0013d94e
enterSmalltalkExecutiveImplementation + 110
16  com.teleplace.Teleplace       	0x0013db81 initStackPagesAndInterpret + 545
17  com.teleplace.Teleplace       	0x00079494 EventLoopEventHandler + 132

The stack frame #11 is a primitive which calls my native code (frame #10)
then the native code deliberately calls fullGC() (frame #9)
and it seems like works, till something bad happen in pow() function,
called by initializeMemoryFirstFree()

Here the code near call to pow() function:

0x0010d43d  <+0141>  shr    %ebx
0x0010d43f  <+0143>  add    $0x1,%eax
0x0010d442  <+0146>  mov    0x182be8,%edi
0x0010d448  <+0152>  add    %ebx,%eax
0x0010d44a  <+0154>  cvtsi2sd %eax,%xmm0
0x0010d44e  <+0158>  movsd  %xmm0,0x8(%esp)
0x0010d454  <+0164>  movl   $0x0,(%esp)
0x0010d45b  <+0171>  movl   $0x40000000,0x4(%esp)
0x0010d463  <+0179>  call   0x163a84 <dyld_stub_pow>
0x0010d468  <+0184>  fstpl  -0x30(%ebp)
0x0010d46b  <+0187>  cvttsd2si -0x30(%ebp),%eax
0x0010d470  <+0192>  add    -0x1c(%ebp),%eax

and here the code where it crashing:

0x98262f56  <+1078>  jmp    0x98262b66 <pow$fenv_access_off+70>
0x98262f5b  <+1083>  movapd %xmm2,%xmm1
0x98262f5f  <+1087>  andpd  0x13e049(%ebx),%xmm1
0x98262f67  <+1095>  movapd %xmm2,%xmm0
0x98262f6b  <+1099>  andpd  0x13e079(%ebx),%xmm0
*** 0x98262f73  <+1107>  movapd %xmm0,-0x78(%ebp)
0x98262f78  <+1112>  movapd %xmm1,%xmm0
0x98262f7c  <+1116>  lea    0x13e069(%ebx),%esi
0x98262f82  <+1122>  addpd  (%esi),%xmm0
0x98262f86  <+1126>  andpd  -0x78(%ebp),%xmm0
0x98262f8b  <+1131>  movapd %xmm0,-0x78(%ebp)
0x98262f90  <+1136>  paddq  0x13cfb9(%ebx),%xmm1

i can only guess, that it either a problem with mprotect(),
or that due to heavy use of MMX/SSE instructions, i miss some
precautions (not saving some registers/processor state) between the
calls in my code.
Any ideas?

Best regards,
Igor Stasenko AKA sig.

More information about the Vm-dev mailing list