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