Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

use eax instead of edi to call ci->entry #5

Merged
merged 1 commit into from
Mar 22, 2014

Conversation

herumi
Copy link

@herumi herumi commented Mar 22, 2014

Linux(Linux 3.11.0-15-generic mruby#25-Ubuntu SMP, gcc 4.8.1)でビルドすると
bin/mruby benchmark/prime.rb
などがsegmentation faultしていました。
logを追いかけるとmrb->cをediに割り当てるようになってから落ちるようです。
cygwinでは動いていたので違いを見るとcall ci->entryでcygwinではeaxを使っている
のにLinux上ではediを使っていてせっかくediに割り当てた値を壊してしまっているせいのようです。


Linuxで落ちるときのvm.oの逆アセンブルコード

objdump -CSlw -M intel build/host/src/vm.o|less

if (cbase == NULL && ci->used > 0) {
prev_pc = *ppc;
e7b: 8b 2e mov ebp,DWORD PTR [esi]
/home/shigeo/Program/mruby/src/vm.c:910

  //printf("%x %x \n", ci->entry, *ppc);

  asm volatile("mov %0, %%ecx\n\t"
 e7d:   89 c1                   mov    ecx,eax
 e7f:   8b 9c 24 80 03 00 00    mov    ebx,DWORD PTR [esp+0x380]
 e86:   89 d6                   mov    esi,edx
 e88:   8b 7a 08                mov    edi,DWORD PTR [edx+0x8]

/home/shigeo/Program/mruby/src/vm.c:925
"%ebx",
"%esi",
"%edi",
"memory");

  asm volatile("call *%0\n\t"
 e8b:   8b 7c 24 50             mov    edi,DWORD PTR [esp+0x50] ***
 e8f:   ff 57 10                call   DWORD PTR [edi+0x10]     ***


cygwinで動いてるときのコード

  asm volatile("call *%0\n\t"
 e93:   8b 44 24 58             mov    eax,DWORD PTR [esp+0x58]
 e97:   ff 50 10                call   DWORD PTR [eax+0x10]

***でediを経由しているため壊れていました。
試行錯誤したら、

  asm volatile("call *%0\n\t"
       :
       : "g"(ci->entry)
       : "%edx");

の"%edx"を取り除くとcygwinと同様のコード生成をして動くようになりました。
一応この修正をしてもcygwin上でも一応動いてるようです。

インラインアセンブラはよくわからないのでこの修正でよいのか分かりませんが。

@miura1729
Copy link
Owner

Linux 3.2.0-40-generic gcc 4.8.1で試してみると、Cygwinのようなコードが出ました。そういうわけでこちらの環境では再現しないのですが、herumiさんのパッチでLinuxもCygwinもちゃんと動きましたのでマージさせてもらいました。ありがとうございます。

miura1729 added a commit that referenced this pull request Mar 22, 2014
use eax instead of edi to call ci->entry
@miura1729 miura1729 merged commit 696d9ea into miura1729:master Mar 22, 2014
miura1729 pushed a commit that referenced this pull request Dec 24, 2017
Add full support of float templates.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants