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
あたりが大変なんだろうなあ。