[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: -current sun4c weirdness



筒井です。

<200104190746.f3J7kUS07875@h053n005.iij.ad.jp>の記事において
masanobu@iij.ad.jpさんは書きました。

> 	sparc は gnu/dist/gcc/config/sparc/netbsd.h が
> 
> 		#define CPP_PREDEFINES "-Dsparc -D__NetBSD__ -D__KPRINTF_ATTRIBUTE__ -Asystem(unix) -Asystem(NetBSD) -Acpu(sparc) -Amachine(sparc)"
> 
> 	なので #define sparc 1 されているはず。

これなんですが、ところがどっこいというやつで sparc/netbsdelf.h だと

---
#define NETBSD_ELF
#include <netbsd.h>

#undef CPP_PREDEFINES
#define CPP_PREDEFINES "\
-D__sparc__ -D__sparc -D__NetBSD__ -D__ELF__ -D__KPRINTF_ATTRIBUTE__ \
-Asystem(unix) -Asystem(NetBSD) -Acpu(sparc) -Amachine(sparc)"
---

になってるので #ifdef sparc だとやっぱりまずいような…。

> しかも、カーネルであれば、${MACHINE}/conf/Makefile.${MACHINE} で
> -D${MACHINE} すれば解決できる。カーネルだからやってもいいし。

むかーし、 #ifdef sun3 とかを #ifdef __sun3__ とかに
直されてしまったことがあって、そのときに

 #ifdef __${MACHINE_ARCH}__ は gcc が predefine してるもので
 CPU specific なものに使い、 #ifdef ${MACHINE} は
 kernel の Makefile で define して port specific なものに使うべき

とか書いたことがあるんですが sparc っていまだに
Makefile では -Dsparc してないんですよねえ。
(昔の) netbsd.h には書いてあったからなんですね。

...

もとの話題の isp_sbus.c ですが、 BUS_DMAMEM_COHERENT を
bus_dmamap_load() に渡すのは API 違反だという話がありました。
結局 sparc64 では IOMMU も cache を持っているという事情があって、
そのような cache を無効にしたい時に COHERENT を指定するのではなくて
有効にしたい時に BUS_DMA_STREAMING を指定する、って方向に
なったはずです。なのでどっちみちこの COHERENT の指定は消しとくべき
なんですが、どうしたもんだか。

#持ってないマシン/デバイスの件を(英語で)やり合うのはしんどくて…
---
Izumi Tsutsui
tsutsui@ceres.dti.ne.jp