自分の12STABLEをベースにしたソースツリーのgeom_flashmapをいじりました。
実はこれはレビューに入れたのですが、ロシアのコミッターのMichael Zhilinと意見が合わなくAbandanしたものです。
Michaelとは仲がよくAsiaBSDConで日本に来た時などときどき会っていました。
まずどのような修正かというとdtsに明示的にrootfsの位置を書かずu-bootのヘッダーから位置を推測して、確認して設定するというものです。OpenWRT方面では同じような機構があります。
従来のFreeBSDでは以下のようにdtsに書く必要があります。
partition@50000 {
label = "kernel";
reg = <0x50000 0x140000>;
};
partition@150000 {
label = "rootfs";
reg = <0x190000 0xe50000>;
};
これの何が問題かというと、kernelコンフィグレーションを変えてkernelサイズが変わるとrootfsの位置が変わってしまい、それに合わせてdtsを修正する必要があります。
私は、AsiaBSDCon 2019で話した、reupgradeというu-bootの操作をせずFreeBSDの操作でリモートでflashの更新をしています。
このためrootfsの位置が変わったのにdtsを書き換えていないと、rootfsが見えなくなりFreeBSDが起動しなくなり、u-bootの操作でflashを更新する必要があります。かなり致命的な状態になります。
もう100回以上はreupgradeをしているとおもいますが、これ以外の問題は起きていません。
自分のパッチで以下のようにOpenWRTと同じように書けるようになりました。
partition@50000 {
compatible = "openwrt,uimage", "denx,uimage";
openwrt,padding = <32>;
label = "firmware";
reg = <0x50000 0xf90000>;
};
dmesgはこのようになります。
このパッチはもともとgeom_mapにrayが入れたと思われる同様の処理をベースに作ったように記憶しています。geom_mapはhintsベースのパーティションマップのモジュールです。
レビューでMichaelが言うにはこのような処理はslicerでやるべきということだったのですが、geom_map同様の処理なのでrayはなんでダメなのと言っていました。
また、今回チェックしたのがFON2601Eでu-bootヘッダーにパディングがある特殊なパターンだったのでそれの対応も入れました。