2006年6月7日 星期三

Damn Pointer

原本一直以為,bus_dmamem_{alloc,free}有問題,會free 到錯誤的地方。因為在 ichhda_attach() 中 alloc, 在 ichhda_detach 中 free, 重複 kldload/kldunload 兩次總會造成 panic,而且還是在奇怪的地方。剛好 kbdmux 目前又會造成 ddb freeze, 連看都沒得看。所以一直認為是它的問題。

終於提起勁來,用最笨的方法在 bus_dmamem_*() function 中加 printf 印出東西來看個究竟。這一看,就抓到問題了。原來,bus_dmamem_alloc() 因為要接好幾個參數,傳回值又是errno, 所以要到的記憶體,是經由 (void**) 填回來的。也就是宣告來放位址的 pointer variable, 傳進去時要給它的位址:

[here sc->vcorb is of type (void *)...]
if (bus_dmamem_alloc(sc->dmat, (void **)&sc->vcorb,
BUS_DMA_NOWAIT, &sc->mcorb)) {
printf("corb alloc failed!\n");
};

而填回來後,sc->vcorb 就是要到的位址了。
在 free 時,卻自作聰明地寫成這樣:

bus_dmamem_free(sc->dmat, &sc->vcorb, sc->mcorb);

真妖受,竟然犯這種菜鳥才會犯的錯 -_- 。

看來這四年來生鏽的技能還真多,不知道放出去以後腦袋還堪不堪用 -___-

沒有留言:

張貼留言