OpenBSD/OCTEONが起動しなかった

ページング周りが全然ダメで、仮想アドレス使い始めた瞬間に死んでしまう使えないシロモノが出来上がった。
その辺のコードはどのMIPSでも大体共通で、特にOCTEONで気をつけるべき部分は無いかと思っていたので、なんでうまく行かないのかよく分からず悩み中…。

cvmctl:900043f0 cvmmemctl:46104
 Unknown Boot-Descriptor: Using Defaults
Boot Descriptor Ver: 0 -> 0/0  CPU clock: 500MHz  Core Mask: 0x1
  Dram: 256 MB  Board Type: 0  Revision: 0/0
  Octeon Chip: 0  Rev 0/0  Mac Address 00.0F.B7.10.09.06 (1)
memrange_register: memory from 0x33c000 to 0x6000000
l1icache size:65536 line:128 set:32768
l1dcache size:4096 line:128 set:2048
l2size:524288 l3size:0
Initial setup done, switching console.
[../../../../kern/init_main.c:main:203]
[../../../../kern/init_main.c:main:208]

Trap cause = 4 Frame 0x9800000000343dc8
Trap PC 0xffffffff80257650 RA 0xffffffff80248d70 fault 0x3c1a0000001ad438
0xffffffff802575f0 (ffffffff8029f6e8,ffffffff802959c8,ffffffff802959c0,50)  ra 0xffffffff80248d70 sp 0x9800000000343f20, sz 0
0xffffffff802489e0 (ffffffff8029f6e8,ffffffff802959c8,ffffffff802959c0,50)  ra 0x0 sp 0x9800000000343f20, sz 0
User-level: pid 0
stopped on non ddb fault
Stopped at      0xffffffff80257650:     lw      k0,0(k1)
0xffffffff802575f0 (ffffffff8029f6e8,ffffffff802959c8,ffffffff802959c0,50)  ra 0
xffffffff80248d70 sp 0x9800000000343f20, sz 0
0xffffffff802489e0 (ffffffff8029f6e8,ffffffff802959c8,ffffffff802959c0,50)  ra 0
x0 sp 0x9800000000343f20, sz 0
User-level: pid 0
ddb>

そもそも、TLBを初期化するtlb_flush()がtlbwiでExceptionを起こしてしまってうまく動かず、FreeBSD/mipsと比較して差異の部分をコピーして来て何とか動かしてる状況だったりして、なんでこんな事をしないと動かないのかちっとも理解できてない。

LEAF(tlb_flush, 0)
	mfc0	v1, COP_0_STATUS_REG	# Save the status register.
	ori	v0, v1, SR_INT_ENAB
	xori	v0, v0, SR_INT_ENAB
	mtc0	v0, COP_0_STATUS_REG	# Disable interrupts
	ITLBNOPFIX
	mfc0	ta1, COP_0_TLB_WIRED


	LA	v0, CKSEG0_BASE		# invalid address
	dmfc0	ta0, COP_0_TLB_HI	# Save the PID

#ifdef CPU_OCTEON
	sll	t3, ta1, PAGE_SHIFT + 1
	addu	v0, t3
#endif

	dmtc0	v0, COP_0_TLB_HI	# Mark entry high as invalid
	dmtc0	zero, COP_0_TLB_LO0	# Zero out low entry0.
	dmtc0	zero, COP_0_TLB_LO1	# Zero out low entry1.
	mtc0	zero, COP_0_TLB_PG_MASK	# Zero out mask entry.
/*
 * Align the starting value (ta1) and the upper bound (a0).
 */
1:
	mtc0	ta1, COP_0_TLB_INDEX	# Set the index register.
#if CPU_OCTEON
	ITLBNOPFIX
	dmtc0	v0, COP_0_TLB_HI	# Mark entry high as invalid
#endif
	addu	ta1, ta1, 1		# Increment index.
#if CPU_OCTEON
	addu	v0, v0, 8 * 1024
#endif
	nop
	nop
	nop
	tlbwi				# Write the TLB entry.
	nop
	nop
	bne	ta1, a0, 1b
	nop

#ifdef CPU_LOONGSON2
	li	v0, COP_0_DIAG_ITLB_CLEAR | COP_0_DIAG_BTB_CLEAR | COP_0_DIAG_RAS_DISABLE
	dmtc0	v0, COP_0_DIAG
#endif

	dmtc0	ta0, COP_0_TLB_HI	# Restore the PID
	li	a0, TLB_PAGE_MASK
	mtc0	a0, COP_0_TLB_PG_MASK	# Restore default mask value.
	mtc0	v1, COP_0_STATUS_REG	# Restore the status register
	ITLBNOPFIX
	j	ra
	nop
END(tlb_flush)

恐らくr10k・LoongsonとはTLB周りの仕様が違うのだろう…


取り敢えずコードはこの辺においた:
http://github.com/syuu1228/OpenBSD-OCTEON