我現在遇到的問題在於 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??????
沒有留言:
張貼留言