2006-08-17

SMART on Solaris/x86 #3

前の話題の続き。

non-data, PIO-read, PIO-writeの3種類のプロトコルを使い分けなければならない時点で、何かの関数を単独で置き換えるだけではダメだという結論になった。
いろいろ考えてみたが、DIOCTL_RWCMDという直接入出力(セクタ番号指定でR/Wできるioctl)機能を拡張してやるのがいいかなと。非常に都合が良いことに、このioctlを発行する際にCOMMANDレジスタやFEATURESレジスタに格納する値を滑り込ませることができる。

んで、OpenSolarisから持ってきたata_cmd.h, ata_disk.[ch], dadk.c, dadkio.hあたりを書き換えて、改造版ドライバを作成してみた。初めてOpenSolarisのモジュールをコンパイルしてみたので、いろいろ苦労したのだけどそれは省略。

さて、Solaris10(1/06)のataドライバとdadkドライバを改造版に差し換え、ネットブート… devfsadmしてデバイスファイルを再作成してみると… あ、あれ、/dev/rdskの下が空っぽだww
なんでも、PCIコンフィギュレーション空間にアクセスする関数の実体がないのだそうで、さっそくOpenSolarisとSolarisの違いを見せ付けられたかたち。

で、アダプタ関数を追加してリブート… おお、こんどはデバイスファイルは作ってくれた。んが、

Aug 13 15:52:13 etta genunix: IDE device at targ 0, lun 0 lastlun 0x0
Aug 13 15:52:13 etta genunix: model ST315320A
Aug 13 15:52:13 etta genunix: ATA/ATAPI-4 supported, majver 0x1e minver 0x0
Aug 13 15:52:13 etta genunix: ata_set_feature: (0x66,0x0) failed
Aug 13 15:52:16 etta pci: PCI-device: ide@0, ata0
Aug 13 15:52:16 etta genunix: ata0 is /pci@0,0/pci-ide@11,1/ide@0
Aug 13 15:52:16 etta genunix: UltraDMA mode 2 selected
Aug 13 15:52:16 etta cmdk: WARNING: cmdk_create_obj: ERROR creating target disk dadk
とエラーになってしまう。当然、正常にI/Oを行なうこともできない。うーん、困った困った。

0 件のコメント: