2006-08-10

SMART on Solaris/x86 #2

前のエントリの続き。

なんとかなりそう、と思ったけど甘かった。I/Oを叩いただけで操作が完了するのはnon-dataプロトコルだけ。で、SMARTにはさらにPIO readとPIO writeのプロトコルを使うものがある。何も考えずにI/Oを叩いてしまうと割り込みが発生し、ステートマシンがおかしくなる可能性がある(良く調べると、ata_disk_ioctl()からはnon-dataプロトコルしか発生しないのね… orz)。

じゃあ割り込みを一時的に無効にすればいいのかとも思ったけど、ATAコントローラの割り込み有効設定はマスターとスレーブで共通で、どちらもデバイスが接続されている場合はえらいことになってしまう。うーむ、どうしたらいいものか。

こうなったら、通常の読み書きと同等(ただし常にPIOプロトコルを使い、レジスタ設定もユーザ指定値を使う)の処理を行なうルーチンを設けなければならないようだ。

さて、通常の読み書きと言ってもなかなか難しい。cmdkデバイスはパーティションテーブルを考慮するので、ディスクそのものよりは一段抽象的なレイヤにあるからこれをいじるのはちょっとおかしい。
となると、対象となるのはdadkデバイスだろう。dadkデバイスは、devfsツリーでは出現しない(pci-ide→ide→cmdkなので)が、なぜかディスクを表現することが可能な不思議なデバイスである。
特に、dadk_ioctl(DIOCTL_RWCMD)や、cmdkread()からcmdkstrategy()経由で呼び出されるdadk_strategy()があやしい。例えば、struct uioやstruct bufをでっちあげて、それに対してあたかもcmdkstrategy()が呼んだかのごとくdadk_strategy()を呼び出してやればいいのかなと。

ただ、dadk_strategy()はGHDという良く分からない仕組みに深く関わっているし、dadk_ioctl(DIOCTL_RWCMD)→dadk_dk_buf_setup()→dadk_dk_strategy()→dadk_dk()と呼び出していくうちにやはりGHDにぶつかってしまう。うーむうーむ。

0 件のコメント: