NetBSD/news68k への道 |
|
printf() 動作時の感動や
マージのときの満足感にはほど遠い。
ftp.netbsd.org に転送。……でかいな。
/pub/NetBSD/arch/news68k/
あたりに展開。勝手に判断してやってるけどこれでいいんだよな。
htdocs の関連 page に snapshot
の件を追記。んで、えいっと
正式 announce を流す。
announce@netbsd.org って重要?
htdocs まわりもサクッと作ってがしがし commit。
残りは誰かやってくれるの期待。
announce@netbsd.org に案内流してね」
mail が届く。ま、 snapshot できた後でいいよな。
stand/common/romcalls.S 中にバグ発見。
m68k assembler 知らないのがバレバレですな。
htdocs/Ports/news68k/index.html
とか先に書いとこうかな……。
CL* まわりだけ修正。
各 m68k arch の vmparam.h に CLSIZE
が残ってるけど……。
installboot を忘れたりしたが適当に
netboot して復旧したりで無事完了。
CL* 定義削除が終わったあたりで先に update するか。
_o_
;-p
"Enable Internal Inst/Data Cache
(with burst)" なんて出てくるではないか。
"(with burst)" は出てこない。
sysinst の動作を確認してみる。
installboot を /dev/rsd?a
に対して行うと boot00 を書く時
Read only filesystem だと怒られる。
/dev/rsd?c に対してだと OK なんだけどなにがいけないんだろ。
LABELSECTOR だからか?
*.tgz
の展開に一つでも失敗していると途中で作業をやめてしまうこと。
sysinst/util.c の
msg_display(failure_msg) が結構わかりにくい。
kern, base, etc
の展開に成功してれば次に進んでもいいような気がする。どうでしょ。
consinit() で #if NFB > 0
でなければ強制的にシリアルコンソールにすべきかな。直しとこ。
make の変数に MKOBJDIR
というのが追加されたらしい。
make obj
してる身としては便利になるのかな。どうなんだろ。
% ls -Flag total 15 drwxr-xr-x 3 tsutsui wheel 512 Nov 20 22:37 ./ drwxr-xr-x 35 tsutsui wheel 1024 Sep 12 04:31 ../ drwxr-xr-x 2 tsutsui wheel 512 Sep 12 04:31 CVS/ -rw-r--r-- 1 tsutsui wheel 142 Sep 12 00:29 Makefile -rw-r--r-- 1 tsutsui wheel 3982 Sep 12 00:29 cat.1 -rw-r--r-- 1 tsutsui wheel 6345 Sep 12 00:29 cat.c lrwxr-xr-x 1 root wheel 22 Nov 20 11:36 obj.alpha@ -> /usr/obj.alpha/bin/cat lrwxr-xr-x 1 root wheel 22 Nov 20 09:53 obj.arm32@ -> /usr/obj.arm32/bin/cat lrwxr-xr-x 1 root wheel 21 Nov 20 11:26 obj.i386@ -> /usr/obj.i386/bin/cat lrwxr-xr-x 1 root wheel 23 Nov 20 11:25 obj.macppc@ -> /usr/obj.macppc/bin/cat lrwxr-xr-x 1 tsutsui wheel 24 Nov 20 22:37 obj.news68k@ -> /usr/obj.news68k/bin/cat lrwxr-xr-x 1 root wheel 25 Nov 20 21:54 obj.newsmips@ -> /usr/obj.newsmips/bin/cat lrwxr-xr-x 1 root wheel 22 Nov 20 21:52 obj.sparc@ -> /usr/obj.sparc/bin/cat lrwxr-xr-x 1 root wheel 21 Nov 20 11:42 obj.sun3@ -> /usr/obj.sun3/bin/cat %
OBJMACHINE, USR_OBJMACHINE とも yes
設定。
ftp.jp.netbsd.org
の中身が一部おかしかったのが直ってる。
tlp がうまく動かないし、そろそろまた
update するかな。
"making man.tgz"
実行中。なのでもうすぐかな。
Makefile
は全然いじってないのに、そういうものなのね。感心感心。
fd.c と fb まわりか。
wscons の作りもちゃんと調べないと……
UPDATE=yes
設定なので 3日はかからないかな。
"panic: bad dir" で死亡。
"sd0(esp0:0:0): cannot allocate scsipi xs"
が根源みたいだけど、 memory pool まわりが変なのか?
/sys/news/adrsmap.h に書いてあったりしませんか?
/sys/newshbdev/*.h
にもありましたが apbus だとどうなんでしょ。
/sys/{newsapbus,newsaps}
か。うーん、そのものずばりはないのか。
hp300/locore.s には
"do not ask me, this is how hpux does it" ってあったり。
sun3/dev/fd.c には
"This code was reverse engineered from the SPARC
bsd_fdintr.s" とか。
cross-mipseb
パッチちゃんと動いてますか。よかったよかった。
gnu/usr.bin/egcs にも mipseb
対応はまだ入ってなかったりします。
sysinst 動かしてみたり。
disklabel
書く手前までは一応動いてるみたいだけど binary
ないからこれ以上確認できんな。
fd.c
も少しだけ書き始めるが、いいかげんいじるのめんどくさくなっで途中でやめ。
cross-mipseb-netbsd のパッチも試してみて欲しいですー。
;-)
zs.c は software interrupt
使ってないんですねえ、とか。
zs_init_reg[2] って 0 でいいんでしょうか。
4.4BSD/news3400 の scc.c だとなんか書いてるような……。
pcc みたいなもんかな。
news68k_init() で初期化。
IIOV() で address 指定するようにする。
tt0
は使わないようにしたほうがいいんだろうな。
macppc/dev/ofb.c まわりをいじってみる。
macppc/dev/ofb.c と
macppc/pci/ofb_pci.c に分割。
ofb_pci
なマシンがないからちゃんとできてるのかどうかわからんな。
macppc/dev/ofb_mainbus.c
とか書いてみる。
freme-buffer-adr . しても
0 とかぬかすし。わからん。やめ。
news68k/dev/si.c から。
bus_space(9) 導入する気力はやはり出ないので
sun3/dev/si.c の真似して struct dma_regs
とか定義する。
struct si_softc の中に
"volatile struct dma_regs *sc_regs;"
の member 追加。
si_attach() で
"sc->sc_regs =(void *)DMAC_BASE;" とかして
DMAC の address 設定。
si_dma_start() 等の DMAC access は
"dmac->ctl = DC_CTL_RST;" とかに置き換え。
news68k/dev/clock_hb.c も書き換え。
news68k/dev/zs.c の zs_cn{get,put}c()
も即値やめて zs_conschan を zscninit()
で set するようにする。
news68k/news68k/machdep.c
の中にもいくつか即値 address 指定残ってるけど。
fdc かな、ということでいろいろながめてみる。
x68k/dev/fd.c は NEC uPD72065 で DMA 使用。
sun3/dev/fd.c は INTEL i82072 で pseudo-DMA 使用。
news68k/dev/fd.c も書けるか?
"pseudo DMA port" ってので DATA やりとりするのか?
"panic: lockmgr: no context" とか言ってるが、原因が
MI なのか MD なのかよくわからん……。
intr.h まわりをちょっと見直し。
m68k/include/psl.h を見たら
"#define splraise4 splraise(PSL_S|PSL_IPL4)"
とか定義してある。うが。
splraise?()
使ってないのは単に ipl が固定じゃないからなのね。
splx() を
"#define splx(s) _spl(s)" に直したり。
spl*() の定義が
intr.h や param.h や
psl.h だったりするのはなんとかならんのか。
x68k/dev/zs.c:zshard() の splhigh()
ってどれくらい意味があるのかしら。
news68k/dev/zs.c の zssoftpending は
alloc_sir()
使うならいらないような気がするなあ。取っちゃえ。
zssoft() の中で spltty()
してるけどこれだと splraise5() だから
softint の意味があるのかないのか……
si.c の DMAC の address 指定も書き直したいなあ。
bus_space(9)
は大変だから si_softc にアドレス member 追加するか。
dmac を別に
attach したほうがいいのか?
/sys/uvm/uvm_swap.c:swap_on() を見ると、先頭
PAGE_SIZE 分だけ使わないようになってますね。
machine/disklabel.h になにか定義追加が必要か。
www.netbsd.org
の index ページスタイルが変更されたようだ。
sun3/stand/netboot の下。んー?
port-sun3/8471 ではダメなのか?
inet_addr.c とか
intoa.c とかなんで /sys/lib/libsa/
以下に残ってるんだ?
ftp.netbsd.org では消えているが
ftp.jp.netbsd.org では残ってる。
distrib/sets/lists
に news68k 用記述書いてみたり。
distrib/utils/sysinst もながめる。
特に news68k specific なとこはないのかな。
sun3/include/psl.h とか見ると
news68k/include/intr.h ももう少し直した方がいいような。
zs は ipl 5 なんだけど、その場合 spltty()
も ipl 5 にすべきなの? kb, ms も ipl 5 なんだけど。
spltty() と splserial() ってどう違うの?
そもそも splserial() って MI で使われてるの?
spl(9) の man 見てもいまいちよくわからん。
news68k_calbrate_delay() って書いた方がいいのかしら。
sun3/sun3/locore2.c とか見ると
VAC の sun3/260 も clock で決めうちしてるみたいなんだよな。
COMPAT_NEWSOS はいまだに emulation
の構造がよくわかってなかったりする。
newsos/syscalls.master
はあるけどほとんどそれだけ。
ssir が char なのに
NSIR が 32 だったり zs_sir が
u_long だったり。
ssir
を machdep.c 内で u_long で宣言しておく。
NSIR のほうはなんとなく sizeof(sir) * 8
とする。 softint って他にはどれくらい使うのかな。
ftp.jp.netbsd.org の更新途中に sup
してしまったのかなんか source tree の中身が変。
RTM_IFINFO まわりだけ手で更新する。
options SOFTDEP
含めて各マシンとも問題なさそう。
pmap.c で引っかかったので
port-sun3/8830 として報告。
pmap_enter()
と trace trap まわり修正のみ。約10分で完了。
tunefs(8)
してないので SOFTDEP の効用はよくわからず。
allocate_sir() を呼ぶ。
ssir
にセットすることで、実際に処理が行われる。
setsoftnet() と
setsoftclock() が登録されており、 sir_init()
で初期化されている。
zs.c で setsoftserial()
相当を使うため後から登録している。
ssir は
locore.s の trap0(), rei(), spl0()
でチェックされる。
trap0() は syscall。 rei()
は各種割り込みから return する時に呼ばれる。
spl0() は全割り込み許可。
T_SSIR trap 起こして処理をしてる。
sun3/sun3/intreg.c 内の関数で処理している。
soft1intr() で処理内容は固定されていて
netintr() と softclock() を処理する。
sun3/dev/zs.c
の zsattach() 参照。
isrdispatch_autovec() 使うと netintr()
と softclock() とが無条件で呼ばれてしまう。
allocate_sir() で行う。
ssir の bit をセットした上で
CTRL_INT2 をたたいて level 2 割り込みを発生させる。
lev2intr() のハンドラでは ssir
を見て各処理に dispatch する。
locore.s 中の sir チェック部分をすべて削除。
spl0() は intr.h で _spl0() に
define する。
machdep.c に lev2intr()
を書いて、現状 trap.c にある dispatcher をそのまま移す。
T_SSIR 部分は削除。
allocate_sir() と init_sir() だけ
trap.c に残るのも変なので machdep.c に移す。
vector.s の level 2 interrupt のところに
lev2intr() を登録。ざっとこんなもんか?
machdep.c に詰め込むより、割り込み関連で別の file
作ったほうがいいような気もするけどどうだろ。
"panic: m_copydata"
で落ちた。これは /sys/kern/uipc_mbuf.c の中。
splsoft*() が
splraise1() のまま。ということで直す。
libc
まわりも全部作り直さないといけないし、表のページ更新は今晩だな……。
si.c の
cache flush のせいかは未確認。
si_dma_stop() の PCIA()
をはずして動かしてみる。
Illegal instruction でぼこぼこ落ちる。
PCIA() で L1 data cache を
flush してるのはなんか変な気がする。
DC_CLEAR
のコードはずして試してみる。……。特に問題なさそうだけど、どうなんだろ。
/sys/conf/osrelease.sh だけ今日の CVS update
に間に合ってないし。おいおい。
osrelease.sh
だけ手で直して気にせず作業続けるか……。
pmap_enter() の変更は特に大したことなさそう。
SOFTDEP も config まわりだけだし、問題ないな。
softintr
まわり書き直ししよ。性能的にどう変わるのかよくわかんないけど。
www.netbsd.org にいつの間にか
suggested port なんて項目が作られてる。
;-p
le0 の表示が変だぞ。と思ったら
current ではもう直ってるらしい。
ifconfig すると
IPv6 の address も勝手に付けてくれるのか。
options INET6
つけてがしがし kernel 作り直す。
ping6 したり tcp6 な telnet
したり。うーん、あまりにもあっさりと動くな。
GENERIC.v6 な kernel
作ったりして表のページ更新。
10268.985u 1363.217s 3:19:23.42 97.2% 0+0k 3472+7162io 1572pf+0w
PG_CI
な kernel 上で kernel make 仕掛けて出社。
14593.759u 1653.266s 4:37:04.98 97.7% 0+0k 3506+7296io 1577pf+0w
DC_BE, IC_BE はずすことで L2 cache
なしマシンでは性能に影響あるのかしら。
251.227u 58.573s 6:45.62 76.3% 0+0k 1138+4521io 1680pf+0w
1024.638u 239.307s 22:09.63 95.0% 0+0k 6628+7849io 2705pf+0w
vr0
絶不調のため挫折。
pmap.c
に手を入れてみたり。
copyseg() と clearseg() はなんとなく
pmap_copy_page() と pmap_zero_page()
とおんなじ感じ。
PG_CI マークしてみる。……が、特に変わらず。
si.c の si_dma_stop()
に cache flush のコード入れるが変化なし。
CACHE_HAVE_VAC
定義しても変わんなかったので、今回これだけで直るはずはないんだけど。
copyseg() の中にはほかに %cacr の
DC_BE をクリアしてるところがある。
DC_BE は burst transfer
を制御するものらしいが、どの辺まで影響するんかいな。
CACHE_CLR とかは m68k/include/cpu.h
で定義されてるが、これって実は MD にあるべきなのかしらん。
news68k/include/cpu.h で一度 #undef して、
DC_BE はずして define しなおす。
IC_BE もはずしてみる。でい。
login:
まで出てきたよ。
Microseconds for one run through Dhrystone: 127.6 Dhrystones per Second: 7837.0
PG_CI のときより速くなってるよ。
しかもなぜか前試したときよりも速いし。
10289.845u 1354.085s 3:20:01.12 97.0% 0+0k 3477+7111io 1590pf+0w
pmap_zero_page() と
pmap_copy_page() で PG_CI
つけるようにしたせいか。
pmap.c
を元に戻して再度挑戦。といっても結果出るのあしたの朝だなこりゃ。寝よ。
%cacr 関連を探る。
copyseg() と clearseg()
が謎な感じ。
CMAP1 と CMAP2 って PTE
のどこか特定の場所か? あ、 CADDR1 と CADDR2
の VA を指してる PTE か。
PG_CI で map してそこに copy やら zero clear
やらしてるけどなんなんだ。
arch/m68k/m68k/copypage.s にある
copypage() と zeropage()
とがこれに対応してるのか?
copyseg() を呼ぶのは vmdup() だけか。
clearseg() は mclear() と
page_clear() と startup() から呼ばれてる。
PG_CI
しないといけない場合があるってことか。
libkern 使わず libsa
だけで済ませよう計画中止らしい。
news68k/stand/ 以下をちょこっと修正。まず
boot の BSS clear を stand/boot/locore.S
に移す。
"objcopy -O elf32-m68k" で ELF な kernel を作って boot
するか試してみる。
LOAD_HDR を off にしてるせいで
ELF だと symbol table のアドレスがちゃんと設定されない。
entry よりも前に
header を読もうとするので entry が 0 の時おかしくなるから。
aout_exec()
でアドレスチェックをするべきという気もするなあ。どうなんだろ。
d5
で判別するコードを書いてみる。
/boot
の中で "netbsd" に置き換えているのでうまくいかん。むぅ。
IDROM
のアドレス決め打ちしてチェックした方がいいのかしら。
pmap_enter() API change"
なんてメールが。ガビーン。一気に萎える。
libkern 使わず libsa
だけで済ませよう計画進行中らしい。
libsa から libkern
に移った関数があるのに、方針変更なのか?
libkern
をどれくらい参照してるのか把握してないけど。
tlp driver の 21143 support も入ったことだし、早いとこ
current 最新化しないといけないな。
start じゃなくて _start
なのか。
asm.h
の中に入れちゃいたい気がしますけど、どうでしょ。
vmunix を逆アセンブル。
mach_init()
でなんかよくわかんないことしてるな。
le
のメモリの初期化か。
locore.o の中なのか? それとも
boot loader の中なのか?
mbuf(9) とか DMA
前の memory copy の影響ってどんなもんなのか気になってたんですよ。
options CACHE_INHIBIT はずすと
L2 cache 無マシンで 20%弱速くなるらしい。
si.c では DMA 後の cache flush
をしてなかったりする(ぉぃ)がなぜか動いているらしい。
locore.s で EC_PHYS と
EC_NONE の判定して区別した方がよさそうなんだけど……。
;-p
GENERIC の件ですが、 UMAPFS
はほとんどの arch でついてたりするんですよねえ。
CODA はそもそも記述がないのがあったり。適当に他の
arch の真似で済ますか?
COMPAT_NEWSOS は Wish List から TODO
に移してもいいかなあ。できるかどうかは別として。
/boot の件のほうは BSS clear は必須なので結局
symbol 参照問題は残るのです。
news68k/stand/boot/locore.S
中で _C_LABEL() 使って clear のコード書けばいいのか。
*.S の中。うーむ、調査が甘いな。
intrcnt を参照するのは
vmstat だけなんでしょうか。
vmstat -i する。と、なぜか
lev4 と lev5 しか出ない。
clock はどうなってるんだ?
clock_hb.c みたら intrcnt
更新忘れてる。あれ?
intrcnt その他の locore.s
内関数および変数を cpu.h で宣言するようにする。
vmstat -i してみると arm32 は
softintr もカウントしてたりで結構いいかげん。
zs だけ vectored
でそれ以外は interrupt register で判別するので悩ましいところですが。
GENERIC ですが、 COMPAT_SVR4 とか
COMPAT_SUNOS とか UMAPFS とか
CODA とか ISO とかいれるべきでしょうか?
options GATEWAY は GENERIC
で有効にすべきか否か?
boot の BSS
なんですが、やっぱり bootxx でも struct exec
解釈すべき?
isa で IST_LEVEL
がまずいってことは特にないんじゃないでしょうか。
arch/i386/isa/isa_machdep.c
には IST_LEVEL が書いてあるそうですし。
sys/dev/isa/wdc_isa.c だと IST_EDGE
固定なんですね。むむむ。
IST_EDGE
でないと動かないか試すとか。
GENERIC.v6 コンパイルしてたら typo 発覚。
NET が無条件に Net
に変換されてしまうらしい。
GENERIC な kernel
を作って表のページからリンク作成。
raid とか有効にしてみたり。
GENERIC にはどこまで機能つっこむべきなんだろ。
GENERIC.v6 も作らないといけないか?
% つける変更だけしておく。
gas.new じゃない古いほうの gas もすでに
thorpej 氏が変更して対応してるのでこれだけ持ってくる。
hp300/locore.s
で crp に % 付いてないのは見落とし?
news68k/stand/ 以下もいくつか書き換え。
ENTRY_NOPROFILE() とか使うようにすべきか?
edata と end
の symbol はどう参照すべき? それよりも bootxx の中で
bzero すべき?
intio の導入後は vector 割り込みはすべて
intiotrap() に行くからそこで count
できるんじゃないかなと。
/usr/src で
make && make install 完走しました。くらい?
etc.news68k
とかがいるけど、その前に 1.4M にしたほうがいいよなあ。
intrcnt
が level 別じゃなくて vector 別になってるとことか。
locore.s に "Prepare to enable MMU"
の hp300 用 comment が残ってるとこかな。
pmap_bootstrap.c の lkptpa って hp300
以外で必要?
si_softc
の中に入れちゃうべき?
bus_space(9)
用意すると幸せになれるでしょうか?
le も zs
も ncr5380sbc も bus_space(9)
不要なんだけど、他に使いそうなデバイスってあったっけ?
/usr/src/etc.news68k とか distrib/sets/lists
の md 分とかもそろそろ作らないといけないな。
si.c の WAIT 取ったのと
INSTALL の config と intr.h 直しただけ。
kern/subr_pool.c の
pr_enter() の中。
options DIAGNOSTIC
のときだけ定義されるので、そもそも想定外の動きをしていることになる。
pr_enter() したあと pr_leave()
せずに再び pr_enter() が呼ばれてる。
dev/scsipi/scsipi_base.c の
scsipi_get_xs() で pool_get()
するときはあらかじめ splbio() にしてる。
pool_get() の最中に
SCSI の lev4intr() がかかってる。そりゃいかんわ。
news68k/include/intr.h
確認。ぐは、 "#define splbio()
_splraise(PSL_S|PSL_IPL3)" になってる。
PSL_IPL4 に直す。
spltty() とか splimp()
とかもいくつにすればいいのかよくわかんないが 4 のままにしておく。
subr_pool.c の DIAGNOSTIC
のコードをきっちり書いた pk 氏と thorpej 氏に感謝! ですね。
dev/scsipi/scsipi_debug.h を見ると
SCSIDEBUG を活用するには
sc_link.flags を設定すればよいらしい。
si.c で ncr_sc->sc_link.flags
にいろいろ設定して load test 仕掛けておいた。
make snapshot というのも仕込んでおいたんだけど、
distrib/sun3/ramdisk で
"make: don't know how to make depend"
だと。なんだよそりゃ。
sun3/dev/si.c の真似して flags で
option の数字を渡して DMA, disconnect
等切替えられるようにする。
INSTALL kernel の config では
DMA 使わないようにしておく。
news68/conf 以下のその他のファイルも
cosmetic 修正。
news68k/stand/
以下の修正をもう一度見直す。
machine ->
${S}/arch/${MACHINE}/include の symlink は
i386 の真似をすればいいようなので調べる。
CPPFLAGS に -nostdinc 足したり、
Makefile.inc を .include する順番変えたり。
1Mbytes/sec とか出るのか。
このへんとか
このへんとか感動がよく伝わってきていい感じ。
"opms at pckbc?"
を使えるようにするパッチも不要か。いつごろ merge されるんだろ。
opms を使ってた i386 も
wsmouse 使うように直す。
pmsi0 at pckbc0
で認識されて動いた。でもスクロールボタンって意味なしなのかしら。
;-)
"hoge* at isa?"
を使用可能に、というのは別に構わないのです。
arch/i386/Cbus/ の中身を見てみる。
arch/arm32/podulebus/ みたいなのを想像してたんだけど……。
bus_dma(9) みたいに MI
な仕様を考えるのは大変だけど、きっと自分自身のためにもなるはず。
sd1 → sd0
へのファイル移動を試みる。
fsck -p
ですぐ直るレベル。なので low level の転送はちゃんとされてるんだよなあ。
"panic: pr_enter" か tsleep()
で割り込み待ちかのどちらか。
si.c でウェイト入れたり splhigh()
入れたりするが特に変わらず。
news68k/machdep.c の dumpsys() や
cpu_dump() は特に問題なさそう。というか他の
m68k とまったく同じ。
cpu_dump() から conf.c, conf.h と追って
dev/scsipi/sd.c の sddump() にたどり着く。
-Wuninitialized
で引っかかりそうなコードが……。
reboot -d
してみる。
si_minphys() でやたらと文句を言われる。
xx_minphys() で bp->b_bcount
を clip したからって printf すべきなのか?
kern/kern_physio.c:minphys() 見たら
MAXPHYS で clip してる。
minphys() だけ使うようにする。
"si0: 8697 extra bytes from 0:0" なんてのが出た。
"read error at byte 0, reading 391426139498496 bytes"
とか言ってるし。どっか間違えてるか?
spl0() は
config_rootfound() の後です。
umass の関係なんですかね。
intrhand_lev4() で si_intr() を
leintr() より前で呼ぶようにしたり。
checking for core dump...
pool scxspl: reentrancy at file ../../../../dev/scsipi/scsipi_base.c line 161
previous entry at file ../../../../dev/scsipi/scsipi_base.c line 118
panic: pr_enter
Stopped in syslogd at _cpu_Debugger+0x6: unlk a6
db> trace
_cpu_Debugger(2b5000,aded9,2b5078,2b5078,789c64) + 6
_panic(1e846,1e819,aded9,76,1e7f0) + 52
__pool_put(e494c,2b5078,aded9,a1) + 4e
_scsipi_free_xs(2b5078,1) + 60
_scsipi_done(2b5078,b99f8,2b48f2,7,2b4800) + 17e
_ncr5380_done(2b4800) + 158
_ncr5380_actions(?)
_ncr5380_machine(2b4800,80,2b5fd8,789d0c,b9290) + 122
_ncr5380_intr(2b4800,789d1c,a5dbc,0,76) + 36
_si_intr(0) + 1a
_intrhand_lev4(0,0,2b5fe0,1,23000001) + 1e
_lev4intr(?)
__pool_get(e494c,0,aded9,76) + 4
_scsipi_get_xs(2a9880,1009) + f0
_scsi_scsipi_cmd(2a9880,789e0c,6,2c60000,2000,4,ea60,6b6f8c,1009) + 4c
_sdstart(2ae800,2ae8b4,6b6f8c) + 1fe
_sdstrategy(6b6f8c,789e84,8ad76,789ea4,80) + 146
_spec_strategy(789ea4,80,6b6f8c,774274,4) + 24
_ufs_strategy(789ea4) + d6
_bwrite(6b6f8c,789ecc,33068,789ec4,c615c) + f2
_vn_bwrite(789ec4,c615c,6b6f8c,789ee8,37a5a) + c
_bawrite(6b6f8c) + 38
_vflushbuf(774274,1) + 84
_genfs_fsync(789f30) + 18
_sys_fsync(6c0780,789f88,789f80) + 86
_syscall(5f) + 114
_trap0() + e
db>
sd0 に NetBSD 入れ直すか。
# dd if=/dev/rsd0a of=/dev/null bs=64k 248+1 records in 248+1 records out 16265216 bytes transferred in 16 secs (1016576 bytes/sec) # uname -m news68k # uname -v NetBSD 1.4L (LIBERO) #557: Thu Oct 28 22:32:31 JST 1999 [...以下略...]
si_intr()
で sc->sc_state の NCR_DOINGDMA
が立ってない。
si_dma_stop()
が呼ばれずそのあとでずっと待ってるらしい。
si_dma_start() の最後では
NCR_DOINGDMA 立ててるつもりなので
printf() 足して確認する。
"Enter pathname of shell or RETURN for sh:"
まで出てくる。おいおいどうなってんだ。
fsck -pn してみる。……。 seek
音が「こんこんこん」ではなくちゃんと「カリカリカリ」な感じ。まじ?
/sys/arch/pc98/Cbus ってすでにあるんですか。
ne2000_isa.c
に対する発言ってどういう意味だったんだろう……。
"hoge0 at cbus0 port ..." みたいになったんでしょうか? 謎。
wscons は入ってるけど。
scsi_1180.o をながめるが、引数を調べようにも
pointer 使いまくりらしくてわけがわからん。
newsmips/dev/scsi_1185.c を見てみる。
#if defined(mips) の記述があるってことは
source が news1200 と共有されてた可能性がある。
sc_dio() あたりを見ながら、
#if defined(mc68030) で書いてあったであろう部分を想像する。
DMAC_MAPENT に書き込む値って physical address
じゃなくてページ番号なのか?
sc_dio() では Scatter/Gather
してないように見えるけど、上位の SCSI ドライバの関係?
DMAC_MAPENT に書き込む値を
"kvtop(addr) >> PGSHIFT" にして試す。
MIN_DMA_LEN=1
にして probe にも DMA 使うようにする。
[...前略...] sched: select for t/l=0x00 select: have AIP after 0 uSec. sched: select rv=0 sched: dma_alloc, len=44 si_dma_alloc dh_addr=0xdc248, dh_len=0x2c sched: dma_setup, dh=0x2b6c1e [...略...] machine: phase=DATA_IN data_xfer: dma_start, dh=0x2b6c1e si_dma_start: reset si_dma_start: set length = 2c si_dma_start: set offset = 248 si_dma_start: mapent[0] = dc000 si_dma_start: terminate tag si_dma_start: set tcmd si_dma_start: set icmd si_dma_start: set sci_mode si_dma_start: set DMAC_CTL si_dma_start: set sci_irecv si_dma_start: input done. si_intr: intr: top, state=1 intr: call machine, cur=0x2b68f2 machine: phase=STATUS machine: phase=MSG_IN msg_in: CMDCOMPLETE [...略...] machine: wait for DMA intr. sched: machine done, cur=0x0 scsipi_cmd: sched done, cur=0x0 scsipi_inqmatch: 19/0/0 <HITACHI, DK515C, CP16> scsipi_inqmatch: 2/0/0 <, , > sd0 at scsibus0 targ 0 lun 0: <HITACHI, DK515C, CP16> SCSI1 0/direct fixed scsipi_cmd: new sr=0x2b68f2 [...停止...]
tsleep()
で止まってる。
/sys/arch/m68k に修正入ってるしー。
cdrecord で試行錯誤。なんとか x6
でもちゃんと書けてるみたい。
tetris(6) High Score
おめでとうございます。パチパチパチ。
/sys/dev/cbus より
/sys/arch/pc98/cbus じゃない? というお告げも来てます。
amd(4) の CAM
対応も入ったって話だから、気が向いたらちょっと見てみよう。
;-)
COMPAT_LINUX は powerpc な方におまかせします……。
vax/vsa/ncr.c をベースにしていつものように切り貼り。
si_dma_start() と si_dma_stop()
とで bounce buffer 転送してるのね。
si_dma_start()
をがしがし書く。仮想→物理アドレス変換って kvtop() だっけ。
si_dma_stop() はテキトー。
DMA_MIN_LEN は 128 にして attach
くらいは PIO でするようにしておく。
"sd1: no disk label" で
"cannot mount root, error = 79" だそうだ。
le0 を root にして single user 起動。
disklabel sd1 してみる。一応動く。が、全然読めてない感じ。
dd if=/dev/rsd1c してみる。いきなり死亡。タイマ
LED も点滅しないから割り込みもろとも死んでる。
printf()
を入れてみる。最初から入れとけという声が上がりそうだけど……。
DMAC_CTL の DC_CTL_ENB たたいて
DMA 始めた瞬間固まったり。
si_intr() の後 tsleep()
しっぱなしだったり。この場合はタイマは生きてる。
19700101
になったりした。変なアドレスに転送されてるのか?
COMPAT_LINUX の件は、
MKLinux の netscape が動くようになると結構幸せかも。
/sys/dev/cbus を作って isa と frontend
を分離するとか行われてるんでしょうか。
dhrystone を動かしてみる。
Microseconds for one run through Dhrystone: 141.7 Dhrystones per Second: 7057.2
ncr.c にも DMA support が入ったようだ。
si_dma_setup() は何もしないで
si_dma_start() だけで DMAC の設定してるな。
struct si_dma_handle って DMA
の場合は必ず用意しないといけないのかしら。
#991021 から問い合わせ。 (なのか?)
locore.h や
mips_machdep.c で切替えてるのはあんまり関係なさそうだなあ。
mips1_ForceCacheUpdate
ってどこにもないぞと思ったら
MachForceCacheUpdate が使われてないだけらしい。
mips/trap.c の trap()
の中でそれっぽいの発見。
MachTLBUpdate() の呼び方が MIPS1
のみのときだと違うようです。
trap.c 中の
#define TRAPTYPE() は CPUISMIPS3
使ってないけどいいのかな。
0xc0000000 に load したり
PG_CI はずした kernel をいろいろ試したり。
mountroot()
まで行ったけど、あとは copyright の後で止まってしまう。
panic() すらしない。条件わからんなあ。
COMPAT_LINUX とかどうです?
[thorpej-scsipi] な branch 作成らしい。
mdsetimage(8)
で落ちる件だが、options MIPS3
をつけると TLB が従来の動作に戻るということなので試す。
newsmips/dev/fb_sub.c の
MachFlushDCache() の prototype 宣言で怒られる。
mips/include/locore.h 内で define
されてるので prototype 宣言削除。
mdsetimage
してみる。……動く。というわけで TLB の変更のどこかが変らしい。
MIPS3 だけみたい。
TX39xx のコードはまだテスト中なのか。
news68k/stand/ 以下その他の修正。
news68k/include/Makefile の INCS
から loadfile_machdep.h, romcall.h 等を削除。
machine -> ${S}/arch/news68k/include 等の symlink
作成 rule を Makefile に追加。
.BEGIN:
で記述すると make obj するとき困る。
${LIBS} や ${PROG}
作成時に作るようにすると、先に make depend
するとき作成されない。
make includes 時に symlink
作るってのが一番まっとうなのかなあ。
m68k-netbsdelf 影ながら応援してますから……。
fvdl-softdep なんて branch ができたようだ。
arch/powerc 以下の WARNS'fy は
結構(かなり?)めんどくさい模様です。
${MACHINE}/stand 以下の make では installed header
を参照してはいけない って話とか。
loadfile_machdep.h を install しちゃいけないってことは
stand/ 以下の各ディレクトリでは必ず
machine -> ${S}/arch/${MACHINE}/include の symlink 必要?
sparc/stand/Makefile.buildboot みたいに
".BEGIN:" の target で symlink 作られると最初に
make obj するときに CURDIR
に作られちゃうから困る、ってのを
send-pr したいけど、どう英語で説明したもんだか……。
[見事に投げ返されました]
;-p
INSTALL.TXT
を見ると一応サポートリストに入っています。
oldconfig
を知らない人なので、あれが普通だと思ってたり。
CWARNSFLAGS は -Wall
その他すべてつけた上で -Werror はずしてます。
locore.s と machdep.c を直して
cpu_reboot() に RB_POWERDOWN
の support を入れてみる。
RB_POWERDOWN, RB_HALT, RB_AUTOBOOT とも OK。よし、寝よ。
Debugger()
まわりでエラーになっていたので
send-pr する。
GENERIC を compile すると
MI SCSI 変更まわりで別のエラーが出た。
/etc
以下のファイルも新しくする。
rc.conf を rcsmerge
でごぞごぞするほかは特にこれといった作業はなし。特に問題なく起動。
dhclient(8) も netstart
中で起動されるようになったのね。
sysconfd(8)
が起動してないとかでいろいろ怒られるのは相変わらずだけど。
ddb_init() が呼ばれてないのに気づく。
consinit()
で ddb_init() 呼ぶように修正。
trace
して確認。ちゃんと symbol 出てるな。よしよし。
newsmips/stand/boot/boot.c
では symbol 情報渡してないけど、まだ書いてないだけなのかしら。
newsmips/stand 以下で make obj
してるとうまくいかないというもの。
objdir が /usr/obj
へのシンボリックリンクの場合しかうまく動かない。
sun3/stand とか gnu/usr.bin/binutils
とか参考にしてファイルの構成を直す。
news68k/stand/common を作ってそこで
libsa, libz, libkern を作るようにする。
bootxx, boot のそれぞれで使う
putchar() と romcalls.S も
stand/common 以下に移動。
bsd.obj.mk の print-objdir
のターゲットを使ってリンク時の lib*.a の PATH
を指定してやる。
objdir あるなし等いくつかの状態でテスト。うん、問題ないな。
sun3/stand/netboot がうまく make
できない問題もすぐ直せるのが判明。
ncr5380sbc.c の変更だけ。
sb_isapnp.c で Error。
MPU まわりの変更のせいか?
"midi* at sb?" があるのに
"mpu* at sb?" がないのが原因か?
sb_isapnp.c の 135行目の
"#if NMIDI" は "#if NMPU"
であるべきなような気がしないでもない。
pcscp(4)
その他もみな同じ。
bus_dmamap_load(9) で
bounce buffer 操作も含めて仮想アドレスが dm_segs[]
の物理アドレスの複数セグメントに変換されるので楽。そのぶん
bus_dma(9) の実装は大変ですけど。
bus_dmamem_alloc(9) で DMA safe なメモリを確保して
bus_dmamem_map(9) で kernel 空間に map しておく。
bus_dmamap_sync(9) して
bounce buffer の転送や cache の invalidate 等を行う、と。
#if BYTE_ORDER やむなし?
pcscp(4)
書いてたときはこれらを理解するのに 1か月もかかっちゃいました。
bus_dma(9) には説明あるんですが、当時はまだ
VM と Scatter/Gather の関係がよくわかってなくて。
mbuf(9)
とかがよくわかってないのでいまだに不明。
;-p
make cleandir なんでしょうか。
sendmail.cf の設定は
某ページ
に書いてますが、今見たら思いっきり古いままだな。いかん。
loadfile() はなかったような……。
<a id="1999xxxx"> に href=
を足すくらいならすぐできるかな、ということで sed で変換してみる。
name タグつけません?
;-p send-pr します。
mipseb の使用レポートも来ないしー。
pcscp(4)
のときも動き始めるまでに半年、その後もかなりディスクの中身飛ばしたし。
tetris(6)動作(じゃなくって)
single user 到達おめでとうございます。
dd で /swap 等を適当なサイズで作って
/swap none none sw 0 0
/etc/fstab に書くのが一番手っ取り早いです。
bootparam
しか詳しくないですが……
exports(5) の -alldirs は mount point の top
のディレクトリでないと指定できなかったような。(うろ覚え)
Microseconds for one run through Dhrystone: 192.1 Dhrystones per Second: 5206.7
PG_CI してすべて cache disable してるけど
L2 cache の有無で動作変えたほうがいいのかしら。
d5 の stack の address
の上位 8bit で判別してしまっていいのか?
Microseconds for one run through Dhrystone: 187.6 Dhrystones per Second: 5330.5
out32rb(), in32rb()
ではなく out32(), in32() 使えばよいのでは。
;-p のコメントってそういうこと……ですよね?
dev 18 と dev 22
で処理が同じなのはそういうものなのかな。
si_dma_alloc() ではなにもする必要はない。
bus_dma(9) を使うのが必須だとすれば
si_dma_alloc() で bus_dmamap_load()
する必要がある。
si_dma_setup() 内で bus_dmamap_t
の dm_segs[] を使って DMAC を設定する、と。
bus_dma(9) するつもりのない news68k
でそこまでする必要があるのだろうか。
ncr5380sbc や ncr53c9x
は bus_dma(9) ができる以前に MI
化されてるので DMA hook が不自然。
aic7xxx 等とは違って DMAC は各マシンで違うから
MI で bus_dma(9) を call するのは無理?
isp(4) の isp_sbus.c と isp_pci.c
とか見ると ncr5380sbc の hook
もそんなに変というわけではないのか?
ncr5380sbc
がついたりする事態も想定しないといけないのか?
;-)
;-p だと変にせかされることもなく
応援してもらえますし。
abs@netbsd.org
さん宛にメールしときましょうか?
;-) できるんでしたっけ。
cross-mipseb-netbsd のパッチを公開。大丈夫だよな。
config/mips/netbsd.h の mipseb
対応パッチってまだ main trunk にも入ってないな。
netbsd-[lb]e.h に分ける?
cross-m68k-netbsd な package
も再度作り直してみる。
BINUTILS_GNUTARGET を
m68k-netbsd じゃなくて a.out-m68k-netbsd
にすればよかったのね。
gas, ld が binutils のだからそのままじゃ PIC
は作れないけど、 kernel cross compile にはこれで十分。
loadfile() の件をふにふにと
send-pr。って
www.netbsd.org の perl が変だよ。ふに。
cross-mipseb-netbsd な compiler package 作成。
cross/binutils で make deinstall
したら m68k 用の cross egcs
まで消えちゃったよ。ふにゅう。
sun3/sun3/leds.c とか見ながら LED 点滅コード追加。
options BLINK
みたいなことしようかとも思ったけどめんどいのでやめ。
ncr5380 でまともに DMA 使ってるの sun3 だけか?
DVMA とかわけわからんぞ。
alloc/free/setup/start/poll/eop/stop
とあるけどどこで何すりゃいいんだろ。
alloc, free は DMA 中フラグをセットするだけか?
setup でページのアドレスセットして
start で開始のレジスタたたけばいいのか?
poll ってなんだろ。 eop はなくてよさそう。
stop も適当だな。
sparc/dev/si.c
は一応 bus_dma(9) 使ってるのか。
alloc 中で bus_dmamap_load()
してるなあ。
;-) もあるじゃないですか。
そーいえば、のなかさんの話、知ってたのに BSD Magazine に書き忘れているじゃん。すいませんすいませんすいません。
scsi_1180.o とか dmac_0266.h
とか眺めてみる。
scsi_1180.o の中の sc_dma()
でいろいろやってる。
dmac_0266.h はかなりコメントが親切。いいねえ。
DMAC_CTL の DMAC_CTL_RST
を上げ下げして reset。
DMAC_TCNT に転送バイト数を write。
DMAC_OFFSET
に転送開始アドレスのページオフセットを write。
DMAC_TAG に 0から始まるタグを、
DMAC_MAPENT
にページの物理メモリアドレスを繰り返し write。
DMAC_TAG
に 0を write。
tcmd, icmd, mode の各レジスタをセット。
DMAC_CTL_MOD で転送方向設定して、
dma_send たたいて、
DMAC_CTL_ENB を 1にして転送開始。
pcscp(4) とか macppc の esp(4)
とかとほとんど同じ処理でいけるはず。
ncr5380sbc ドライバの DMA hook
がどうなっているか調査か。
0xc00xxxxx
を指してないので調べて頂いたが、そういう設定はなさそう。
/sys/ 以下を見ると実は
news1400 と news1700 では kernel が違う。
0xc00xxxxx
を明示的にアクセスしてる部分がある。
vbr とか sp の設定とか
fdc_set_dma の中とか、怪しいといえば怪しい。
0xc00xxxxx
指定してるところがある。 2次キャッシュに関係あるのか?
mozilla と打ち込んでから待つこと
10分(笑)ようやく最初の Window が出てくる。
uname(3) が MACHINE_ARCH
じゃなくて MACHINE を返すのがうれしいかもとか思ったり。
;-p
;-p
ftp.netbsd.org
を見るとなぜか最初の message に
"NEWS (68k & MIPS)"
って書いてある。なぜ?
loadfile.c は誰も直してくれなかったらどうしましょ。
loadfile() に switch
するには……ちょっといろいろ複雑みたいですね。
loadfile() で NMAGIC
が読めないのが気になって夜も眠れない(ウソ)のでもう少し調べてみる。
OMAGIC とか NMAGIC
とかの違いをよくわかってないので a.out(5) の man
とか読んでみる。
OMAGIC だと text, data, bss
をすべて前から順にベタで配置する。
NMAGIC だと text と data
以降(bss 含む)が別のページになるように配置する。らしい。
pmap_bootstrap.c で text を PG_RO
に、 data 以降を PG_RW に設定している。
OMAGIC だと data の先頭の一部が
PG_RO になってしまう。なのに今までなんで動いてるんだ?
locore.s 中の
temporary stack になってて、後ろのほうしか使ってなかっただけらしい。
NMAGIC
にするのは必須みたいなのであらためて loadfile()
をチェック。
NMAGIC を使ってる
mvme68k/stand/libsa/exec_mvme.c
とか見ながら違いを確認。
aout_exec() の text load 後の
alignment あわせのコードは間違ってるような……
LOAD_SYM を外してみるが今度はダンマリになる。
NMAGIC
でも header 長は text に含まれないのが正しいのか?
loadfile() の aout_exec()
のコメントはウソ?
NMAGIC でも text から header
長を引かないようにして、再度 installboot して起動。
_o_
OMAGIC
のままですね。これでも一応動きますのでそのうち作り直します……。
ramdiskbin.mk 作成時に OBJDIR
が正しく認識されてないような。
crunchgen.c の中で MACHINE
直接参照してるじゃねーか。
make(1) みたいに uname(3)
使ってくれないと……とぶつぶつ言いながら news68k 上で作り直す。
setenv MACHINE news68k
すれば動くんですけど、やっぱりねえ。
ramdisk の下はよさそう。が、
bootfloppy の下の installboot で怒られる。
/dev/rvnd0a じゃなくて
/dev/rvnd0c だと書けるのでそうする。
"gzip -9 netbsd.tmp"
が遅い……。と、完成。なんか ramdisk スカスカだなあ。
dd して news68k で起動。
sh の prompt 登場! 当たり前だが
ifconfig も disklabel
もなんでも OK。 ;-)
PG_CI 外して様子を見てみる。
;-p
ncr5380sbc.c だけか。
"yet another
chip-designers-and-manual-writers-disagree" にちょいウケ。
locore.s で physmem
を d4 から渡すようにしてたのに boot.c
変更してないじゃん。
hp300/stand/common/machdep.c
とか見ながらレジスタに値渡すように修正。
boot から hd(1)/netbsd
を読ませてみる。
bootdev の MAGIC
に 0xa を渡すのに newsmips/autoconf.c
だと 0x5 見てるな。
/boot は 0x5
渡すようだ。
/boot でも 0x5
渡すようにしておく。
installboot にとりかかる。
loadfile()
を使うようになってるらしい。
loadfile()
不信気味なので見送り。
sd0 と sd1
を間違えたりしたが、 primary の bootxx
はちゃんと書けた模様。
/boot が正しく読めず
monitor に落ちる。メモリダンプすると全然違うものが load されてる。
dd で確かめてみるが installboot での
/boot の block numbers はちゃんとあってる。
/boot
読む時アクセスランプ点いてないじゃん。
sd1 じゃなくて sd0
を読んでるらしい。よく見ると bootdev の値が変。
newsmips/include/romcall.h によれば hd(1)
は 0xa0100000 のはずだが 0xa1000000
になってる。
BOOTDEV_CTLR() を書き換え。
make includes だけで 2時間かかったり。
;-)
;-p
bus_space(9) 関数群と bus_dma(9)
関数群の解説と使用例。
config(8) と files
その他設定ファイルの書式について。
;-p
romcalls.S の trap #0
呼び出しの前後でレジスタ退避するようにする。
loadfile() 動作!
0x0 から、 entry の _start
は 0x1000 なのに text が 0x1000 から
load されてる感じ。
libsa/loadfile.c
を見ると、確かに entry のアドレスから読み込むように書いてあるような……
_start が先頭にあったから気づいてないのか?
loadfile()
を使ってるのって昔の sparc だけ?
_start が先頭に来るように locore.s
をいじって kernel を作り直してみる。
loadfile()
の先頭で止まってしまう。
loadfile.c をじっとながめる。……。
OMAGIC だと header を text より前に読み込んでるようだけど、
text が 0x0 からだと困るような……。
NMAGIC な kernel を作って試してみる。……が、今度は
symbol table がまともに読み込まれない。
loadfile() って
a.out じゃ全然ダメじゃん。いっそのこと
kernel ELF にしたろか。
OMAGIC に戻して loadfile() の
flag から LOAD_HDR をはずしたら無事 kernel
に jump したらしい。
bootxx() と boot() は
d4〜d7 だけ渡して呼ぶことにする。
boot と installboot
の同時作業でははまるのが目に見えてるので installboot
は後まわし。
boot を手で floppy
の 16セクタ目からベタで書きこむ。
bootxx.c の block_count, block_table
もあらかじめ書いておく。
boot() のほうに渡す bootdev は実際に
kernel がある hd(1) を見るように細工しておく。
block_count は block_size
単位だが block_table はセクタ単位だったり。
sd じゃなくて hd
だったり。
romopen() の後 devname が破壊されてて
printf() がふっとんだり。
loadfile() まではたどり着く。
"Inappropriate file type or format"
と文句を言って読み込んでくれない。
loadfile_machdep.h の記述をいろいろ変えてみるが変わらず。
"No such file or directory"
になるよなあ。なにが違うんだ。
newsmips/stand 以下を news68k/stand
以下にまるごと copy する。
Makefile 中の CPPFLAGS とかいろいろ書き換え。
boot/locore.S と bootxx/start.S
は適当(ぉぃ)に m68k assembler に書き換え。
romcalls.S は以前調べた結果から
newsmips の syscall を trap #0 に置き換え。
d0 で渡して、 argv
はスタックに積まれてる値を linkw fp,#0 して
fp で渡す。
_halt だけは moveq #8,d7 して
trap #15 を呼ぶ。
0x200000 っぽいのでそうする。
bootxx 完成。うーむ。
installboot
を直すのはちょっとめんどくさいな。
bootxx
だけ書いてどうなるか試してみる。
dd する。
"bo fh()" して起動。
start.S でいきなり halt に飛ばす。
start.S の中で手でスタックに引数積んで
rom_write() 呼んでみる。
_rom_write
その他は動いてて address が変なのか?
boot0 を調べてみる。
0x200000 に load されるのではなくて
load されたあと自力で 0x200000 に転送しているようだ。
0x0 の先頭に load されてた。
start.S
にも転送させるコードを入れようかと思ったが面倒なので load address を
0x0 にして作り直す。
"NetBSD/news68k Primary Boot"
が出てた。 printf() 動いてるじゃん。いいぞ。
bootxx()
を呼ぶ前に各レジスタを引数とすべくスタックに積んでみる。
d4 は 0xffc000 だから total memory かな。
d5 が printf で "boot"
が表示されるから boot filename の pointer が入ってるっぽい。
d6 は 0xa0000001 だから
0xa0 が MAGIC とすると bootdev の
fh(0,0,0) なのか?
d7 は "bo /x" の "x"
の数字らしい。
d1〜d3 はいずれも 0 で
d0 は 1。
意味なしなのかこの数字に意味があるのか……
M68030 用の TBIA_30() もあったんですね。
HP_MMU
なマシンがあって面倒なんだ、という気もします。
#ifdef HAVE_CACHE_PAC してる
sys_machdep.c の cachectl1()
と DMA まわりだけ。
hp300/locore.s で定義されてる PCIA()
内の 2次キャッシュクリアをどうするか、なんですが。
/etc/ppp/peers/ 以下の読み込みが root
権限で行われなくなったみたいですがそれ以外は問題なさそうです。
news68k/dev/zs.c をいじる。
csh の prompt が変だったり。なぜか tcsh
だと OK。
zs でも
sparc や macppc は問題なし。
ZS_DELAY() を無効にしてみる。
delay()
なんぞ入れなくても十分遅いということか?
romcall.S の中身の検討と load address の確認かな。
disklabel, newfs, mount
とも問題なし。うんうん。
"root on sd1a"
で立ち上げるべく tar でディスクにファイルを移す。
/etc/fstab その他も修正。
installboot だけ NEWS-OS 上で実行。
fsck とか mount とか軒並動かん。
fsck_ffs や mount_ffs は OK。なんなんだ?
gdb で見てみると strcmp() で落ちてる。
/etc/fstab
確認すると root の mount point "/" を書くの忘れてる。
fstab 修正して起動。……ちゃんと起動した。うーむ。
ncr5380sbc.c もよく見たら 2か所 #if 0
でコメントアウトしただけだな。うーむ。
TBIA() その他 は
昔の記憶 によれば
m68k/cacheops.c もしくは locore.s
とかにあります。
locore.s の中でした。
pmap.c で #include <m68k/cacheops.h>
してない、ってやつかな?
cacheops.c だと L2 cache
の扱いがちゃんとしてないんですよねえ。どうすべきなんでしょ。
;-p
printf()
が動いた感動」をわかってくれる人ってほとんどいないんですよねえ、
というネタで笑って頂けるだけでも十分です ;-)
"panic: pool_put" ってのは
/sys/kern/subr_pool.c の中。
si_intr() を呼ぶようにしてみる。
disklabel sd0。……お、 panic しないぞ? ほんとか?
NCR_TRACE() 無効にして再度試す。
"sd0: no disk label" とも言われてる。
newsmips だと NEWS-OS の disklabel も読めるのに……
dd して /dev/rsd0c
読んでみる。一応それっぽい中身が読めてるような……
news68k/include/disklabel.h を確認してみる。
disklabel sd0 する。えい。
# disklabel sd0 # /dev/rsd0c: type: SCSI disk: hdsd00_639 [...中略...] 8 partitions: # size offset fstype [fsize bsize cpg] a: 31768 0 unused 1024 8192 # (Cyl. 0 - 32*) b: 181760 31768 swap # (Cyl. 32*- 221*) c: 1309896 0 unused 512 4096 # (Cyl. 0 - 1355) d: 21884 790527 4.2BSD 1024 8192 16 # (Cyl. 818*- 841*) e: 307200 812411 4.2BSD 512 4096 16 # (Cyl. 841*- 1159*) f: 190285 1119611 4.2BSD 1024 8192 16 # (Cyl. 1159*- 1355) h: 576999 213528 4.2BSD 1024 8192 16 # (Cyl. 221*- 818*) disklabel: warning, partition b: offset % cylinder-size != 0 [...後略...]
mount -r や fsck -n
も問題なさそう。まだ恐くて read only のみだけど。
sd0 の中身を空いてる wd1
に移して 1台浮かせるか。めんどくさ。
# dd if=/dev/rsd0c of=/dev/null bs=64k ^C179+0 records in 179+0 records out 11730944 bytes transferred in 286 secs (41017 bytes/sec)
groff の途中。
mdsetimage で kernel file を mmap()
したところに fs image を read() するところで落ちる。
mdsetimage を static で作って
1.4R の boot floppy
を起動してそこで image を書き込んでみる。
vnconfig だの installboot
だのして newsmips 1.4K の boot floppy のできあがり。
FORCE_POLLING の設定してても BUSY monitor
の割り込み設定してるけどそんなものなのか?
ncr.c は PIO
でそれなりに動いてるみたいだし……
ncr5380_select() で
BUSY monitor 設定しないようにしてみる。
"panic: pool_put" で死亡。
sun3/stand/netboot 以下で undefined symbol
で停止。
intoa() と int_addr() が
libsa から libkern に移ったせいらしい。
games, gnu 以下で
make 続行。
distrib/newsmips
以下のファイルを持ってきて適当に修正。
mdsetimage で panic する。
trap: TLB miss (load or instr. fetch) in kernel mode status=0xfc14, cause=0x10000008, epc=0x100000, vaddr=0x100000 pid=211 cmd=mdsetimage usp=0x7ffffa08 ksp=0xc419cc50 Stopped in mdsetimage at 0x100000:trap: TLB miss (load or instr. fetch) in kernel mode status=0x8fc14, cause=0x30000308, epc=0x80109f50, vaddr=0x100000 pid=211 cmd=mdsetimage usp=0x7ffffa08 ksp=0xc419cb10 Stopped in mdsetimage at 0 80109f50: lw a0,0(v0) db> trace 80109f40+10 (100000,0,0,0) ra 800088d4 sz 24 ← db_disasm() 800088a4+30 (100000,0,0,0) ra 8000b4cc sz 24 ← db_print_loc_and_inst() 8000b3f0+dc (0,0,0,0) ra 8010aaf4 sz 32 ← db_trap() 8010a8d4+220 (0,0,0,0) ra 8010ddf8 sz 48 ← kdb_trap() trap+18c (fc14,10000008,100000,100000) ra 80002098 sz 72 mips1_KernGenException+c4 (81eb5348,c0062040,2022a000,80145040) ra 100000 sz 120 PC 0x100000: not in kernel space 0+100000 (81eb5348,c0062040,2022a000,80145040) ra 0 sz 0 User-level: pid 211 db>
locore_mips1.S まわりなのかな。
pmax とか arc とかだとどうなんだろ。(ぼそっ)
screg_1180.h には NCR5380 にはない
"Extended Mode register" という記述がある。
scsi_1180.o では特に触ってないようだ。
NCR_TRACE() の表示を出して動作を確認してみる。
"unexpected disconnect."
と言われるのは変なタイミングで割り込みが入っているからなのか?
"NCR5380_FORCE_POLLING"
セットして割り込みハンドラでも si_intr()
呼ばないようにしてみる。
machine: discon, waited 0 sched: machine done, cur=0x0 sched: no work, cur=0x0 scsipi_cmd: sched done, cur=0x0 pool scxspl: putting with none out panic: pool_put syncing disks... done.
~/.cvsrc
に "update -Pd" と書いておくとよいですよ、とメールを頂く。
newsmips/stand 以下で make obj
してると問題ありだったので send-pr 済。
usr.bin/tn3270 あたり。あと 2日くらいか?
(ただし MKMAN=no, MKLINT=no 設定)
NKMEMCLUSTERS を増やしとかないと
panic するのはほんとに足りないのか bug なのか。
"cvs update -d -P"
が良いと思う、と曽田さんのお言葉。
"back out...; too many people complained."
なんていういやな commit log が流れてたりするけど……
diff 使ったり vi 使ったり
mule 使ったり rcs 使ったり。
INET6 まわりくらい。
"nfs_boot: timeout..."
とか出るけどこれは arm32 の de のせいかな。
autoconf.c
まわりの変更が入ってるのでこいつは取り込んでおきたい。
sup.jp.netbsd.org
も更新されてた。update script だけしかけて寝直す。
sys/arch/hpcmips 等が作られてないのに気づく。
"cvs update -d"
とすればよいらしいのでそうしておく。
;-) 今さらながら
Oh!X 夏号を買う。
;-p
volatile
有無チェック。ないところは追加。ついでにすべて u_char
で統一。
mvme68k/clock.c ベース。
newsmips/clock.c とを見比べてみる。
clock.c 内の YEAR0
の記述を削る。再起動してテストも OK。
;-p
olseek() の修正は無事 commit された。
すでに判明してたらしいけど、勉強になったからいいや。
PMAP_NEW まわりも直ったようだ。
powerpc はまだみたいだけど。
libc
まわりに大量に修正が入ってるから sup するのためらってしまうな……
hp300/pmap.c
を適当な場所に copy して check in。
news68k/pmap.c を上書きして
check in。これで hp300 → news68k の変更点が出る。
hp300/pmap.c を上書きして rcsmerge
する。うん、結構うまくできてるかも。
ncr5380*.[ch] を news68k/dev/ に持ってくる。
>某偉い人
PG_CI
マークしてるところを options で切替えられるようにしておく。
config(8) が通らない。
port-news68k.html
300kbyte 突破(ぉぃ)じゃなくて、
NetBSD/hpcmips import おめでとうございます。
;-p
;-) から
DESTDIR="/../."
でちゃんと動きますよ、とメールをもらう。
"/" を指定すると "/emul/aout"
を見るんだから、 "/../../" にすれば本物の
"/" が見えるのだろうと思ってたのだが…
"/emul"
以下に該当ディレクトリがなければ問題ないのか。
ktrace(1)
で調べてみると、それとも違う。
"ktrace bash /.././usr/local/lib/.profile" とすると、
684 bash CALL open(0xa2ccc,0,0xa2ccc) 684 bash NAMI "/./usr/local/lib/.profile" 684 bash RET open -1 errno 13 Permission denied
"/emul/aout" は一切見ずに、最初の
"/.." を取った path を見にいってる。
COMPAT_*
の仕組みは真面目に調べたことなかったのだが、ちゃんとソースを読んでみる。
/sys/compat/common/compat_util.c の
emul_find() に
/* * We provide an escape method, so that the user can * always specify the real root. If the path is prefixed * by /../ we kill the alternate search */
/sys/compat/ 以下を調べたついでに、
netscape の history.db
が変な件も調べてみる。
ktrace(1) 結果は以下のとおり。
911 netscape RET read 260/0x104 911 netscape CALL compat_43_olseek(0x7,0,0,0x59d800,0xefbfbd24) 911 netscape RET compat_43_olseek -1 errno 22 Invalid argument 911 netscape CALL compat_43_olseek(0x7,0,0,0x59d800,0xefbfbd0c) 911 netscape RET compat_43_olseek -1 errno 22 Invalid argument
8298 netscape RET read 260/0x104 8298 netscape CALL compat_43_olseek(0xa,0,0) 8298 netscape RET compat_43_olseek 0
"Invalid argument" な感じ。なんなんだ。
/sys/kern/syscalls.master と
/sys/compat/aout/syscalls.master とを見比べる。
aout/syscalls.master の
19番 sys_lseek() は
compat_43_sys_lseek() であるべきなような……
syscalls.master 直して
aout_syscall*.[ch] 作り直して kernel make。
% cd /usr/src % cvs -d /cvs/repository update -j current-19990910 -j current-19990914
"DESTDIR=/../.." というのが肝ですな。どちらのメモも
"../." になってるのは書き間違い?
COMPAT_AOUT ファイルを /usr/emul/aout
に置いたので "DESTDIR=/../../.." とする。
/emul/aout
以下に移動させないよう注意。
/usr/libexec/ld.so も /emul/aout
以下に移動した方が consistent かな?
make(1)
の動きが変なような気がするがそのまま続ける。
BOOTSTRAP_ELF を設定して、
GNU toolchain は OBJECT_FMT=a.out で作成しインストール。
libc_pic.a を作成し lib/csu
以下を作ってから ld.elf_so 作成。
make build。
"-I \!"
つけるの忘れてたようだ。ごーん。
DESTDIR 設定してたらいくつか make
できないものがあったけど、これって make(1) のせい?
history.db
が正常にアクセスできてないような。リンクが全部青色。 cache は OK。
ktrace(1) で調べてみると compat_43_olseek()
で "Invalid argument" とか言われてるけど、このせい?
PMAP_NEW
の変更をちょっと見てみる。
"opms at pckbc?" を使えるようにするパッチ
をあてる。
tlp ドライバも試そうかと思ったが、まだ 21143
等はサポートしてないようだ。
make build 中
daily cron が走った時に一度固まってしまった。
opms まわりを commit してみる。
arch/arm32/conf
に移ってテキトーに cvs commit してみる。
% cvs -d /cvs/repository commit files.arm32
arch/arm32/isa/ 以下で pms.c の追加。
memcpy() の prototype の件
もあっさり
修正されたようだ。
PMAP_NEW や sh3 の件もあるし、今晩あたりまた
sup して cvs import 2回目と cvs update も試してみるか。
;-p ちゃんと subscribe することにする。
ukbd.h の件 は
つばいさんの指令 により
send-pr して即
close された。うむ。
gethostbyname(3) がおかしい件もつばいさんからメール。
libc/net/gethnamaddr.c の _gethtbyname2()
の中で、 static char hostbuf[] と
malloc() された
char *tmpbuf が同じ alignment
であることを仮定しているのがおかしい、とのこと。
machine/param.h の
ALIGNBYTES が最大 alignment である
(sizeof(double) - 1) にしてあるのでこの現象が発現する、と。
_o_
ALIGNBYTES == 7
みたいですしー。
ex を i386 に、 de を arm32 に。
rc.conf
と ifconfig.* を直すだけ。
/work/current に sup して
/work/current/src 以下に用意してある。
/cvs/repository
に用意。いずれも arm32 の
CATS 上。
/work/current/src に移って cvs import
実行。 module 名は安直に src とする。
% cd /work/current/src% cvs -d /cvs/repository import -I \! src netbsd current-19990910
src の次の netbsd
はベンダー名で、 current-19990910 はタグ。
cvs checkout
で作業領域作成。作成場所は予定どおり /usr/src 直下。
% cd /usr/src% cvs -d /cvs/repository checkout -d . src
-d は repository の path で、
checkout の後ろの -d は checkout
先のディレクトリの指定。
src は import の時に指定した module 名。
TCWSCONS をベースに config して
make。問題なく作成できて起動も OK。
"make obj && make build" してしばらくほっておく。
"WARNING: clock gained 69 days"
なんて言われてしまう。う〜む、そんなにさわってなかったか。
ukbd.h がないと怒られる。
files.usb の ukbd から
"needs-flag" がなくなっている。
make build 中に m68k まわりの current での変更点チェック。
COMPAT_14 や COMPAT_SVR4
の記述追加。
spl() の定義が arch/m68k/include/psl.h
に移動。
machdep.c での allocsys()
の MI 化。
pmap_ptpage_addref(),
pmap_ptpage_delref() 追加と pmap_extract()
API 変更。
pmap_change_wiring() → pmap_unwire() の改名と
pmap_pageable() 削除。
PMAP_NEW 化のコードが
commit されてしまった。ぐがが。
sbin/badsect の
ffs_bswap.c で memcpy()
の declaration 云々と文句を言われてる。
/sys/sys/systm.h から memcpy()
の prototype がなくなってる。
ifconfig(8)
その他の動作が変。
ifconfig vr0 [host名] とすると全然違う IP address
がついてしまう。 IP address 直接指定なら問題なし。
gethostbyname(3) が変なのかこちらも memcpy(3)
が変なのか…
CTRL_TIMER
ポートに 0 と 1 とを順に書いて pulse edge を送る必要がある。
IIOV()
マクロを使わないようにしたときにはなぜか
DELAY(1) をいれる必要があった。
*(char *)CTRL_TIMER = 0; DELAY(1); /* ←これ */ *(char *)CTRL_TIMER = 1;
DELAY() なんてしてらんないし
NEWS-OS は何もしてないので再確認する。
DELAY(1) を __asm("nop")
に置き換えるがダメ。数増やしても変わらず。
*(volatile char *)
にすればよいことが判明。
volatile
ってそういうことだったのかー。いやぁ素人なもんで。
egcs やら binutils
やら news68k 上で作り直してみる。
tetris(6) を動かすべく
/usr/games 以下も build する。
tetris(6)
は console でも元気に動く。
$CVSROOT ディレクトリ以下に "CVSROOT"
というディレクトリを作る必要あり。
$CVSROOT
の "repsoitory 名のディレクトリ" の中に入る。
$IMPORTROOT 以下に sup して
$SRCROOT/"repository name" 以下で build する、ということ。
/usr/src 直下に build source tree
を作ろうとすると難しいのか?
netbsd だとして、
/usr/src 以下に netbsd -> . の
symbolic link を作るのは反則?
src にして
/usr に checkout すればいいのか?
CVSROOT ディレクトリは "cvs init"
すれば自動的にできるとのこと。
(==$CVSROOT) が一つだけあって、ここに
"*,v" のファイルをすべて置く。
$CVSROOT 以下に
"*,v" のファイルが作成される。
$CVSROOT 以下には作ってはいけない。
cvs checkout -d [directory] [module 名] で指定可能。
cvs commit, cvs update
等は「CVS 作業領域」内であれば常に使用可能。
cvs import して
CVS の repository に取り込む
cvs checkout して作業領域を作る
cvs import したあと作業領域内で
cvs update する
cvs commit は逆に作業領域の変更を repository
に入れるものですね。
/usr/src
以下にしたい。
tar_files
を取ってくる。が、回線遅過ぎ。
make cleandir して kernel を作り直す。
parity error の trap
が出なくなってしまった。なんなんだ。
make clean してなかったけど……。
NFS server の arm32 が変だったのか?
machdep.c に si のハンドラ作って
attach routine 内の NCR5380_FORCE_POLLING
の flag をはずす。
printf()
はさんでみると、 level 4 の割り込みかかりっぱなし。あれ?
#if NSI > 0 してるのに
#include "si.h" してなかった。ぐは。
[...前略...] libero# disklabel sd0 ncr5380_machine: unexpected disconnect. panic: ncr5380_done: state=idle syncing disks... done rebooting... NEWS>
panic() するだけまだましか……
pcscpreg.h とか。
CTRL_PARITY, CTRL_PARITY_CLR を調べてみる。
adremap.h にも PARITY_VECTOR
ってのがあるし。
CTRL_PARITY_CLR
を叩くようにしてみる。
CTRL_PARITY_CLR 叩いて return させてみる。
"parity error ignored" の printf()
に埋もれつつも login: の prompt は出てきた。うーむ。
disklabel(8) も mt(1) もダメ。
console も ping も応答がないので完全に死んでる。
newsmips/dev/scsi_1185.c には次のような注釈がある。
* DMAC_WAIT --- DMAC_0266 wo tukau-baai, DMAC mata-wa SCSI-chip ni * tuzukete access suru-baai, * kanarazu wait wo ireru-beshi !
scsi_1180.o では nop
が 6つほどはさんである。
ncr5380var.h
ではレジスタアクセスが次のように定義されてる。
# define NCR5380_READ(sc, reg) (*sc->reg)
# define NCR5380_WRITE(sc, reg, val) do { *(sc->reg) = val; } while (0)
"ireru-beshi!"
などと言われてもちょっと困ってしまう。
ncr5380*.[ch] を
MD に持ってきていろいろいじってしまうか……
gnats-bugs
からなかなか返事が来ない。調子悪いのかな。記述間違えてないよなあ。
PMAP_NEW for all platforms" の提案。
mail-index.netbsd.org
のアーカイブにないのはなぜかしら。
vector.s
いじって様子を見ようと思ったんですけど、いまいち make
するガッツが出ない。
vmunix から調べてみる。
vmunix を binary search
してベクタテーブルらしきところを調べる。
Xstray() で意味無し。まあ、
vectored ならそれが当然か。
0x800029f2
なんてそれっぽい飛び先が書いてあるじゃん。
Xparity() ってなんだそりゃ。
copypage() で発生するのもわかるが、なんで
SCSI 触ったときだけ出るんだ?
vmunix の Xauto7() を見ると確かに
printf("auto7\n") しかしてないように見える。うむむ。
CTRL_PARITY と CTRL_PARITY_CLR
のポートは locore.s の先頭で設定してるつもりなんだけど……
vector.s に行きつく のは
昔の調査 でだいたいわかってました。
"objdump --disassemble vmunix" だったりするのです。
0x300 ってことは 4 で割って 192番ですか。なんなんだろ。
adrsmap.h からすると
ipl 4 の autovectored らしいんだけど、ほかにもあるのかしら。
spl0() した瞬間じゃなくて遅れて出るのもよくわかんないな。
"objdump --disassemble scsi_1180.o"
してみる。
scsi_hardreset() の中で 0xe0e80000
あたりになにか書いてる。
/sys/newshpdev/dmac_0226.h を見ると DMAC の soft reset
らしい。
si.c に足してみる。
#if 0 で 2回目のチェック外して make するだけ。
goto のラベルの使い方が変だぞ、おい。
[...前略...] si0 at hb0 addr 0xe0cc0000 ipl 4, polling scsibus0 at si0: 8 targets, 8 luns per target sd0 at scsibus0 targ 0 lun 0: <HITACHI, DK515C, CP16> SCSI1 0/direct fixed sd0: 639MB, 1361 cyl, 14 head, 68 sec, 512 bytes/sect x 1309896 sectors st0 at scsibus0 targ 5 lun 0: <WANGTEK, SCSI-36, A> SCSI1 1/sequential removable st0: drive empty st1 at scsibus0 targ 5 lun 1: <WANGTEK, SCSI-36, A> SCSI1 1/sequential removable st1: drive empty st2 at scsibus0 targ 5 lun 2: <WANGTEK, SCSI-36, A> SCSI1 1/sequential removable st2: drive empty st3 at scsibus0 targ 5 lun 3: <WANGTEK, SCSI-36, A> SCSI1 1/sequential removable st3: drive empty st4 at scsibus0 targ 5 lun 4: <WANGTEK, SCSI-36, A> SCSI1 1/sequential removable st4: drive empty st5 at scsibus0 targ 5 lun 5: <WANGTEK, SCSI-36, A> SCSI1 1/sequential removable st5: drive empty st6 at scsibus0 targ 5 lun 6: <WANGTEK, SCSI-36, A> SCSI1 1/sequential removable st6: drive empty st7 at scsibus0 targ 5 lun 7: <WANGTEK, SCSI-36, A> SCSI1 1/sequential removable st7: drive empty boot device: <unknown> [...続く...]
;-)
st がたくさん出てるのは
/sys/dev/scsipi/scsiconf.c で
SDEV_NOLUNS 定義すればよいだけの話。
[...続き...] nfs_boot: trying RARP (and RPC/bootparam) nfs_boot: client_addr=0xc0a81409 (RARP from 0xc0a81408) nfs_boot: server_addr=0xc0a81408 nfs_boot: hostname=libero root on diamante:/export/NetBSD/news68k/root root time: 0x37d28613 WARNING: clock lost 382 days -- CHECK AND RESET THE DATE! init: copying out path `/sbin/init' 11 unexpected trap (vector offset 300) from 7e0fc unexpected trap (vector offset 300) from 7e0fc unexpected trap (vector offset 300) from 7e0fc unexpected trap (vector offset 300) from 7e0fc unexpected trap (vector offset 300) from 7e0fc unexpected trap (vector offset 300) from 7e0fc [...以下繰り返し...]
0x7e0fc ってのは copypage() の中。
vector offset の
0x300 ってなんだ?
sd0 が 0番、 st0 は 5番。
ncr5380sbc.c は ID が magic number
で埋め込んであるような気がするが、そんなものか?
"Keep this code for reference anyway..."
とか書いてあるから取っちゃっても構わないのだろーか。
tlp の driver が commit されたようだ。
"select found SCSI bus busy, resetting..."
のメッセージは計 42回出てくる。
NCR5380_DEBUG つけたり ncr5380_debug = 3;
したりして様子を見る。
DDB
つけてないと出てこないようだ。
DDB
はまだ試してないのだが……
#define NCR_TRACE printf などとひどいことをする。
scsibus_reset は動いてるっぽい。
ncr5380_select()
でアービトレーションに入った後、バスも獲得できているようだ。
BSY と SEL
をアクティブにするとなぜかその時点で Lost arbitration
のフラグが立ってしまって busy になってしまう。
ncr5380sbc.c の 1411行目あたりの
"lost two" というやつ。
;-p
XXX なコードであーやんなっちゃう。
;-)
pcscp(4)
が動いた時にも思ったけど、何事もやってみればなんとかなるもんですねえ。
MACHINE
にもあてはまります。愛着がない分もっとつらいかも。
mail-index.netbsd.org
の調子が悪いみたい。リンクが張れん。
;-)
files.news68k を修正。うーん、と深く考えず
device 名は si にする。
arm32/podulebus/csa.c と news68k/dev/if_le.c
とを切り貼りして si.c 作成。所要時間 3分。
[...前略...] si0 at hb0 addr 0xe0cc0000 ipl 4, polling scsibus0 at si0: 8 targets, 8 luns per target si0: select found SCSI bus busy, resetting si0: select found SCSI bus busy, resetting si0: select found SCSI bus busy, resetting si0: select found SCSI bus busy, resetting si0: select found SCSI bus busy, resetting si0: select found SCSI bus busy, resetting si0: select found SCSI bus busy, resetting [...後略...]
192.168.20.9 だったり。
% grep ncr5380sbc /sys/arch/*/conf/files.* /sys/dev/*/files.* /sys/arch/arm32/conf/files.arm32:device oak: scsi, ncr5380sbc /sys/arch/arm32/conf/files.arm32:device csa: scsi, ncr5380sbc /sys/arch/mac68k/conf/files.mac68k:device sbc: scsi, ncr5380sbc /sys/arch/pc532/conf/files.pc532:device ncr: scsi, ncr5380sbc /sys/arch/sparc/conf/files.sparc:device si: scsi, ncr5380sbc /sys/arch/sparc/conf/files.sparc:device sw: scsi, ncr5380sbc /sys/arch/sun3/conf/files.sun3:device si: scsi, ncr5380sbc /sys/arch/vax/conf/files.vax:device ncr: scsi, ncr5380sbc /sys/dev/isa/files.isa:device nca: scsi, ncr5380sbc
/sys/arch/sparc/dev/si.c を開くがそのまま沈没。
/sys/arch/sparc/dev/si.c あたりが参考になるかな。
;-p
pcscp(4) frontend も
macppc の wdc(4) 対応も adv(4),vr(4),ex(4)
の big endian 対応も動機はみな同じ。
/sys/dev/ic 以下の SCSI 調査。
screg_1180.h と ncr53c9xreg.h
とが違うのは確認済。
ncr5380reg.h を見てみる。
/sys/dev/ic/ncr5380reg.h のレジスタ定義:
/* * Machine-independent code uses these names: */ #define sci_data sci_r0 /* r: Current data */ #define sci_odata sci_r0 /* w: Out data */ #define sci_icmd sci_r1 /* rw: Initiator command */ #define sci_mode sci_r2 /* rw: Mode */ #define sci_tcmd sci_r3 /* rw: Target command */ #define sci_bus_csr sci_r4 /* r: Bus Status */ #define sci_sel_enb sci_r4 /* w: Select enable */ #define sci_csr sci_r5 /* r: Status */ #define sci_dma_send sci_r5 /* w: Start dma send data */ #define sci_idata sci_r6 /* r: Input data */ #define sci_trecv sci_r6 /* w: Start dma receive, target */ #define sci_iack sci_r7 /* r: Interrupt Acknowledge */ #define sci_irecv sci_r7 /* w: Start dma receive, initiator */
/sys/newshbdev/screg_1180.h のレジスタ定義:
/* * SCSI I/F Chip CXD1180 Register address assignment */ #define SCSI_BASE 0xe0cc0000 #define sc_csdr *( (u_char *)(SCSI_BASE + 0) ) #define sc_odatr *( (u_char *)(SCSI_BASE + 0) ) #define sc_icomr *( (u_char *)(SCSI_BASE + 1) ) #define sc_moder *( (u_char *)(SCSI_BASE + 2) ) #define sc_tcomr *( (u_char *)(SCSI_BASE + 3) ) #define sc_curbr *( (u_char *)(SCSI_BASE + 4) ) #define sc_selenr *( (u_char *)(SCSI_BASE + 4) ) #define sc_bstr *( (u_char *)(SCSI_BASE + 5) ) #define sc_sdmas *( (u_char *)(SCSI_BASE + 5) ) #define sc_indatr *( (u_char *)(SCSI_BASE + 6) ) #define sc_sdmatr *( (u_char *)(SCSI_BASE + 6) ) #define sc_resipr *( (u_char *)(SCSI_BASE + 7) ) #define sc_sdmair *( (u_char *)(SCSI_BASE + 7) ) #define sc_ex_moder *( (unsigned char *)(SCSI_BASE + 4) ) #define sc_ex_tclow *( (unsigned char *)(SCSI_BASE + 5) ) #define sc_ex_tcmid *( (unsigned char *)(SCSI_BASE + 6) ) #define sc_ex_tchi *( (unsigned char *)(SCSI_BASE + 7) )
CXD1180 なのはそういうことなの?
;-p
tetris(6) は news68k では動かしてなかった ;-)
;-)
MACHINE_ARCH 問題より
device の判定に flags での暗黙指定や起動時の customize
をばりばりに使ってることの方が気になってたりして。
sparc/include/param.h の CPU_ISSUN4*
の定義みたいなことするのかと思うとやってられない…
make build かけてひたすらほっとけばいい?
bufcache
まわりとか今回の 1.4J の splsoftclock() とか結構あるのか?
screg_1180.h と scsi_1180.o を眺める。
sc_csdr: Command Status and Data Register?
sc_odatr: Output DATa Register?
sc_icomr: Initiator COMmand Register?
sc_moder: Mode Register?
sc_tcomr: Target COMmand Register?
sc_curbr: CURrent Busphase Register?
sc_selenr: SELect ... わからん。
sc_bstr: Bus STatus Register?
sc_sdmas: ??? DMA Status?
"scsi control register"
とかあるんだけど、該当しそうなのがないし。
zs の clock を確認してみる。
zs.c の PCLK って 9600
で割り切れなくてもいいのか?
x68k/dev/zs.c
では 5MHz になってるな。ううむ。
;-p
== source
をいじる人」という気がしないでもない。
;-p
0xdeadbeef のコメント
が書いてあったり。今まで気づかなかったとは不覚。
pcscp(4)
を書く前に買ったんだけど、まだ DMA まわりしか読んでない。
struct scb, struct sfb の説明とかは参考になるかな。
pcscp(4)
では結局一番下の probe/attach/DMA/interrupt しか書いてないんだよな。
bus_dma(9) と chip の S/G
機能を使ったから自分ではなにも知恵使ってない。
ncr53c9x.c
見ながら読まないといけないなあ。
sys/newshbdev/dmac_0266.h
にはちゃんと #ifdef news1700 な項目があった。
newshbdev/fdreg.h の FD_PSEUDO_DMA
ってのはまた別の話なのか?
fdreg.h の中に
"#define phys(x) ((caddr_t)(x)+0xc0000000" とかある。
0x0 からと
0xc0000000 からってやはりなにか違うのか?
aha.c やら wds.c やら ncr53c9x.c
やら眺めてみる。
screg_1180.h と screg_1185.h を比べてみる。
screg_1185.h は結構 comment が親切なのに
screg_1180.h はかなりいい加減。
scsi_1185.c でも DMA 関連のコードは
#if defined(mips) の中にしかないような…。
vnd 上で
installboot して別のマシンで floppy
に書く、しか試せないし。
sc_adapter と sc_link とかか?
scsipi_cmd と scsipi_minphys だけか?
newsmips/dev/scsi_1185.c をベースに考えよう。
news3400/hbdev/scsi_1185.c
も見た方がいいかな。
scsi_1180.o
を逆アセンブルして推測。使っている関数は
scsi_1185.c と結構似てるみたいだし。
scsi_1185.o
があるのでこっちも参考になるかな。
screg_1180.h と screg_1185.h の比較。
newsmips/dev/sc_wrap.c
はあんまり見ないで、と言われてるけど、 MI SCSI
を使う場合の相違点ということで眺めてみよう。
scsi_1180.c 下さいとか CXD1180
のデータシート下さいとか頼んだ方が早いのだろうか。
/boot を見てみる。が、やはりよくわからん。
MAGIC を見て動作を変えているところはあるようだが…
NMAGIC と OMAGIC で何が違うんだ。
MAGIC と L2 cache
には関連なさそうな感じ。
NMAGIC で動かすことにこだわることはないかな。
(magic 410) と出るが
NetBSD だと (magic 407) である。
Makefile.${MACHINE} の
LINKFLAGS を見てみる。
"-N" にしてたのだが……。
"-n", "-N", "-z" なんでもあり。
"-N" だがそれ以外はみな
"-n" になってる。
"-n" の
NMAGIC にしてみる。
file(1) でみると
"old SGI 68020 pure executable" と
NEWS-OS の vmunix と同じ表示が出てくる。そういうことだったのね。
/boot は
magic で動作区別してたのね。
"-N" の OMAGIC
で作って立ち上がるか確認。……うん、問題なく動く。
"-n" の NMAGIC
で作って起動。……間違いなく動かん。
pmap_bootstrap() は通過。
uvm_setpagesize() も問題ない。
news68k_init() の中で死んでるのを確認。
uvm_page_physload() で死んでる。
printf() 使おうと思ってその前に consinit()
入れてやるがそれも死んでしまう。
uvm_page_physload() を飛ばしてやるとその次の
pmap_enter() は通過したが、こんな状態では意味無しかな。
OMAGIC だと動いて NMAGIC
だと途中で止まるってどういうことだ?
OMAGIC
にしてたから今まで動いてたのか。
/boot
で変なことしてないか確かめるのが先?
#ifdef HAVE_CACHE_PAC になってるところが
next68k だと #if defined(HP370) になってる。
hp300/locore.s を見ると 68030
でも妙な MMU 関係らしき I/O ポート叩いてるんだよなあ。なんなんだろ。
/usr/mdec/ 以下を入れ忘れたりしてたので作り直す。
installboot は partition c を指定しないとダメなのね。
make だけで image 作れるようにはなったが、
sysinst は先が長そう。
newsmips/stand/ 以下の source をざっと眺める。
*.S な source だけ news68k 用に直せばいいのかしら。
port-news68k.html のサイズが 200kbyte
突破している。
arch/newsmips/stand 以下を取ってきて試してみる。
make obj && make するといきなり
error。お?
boot/Makefile の .PATH:
と CPPFLAGS, bootxx/Makefile の
CPPFLAGS に ${.CURDIR} 追加。
bootxx/Makefile の L に
${.OBJDIR} 追加。こっちはなくてもいいかも。
libsa に loadfile()
がないと怒られる。
dd して起動。
terminal type? に vt100
と入れると画面が乱れるのがアレだけど、どうすべきかな。
distrib/newsmips
以下のファイルと同じく 物置ディレクトリ
に入れておきます。
/etc/disktab にも floppy
エントリ足さないといけないです。
;-p
PG_CI 追加 hack
はひど過ぎ。なんとかしたいなあ。
bus_space(9) 関数群の解説。うーん、勉強になる。
←今までロクに理解してなかったりして
zs も le も
bus_space(9) は使ってないからほっとこう(←手抜き)。
files.* の中の needs-flag
と needs-count
の説明。うーん、知らんかった。直しとこう。
telnetd が core を吐く のは
/etc/gettytab がないせいとか書いてあった ような…
gettytab がないとデフォルトでは
"4.4BSD UNIX (libero) (ttyp0)" なんて出るのか。うーむ。
arch/news68k 以下の source
を公開に向けて直していくことにする。
adrsmap.h を使うのをやめて必要なところで
#define するようにする。
adrsmap.h 程度の中身なら copyright
の問題はないと思うが、いちいち許可をもらうのもめんどくさいし。
tt0 で map
するようにしたら pmap.c で PG_CI
つけなくてもよくなった、って書いてたけど、
実は大ウソ。
#endif
を挿入する位置間違えてる。これじゃ結局常時 |= PG_CI
されてるじゃねーか。
objcopy が
a.out-newsos3 の BFD target が作れるよう用意して下さい。
;-)
;-p
tt0 も 68020 じゃ使えないのか?
adrsmap.h とかまずいかも。
machid.h は newsmips と同じだから OK。
zs まわり確認。妙に文字落ちするような気がするが sun3
も一緒か?
kb はいいけど fb
はディスプレーどころかケーブルすらないからなあ…
COMPAT_NEWSOS。が、これは Lite2 見て newsmips
から始めるべき?
CTRL_RAM
ってのもあったな。
isdn, lpt, vme 等々…
locore.o
からするともしかして 68851 PMMU じゃなくて独自 MMU なのか?
0xc0000000 とか 0x40000000
とかの物理アドレスにマップしたらどうなるか試してみる。
boot0 を見直す。確かに
trap #0 で ROM を呼び出してる感じ。
/boot
を objdump で逆アセンブルしてみる。
boot0 を確認してみる。
"objdump --disassemble-all --architecture=m68k
-b binary boot0" で出てきた。
pcscp
の時はまだ自分で考えたコードがあったというのに。このままではいけない。
sys/dev/ncr53c9x.c とか
newsmips/dev/scsi_1185.c, newsmips/dev/sc_wrap.c
あたりから見ていくか。
sys/newshbdev/screg_1180.h
くらいか。
pmove a2@,tc の MMU on
前後にいろいろコードを書いてみる。
CTRL_CACHE_CLR をたたくのはすでにやっているがダメ。
PG_RO
なので無理ということに気づかず悩んでしまったり。
_o_
PG_CI
つけてないとダメ、って書いてたけど実はそうではなかった。
pmap_bootstrap() での data/bss 他の pte 設定は
protopte = (protopte & ~PG_PROT) | PG_RW;なので kernel text で
PG_CI
つけてたらそのままこちらも PG_CI ついてしまう。
PG_CI つけてないとダメなようだ。
illegal instruction
で、data/bss/pte の場合は MMU fault。うむ。
0xdeadbeef ってなにか意味あるのか?
pmap_enter() でも
PG_CI つけてないとまともに動かなかったのだが……
tt0 でマップするようにしたら
PG_CI つけなくてもよくなった、ってのも変。
PG_CI を指定していた。
CTRL_PARITY とか CTRL_RAM とか関係あるのか?
PG_CI
なしでも変わりなく動いてるとのこと。
pmap_bootstrap()
の中で全メモリリードとかしていたが、ホントは MMU on 直前にすべきか?
;-p
pcscp は結局書いたの frontend だけだったしなあ。
mountroot() の rarp request が出てきたとの報告。
le0 がおかしくなる。
0x800xxxxx と 0xc00xxxxx
のアドレスの使い分けが関係あるのか?
"level 3 interrupt"
の件は fdc からの割り込みが原因らしい。
fd.c を書いてみようか。
i386/isa/fd.c とか sun3/dev/fd.c
とかいろいろあるけど、どれがわかりやすいかな。
fd の fdc/fd 分離および MI/MD
分離とかいう話はどうなってるのかな。
sendmail.cf で指定したのと違う smtp server
に投げに行くけどこれってこっちの設定か? 向こうのせいなのか?
CACHE_CLR をいろんなところでたたいたり
MMU on 後 longjump させてみたり。
PA!=VA
でいろいろ細工してるから 2次キャッシュつきでも動いてるとか…
PG_CI つけてごまかしてると動くしなあ。
locore.s の最初の方の
2次キャッシュ制御ポートのいじり方を変えてみる。
PG_CI
をはずしてると何やってもダメそう。
PG_CI つけててもたまに le0
が変なのか yp まわりがおかしくなる。
tt0 使用バージョン kernel を PWS-1560
でテストしてもらうが、変化無しとのこと。
INT_STATUS を確認するのが先かな。
PG_CI
問題をもう少し調べてみる。
pmap_bootstrap() 中の kernel text の
PG_CI を外してみる。
PG_CI を外してみる。
top も走らせておく。
panic()
したけど、これって単に nfs 先の swap がおかしくなっただけのような気も…
config.guess に news68k 追加して
./configure && make bootstrap
仕掛けてちょっと外出。
"nfs_timer: ignoring error 64"
と叫び続けている。
PA == VA としてアクセスするようにするもの。
xpdf
とかでも出てこないから、元から入ってないらしい。
0xe0000000〜0xe1ffffff
まで、アクセスは read/write とも、 cache は inhibit。
FC_BASE=5, FC_MASK=0 とする。
locore.s にコード追加。
tc レジスタの設定の直前に tt0
の設定を入れる。コードはこんな感じ。
RELOC(protott0, a0) movl #0xe0018550,a0@ pmove a0@,tt0
as に tt0
なんぞ知らん、と怒られてしまう。おい。
tt0 は 68030 のみなんだっけ?
binutils-2.9.1 の gas がいるのか?
sun3/sun3x/locore.s
で tt0 使ってるところがある。
".long 0xf0100800"
でいいらしいのでそうしておく。
tt1
はどうなんだろ。まあこれは後回し。
news68k/machdep.c の中の IIOV()
マクロを削除して make して起動。
trap() も起こることなく立ち上がる。よさそうね。
"nuke IIOV() macros" 行動開始。
news68k/dev 以下の
clock_hb.c, zs.c, if_le.c の各ファイルを修正して起動。
zstty1 の attach
が終わったところで沈黙してしまう。何度やっても一緒。
clock_hb.c で IIOV()
復活させたらちゃんと起動する。
clock_intr() 中の次の部分。
/* Pulse the clock intr. enable low. */ *(char *)IIOV(CTRL_TIMER) = 0; *(char *)IIOV(CTRL_TIMER) = 1;
sun3/sun3x/clock.c ほぼそのまま。
NEWS-OS では "sf CTRL_TIMER; st CTRL_TIMER" って感じ。
IIOV() 削除した上で上記
2行の間に DELAY(1); を入れてみる。
tt0 が使えるようになったので、これで
PG_CI 問題が変化するか確かめてみる。
pmap_enter() で無条件に "npte |= PG_CI"
してたのを元に戻す。
PG_CI 外す前と dhrystone
の結果が変わらないような気がするがそんなものか?
pmap_bootstrap() 中の kernel と pte
その他のページにつけている PG_CI をはずしてみる。
configure()
以前でぼとぼと落ちる。
zs を確認してみる。
zs_attach() 中で
cs->cs_defspeed
にどんな値が設定されているか printf() で確認する。
zstty0 は 11815
なんて数字が出てくる。
zstty1 は zs_defspeed そのまま
9600 と出てくる。
zs.c では PCLK は newsmips
と同じ 4.9152MHz に設定している。
4.9152×(9600/11815) の 4MHz
くらいという推定が成り立つ。
9600×416
の 3.9936MHz だろう。
PCLK として設定。
getty 正常に起動。よしよし。
telnet が死んで終わってしまっているが、
setiathome も 0.3% までは進んでたようだ。
setiathome 再起動して出社。
libero-% uptime 9:42PM up 19:12, 1 user, load averages: 2.26, 2.06, 1.79 libero-% ps -u USER PID %CPU %MEM VSZ RSS TT STAT STARTED TIME COMMAND tsutsui 248 25.0 36.5 14556 5960 p0- DN 7:58AM 333:45.17 ./setiathome tsutsui 324 3.5 3.3 512 524 p0 Ss 9:40PM 0:01.26 -csh (tcsh) tsutsui 394 0.0 1.1 252 156 p0 R+ 9:42PM 0:00.20 ps -u libero-% pstat -s Device 1K-blocks Used Avail Capacity Priority /swap1 32768 7308 25460 22% 0 /swap 16384 9344 7040 57% 0 Total 49152 16652 32500 34% libero-%
PG_CI
付きでは動くけど、なしだと動かない理由はわからないまま。
zs が腐るのと PWS-1560 での割り込みか。
setiathome
の途中結果が消えちゃってる。
pmap.c の pmap_enter()
で常に npte |= PG_CI するようにしてみる。
#310 か。
#1078 になってた。
telnet
は問題なし。
ping には反応し続けている。どうなってるのか?
telnet して top
で調べると……結構調べられちゃうところだけでも大した進歩かも。
cron の負荷がいつまでも減らないが、
setiathome も動き続けている感じ。
PG_CI で状況は変化するということか。
ld.*so
とかで必要だよーん、とメールをもらう。
libexec/ld.aout_so/arch/m68k/mdprologue.s
とか見ると trap12 で
cachectl1() を呼んでいる。
sysnews.o の cache
まわりは気にしなくてもいい、ってことですね。
_o_
zs の attach の後で "level 3 interrupt."
が表示され続ける、とのこと。
printf()
と status read を追加したような気もするが…
PG_CI 有無では動作に違いはなさそうに見える、とのこと。
pmap.c でもすべて PG_CI つけてみるか?
intr.h
で spl*() をすべて spl7() すなわち
splhigh() にしてみる。
_spl() と
_splraise() の違いもよくわかってないんだけど…
PG_CI ありとなしの kernel を改めて作る。
configure() までたどり着けない。
_o_
sysnews.o は NEWS-OS で man sysnews
すれば載ってるよ、と曽田さんに言われたのを思い出して確認してみる。
NEWS_CACHECTRL と
NEWS_CACHFLUSH。
NEWS_CACHECTRL
Declare whether to use cache in the specified area
(in the unit of a page) or not. This is effective
only on those machines utilizing an MC68030 as the
main CPU, but ignored on those utilizing an
MC68020.
The format is as follows:
sysnews(NEWS_CACHECTRL, addr, count, cacheable)
NEWS_CACHEFLUSH
Flush the instruction cache or data cache in the
specified area. For those machines utilizing an
MC68020 as the main CPU, this is effective only if
FLUSH_ICACHE is specified; if FLUSH_DCACHE is
specified, this is ignored.
The format is as follows:
sysnews(NEWS_CACHEFLUSH, addr, count, whichcache)
m68k_sync_icache(2)
ってのはできてたな。
const char 配列に入れてたけど、
newsmips/machid.h にあるように ID には隙間が多い。
hp300/hp300/machdep.c の
struct hp300_model を真似して
struct news68k_model を定義して ID から
Model 名を引くようにする。それでも数多いけど。
locore.s 中で ID 調べて
news700/800/1200/1700/1800
のいずれのクラスのマシンか判定する必要があるんだけど…
zs
の attach まで終わった後で沈黙、とのレポート。
confiugre() は終わってるようだけど
mountroot() までたどり着けない、って感じかな?
cpu_initclocks() 中の printf()
は実行されてない。
tcpdump で見ても le0
からは何も出てないとのことなので
zs が死んだだけというわけでもなさそう。
spl0() したところでダメになっているのか?
PG_CI
つけたのとつけない場合で変化あるか見てもらえばいいかな。
PG_CI
なしだとやはり configure() にたどり着けないことが多い。
"starting local daemons:." のあと、遂に getty
起動! ……かと思いきや console がぐちゃらけてしまった。
zs のボーレート設定かどこかがおかしいのか?
telnet
では外から普通に login できてしまう。
su して
/etc の下のファイルを
vi で設定してまわったりして。
statclock()
まわりがまともになったせいか、結構いろいろまともに動く。
ls とかだけでなく dynamic link なバイナリもちゃんと動く。
termcap を用意してやると
vi も使えて rc.conf
の編集もできちゃったりして。
"building databases..."
のところで le0 が死んでしまったようで
nfs server not responding で止まってしまう。
"copying out path `/sbin/init' 11" のあと
"uvm_fault(0x8b9c4, 0x27e000, 0, 0x1) -> 0x1" で落ちる。
0x8b9c4 は kern_malloc.c の
free() の中の btokup() マクロのあたり。
malloc.h で定義されている。要は
kmemusage[] の中身を読もうとして失敗している。
"le0: dropping chained buffer"
が出ることも多い。
ping には反応するがコンソールがダンマリになったり。
nfs_lookup() の中で落ちる。
nfsm_fhtom() のマクロの中か?
0x7cd94 で trap 1。
syscall() の最後の rts。
0xabababab
になっているようだ。
panic() 時の Kernel stack trace では
0xabababab に交じってまともそうな数値も入っているが…。
0x7a004 で
pmap_enter() の中。
pmap が 0x46fc2700 なのが悪いらしい。
pmap が悪いのか…
PG_CI
をつけた時とつけない時とではやはり落ち方が違う。
PG_CI なしの場合は configure()
が始まる前に落ちる場合がある(いつもではない)。
PG_CI
をつけている場合は、少なくとも mountroot() までは進む。
statclock() で落ちる原因。
clock.c の中で
stathz を初期化せず 0 のままにしてる場合に
statclock() で落ちているようだ。
stathz
は hz と同じ 100 に設定されている。
stathz
は 0 にしないといけない。
stathz が
100 になってた ようだ。
statclock()
はどこからも呼ばれないので落ちなかっただけらしい。
statclock() で落ちる直接の原因は
前に書いたとおり。
/sbin/init が起動する前だから
curproc == 0 なのは問題ない。
/sbin/init も動いてないのに
CLKF_USERMODE(frame) が真なのが変、とのこと。
statclock() ひいては
hardclock() の引数の frame
の出どころを調べる。
hardclock() は news68k/dev/clock_hb.c
に書いた clock_intr() から呼ばれる。
sun3/sun3x/clock.c から持ってきたそのまま。
clock_intr() は locore.s
の _isr_clock() のハンドラから呼ばれる。
_isr_clock() も sun3 から持ってきている。
locore.s の
_isr_clock() では引数としてスタックになにも積んでいない。
sp
トップに積まれている値を改めてスタックに積んでいる。
(struct clockframe *)
だが sun3 では構造体そのものが引数。
cpu.h の struct clockframe
の定義からして違う。ハードで細工してるのか?
INTERRUPT_SAVEREG
でスタックに積んだ分も struct clockframe に含めてるのか。
locore.s
で引数をスタックに積むようにする。
news68k/dev/clock_hb.c 中の clock_intr()
の引数もポインタ渡しに変更。
stathz == 0 の状態で
statclock() は動いてるようだ。
"le0: dropping chained buffer"
と怒られて IP が取得できない。
news68k/include
以下のファイルを見直してみる。
intr.h
の定義とかはともかくあんまり本質的なのはないような…
proc.h で MDP_STACKADJ
が hp300 と mvme68k で違うのはなにか意味があるのだろうか。
param.h の UPAGES も
2 だったり 3 だったりするが…
PG_CI をつけてもダメ、って書いたけど、
PG_CI 付きと無しの kernel を同時に置いて
2つ交互に立ち上げてみると PG_CI
付きの方がなんとなく長持ちしているような…
locore.s いじりすぎか?
pmap_bootstrap.c ですべての
pte に PG_CI をつけてみる。
kern_clock.c の 925行目あたり、
statclock() で curproc == 0 なのに
CLKF_USERMODE(frame) が真になってて
p->p_uticks++; で落ちるというもの。
mountroot() までたどり着いてから早10日。
pmap_bootstrap()
中で全メモリリードとかしてもダメみたいだから、
キャッシュは関係ないのだろうか。
locore.s
の始めから一通り見直した方がいいのだろうけど、
この中途半端な状態ではいまいちやる気が出てこない。
MMU fault だの illegal instruction
だの bad kernel access だのいろいろ言われるとなんだかもう。
0x0
番地から memory 量その他の値が格納されてるみたいなのだが…
locore.o の _start
中にはそんなとこに書き込むコードはない。
vmunix は magic 410 だが
"objcopy -O a.out-newsos3" の吐くコードの magic は 407。
file(1) で調べると "pure"
がつくかつかないかの違い。
locore.s 中で
vbr と sp に 0xc00xxxxx
のアドレスを入れている。
crp, tt0, tt1, tc 辺りには
0x000xxxxx のアドレスを入れている。
KERNBASE は
0x80000000。この辺なにか意味はあるのだろうか。
CACHE_CTRL の 0xe1300000
に何か書き込んでから boot すると "Boot error 4"
が発生する。
locore.s の先頭で "st 0xe1900000"
はしてるけど、それだけでは足りないのか。
locore.s をいじってしまう。
CTRL_CACHE_CLR の 0xe1900000 は
locore.o の dcia() 等何か所かで使われている。
CTRL_CACHE の 0xe1300000 は
locore.o の _start の最初で一回
"st 0xe1300000" されてるだけ。
"Enable Internal Inst/Data Cache"
と言うだけ。
locore.o
中に icia(), dcia(), cache_ctrl() がある。
cache_ctrl() は引数を cacr
レジスタに入れるだけ。
icia(), dcia() はそれぞれ I-cache/D-cache を
flush している。
"st 0xe1900000" してるだけ。
locore.o 以外では
machdep.o くらい。
cacheflush() と
cachectrl() の二つ。
cacheflush() は引数に応じて icia() と
dcia() を呼んでるだけ。
cachectrl() は長くていまいちよくわからん。頑張れば
discompile できなくもなさそうだが…
vtopte() を呼んで、いろいろ bit test をしては
dcia(), icia() を呼んでたりする。
cachectrl() がどこから呼ばれているのかも問題だが、
やはりめんどい処理が必要なのだろうか。
machdep.o の startup() も眺める。
"Enable Internal Inst/Data Cache" を表示するのは
startup() から呼ばれる initcpu() の中。
cache_ctrl() を呼んで cacr
を設定してるだけな感じ。
cacheflush(), cachectrl() の symbol があるのは
sysnews.o の中。
cacheflush() しか参照されてないみたいだが…
sysnews() は machine dependent
な処理をまとめてテーブルで処理してるのか?
sysnews() で検索しても引数がわかんないとつらそう。
pkgsrc/cross の下に m68k-netbsd
をでっち上げる。
BINUTILS_GNUTARGET と TARGET_ARCH に
m68k-netbsd を set。
BINUTILS_LDEMULATION に m68knbsd を set。
binutils
がちゃんとできてないようなので、現状の cross 用 binary
を使うようにする。
make install して、
cross make script で cc は pkg の egcs, binutils
は手持ちの cross binary を参照するようにする。
0〜0xfff までの
firstpage の部分だが…
pmap_bootstrap.c で pte の 0 clear
をしないようにする。……変化なし。
pmap_bootstrap.c で全メモリを 0 clear
する。……改善の兆しなし。
locore.s の中で movew #PSL_LOWIPL,sr
してたのを configure() の最後で spl0()
する。……効果なし。
locore.s 中の BSS clear を削除。……ダメ。
COMPAT_LINUX でもやり始めようか。
locore.s や pmap_bootstrap.c
をちょこちょこいじって試す。
pmap.c の pmapdebug
をすべて有効にして様子を見てみる。
pmap_enter()
していく途中でおかしくなっているようにも見えるが、
printf() でおかしくなっているような気も…
pmap_init() 前でもおかしくなる。
printf(version) が動き出す前にいきなり
monitor に落ちてしまう。
locore.s も pmap_bootstrap.c
も他の m68k とくらべ変なところはないと思うのだが…
"grep CACHE_HAVE_PAC /sys/arch/hp300/*/*" してみる。
hp300/sys_machdep.c
の cachectl1() だけ。
pmap.c の pmap_procwr() から呼ばれる。
news68k/include/cpu.h の定義を
#define CACHE_HAVE_PAC に変更。
locore.s の ectype を EC_PHYS
に変更して PCIA() に 2次キャッシュクリアのコードを追加。
zs の echo back
が返ってくることが多くなったような気はするが…。よくわからん。
"starting system logger"
まで進んだぞ? なんだ? これも確率の問題なだけか?
ypbind まで起動した。
/usr/lib の下を展開し忘れている。しまった。
/usr/lib
以下を用意してやると、さらに徐々に進んでいく。
"clearing /tmp" のあとあたりで panic()。
NEWS> bo /3
Boot0 (NEWS-OS 4.2) loading hd(0,0,0)boot
Boot (NEWS-OS 4.2, news1700)
: hd()/netbsd
548696+26004+110408 start at 0x00001000 (magic 0407)
Copyright (c) 1996, 1997, 1998, 1999
The NetBSD Foundation, Inc. All rights reserved.
Copyright (c) 1982, 1986, 1989, 1991, 1993
The Regents of the University of California. All rights reserved.
NetBSD 1.4 (LIBERO) #173: Sun Jun 6 19:37:49 JST 1999
tsutsui@mirage:/usr/src/news68k/sys/arch/news68k/compile/LIBERO
SONY NET WORK STATION, Model NWS-1750, Machine ID #10557
real mem = 16756736
avail mem = 13197312
usbbing 409 buffers containing 1675264 bytes of memory
mainbus0 (root)
hb0 at mainbus0
le0 at hb0 addr 0xe0f00000 ipl 4: address 08:00:46:00:35:36
le0: 8 receive buffers, 2 transmit buffers
clock0 at hb0 addr 0xe0d807f8 ipl 6: Mostek MK48T02, 2048 bytes of NVRAM
clock0: delay_divisor 82
zsc0 at hb0 addr 0xe0d40000 ipl 5 vect 64
zstty0 at zsc0 channel 0 (console)
zstty1 at zsc0 channel 1
hz=100, stahz=100, profhz=100
boot device: <unknown>
nfs_boot: trying RARP (and RPC/bootparam)
nfs_boot: client_addr=0xc0a81409 (RARP from 0xc0a81408)
nfs_boot: server_addr=0xc0a81408
nfs_boot: hostname=libero
root on diamante:/export/NetBSD/news68k/root
WARNING: bad date in battery clock -- CHECK AND RESET THE DATE!
/etc/rc: Can't open /etc/rc
Enter pathname of shell or RETURN for sh:
#
#
# ls
altroot dev home mnt proc sbin swap tmp var
bin etc kern netbsd root stand sys usr
# ps
PID TT STAT TIME COMMAND
ps: warning: /var/run/dev.db: No such file or directory
5 ?? Ss 0:00.39 -sh
7 ?? R+ 0:00.22 ps
# df
Filesystem 512-blocks Used Avail Capacity mounted on
diamante:/export/NetBSD/news68k/root 2062354 1381700 577536 70% /
# halt
halt したあとでそのまま固まっててそこでおしまい。
#173 か。ま、そんなもんでしょ。
wdc,
adv に
pcscp と遊びまくった macppc は現在 #485。
adv と言えば、
先日の修正 が
commit された。
[...]
trap type 1, code = 0xa64d, v = 0xabababab
kernel program counter = 0x7db0a
pid = 1, pc = 0007DB0A, ps = 2000, sfc = 1, dfc = 1
Registers:
0 1 2 3 4 5 6 7
dreg: 00000000 00000004 ABABABAB ABABABAB ABABABAB ABABABAB ABABABAB 00000000
areg: 0065F000 0065D2A4 ABABABAB ABABABAB ABABABAB ABABABAB ABABABAB FFEFFD74
Kernel stack (0065FEC4):
65FEC4: 0007D4C6 0065FF10 00000080 ABABABAB ABABABAB ABABABAB ABABABAB ABABABAB
65FEE4: 00000000 ABABABAB ABABABAB ABABABAB ABABABAB ABABABAB ABABABAB 00001320
65FF04: 00000001 0000A64D ABABABAB 00000000 00000004 ABABABAB ABABABAB ABABABAB
65FF24: ABABABAB ABABABAB 00000000 0065F000 0065D2A4 ABABABAB ABABABAB ABABABAB
65FF44: ABABABAB ABABABAB FFEFFD74 00000000 20000007 DB0AB00C CEEEA64D 286E0000
65FF64: 0065FFAC 0065FFAC FFFFFF0D 4E754E75 ABABABAD ABABABAD ABABABAD ABABABAB
65FF84: 4E56FF0D 000FF07C FFFFFF0D ABABABAB 00003C7C 00000000 80200000 ABABABAB
65FFA4: 00002000 00000004 0065FFAC ABABABAB ABABABAB ABABABAB ABABABAB ABABABAB
65FFC4: ABABABAB ABABABAB ABABABAB ABABABAB ABABABAB ABABABAB ABABABAB ABABABAB
65FFE4: ABABABAB ABABABAB ABABABAB ABABABAB ABABABAB ABAAABAB ABABABAB
panic: Address error
trap type 1, code = 0xf64d, v = 0xabababab
kernel program counter = 0x7e48e
trap during panic!
[...]
0xabababab ってのは monitor が起動時の memory test
で書き込む値。
m68k/m68k/cacheops.c まわりの削除。
files.news68k 直して、
#include <m68k/cacheops.h> を足したものを削る。
hp300/locore.s から TLB/cache flush
まわりのコードを持ってきて、 cpu.h に prototype 追加。
#ifdef M68040 の部分は鬱陶しいので削る。
#if defined(M68K_MMU_HP) の部分のうち、
2次キャッシュに関する部分は残し、 HP MMU 自身の操作については削る。
"do not ask me, this is how hpux does it"
なんて書いてあったりしてよくわからんところもあるが…
#ifdef DEBUG の中で
jne _C_LABEL(_TBIA) してたりするが…
pmap.c はまだだけど、ひとまず make してみる。
pmap_bootstrap.c でキャッシュ制御ポートの
VA を locore.s 内の変数に代入しておく。
panic()
の仕方とかはあんまり変化してないような…
panic() 中にたまに hang して
monitor までたどり着けないことがあるような気がする、って程度か?
ICIA() で
2次キャッシュクリアしてないみたいだけど、いいんかいな。
locore.o では dcia(), icia()
とも on-chip キャッシュをクリアしているように見える。どっちが正しいんだ?
ICIA(), DCIA()
それぞれ直して試してみるが、特に変化ないようだ。問題の本質ではないのか?
pmap.c 周辺も直してみる。
pmap_bootstrap.c で pmap_aliasmask
を設定。機種判定はひとまずおいておく。
news68k/include/cpu.h で #ifdef news1700
の時 #define HAVE_VAC する。
pmap.c の #ifdef M68K_HP_MMU
を #ifdef HAVE_VAC に置き換える。…のでいいのか?
firstpage
ってのの扱いがよくわからん。
"C" を表示したところでいきなり
panic()。がっくし。
panic()
するタイミングが早くなる。
panic() の時の stack trace を見ると、
表示される pc と code の中身が実際の
kernel の中身と違う。
"/etc/rc: Can't open /etc/rc"
の表示が。そういえば /etc/rc 消しといたんだっけ。
"Enter pathname of shell or RETURN for sh"
が引き続いて表示される。これを見るのは初めてだな…
panic() しないのか、と RETURN
を叩くと、なんと! echo back
が返ってくるではないか! おおおっ!?
zs は無実なのか? そうなのか?
…などと動揺していると、なんと今度は
"#" の /bin/sh prompt が!!
ls と打ってみる。…が、反応がない…
ping
の反応が変とかいろいろ問題はあるが、動く時は動くということか。
printf() 動作 & mountroot()
到達おめでとう mail をもらう。
printf()
が動いた感動」をわかってくれる人って世の中ほとんどいないんですよねぇ、
とかやりとりしたり。
/sbin/init
が立ち上がって sh が動きそうなところまでは行く。
"Automatic boot in progress: starting file system checks."
が表示されたりする。
ping を打ってみると、普通に反応する時と
5秒くらい沈黙してまとめて返事してくる時とがある。
MMU fault だの uvm_fault
だの illegal instruction だのが出始める。
configure()
が始まる前にすでにおかしくなってしまう。
panic() する度に RESET
するのがなんだかめんどくさくなってきた。
locore.s の doboot() に
monitor に飛ぶコードを追加。
d7 に
0x08 を入れてみる。
panic() してくれる。
"rebooting..." の表示の後、見事
"NEWS>" のプロンプト登場。完璧と言えよう。ほほ。
pmap_bootstrap.c から見直す。
pagezero
や last kernel PT page の処理。
panic()
したりと変だが、ひとまず mountroot()
より前で変になることはなくなったような…
identifycpu() 中の
Model ID → Model 名変換のコードを復活させてみる。
machdep.c やら vm_machdep.c やら
pmap.c やらの上記 hp300 quirk 処理を探す。
cacheops.c は使えなくて
hp300 のように locore.s に TBIA()
やらを書いて…
pmap.c と pmap_bootstrap.c も直して…。
HP_MMU のキャッシュ操作を news68k 用に置き換えて…
port-news68k.html
のサイズがいつの間にか 100kbyte を超えている。
printf()
動いた記念というわけでもないが、ページのスタイルをいろいろ手直しする。
jweblint かけてみたり lynx でも見やすいように変えてみたり。
uvm_fault の中に表示されている
0xe1c00000 ってのは IDROM のアドレス。
identifycpu() の中で
IIOV() 足すの忘れてるだけ。
identifycpu() の中で
panic() もせず沈黙してしまう。
/sys/dev/ic/ncr53c9x.c
を真似して書いているのだがいけないのか?
hb0 at mainbus0 の後で panic()。
badaddr() の中。
news68k/dev/ 以下で badaddr()
使ってるところ調べると if_le.c で IIOV()
が余計についてた。
clock0 の attach
最中に set_vector_entry() で panic()。
mountroot()
まで進んだみたいだぞ。
cngetc() についても動いてるってこと。
"options NFS_BOOT_BOOTPARAM"
をつけてなかったのでつけて作り直す。
tcpdump で確認するとちゃんと
RARP request 出してるようだ。えらい。
NEWS> bo /3
Boot0 (NEWS-OS 4.2) loading hd(0,0,0)boot
Boot (NEWS-OS 4.2, news1700)
: hd()/netbsd
559068+26168+110524 start at 0x00001000 (magic 0407)
Copyright (c) 1996, 1997, 1998, 1999
The NetBSD Foundation, Inc. All rights reserved.
Copyright (c) 1982, 1986, 1989, 1991, 1993
The Regents of the University of California. All rights reserved.
NetBSD 1.4 (LIBERO) #96: Thu Jun 4 19:02:18 JST 1999
tsutsui@mirage:/usr/src/news68k/sys/arch/news68k/compile/LIBERO
SONY NET WORK STATION, Model Id 13, Machine ID #10557
real mem = 16760832
avail mem = 13193216
using 409 buffers containing 1675264 bytes of memory
mainbus0 (root)
hb0 at mainbus0
le0 at hb0 addr 0xe0f00000 ipl 4: address 08:00:46:00:35:36
le0: 8 receive buffers, 2 transmit buffers
clock0 at hb0 addr 0xe0d807f8 ipl 6: Mostek MK48T02, 2048 bytes of NVRAM
clock0: delay_divisor 82
zsc0 at hb0 addr 0xe0d40000 ipl 5 vect 64
zstty0 at zsc0 channel 0 (console)
zstty1 at zsc0 channel 1
boot device: <unknown>
nfs_boot: trying RARP (and RPC/bootparam)
printf() 使えるので結構余裕かましてたりして。
le の割り込みハンドラを用意する。
machdep.c を開いて newsmips/newsmips_trap.c
の真似して status register を見て leintr()
を呼び出すようにする。
stray intr
とか文句をいいながら RARP での IP address 取得には成功。受信してるぞ。
/etc/bootparams
直して、んでもう一回起動。
stray intr がやたらと出るので見にくいが…
"init: copying out path /sbin/init 11" は出た。
trap2 で落っこちた。場所は
mi_switch() の中か?
printf()
の出し方をなんとかしよう。
identifycpu()
あたりで落っこちるようになってしまった。
panic: pmap_enter_ptpage: can't get KPT page
とか出るし。
panic: pmap_init: bogons in the VM system!
とか言われることが多いような…
make clean して make し直してる間
NWS-1750 の電源切っておいて次に起動したら立ち上がったぞ。
[...前略...] zsc0 at hb0 addr 0xe0d40000 ipl 5 vect 64 zstty0 at zsc0 channel 0 (console) zstty1 at zsc0 channel 1 boot device: <unknown> nfs_boot: trying RARP (and RPC/bootparam) nfs_boot: client_addr=0xc0a81409 (RARP from 0xc0a81408) nfs_boot: server_addr=0xc0a81408 nfs_boot: hostname=libero root on diamante:/export/NetBSD/news68k/root root time: 0x3757d9f1 WARNING: bad date in battery clock -- CHECK AND RESET THE DATE! init: copying out path `/sbin/init' 11 /etc/rc: Can't open /etc/rc
ping には反応する。
/bin/sh も動いてるけど、
zs がおかしくて出力されないってことなのか?
/etc の下やら /usr の下やら用意する。
tcpdump の出力を見ながら
news68k の console の 98note の画面をじっと見る。
"Process (pid 1) got signal 11"
というのがどどどーっと流れ続ける。
zs
をちょっと真面目に調べてみよう。
PA == VA でよくて、
I/O 空間の map が変ということらしい。
pmap_bootstrap.c を眺めてみる。
00000000 !--------------! firstpa
! kernel text !
!--------------! etext
! " data !
!--------------! edata
! " bss !
!--------------! kstpa
! kernel !
! seg. table !
!--------------! kptpa
! kernel !
! page table !
! (sysptpage) !
! ---------- ! iiopa
! (IO space) !
!--------------! kptmpa
! ptmap !
!--------------! lkptpa
! last kpt !
!--------------! p0upa
! proc0 u-area !
! !
!--------------! avail_start
! !
! !
:
! !
! !
!--------------! avail_end
! msgbuf !
0xxfc000 !--------------! maxmem
! PROM work !
0xxfffff !--------------!
0xe0000000 以降から始まる
I/O 空間は PA != VA ですな。これじゃ LED 点かなくて当然。
intiobase から map
されることになるようだ。
0xe0c00000〜0xe1d00000 までを
I/O 空間としてマップしている。
0xe0dc0000 なので
(intiobase + 0x001c0000) を叩けば LED が点灯する。はず。
main()
に飛ぶとこまで進んでるようだぞ。
news68k/dev 以下のドライバは VA == PA
前提のアドレス指定がしてある。config の記述もそう。
news68k/include/cpu.h の IIOV()
マクロでごまかせば何とかなる。
I/O 空間を 256Mbyte も
map してることになる。
tt0, tt1 レジスタを使うべきなのだろうか。
IIOV()
使うように書き換えて main() に飛んだ後どうなるか試す。
locore.s の doboot()
に書いておいた LED のコードが実行されてるようだ。
doboot() を呼ぶのは machdep.c
の cpu_reboot() だけ。
panic() してるのか? ほんとか?
panic() しそうなところと
consinit() まわりをチェックする。
consinit() での DIP_SWITCH
のアドレス指定に IIOV() 足すの忘れている。
NEWS> bo /3
Boot0 (NEWS-OS 4.2) loading hd(0,0,0)boot
Boot (NEWS-OS 4.2, news1700)
: hd()/netbsd
557264+26004+110524 start at 0x00001000 (magic 0407)
Copyright (c) 1996, 1997, 1998, 1999
The NetBSD Foundation, Inc. All rights reserved.
Copyright (c) 1982, 1986, 1989, 1991, 1993
The Regents of the University of California. All rights reserved.
NetBSD 1.4 (LIBERO) #81: Thu Jun 3 20:15:47 JST 1999
tsutsui@mirage:/usr/src/news68k/sys/arch/news68k/compile/LIBERO
uvm_fault(0x8e93c, 0xe1c00000, 0, 0x1) -> 0x1
type 8, code [mmu,,ssw]: 4010755
trap type 8, code = 0x4010755, v = 0xe1c00000
kernel program counter = 0x7b6ec
pid = 0, pc = 0007B6EC, ps = 2004, sfc = 1, dfc = 1
Registers:
0 1 2 3 4 5 6 7
dreg: 00002704 00000052 00000000 00000000 00000000 00000000 00002000 00000000
areg: E1C00000 0009CCD0 FFEFFFFC 000A5A98 000AA000 00000000 000B7F34 FFEFFFFC
Kernel stack (000B7E40):
0B7E40: 0007F47E 000B7E8C 00000080 00000000 00000000 00000000 00000000 00002000
0B7E60: 00000000 FFEFFFFC 000A5A98 000AA000 00000000 00000000 000B7F34 000012F2
0B7E80: 00000008 04010755 E1C00000 00002704 00000052 00000000 00000000 00000000
0B7EA0: 00000000 00002000 00000000 E1C00000 0009CCD0 FFEFFFFC 000A5A98 000AA000
0B7EC0: 00000000 000B7F34 FFEFFFFC 00000000 20040007 B6ECB008 1EEE0755 0200000F
0B7EE0: E1C00000 E1C00000 000AA000 10101010 0007B6F2 0007B6F0 0007B6EE 0009CCFF
0B7F00: 0200FF0D 000FF487 00000000 00000400 E1C00000 FFFFE1C0 20200000 000B7F3C
0B7F20: 00000000 0000007C 000B7F48 000AA000 00000000 000B7F44 0007AEF6 0009CCD0
0B7F40: 000AA000 000B7F78 0007AA18 0008E5D2 000AA000 00000000 00000000 00000000
0B7F60: 00000000 00000000 FFEFFFFC 000A5A98 FFFFF000 000ED000 000B7FAC 00003BBE
0B7F80: 00003B08 00089850 000AA000 00000000 00000000 FFEFFFFC 00000000 000AA000
0B7FA0: 00000000 00000000 00000000 00000000 00000000 000AA000 00000000 00000001
0B7FC0: 00000001 00012214 000BB000 00000000 00001000 FFEFFFFC 00000000 000B7FF4
0B7FE0: 0007A8C6 000BB000 00001000 000AA000 00000000 00000000 00000000 00000000
0B8000:
panic: MMU fault
System halted. Hit any key to reboot.
rebooting...
printf()
動いた! 信じられん。
printf() 動くまで 3か月というのが当初の目標だったけど…
1か月かからずに動いてしまった。
#81 だし。
machdep.o からすると
reboot() も halt() も最終的には同じ
trap15 を呼んでるので、 d7
かどっかのレジスタの引数で halt になるはず…
locore.s
で map されてるけど、それ以外を map しているところを探すと。
pmap_bootstrap() で使う値を設定し間違えている。
VA != PA である。
physmem を pmap_bootstrap()
中で用意しているという違いがあったが、locore.s
で用意しても変わらず。
VA == PA の場合は mvme68k/locore.s
のコメントにあるように単に MMU on するだけ。(なのか?)
VA != PA の場合は hp300/locore.s
のようにいろいろ細工しなきゃいけない。具体的には
VA == PA になるページを用意してそこに MMU on
のコードを書いて実行し元に戻っている。
VA == PA のようだ。 amiga や atari はよくわからん…
srp, crp 両方使ってるが
NEWS-OS では crp のみでほかに tt0, tt1
も使っていてちょっと違う。
vmunix
が再起動してしまった。
binutils を作り直す。
objcopy を使い分けるようなことをしなくても、
configure で
"--enable-targets='m68k-netbsd m68k-sony-newsos4'"
のように複数指定すればいいはず。
Makefile.news68k も objcopy
呼び出すように書き換える。
locore.s で 0番地付近を使わないようにしてみる。
".fill NPBG/4,4,0" を追加。
;-)
とりあえず BSS clear は通過してるようだ。
pmap_bootstrap() も通過している。
fsck
でやたら待たされるのがかなわん。
ex on arm32 を直すのが先か?
de と ex 入れ換え計画か?
それとも fxp 新規導入か?
machdep.c
をひらく。が、やはりいまいちガッツが出ない。ぷぅ。
news68k/compile 以下に移って i386 上で
cross make を走らせる。
-Wall はつけてるけど
-Werror はつけてないので結構危ない warning
見落としてるかも。
Undefined symbol
がこれでもか、と言わんばかりに出る。
locore.s まわりから修正。 locore.s
で使うマクロは assym.h に入れないといけないのね。
genassym.cf を修正。ちょこちょこ。
TBIS() とか DCIS()
とかの TLB/cache 周りの命令。どこに入ってるんだ?
locore.s に入ってるけど
mvme68k では m68k/m68k/cacheops.c のを使ってるのが判明。
files.news68k 直したり
#include <m68k/cacheops.h> 追加してまわったり。
uvm_map.o で pmap_prefer() がないだと。
#ifdef M68K_MMU_HP の中じゃん。
include/pmap.h の
PMAP_PREFER() の定義を削除して解決。
cninit.o で constab がないとか言ってる。
constab[] 使わないことにしたので cninit.c
はいらないという結論。 files.news68k から削る。
machdep.c やらにダミーのエントリ追加。
/netbsd として置いて、
monitor に落としていよいよ起動。どきどき。えい。
NEWS> bo /3 Boot0 (NEWS-OS 4.2) loading hd(0,0,0)boot Boot (NEWS-OS 4.2, news1700) : hd()/netbsd Bad exec file format.
file(1) を使って file 形式をもう一度確認してみる。
"NetBSD/m68k object file not stripped" と出る。
vmunix は
"old SGI 68020 pure executable" と出てくる。
objdump で解釈できるんだから
a.out には間違いないよなあ。 magic の問題だけか?
objcopy に入っている
"a.out-sunos-big" とかに変換してみる。
file(1) が "data"
と表示するようでは無理だわな。
binutils が NEWS-OS
の形式をサポートしてれば問題ないんじゃないか、ということで試す。
binutils-2.9.1 を展開してたディレクトリで
"configure --target=m68k-sony-newsos4" してみる。
gas はダメと怒られたがそれ以外はいけそう。んで make。
objdump 走らせてみると
a.out-newsos3 というのがある。これでいけるか。
"objcopy -O a.out-newsos3 netbsd /tmp/netbsd"
として変換。
NEWS> bo /3 Boot0 (NEWS-OS 4.2) loading hd(0,0,0)boot Boot (NEWS-OS 4.2, news1700) : hd()/netbsd 595248+27552+116228 start at 0x00000000 (magic 0407) Boot0 (NEWS-OS 4.2) loading hd(0,0,0)boot Boot (NEWS-OS 4.2, news1700) : hd(0,0,0)/vmunix 943812+242952+307752 start at 0x000019e8 (magic 0410) [以下略]
vmunix
が勝手に起動してしまった。何が起こってるんだ?
vmunix は最初の 0x0 から
0xf00 までは 00 で埋められている。
NEWS-OS と同じく KERNBASE を
80000000 にしとかないといけないのか?
adv
の初期化が arm32 でうまくいかない件をまた調べ始める。
advansys.c とか advlib.c
とか取ってくる。
adv は CAM
化されたものしかないのでどうかなと思ったが、元は同じ
Linux のがベースのようだ。
adv って wrapper
かましただけというか、関数名とか構成とかは実はかなり Linux なまま。
(u_int16_t *) でアクセスして、 padding
の部分は if 文でカウンタの値見て飛ばすというヒドイことをしていた。
_ で区切るのが正当だよなあ。
adv_init()
の先頭で reset_chip_and_scsi_bus() を呼んでいる。
AscInitFromEEP()
の中で呼んでるけど、なんか呼んでる順番が違う。
AscInitFromEEP() の先頭でも
AscResetChipAndScsiBus() を呼ぶようにしてみる。
adv の動作を確認。うん、よさそうだな。
adv の作者の
Dante さんにメール。
adv の big endian
対応でさんざんやりとりしたので send-pr より早いはず。
machdep.c をひらく。
consinit()
いじったところでもう頭が動かなくなる。ぷー。
vector.s を直す。
locore.s。 hp300 とか sun3 とか見ながら
handler 追加。こんな感じでいいのかしら。
machdep.c に入れたけど、
I/O address は機種毎に違うから、本来なら判別は mvme68k みたいに
locore.s ですべきなんだよなあ。めんどくさ。
news1700 に決めうち。
pmap_bootstrap.c にも EIO 処理追加。
hp300 のを見ながら直す。
isr.c にも isr_add_custom() 追加。
sun3/sun3/isr.c から copy して変数名だけちょっと調整。
"XXX - could just kill these..."
とか書いてあるけど、実はこれあまりよろしくないのか?
machdep.c はちょっと大変だから明日帰ってきてからだな。
binutils-2.9.1 をちゃんと作ってみる。
LIBTOOL のとこだけ直す。
patch-a[degh] をあてなければよいようだ。
./configure --target=m68k--netbsd ; make で今度は完成。
:-p
sun3/sun3x/clock.c を見ながら
news68k/dev/clock_hb.c と
news68k/news68k/clock.c を修正する。
pcc
のタイマ設定周りはざっくり削除。
clock の割り込みハンドラで割り込み制御レジスタを
OFF/ON してるのも同じ。
statintr 関係についてもざっくり削除。
leds_intr() とかがある。将来は
LED の制御ってしたほうがいいのかな。
news68k/dev 以下は終わったつもり。
news68k/news68k
以下をもう一度確認したらあとは make するばっか、のはず…
locore.s の割り込みハンドラ
vector.s のテーブル
locore.s, pmap_bootstrap.c での EIO のマップ
isr.c に isr_add_custom() 追加
machdep.c の consinit() まわり
machdep.c に ipl 3,4 の割り込み dispatcher 記述
machdep.c の nmintr()
まわり(前回わけわかんなくなってるので)
On the hp300, physical RAM is always located at the end of the physical
address space. In the hp300 pmap_bootstrap(), the PTEs are frobbed
manually to map the last page of RAM VA == PA.
This is used to provide a trampoline
page that code can execute from when both
the MMU is enabled and disabled :-)
locore.s とか pmap_bootstrap.c
の pa == va の処理は余計なのかしら。
objdump を使うために sun3 を起動。
clock.o を改めてチェック。
startrtclock() はほとんど 1行だけ。
"*(char *)CTRL_TIMER = 1;" みたいな感じ。
objdump を作り直してみる。
binutils-2.9.1 を展開して configure
して make。
$(LIBTOOLS) がちゃんと定義されなくてダメ。うぐ。
m68k--netbsd をデッチ上げて
make。
ld と as
はいらないからいけるはず…と思ったら NFS server の
arm32 が hang してしまう。うがー。
panic() してくれんとなにもわからん。
ex と i386 の de 入れ換えようかな…
ex on arm32 以外にもやることリストはたくさんあるが
news68k 優先でやってるので止まったまま。
adv driver を arm32 で使うと
reboot 後の初期化に失敗する対策 (sync まわりっぽい)
vr driver 使うと MTU 小さくしないと
"transmit aborted" と怒られる原因調査 (i386 でも変?)
ofb.c 分割が必要?)
ncr driver bi-endian 化 (OpenBSD 参照)
COMPAT_NEWSOS の可能性検討 (Lite2 参照)
sun3/sun3x/mk48t02.h
とか見てて重要なことに気づく。
adrsmap.h には CTRL_TIMER
ってアドレスしかないけど、 ON/OFF 制御だけなのか?
clock.o に
startrtclock() ってのがあるけど、 CTRL_TIMER
の 0xe1000000 しかそれっぽいのはない。
clock.h も見てみるが timer
については何もない。うーむ。
LEAPYEAR(year) のマクロが
(((year) % 4) == 0) になってるのは
2100年問題だよなと思ってたのだが…
clock.h には
"good till time becomes negative"
なんて書いてある。そうかも。
if_le.c
を開く。しかしすでに時は 23時をまわってたりして…
if_le.c はほとんど newsmips
そのままで OK。 confargs 直すだけ。のはず…
clock_hb.c。これがまたいろいろわかんないんだけど…。
clock_pcc.c。
clock_pcc.c では 2種類のタイマを設定して
clock_pcc_profintr() と clock_pcc_statintr()
の 2つのハンドラを設定している。
pccintr_establish() している。
mvme68k/dev/clock_pcc.c ではアドレス指定に
struct pcc を使ってるので、これを news68k
用に別の表記に直さないと…。
sun3/sun3x/clock.c と比べてみる。
"This doesn't need to do anything,
as we have only one timer and profhz==stathz==hz."
とのコメント。そうか、 arm32 の起動時にもそんな表示があったなあ。
isr_add_custom() なんて関数発見。
news68k でもこれを用意してやった方がスマートか?
sun3/sun3/isr.c を見てみる。うーむ、
mvme68k/mvme68k/isr.c と似て非なる記述。どうしたもんか。
send-pr を出すことにする。
src/distrib の特定の場所で make obj
してから make すると怒られるというもの。
list 中のカレントディレクトリのファイルの
path に ${CURDIR} を追加するだけ。
src.tgz から distrib
以下を展開して、ざっと眺めてちょいちょいと patch 作成。
;-p
zs.c を書き始める。
x68k/include/z8530var.h
でしてたり、シリアルコンソール時の初期化を自前でやってたりする。
zsc が 2つ以上ある時も割り込みハンドラはすべて
zshard() で同じなのだろうか?
hb.c
とか見直しながら進める。うー、 confargs が…。
zsaddr[] を zs_match()
の中で代入してるけど zs_attach() で設定すべきなような…。
splhigh() とか splzs()
とかしてるけど、これって必要なのかしら。
adrsmap.h にある SCC_STATUS0
のアドレスってなんなのかしら。
news3400/dev/scc.c とか見ればわかるのか?
setsoftserial() の仕様ってどんななんだ?
mvme68k だけ引数が違ってたりするし、また調べないと…。
zscn{get,put}c() で
SCCPORT0A とか使ってるのはイマイチだなあ。
adrsmap.h
をちゃんと分割してしかるべきところで必要な分だけ定義すべき。
if_le.c かな。時間があればだけど。
locore.s にある rei には
"Emulation of VAX REI instruction" って書いてあったりするんだよなあ。
softclock について調べてみる。
IIOMAPSIZE, EIOMAPSIZE だけ確認しておく。
cpu.h, vmparam.h に書いてある。
EIOMAPSIZE は 14Mbyte
とかになってる。がばっと取っても問題なさそう。
EIO のコードは pmap_bootstrap.c
から取っちゃったんだよなぁ。気が向いたら直すか。
softclock がどうなってるかよくわからんが…
jolitz 本やら悪魔本とかちゃんと調べるか。
spl0()
が実行されたあとで、 spl0() が実行されるのは
configure() のあとだから、割り込み書いてなくても
mountroot() までは進むよ」と言われている。
softclock の処理と
I/O 空間の範囲。
0xe0000000 あたりから。この次に出てくるのは
FDC_DMA の 0xe0c80100。
le の 0xe0f00000 まで続く。
0xe1000000 から 0xe1f0000000
までは制御用レジスタやら IDPROM やらが続く。
0xf0000000 以降に fb や
2チャンネル目以降の zs, le
つまり外部スロットの I/O が配置されている。
IIO と EIO
と両方定義して 2か所 map すべきなのか?
fb は今のところ書く気ないから 0xf0000000
以降はほっといてもいいか?
zs について。
zs については mvme68k
のものをベースにしようと決めていたが、中身をちゃんと確認してみる。
mvme68k/dev/zs.c を見てみる。
zs_init_reg[2] の値が vector
値らしいのだが、なぜか "0x18 + ZSHARD_PRI"
などというものが書かれている。
ZSHARD_PRI は 4、つまり ipl の値。
0x18 ってのは level0 autovectored の vector
なので、これは ipl 4 の autovector である。なんでこんな値が?
mvme68k/dev/zs_pcc.c の pccintr_establish()
ではちゃんとした vector 値を渡しているのに…
x68k/dev/zs.c
を調べる。
zs_init_reg[2] の初期値は 0x70。
これは config に書かれている 112 と一致する。
"zs_init_reg[2] = ia->ia_intr;"
と config からの値も代入している。
"Vector is programmed into the SCC by the PCC."
なんてコメントが書いてあった。がく。
pcc 上の zs では
zs_init_reg[2]
の初期値は無意味ってことか。だったら変な値書くなよ。
zs の元のコードの sun3
の記述がそのまま残ってただけらしい。
zs のコードは zs.c と
zs_pcc.c に分かれているというのは
以前書いたとおり。
zs_pcc.c
にあり、レジスタの設定等は zs.c 側の
zs_config() で行なっている。これは問題ない。
zs のコードでは
zs_config() を zs_pcc_attach()
から呼んでいるのだが、これだと config で指定された vector 値を
zs_config() に渡す術がない。
zs_config() の引数の struct zsc
は MD で定義されているので、 zs
が分割されている意味はあんまりないような気がしてきた。
x68k/dev/zs.c ベースでいくか。
ipl 1 は NEWS-OS のバイナリからすると AST
(async TRAP?) の処理となっているが、よくわからないので無視。
ipl 2 はどうも softclock らしい。ハンドラは
autovectored のみ。これには割り込み禁止/許可を制御するポートがある。
ipl 3 は前にも書いたとおり fd, lpt
のほか外部スロット割り込み。ハンドラは autovectored のみ。
ipl 4 も以前書いたとおり le, scsi
と外部スロット割り込み。ハンドラは autovectored のみ。
ipl 5 は autovectored で kb, ms
があり、 vectored で zs がある。
ipl 6 は hard clock。ハンドラは
autovectored のみ。
ipl 7 は parity error。ハンドラは当然 autovectored。
zs については
isrlink_vectored() を使えばよい。途中に
hb_intr_establish() をかますかはひとまずおいておく。
isrdispatch_autovec() は結局使ってなかったりするので、
isr.c は元の mvme68k の形のまま変更しない。
isrlink_autovec() も
isrdispatch_autovec() も使わずに、
machdep.c に ipl 1〜6
のそれぞれに対応する dispatcher を書く。
isr.c が MI
になっても問題ないし machdep.c という名前もあっている。
hb_intr_establish() を定義する必要はないかな…。
zs と screen のように console
になり得るデバイスが複数ある場合の処理がよくわかっていない。
hp300/conf.c のように constab[]
にずらずら書いて hp300/autoconf.c の
hp300_cninit() で選ばせる、ってのが主流だった。
sys/dev/cons.c に定義されてる
cn_tab に代入する、ってのが流行りだと思う。
newsmips/cpu_cons.c
のようにやればよい、と。
newsmips/cpu_cons.c では
console が zs であっても fb
の初期化にいってしまう。
fb
だった場合変なことになってしまうし、そもそも cn_getc()
が用意されてなかったりする。
screen/kbd の類が console の場合は
ROM内 routine を使うのが妥当だろう。
zs
しか使えないのでそもそも関係ないけど。
cpu_cons.c ってのをわざわざ別にする必要はないかな。
machdep.c に入れてしまっていいか。
news68k/dev 以下に取り掛かる。
news68k/dev/hb.c から。
hb.c は autoconf.h
を include している。が、これは struct confargs
の定義だけ。
hb.c では ca_name と
ca_addr しか使ってないようだが…
x68k/dev/intio.c や
mvme68k/dev/pcc.c を見て比べてみる。
intiovar.h, pccvar.h で
intio_attach_args, pcc_attach_args
を定義してそれを使っている。
hbvar.h を作ってそこで
hb_attach_args を定義してそっちを使うことにする。
"#define cf_addr cf_loc[HBCF_ADDR]"
などの定義も書いておく。
ioconf.c や locators.h
を見て仕組みを納得。
autoconf.h は今のところ空にしておく。
autoconf.c は newsmips
から持ってきてるのだが、これは mainbus.c が別にいるようだ。
mainbus.c がない arch の場合は autoconf.c で
mainbus の attach をしてる。
files.news68k も修正。
mvme68k/autoconf.c を見ながら
news68k/mainbus.c を直す。
confargs を使ってるが、
ca_name しか使ってないようなので単に
char * にする。
cpu の表示は machdep.c の
identifycpu() でするのでここでは attach しない。
mvme68k では attach
するデバイスのリストを機種毎に切替えている。
news68k もそうすべきなのか?
iop0 at mainbus0 は必要だろう。
machdep.c の identifycpu()
を直して global 変数を作る。
struct idrom
の構成が違うらしいのだが…。とりあえず無視。
mainbus.c に戻る。ひとまず news1700 の記述だけ用意する。
vme0
という記述があるのだが…
#if 0
でくくって書いておく。
vme の intr_establish
とかってどうなっているのだろう…。上位で mvme68k のまねしとけば大丈夫?
news68k/dev/hb.c に戻ってくる。
x68k/dev/intio.c, mvme68k/dev/pcc.c を参考に修正する。
newsmips/dev/hb.c や mvme68k/dev/pcc.c は
mainbus と同じく attach すべきデバイスリストを持っている。
x68k/dev/intio.c にはそういう定義はない。
mvme68k/dev/pcc.c はリストを順番に見てそれぞれ
config_found() をかけている。
x68k/dev/intio.c はそのまま config_search()
をかけている。ここまではいい。
newsmips/dev/hb.c はリストのそれぞれに対して
config_search() をかけてる。変じゃないか?
config_search() を調べようかと思ったが、それより
newsmips で実際に修正して動かしてみることにする。
hbdevs[] を削って x68k/dev/intio.c
のように config_search() を一回だけ呼ぶようにする。
"hb0 at mainbus0"
を表示したあと沈黙してしまう。
hb_search()
の中で ca_name を設定してなかった。
hb_search() の中に
"ca->ca_name = cf->cf_driver->cd_name;"
を足して再度挑戦。
news68k/dev/hb.c も上記のようになおして一応これで
attach 部分は終わり。
bus_space(9) とか使うようにすべきなのだろうが…。
hb_intr_establish() を考える。
news68k/news68k/isr.c
を作るつもりでいるのだが…
mvme68k/dev/pcc.c は vectored しか使わないので
autovectored で割り込みを assign するコードはない。
hb_intr_establish() の vector
値の引数が -1 だったら autovectored ということにするか。
mvme68k/mvme68k/isr.c の isrlink_autovec()
では、渡された割り込みハンドラを
isr_autovec_list_t というリストに登録している。
isrdispatch_autovec()
ではすべての該当割り込みハンドラをリストの順に呼び出すようになっている。
isrlink_autovec() における登録時に
priority という software
上の優先度を示す数値を渡し、それによりリストの順序を変えているのだ。
newsmips/newsmips_trap.c
と同じように status のみを見て優先度の高い順にハンドラを呼べばよい。
mvme68k/mvme68k/isr.[ch] が m68k/m68k
以下に移動することが前提なのならばそちらを使えるようにしないといけない。
isr.c が MD であるという考え方ならば
newsmips と同じような dispatcher にすればよい。
hb_intr_establish() を呼ぶ意味はなくなってしまう。
zs だけらしい…
if_lance.o を調べてみる。
0xe0e00000, 0xe0f00000, 0xe1c00000
と 3つ。
0xe1c00010
からが MAC address っぽい。
newsmips/dev/if_le.c と同じように各バイトの下位
4ビットずつに計 12バイト入っている感じ。
scc.o。
0xe0d40002, 0xe0d40000, 0xe0f40000 ってとこか。
adrsmap.h
からすると port A/B と status てな感じか。
sys/news1700/adrsmap.h
ってのは NEWS-OS の中に入ってた。がーん。
cache enable
とか必要なものはすべて書いてある。ショック。
files.news68k と config の書式。
"device* at intio? addr ? intr ?"
という形式だがどうすべきか。
"device* at hb? addr ? ipl ? vect ?"
という書式にする。
adrsmap.h によると、 le, scsi
は ipl 4 の autovectored らしい。
locore.o から察するに clock は
ipl 6 で kb, ms は ipl 5 。
zs がわからん。でも vectored
ならばいくつにしたって構わないのか?
config(8)
は通った。よしよし。
news68k/news68k 以下から始める。
HP_MMU
とか M68040 のコードは残しといた方がいいのかしら。
struct idrom の構造が newsmips
と違うじゃねーか。めんどくさー。
configure() の中でやるの?
cpu_startup() でやるの? arch によって違うぞ。
news68k/news68k
以下を一通り修正。 i386 上でえいやと cross-make。
warning は出るものの、一応
news68k/news68k 以下のコンパイルは通った。
news68k/dev の下。しかし今度は
hb_intr_establish() とか書かないといけない。
pcc.c は vectored だけだけど、 autovectored
が混在する時ってどうなるんだろ。
newshbdev/scc.h を見ると spl5
と書いてある。
locore.o の ipl 5
のハンドラは kb, ms しか見てなさそうだから
vectored でいいのかな。
vect についても "#define SCCVEC0 64"
を信用していいのか?
locore.s の _start から main
に飛ぶまでは 2次キャッシュを除いてひとまず分析終わり。
printf() のために zs は必要。
le もいるだろう。
zs.c と if_le.c
を眺める。
leintr() とか zs_intr()
とかは、最終的には newsmips_trap.c から
interrupt status に応じて呼ばれる。
zs を載せている
x68k のコードを見てみる。
GENERIC を見ると NEWS-OS と同じような
intr の数字が書いてある。
x68k/dev/zs.c を見る。割り込みの設定は
intio_intr_establish() で行われている。
intio.c を見る。 intio_intr_establish()
ではベクタに応じて構造体 iiv[] に呼び出す関数と引数を登録。
iiv[] に登録された関数は
intio_intr() の中で呼ばれる。
intio_intr() は locore.s の
_intiotrap から呼ばれる。
_intiotrap は vector.s
に登録してある。なるほど。
GENERIC には
intr の数字がない。
locore.s の中の割り込み関連の記述も結構違う。
locore.s では unexpected 扱いの
lev[123456]intr が hp300 では重要な扱い。
intrcnt
を数えているが hp300 では interrupt level 別。
pcc.c の pcc_intr_establish()
はさらに上位の isrlink_vectored() を呼ぶようになっている。
vector.s も default は badtrap
を書いておいて isrlink_vectored() で書き換えている。
zs も zs.c と zs_pcc.c
に分けられているし、努力のあとが感じられる。
locore.s を見ると最初に bss
をクリアしてたりして news68k との親近感が湧く。
clock も例の MK48T02 を使っている。
files.news68k も直す。
clock.c は dev, ${MACHINE}
どちらのディレクトリに置くべきなんだ? 現状は結構バラバラ。
mvme68k/clock.c と
dev/clock_pcc.c に分けられてた。なるほど〜
GENERIC 等には intr
は記述されていないが、
dev/pccreg.h あたりに定義されている。
"?"
になってたらデフォルト値を使う、ってのが正しい?
fdc と SCSI は NEWS-OS のヘッダに書いてあるが
zs, le はない。むぅ。
adrsmap.h 下さい、って頼んだ方が早いかな。どう考えても
licence の問題はなさそうだし。
help でコマンドを確認して
NEWS> ms e0dc0000 1
としてみる。
help の中に "mu :Memory Usage"
というのがあるので見てみる。
NEWS> mu
c0ffc000 !--------------! c0000000 !--------------!
! Lower margin ! ! Operating !
c0ffc000 !--------------! ! system use !
! calloc() use ! c0ffc000 !--------------!
c0fff400 !--------------! ! Reserved !
! Boot stack ! c1000000 !--------------!
c0fff800 !--------------!
! ROM stack !
c1000000 !--------------!
! Upper margin !
c1000000 !--------------!
Size of main memory: 01000000
Reserved for monitor: 00004000
Dynamic alloc. base: c0ffe900
Current MSP: c0fff800
Current ISP: c0ffffa8
Active SP: ISP
NEWS>
0xc0000000 から 16M なのか。
NEWS> mu
c0bfc000 !--------------! c0000000 !--------------!
! Lower margin ! ! Operating !
c0bfc000 !--------------! ! system use !
! calloc() use ! c0bfc000 !--------------!
c0bff400 !--------------! ! Reserved !
! Boot stack ! c0c00000 !--------------!
c0bff800 !--------------!
! ROM stack !
c0c00000 !--------------!
! Upper margin !
c0c00000 !--------------!
Size of main memory: 00c00000
Reserved for monitor: 00004000
Dynamic alloc. base: c0bfe900
Current MSP: c0bff800
Current ISP: c0bfffa8
Active SP: ISP
NEWS>
0xc0000000 から後ろの方へと配置されるようだ。
"panic:" とか言って
monitor すら立ち上がらない。おいこら。
0xc0000000 以外にも
RAM がマップされているか調べてみる。
0x0, 0x40000000, 0x80000000 にも見えているようだ。これなら
KERNBASE はどれでも OK?
0xfffff000 にアクセスすると
fffff000: Bus error pc = e0006b02
と怒られた。 monitor は 0xe0000000 からってことか。
pmap_bootstrap.c を眺めてみる。
manual は後回し ;-p。
/sys/arch/hp300/DOC/HPMMU.notes
というのがある。
"mimic the Motorola 68851 PMMU"
とあるから同じようなもんだろう。
1024×1024×4k = 4G と va 空間を全部参照できるわけだな。
pmap_bootstrap.c の続き。
firstpa は RAM の開始物理アドレス。
nextpa は kernel end 直後のページの物理アドレス。
ここからいろいろ配置していく。
Sysptsize と I/O スペース分をあわせただけ用意。
Sysptsize はページ数、
[IE]IOMAPSIZE は I/O スペースに必要な entry 数。
NPTEPG は 1ページに含まれるエントリ数で
machine/param.h に定義されている。
locore.o を見直す。
0x800xxxxx のアドレスは symbol のアドレスか?
vmunix を "objdump --disassemble"
してみる。が、 sun3 では遅過ぎ。
objdump
を入れてなかった。敗北。
kseg_table ってのがあるけど 2kbyte しかないぞ?
KERNBASE が 0x80000000
だからか? うーむ。
maxmem, freemem, physmem なんて symbol 発見。
0 から読んだ値を書いてる。
PROM が書き込むのか?
locore.o の中身を見てみる。
0xe1280000 が _ctrl_ast
という symbol になっている。なんかの制御用ハードか。
0xe1xx0000 あたりにいろいろあるようだ。
movel %al@(188), 1286a <monitor>
なんてのもある。ふむふむ。
/sys/arch/hp300/include/pte.h
とかを見ればよいことに気づく。うむ、ちゃんと説明がある。
0 から 0x80000fff
までそのまま read only で map (なのか?)。
0x80000fff を write 可で。RAM か?
0x0f800000 とか 0x0f000000
とかのアドレスをどこぞに map してるようだ。 ROM なのか…
0x01ff0000
を 0x0f800000 に map してる、ってのが正解?
main() は呼んでなくて
_u とか _Umap とか作ってどこかに飛んでいる。
_u ってどこかで見たんだけどどこでだっけ…
d6 と d7
に入っているっぽい。
moveml 8, %d0-%fp
ってのがあるからこっちが本物?
0 を怪しげに読み書きしているコードがある。
live_led などという symbol がある。
0xe0dc0000 の bit0 をいじると基板上の
LED が制御できるようだ。試してないけど。
locore.s の debug_led
のように「どこまで進んでるか」 debug も可能か。
fsck
エラーで止まっている。
locore.s をいじり始める。
HP_MMU と M68040/M68060
のコードはじゃまくさいので削除。
MMUbase って何に使ってるんだ?
HP MMU と M68040
だけ使ってるかと思ったが、外部キャッシュの制御にも使われているようだ。
;-p
locore.s を見てみる。
MMUbase は使われてない。外部のコントローラーか?
;-)
as が解釈できない命令を出すらしくこける。
tcsh
だけ作ってやめる。
src/distrib/notes/i386/hardware の修正が入って
NetBSD-1-4 branch の pullup は終わりということなので
sup かけて
一通りのマシンで
make build してみる。
timed で OK。
make -j20 とかで kernel を作ってみる。
当たり前かもしれないけどちゃんと動く。うむ。
/usr/src/sys の下をのぞいてみる。
zs と le は newsmips とほぼ同じ感じ。
hb は hyper-bus の略らしい。
objdump で
locore.o を逆アセンブルしてみる。
NEWS> bo
Boot0 (NEWS-OS 4.2) loading hd(0,0,0)boot
Boot (NEWS-OS 4.2, news1700)
: hd(0,0,0)/vmunix
943812+242952+307752 start at 0x000019e8 (magic 0410)
SONY NET WORK STATION, Model NWS-1750, Machine ID #10557
NEWS-OS Release 4.2C #0: Tue Jul 21 14:22:38 JST 1992
root@wsrel11:/MAKE4.XR/src/sys/NEWS1700
Copyright (c) 1990, 1991, 1992 Sony Corporation
All Rights Reserved
real mem = 16777216
avail mem = 14581760
using max. 2798 buffers, 11460608 bytes [dynamic allocate buffer]
Enable Internal Inst/Data Cache
Floating-Point Coprocessor is mc68882
Initializing SCSI.......... done
sdc0 at hb addr 2000 intr 0
sd0 at sdc0 slave 0 (bus=0, chan=0, lun=0)
sd0: hd639
stc0 at hb addr 2000 intr 5
st0 at stc0 slave 0 (bus=0, chan=5, lun=0)
st0: 5125 (512 BYTES REC)
fc0 at hb addr 0 intr 20
fd0 at fc0 slave 0
fd1 at fc0 slave 1
fd2 at fc0 slave 2
fd3 at fc0 slave 3
en0 at hb addr 0 intr 16
en0: hardware address 08:00:46:00:35:36
bpf: en0 attached
kb0 at hb addr 0 intr 36
ms0 at hb addr 0 intr 40
fb0 at hb addr 0 intr 44
fb0: NWB-225 (1280 x 1024 8 plane)
fb1 at hb addr 0 intr 44
fb1: NWB-514 (1280 x 1280 4 plane)
rs0 at hb addr 0 intr 48
lp0 at hb addr 0 intr 104
isdn0 at hb addr 0 intr 120
isdn0: NWB-236 ISDN/X.25 Interface Board
bpf: is0 attached
bpf: dx0 attached
bpf: dl0 attached
bpf: sl0 attached
bpf: sl1 attached
bpf: lo0 attached
root fstype 4.3 (sd0a)
swap fstype spec (sd0b, 90880KB)
erase ^?, kill ^U, intr ^C
#
fb0 と fb1 が検出されてるけどどうも
fb0 のほうははまぼろしらしい(?)。
hb の device の address が 0 ばっかり。
そのかわり intr の数字が巨大。そんなものなのか?
disklabel(8) がない。
/usr/etc の下にあるらしい。
/dev/sd00g とか mount してみる。…が、
/etc/mtab がいるらしい。
fsck かけて調べてみると /usr
の下は残っているが /etc と /var
の下が消されているようだ。
mkdir もないので空のディレクトリを
/etc に rename してなんとかごまかす。
/usr が mount
できたので ftp できるか試してみる。
… /etc/services がないとダメらしい。
/etc/hosts がいるらしい。
configure()
までは vm が動いてなくても大丈夫だとか、
printf() だよとか、
printf() が動くようになるまでが大変なんだとか。
bootpd だと boot するけど
dhcpd だと kernel を読んでくれない。なぜ?
locore.s を眺めてみる。
news68k/{news68k,include}/
あたりは hp300, x68k あたりから適当に持ってくる。
news68k/dev/ は
newsmips から
if_le.c と zs.c だけ持ってくる。
news68k/conf/files.news68k をなんとなく書いてみる。
locore.s, machdep.c あたりが大変なんだろうなあ。