2010年3月15日 星期一

我現在遇到的問題在於 debug,
我需要知道我是那一步錯了。
將 Makefile.target中的
#LDFLAGS+=-Wl,-shared
改成
LDFLAGS+=-Wl,-T,$(SRC_PATH)/$(ARCH).ld
就可以避免產生 PIE 的檔案。這樣就可以用 gdb 了。

現在遇到的另一個問題是:
要跳回qemu時的位置錯了!
就是我從qemu拿到的是 0x62933f88
可是經由 llvm 產生 call instruction 時的位置卻是0xdb24137。
而且這個值是會變的!

something wrong with "inttoptr" instruction

這是怎麼回事?

0x764, 1
28(Reg)

0x501, 2
28(Reg) 45(Reg)

0x4ff, 2
38(Reg) 5(Imm)

0x4ff, 2
27(Reg) 1(Imm)

0x501, 2
29(Reg) 38(Reg)

0x329, 1
128(Imm)

====================
現在好玩了,我發現 int 的處理是去 call helper_raise_interrupt
而非跳回去。
所以,只要 call 它就好了嗎?

call 了,可是跳不過去…

Question : how to link

可以了,哦耶!
要記得的教訓是:
1、要注意qemu對結束條件的處理,
像 int 0x80,qemu的處理法是呼叫 helper_raise_interrupt( 80, 02 )。
這要用 gdb 看才知道。
2、generated code的處理。LLVM的 CodeEmitter 將code產生在它自己管理的地方,
這部分要再處理一下。如,能否指定 memory 的位置,

目前已經可以產生 switch statement 以及 llvm translation functions header

我還需要麼,
我需要的是:
1、一個 test program。
2、列出它用到的 opcode 及 operands 的值
3、qemu 停止translate 的 opcode 以及 它的處理方式。
4、目前code gen的 overhead是否高?
5、如何確定translation function寫對?

exec.c:910
tb_link_phy_page??????

沒有留言:

張貼留言