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

Re: -current sun4c weirdness



 齊藤masanobuです。

 全然気がついてなかった驚きの事実。しかも sparc の問題とつながった。

 > > Izumi>うちの SS1+ でも 1.5K あたりからそんな具合で困ってます。1.5
 > > Izumi>release の kernel だと起こりません。
 > > 
 > >   なんか、UBC 入ったあとでおかしくなったような気がしてます。
 > 
 > 1.5-release が出るまでしばらく -current から遠ざかっていたので
 > いつ頃からかなのかよくわからないんですが、 UBC か ncr53c9x の
 > tag queuing かそのへんかなあ、というところでした。

これですが、もしかして isp_sbus.c rev. 1.40 からではないでしょうか?
2001/02/28 以降です。

sys/dec/sbus/isp_sbus.c では。

	#if     _MACHINE == sparc64
	#define LMAP_FLAGS      BUS_DMA_NOWAIT|BUS_DMA_COHERENT
	#else
	#define LMAP_FLAGS      BUS_DMA_NOWAIT
	#endif

さて、これは sparc (not sparc64) ではどう処理されるでしょう?
答えは「else part にいく」です。

たぶん mjacob 君は machine/param.h の

	#define _MACHINE        sparc64
	#define MACHINE         "sparc64"

の _MACHINE と比較したかったのでしょう。が、

	#if sparc64 == sparc64

も

	#if sparc == sparc64

も常に真です。なぜなら sparc64 はどこでも定義されてないからです。
たとえば、どんなマシンでもいいので、

	$ /usr/bin/cpp<CR>
	#if foo == bar<CR>
	#error BOMD<CR>
	#endif<CR>
	<EOF>

とかやってみてください、BOMB が出ますね? そういうことです。
但し、この問題は i386 では起きません。なぜなら

	stone: {93} cpp -dM
	#define __NetBSD__ 1
	#define __KPRINTF_ATTRIBUTE__ 1
	#define i386 1
	#define __GNUC__ 1
	stone: {94} uname -m
	i386
	stone: {95} cpp -dM
	#define __NetBSD__ 1
	#define __KPRINTF_ATTRIBUTE__ 1
	#define i386 1		<============ これだーーーーーーー
	#define __GNUC__ 1

だからです。先頭に '_' がついていないものを predefine しない
(名前空間を破壊しない) のが最近の流儀ですから、sparc とか sparc64
が #define sparc 1 とか #define sparc64 1 しないのは正しいです。
今、NetBSD/sparc で試せない状態ですが、これらは定義されていない
はずです。

ということで

	#if     _MACHINE == sparc64

みたいな比較はやめましょう。

…と書きつつ、間違ってたらどうしよう。

----------------------------------------------------------
		SAITOH Masanobu (masanobu@iij.ad.jp
				  msaitoh@netbsd.org)