EdgeRouter LiteでOpenBSD/OCTEONカーネルロードしてみる
Looking for valid bootloader image.... Jumping to start of image at address 0xbfc80000 U-Boot 1.1.1 (UBNT Build ID: 4493936-g009d77b) (Build time: Sep 20 2012 - 15:48) BIST check passed. UBNT_E100 r1:2, r2:12, serial #: DC9FDB2920A7 Core clock: 500 MHz, DDR clock: 266 MHz (532 Mhz data rate) DRAM: 512 MB Clearing DRAM....... done Flash: 4 MB Net: octeth0, octeth1, octeth2 USB: (port 0) scanning bus for devices... 1 USB Devices found scanning bus for storage devices... Device 0: Vendor: Prod.: USB Flash Memory Rev: PMAP Type: Removable Hard Disk Capacity: 3745.0 MB = 3.6 GB (7669824 x 512) 0 Octeon ubnt_e100# <INTERRUPT> Octeon ubnt_e100# setenv serverip 192.168.100.112 Octeon ubnt_e100# dhcp BOOTP broadcast 1 octeth0: Up 1000 Mbps Full duplex (port 0) DHCP client bound to address 192.168.100.114 Octeon ubnt_e100# tftpboot $(loadaddr) bsd Using octeth0 device TFTP from server 192.168.100.112; our IP address is 192.168.100.114 Filename 'bsd'. Load address: 0x9f00000 Loading: ######################### done Bytes transferred = 3478580 (351434 hex), 416 Kbytes/sec Octeon ubnt_e100# bootoctlinux $(loadaddr) ELF file is 64 bit Allocating memory for ELF segment: addr: 0xffffffff81000000 (adjusted to: 0x1000 Allocated memory for ELF segment: addr: 0xffffffff81000000, size 0x387300 Processing PHDR 0 Loading 2f94e0 bytes at ffffffff81000000 Clearing 8de20 bytes at ffffffff812f94e0 ## Loading Linux kernel with entry point: 0xffffffff81000000 ... Bootloader: Done loading app on coremask: 0x1 Total DRAM Size 0x0000000020000000 Bank 0 = 0x0000000001388000 -> 0x000000000FFFFFFF mem_layout[0] page 0x00000000000004E2 -> 0x0000000000003FFF Initial setup done, switching console. boot_desc->desc_ver:7 boot_desc->desc_size:400 boot_desc->stack_top:0 boot_desc->heap_start:0 boot_desc->heap_end:0 boot_desc->argc:2 boot_desc->flags:5 boot_desc->core_mask:1 boot_desc->dram_size:512 boot_desc->phy_mem_desc_addr:0 boot_desc->debugger_flag_addr:a44 boot_desc->eclock:500000000 boot_desc->boot_info_addr:1001f0 boot_info->ver_major:1 boot_info->ver_minor:2 boot_info->stack_top:0 boot_info->heap_start:0 boot_info->heap_end:0 boot_info->boot_desc_addr:0 boot_info->exception_base_addr:1000 boot_info->stack_size:0 boot_info->flags:5 boot_info->core_mask:1 boot_info->dram_size:512 boot_info->phys_mem_desc_addr:24108 boot_info->debugger_flags_addr:0 boot_info->eclock:500000000 boot_info->dclock:266000000 boot_info->board_type:20002 boot_info->board_rev_major:2 boot_info->board_rev_minor:12 boot_info->mac_addr_count:3 boot_info->cf_common_addr:0 boot_info->cf_attr_addr:0 boot_info->led_display_addr:0 boot_info->dfaclock:0 boot_info->config_flags:8 Copyright (c) 1982, 1986, 1989, 1991, 1993 The Regents of the University of California. All rights reserved. Copyright (c) 1995-2013 OpenBSD. All rights reserved. http://www.OpenBSD.org OpenBSD 5.3-current (GENERIC) #0: Sat Apr 6 10:44:05 JST 2013 root@obsdhack.my.domain:/usr/src/sys/arch/octeon/compile/GENERIC real mem = 247939072 (236MB) avail mem = 245628928 (234MB) mainbus0 at root cpu0 at mainbus0: Cavium OCTEON CPU rev 0.1 500 MHz, Software FP emulation cpu0: cache L1-I 32KB D 16KB 4 way, L2 128KB direct clock0 at mainbus0: int 5 iobus0 at mainbus0 octcf at iobus0 base 0x1d000800 irq 0 not configured octeon_pcibus_match, no PCI host function detected. pcibus at iobus0 irq 0 not configured cn30xxgmx0 at iobus0 base 0x1180008000000 irq 48 cnmac0 at cn30xxgmx0 address=0x0001180008000000: RGMII, address dc:9f:db:29:20:7 cnmac1 at cn30xxgmx0 address=0x0001180008000000: RGMII, address dc:9f:db:29:20:8 cnmac2 at cn30xxgmx0 address=0x0001180008000000: RGMII, address dc:9f:db:29:20:9 uar: ns16550, no working fifo com0: console com1 at uartbus0 base 0x1180000000c00 irq 35: ns16550, no working fifo /dev/ksyms: Symbol table not valid. vscsi0 at root scsibus0 at vscsi0: 256 targets softraid0 at root scsibus1 at softraid0: 256 targets root device:
OpenBSD/i386のパケット受信フロー
共有データとジャイアントロックの位置に注意しながら関数レベルで追ってみた(実際にはかなり簡略化しているが)。
SMP対応が全く進んでいないという事が容易に見て取れる。
さくらのVPSにOpenBSDをインストールしてみた
ふと思い立って、さくらのVPSを契約し自宅のOpenBSD鯖をそこへ移行する計画を実行に移してみる事にした。
なので、まずさくらのVPSにOpenBSDを入れる必要があるが、「カスタムOSインストール」の項目にOpenBSDは無い。ではどうするか。
他にも色々方法がある事は知っているが、私はGRUB2を使う方法を選んだ。
以下ではその方法を説明する。
まず、OS再インストールのページを開き、「カスタムOSインストールへ」のリンクを選びます。
おもむろにUbuntu 10.04を選びます。amd64でもi386でもOK。
これはGRUB2を簡単に入れるためだけに使用します。
CentOSに頑張って入れる方法もあるけど、どうせ潰すんだからめんどくさいです。
VNCコンソールが起動してUbuntuのインストーラがあがってくるのでガンガン先へ進みます。
この時、VM管理インタフェースのWebページにIPアドレスの設定情報が表示されるので必ずメモりましょう。ここでしか見れないっぽいので。
インストールが終わるとVNCが切れてVMが落ちてしまいます(なぜだろう。
仕方ないのでホームに戻って起動を押します。
リモートコンソールを開くと、Ubuntuが起動してきてるはずです。
起動が完了したら、ログインして
cd /boot
sudo wget ftp://ftp.jaist.ac.jp/pub/OpenBSD/4.8/amd64/bsd.rd
などと打ちインストール用のRAMDISKカーネルを/bootにダウンロードします。
ダウンロードが終わったら
sudo reboot
GRUB2があがってくるので、10秒以内に'c'キーを押します。
kopenbsd /boot/bsd.rd boot
と打ちます。
これでGRUB2からOpenBSDのRAMDISKカーネルをブート出来ます(楽でしょ。
これ、多分他の*BSDでも行けるんじゃないかな。
ブートしたら「VNCコンソールを開く」を押してVNCコンソールを開きます。
インストールを進めます。
この時、「Change the default console to com0? 」をyesに、スピードを115200にします。
これで次回起動時よりHTMLなリモートコンソールを使う事が出来ます。
CDブートではないので「Location of sets?」はftpにします。
インストールが終わったら再起動します。
IIJ 次世代モジュール型エコ・データセンター 実証実験サイトでは300台のサーバが全てOpenBSDで動いている(キリッ
何故かIIJの次世代データセンタの実験施設に招待されたので見学してきた。
Geekなページのあきみちさんや東工大の首藤先生などその方面で有名な方々が集っている中、どうして私が呼ばれたんだろうと思ったがどう考えてもOpenBSD枠ですね本当にありがとうございました。
◯お話を聞いた
・従来型のデータセンターの課題
建物の建築費用が高く、一度にまとめて広いフロアを建設しなければならず、建設にも一年単位の時間がかかるので需要に合わせた供給を行なうのが難しい。
この為、需要を見越して先行投資する事になるが、そうすると運用開始してすぐに利用率を100%にする事は難しい。埋まるまで商売苦しい><;
IT機器にかかる電力と同じかそれ以上の電力を冷却に費やしている。
また、IT機器の小型化・発熱量の増大に冷却システムが追いついておらず、42Uにぎっちりサーバを詰め込むような運用が難しい。
ラックスペースを浪費している。
・そうだ外気冷却型のコンテナにしよう
冷却に使うコンプレッサが最も電気を食う。
外気を用いて冷却すれば冷却にかかる電気消費を抑えられる。
コンテナ筐体を単に平積みで並べるだけにすれば建築コストも低減出来る。
従来型データセンターと違ってコンテナ単位で需要に応じて段階的に増設出来、建設にかかる期間も短い。
コンテナにシステムを詰め込んでトラックで運んできて現地に固定するだけ。置くだけなら半日。
・実験してみる
まずは実証実験を行ってみた。
実験用地・コンテナの開発はNLMエカル、電気空調設備は東芝、防災・消防設備は能美防災、ラック・分電盤は河村電器産業に頼んだ。
この実験は主に外気冷却型コンテナの冷却効率や電気効率を評価するもので、サーバで何かをするのはあまり重要でなく、熱を発していれば何でも良かった。本当はホットプレートでもよかったんだけど、流石に燃えそうだったので辞めた。
新品をラック全部埋めるだけ買う予算が無かったのでKSG(コンピュータのおっと)に頼んで中古をかき集めてもらった。
中古だったので全機種同じという訳に行かず、ラックによって熱量が偏らないように計算してバランスよくラックに配置するのが大変だった(!)。
データセンターの消費電力削減・外気冷却方式の普及促進の為、ASHRAE(米国暖房冷凍空調学会)は2008年にデータセンター内の温湿度条件を緩和した:
http://tc99.ashraetcs.org/documents/ASHRAE_Extended_Environmental_Envelope_Final_Aug_1_2008.pdf
この実験では外気冷却を利用しつつ、この2008年バージョンの推奨値規格に準拠する事を目指している。
外気を使うという事は、季節・時刻によって刻々と気温・湿度が変化するから、単純に外気をコンピュータに吹きつけるだけではASHRAEの温湿度条件に準拠出来ない。
夏期の気温・湿度が高い時は排気を循環させて冷却装置を用いて温度・湿度を下げる。これは普通のDCと同じ。
冬期の気温が低い時はいきなり全力で外気を吹きつけると結露するので程良く排気の温かい空気を混ぜる。
春・秋は外気を直接取り込む。
詳しくはASCIIの記事を参照:
http://ascii.jp/elem/000/000/500/500186/
電気利用効率の指標としてはPUEがある。
PUE=データセンタ全体の消費電力÷IT機器の消費電力
従来型のDCでは一般的に2.x程度、かなり努力して1.4x程度と言われている。
1.2以下は国内の商用サービスでは実現していない。
本実験では冬期の混合運転モードで実測Partial PUE(※配電盤・UPSを含まないPUE)1.07を達成。
通年1.1台を目指し夏期の循環運転モードを極力減らす努力を続けている。
・商用サービスに向けて
来年には商用サービス向けに建設し、IIJ GIO(クラウドサービス)のインフラとして運用を開始する。
・OpenBSD
実験サーバのOSは全てOpenBSDをインストールしてある(!)
実験に使っている温湿度計はストロベリーリナックス社の製品で、全て実験サーバに接続されsensor deviceとして動いている(!!)
yuo先生の仕業。温湿度計のドライバ書いたのもyuoさん。
パネェ…
送信者 Aug 06, 2010 IIJ Container DC |
送信者 Aug 06, 2010 IIJ Container DC |
送信者 Aug 06, 2010 IIJ Container DC |
送信者 Aug 06, 2010 IIJ Container DC |
送信者 Aug 06, 2010 IIJ Container DC |
送信者 Aug 06, 2010 IIJ Container DC |
送信者 Aug 06, 2010 IIJ Container DC |
送信者 Aug 06, 2010 IIJ Container DC |
送信者 Aug 06, 2010 IIJ Container DC |
送信者 Aug 06, 2010 IIJ Container DC |
送信者 Aug 06, 2010 IIJ Container DC |
送信者 Aug 06, 2010 IIJ Container DC |
送信者 Aug 06, 2010 IIJ Container DC |
送信者 Aug 06, 2010 IIJ Container DC |
送信者 Aug 06, 2010 IIJ Container DC |
送信者 Aug 06, 2010 IIJ Container DC |
送信者 Aug 06, 2010 IIJ Container DC |
送信者 Aug 06, 2010 IIJ Container DC |
送信者 Aug 06, 2010 IIJ Container DC |
送信者 Aug 06, 2010 IIJ Container DC |
送信者 Aug 06, 2010 IIJ Container DC |
送信者 Aug 06, 2010 IIJ Container DC |
関連記事:
[http://www.shudo.net/diary/2010aug.html#20100806:title]
[http://d.hatena.ne.jp/futsu-9/20100806/p1:title]
[http://blog.virtualtech.jp/itooon/427:title]
[http://www.iij.ad.jp/news/iijnews/2010/vol99.html:title]
[http://www.google.com/search?hl=ja&q=IIJ+%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A+%E3%83%87%E3%83%BC%E3%82%BF%E3%82%BB%E3%83%B3%E3%82%BF:title]
panicを解決してメモリ量が出る所まで進んだ
panicの原因はphysmemを初期化していないのが原因だったので、これにきちんと物理メモリ量を代入するように直した。
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) l1icache size:65536 line:128 set:32768 l1dcache size:4096 line:128 set:2048 l2size:524288 l3size:0 Initial setup done, switching console. Copyright (c) 1982, 1986, 1989, 1991, 1993 The Regents of the University of California. All rights reserved. Copyright (c) 1995-2010 OpenBSD. All rights reserved. http://www.OpenBSD.org pmap_init() pmap_reference(803373c0) pmap_enter(0xffffffff803373c0, 0xc000000001730000, 0x354000, 0x7, 0x13) pmap_enter: first pv: pmap 0xffffffff803373c0 va 0xc000000001730000 pa 0x354000 pmap_kenter_pa(0xc000000000000000, 0x5ffc000, 0x3) pmap_kenter_pa(0xc000000000004000, 0x350000, 0x3) OpenBSD 4.7-current (GENERIC) #20: Fri Jul 2 23:58:44 JST 2010 syuu@lt0115:/home/syuu/octeon/src/sys/arch/octeon/compile/GENERIC real mem = 97271808 (92MB) pmap_reference(803373c0) pmap_kenter_pa(0xc000000000008000, 0x5ff8000, 0x3) pmap_reference(803373c0) avail mem = 92897280 (88MB) pmap_enter(0xffffffff803373c0, 0xc000000002030000, 0x34c000, 0x3, 0x13) pmap_enter: first pv: pmap 0xffffffff803373c0 va 0xc000000002030000 pa 0x34c000 pmap_enter(0xffffffff803373c0, 0xc00000000202c000, 0x348000, 0x3, 0x13) pmap_enter: first pv: pmap 0xffffffff803373c0 va 0xc00000000202c000 pa 0x348000 pmap_enter(0xffffffff803373c0, 0xc000000002028000, 0x5ff4000, 0x3, 0x13) pmap_enter: first pv: pmap 0xffffffff803373c0 va 0xc000000002028000 pa 0x5ff4000 pmap_enter(0xffffffff803373c0, 0xc000000002024000, 0x5ff0000, 0x3, 0x13) pmap_enter: first pv: pmap 0xffffffff803373c0 va 0xc000000002024000 pa 0x5ff0000 pmap_enter(0xffffffff803373c0, 0xc000000002020000, 0x5fec000, 0x3, 0x13) pmap_enter: first pv: pmap 0xffffffff803373c0 va 0xc000000002020000 pa 0x5fec000 pmap_enter(0xffffffff803373c0, 0xc00000000201c000, 0x5fe8000, 0x3, 0x13) pmap_enter: first pv: pmap 0xffffffff803373c0 va 0xc00000000201c000 pa 0x5fe8000 pmap_enter(0xffffffff803373c0, 0xc000000002018000, 0x5fe4000, 0x3, 0x13) pmap_enter: first pv: pmap 0xffffffff803373c0 va 0xc000000002018000 pa 0x5fe4000 pmap_enter(0xffffffff803373c0, 0xc000000002014000, 0x5fe0000, 0x3, 0x13) pmap_enter: first pv: pmap 0xffffffff803373c0 va 0xc000000002014000 pa 0x5fe0000 pmap_enter(0xffffffff803373c0, 0xc000000002010000, 0x5fdc000, 0x3, 0x13) pmap_enter: first pv: pmap 0xffffffff803373c0 va 0xc000000002010000 pa 0x5fdc000 pmap_enter(0xffffffff803373c0, 0xc00000000200c000, 0x5fd8000, 0x3, 0x13) pmap_enter: first pv: pmap 0xffffffff803373c0 va 0xc00000000200c000 pa 0x5fd8000 pmap_enter(0xffffffff803373c0, 0xc000000002008000, 0x5fd4000, 0x3, 0x13) pmap_enter: first pv: pmap 0xffffffff803373c0 va 0xc000000002008000 pa 0x5fd4000 pmap_enter(0xffffffff803373c0, 0xc000000002004000, 0x5fd0000, 0x3, 0x13) pmap_enter: first pv: pmap 0xffffffff803373c0 va 0xc000000002004000 pa 0x5fd0000 pmap_enter(0xffffffff803373c0, 0xc000000002000000, 0x5fcc000, 0x3, 0x13) pmap_enter: first pv: pmap 0xffffffff803373c0 va 0xc000000002000000 pa 0x5fcc000 pmap_enter(0xffffffff803373c0, 0xc000000001ffc000, 0x5fc8000, 0x3, 0x13) pmap_enter: first pv: pmap 0xffffffff803373c0 va 0xc000000001ffc000 pa 0x5fc8000 pmap_enter(0xffffffff803373c0, 0xc000000001ff8000, 0x5fc4000, 0x3, 0x13) pmap_enter: first pv: pmap 0xffffffff803373c0 va 0xc000000001ff8000 pa 0x5fc4000 pmap_enter(0xffffffff803373c0, 0xc000000001ff4000, 0x5fc0000, 0x3, 0x13) pmap_enter: first pv: pmap 0xffffffff803373c0 va 0xc000000001ff4000 pa 0x5fc0000 pmap_enter(0xffffffff803373c0, 0xc000000001ff0000, 0x5fbc000, 0x3, 0x13) pmap_enter: first pv: pmap 0xffffffff803373c0 va 0xc000000001ff0000 pa 0x5fbc000 pmap_enter(0xffffffff803373c0, 0xc000000001fec000, 0x5fb8000, 0x3, 0x13) pmap_enter: first pv: pmap 0xffffffff803373c0 va 0xc000000001fec000 pa 0x5fb8000 pmap_enter(0xffffffff803373c0, 0xc000000001fe8000, 0x5fb4000, 0x3, 0x13) pmap_enter: first pv: pmap 0xffffffff803373c0 va 0xc000000001fe8000 pa 0x5fb4000 pmap_enter(0xffffffff803373c0, 0xc000000001fe4000, 0x5fb0000, 0x3, 0x13) pmap_enter: first pv: pmap 0xffffffff803373c0 va 0xc000000001fe4000 pa 0x5fb0000 pmap_enter(0xffffffff803373c0, 0xc000000001fe0000, 0x5fac000, 0x3, 0x13) pmap_enter: first pv: pmap 0xffffffff803373c0 va 0xc000000001fe0000 pa 0x5fac000 pmap_enter(0xffffffff803373c0, 0xc000000001fdc000, 0x5fa8000, 0x3, 0x13) pmap_enter: first pv: pmap 0xffffffff803373c0 va 0xc000000001fdc000 pa 0x5fa8000 pmap_enter(0xffffffff803373c0, 0xc000000001fd8000, 0x5fa4000, 0x3, 0x13) pmap_enter: first pv: pmap 0xffffffff803373c0 va 0xc000000001fd8000 pa 0x5fa4000 pmap_enter(0xffffffff803373c0, 0xc000000001fd4000, 0x5fa0000, 0x3, 0x13) pmap_enter: first pv: pmap 0xffffffff803373c0 va 0xc000000001fd4000 pa 0x5fa0000 pmap_enter(0xffffffff803373c0, 0xc000000001fd0000, 0x5f9c000, 0x3, 0x13) pmap_enter: first pv: pmap 0xffffffff803373c0 va 0xc000000001fd0000 pa 0x5f9c000 pmap_enter(0xffffffff803373c0, 0xc000000001fcc000, 0x5f98000, 0x3, 0x13) pmap_enter: first pv: pmap 0xffffffff803373c0 va 0xc000000001fcc000 pa 0x5f98000 pmap_enter(0xffffffff803373c0, 0xc000000001fc8000, 0x5f94000, 0x3, 0x13) pmap_enter: first pv: pmap 0xffffffff803373c0 va 0xc000000001fc8000 pa 0x5f94000 pmap_enter(0xffffffff803373c0, 0xc000000001fc4000, 0x5f90000, 0x3, 0x13) pmap_enter: first pv: pmap 0xffffffff803373c0 va 0xc000000001fc4000 pa 0x5f90000 pmap_enter(0xffffffff803373c0, 0xc000000001fc0000, 0x5f8c000, 0x3, 0x13) pmap_enter: first pv: pmap 0xffffffff803373c0 va 0xc000000001fc0000 pa 0x5f8c000 pmap_enter(0xffffffff803373c0, 0xc000000001fbc000, 0x5f88000, 0x3, 0x13) pmap_enter: first pv: pmap 0xffffffff803373c0 va 0xc000000001fbc000 pa 0x5f88000 pmap_enter(0xffffffff803373c0, 0xc000000001fb8000, 0x5f84000, 0x3, 0x13) pmap_enter: first pv: pmap 0xffffffff803373c0 va 0xc000000001fb8000 pa 0x5f84000 pmap_enter(0xffffffff803373c0, 0xc000000001fb4000, 0x5f80000, 0x3, 0x13) pmap_enter: first pv: pmap 0xffffffff803373c0 va 0xc000000001fb4000 pa 0x5f80000 pmap_enter(0xffffffff803373c0, 0xc000000001fb0000, 0x5f7c000, 0x3, 0x13) pmap_enter: first pv: pmap 0xffffffff803373c0 va 0xc000000001fb0000 pa 0x5f7c000 pmap_kenter_pa(0xc00000000000c000, 0x5f6c000, 0x3) pmap_kenter_pa(0xc000000000010000, 0x5f70000, 0x3) pmap_kenter_pa(0xc000000000014000, 0x5f74000, 0x3) pmap_kenter_pa(0xc000000000018000, 0x5f78000, 0x3) pmap_kenter_pa(0xc00000000001c000, 0x5f5c000, 0x3) pmap_kenter_pa(0xc000000000020000, 0x5f60000, 0x3) pmap_kenter_pa(0xc000000000024000, 0x5f64000, 0x3) pmap_kenter_pa(0xc000000000028000, 0x5f68000, 0x3) pmap_kenter_pa(0xc00000000002c000, 0x5f4c000, 0x3) pmap_kenter_pa(0xc000000000030000, 0x5f50000, 0x3) pmap_kenter_pa(0xc000000000034000, 0x5f54000, 0x3) pmap_kenter_pa(0xc000000000038000, 0x5f58000, 0x3) pmap_kenter_pa(0xc00000000003c000, 0x5f3c000, 0x3) pmap_kenter_pa(0xc000000000040000, 0x5f40000, 0x3) pmap_kenter_pa(0xc000000000044000, 0x5f44000, 0x3) pmap_kenter_pa(0xc000000000048000, 0x5f48000, 0x3) pmap_kenter_pa(0xc00000000004c000, 0x5f2c000, 0x3) pmap_kenter_pa(0xc000000000050000, 0x5f30000, 0x3) pmap_kenter_pa(0xc000000000054000, 0x5f34000, 0x3) pmap_kenter_pa(0xc000000000058000, 0x5f38000, 0x3) pmap_kenter_pa(0xc00000000005c000, 0x5f1c000, 0x3) pmap_kenter_pa(0xc000000000060000, 0x5f20000, 0x3) pmap_kenter_pa(0xc000000000064000, 0x5f24000, 0x3) pmap_kenter_pa(0xc000000000068000, 0x5f28000, 0x3) pmap_kenter_pa(0xc00000000006c000, 0x5f0c000, 0x3) pmap_kenter_pa(0xc000000000070000, 0x5f10000, 0x3) pmap_kenter_pa(0xc000000000074000, 0x5f14000, 0x3) pmap_kenter_pa(0xc000000000078000, 0x5f18000, 0x3) pmap_kenter_pa(0xc00000000007c000, 0x5efc000, 0x3) pmap_kenter_pa(0xc000000000080000, 0x5f00000, 0x3) pmap_kenter_pa(0xc000000000084000, 0x5f04000, 0x3) pmap_kenter_pa(0xc000000000088000, 0x5f08000, 0x3) Trap cause = 4 Frame 0x9800000000343d18 Trap PC 0xffffffff8009ad4c RA 0xffffffff8009ad18 fault 0x46432ff84fbd2a90 0xffffffff8009a480 (ffffffff802600c8,ffffffff802600d8,1,3fd8) ra 0xffffffff8009ad18 sp 0x9800000000343e70, sz 0 0xffffffff8009a480 (ffffffff802600c8,ffffffff802600d8,1,3fd8) ra 0x0 sp 0x9800000000343e70, sz 0 User-level: pid 0 stopped on non ddb fault Stopped at 0xffffffff8009ad4c: ld v1,8(v0) 0xffffffff8009a480 (ffffffff802600c8,ffffffff802600d8,1,3fd8) ra 0xffffffff800 9ad18 sp 0x9800000000343e70, sz 0 0xffffffff8009a480 (ffffffff802600c8,ffffffff802600d8,1,3fd8) ra 0x0 sp 0x9800 000000343e70, sz 0 User-level: pid 0 ddb>
http://github.com/syuu1228/OpenBSD-OCTEON/commit/d872d06991f4ca53736b2b1d41fb8cd938ae3966
Copyrightが出てpanicする所まで来た
ページテーブルを引く所でこけてるから仮想メモリ周りが悪いのかと思ったら、NULLポインタを解決しようとして何故か初期化されてないproc0のユーザ空間向けページテーブルを引いているのが原因だった。
NULLポインタを関数コールしてるコンソール周りを直したら、Copyrightが出てpanicする所まで進んだ。
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) uvm_page_physload(0xcf, 0xd6, 0xcf, 0xd6, 0, 0) uvm_page_physload(0x19d, 0x1800, 0x19d, 0x1800, 0, 0) l1icache size:65536 line:128 set:32768 l1dcache size:4096 line:128 set:2048 l2size:524288 l3size:0 Initial setup done, switching console. Sysmap:0x9800000000674000 [../../../../kern/init_main.c:main:203] [../../../../kern/init_main.c:main:208] [../../../../kern/init_main.c:main:215] Copyright (c) 1982, 1986, 1989, 1991, 1993 The Regents of the University of California. All rights reserved. Copyright (c) 1995-2010 OpenBSD. All rights reserved. http://www.OpenBSD.org [../../../../kern/init_main.c:main:220] pmap_init() pmap_reference(80337930) panic: uvm_km_suballoc: submap allocation failed Stopped at 0xffffffff80257fd4: jr ra 0xffffffff80257fd8: nop 0xffffffff80257fd0 (7,ffffffff80295ba0,1,1ce) ra 0xffffffff800bb4ec sp 0x98000 00000343e60, sz 0 0xffffffff800bb428 (7,ffffffff802ab774,ffffffff802fd5b8,4) ra 0xffffffff801eed 04 sp 0x9800000000343e60, sz 96 0xffffffff801eece4 (7,ffffffff802ab774,ffffffff802fd5b8,4) ra 0x0 sp 0x9800000 000343ec0, sz 0 User-level: pid 0 RUN AT LEAST 'trace' AND 'ps' AND INCLUDE OUTPUT WHEN REPORTING THIS PANIC! DO NOT EVEN BOTHER REPORTING THIS WITHOUT INCLUDING THAT INFORMATION! ddb>
http://github.com/syuu1228/OpenBSD-OCTEON/commit/ca298cbe7ddfd60a2affdc9c476fd89db23b4172#diff-3
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