終於提起勁來,用最笨的方法在 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);
真妖受,竟然犯這種菜鳥才會犯的錯 -_- 。
看來這四年來生鏽的技能還真多,不知道放出去以後腦袋還堪不堪用 -___-
沒有留言:
張貼留言