[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)