top page > X Window System > here

FreeBSD における X Window System (修正)


概要

対象は次のようなものです.

  1. PC-98 (とはいえ AT 互換機と共通の情報も多いです.)
  2. XFree86 の 4 系,X.Org の 6 系,7 系
  3. FreeBSD は 4 系までは FreeBSD(98),5 系以降は FreeBSD/pc98

目的は次のようなものです.

  1. X Window System の自前の修正法を提示する.

目次

1. 文書の取得
2. ports を利用してソースを修正する方法
3. ソースの見方
4. 参考資料

1. 文書の取得

修正の必要性の有無にかかわらず,先ず ports/packages そのままの状態で install しておく方が合理的です. 少なくともソース等の修正を要する部分だけは packages でなく ports を使って install します.

ここで言う「修正」とは,X のソースだけでなく,FreeBSD の側が設定した種々の選択の変更も含みます. X のソースの修正は,その動作に問題がある場合に必要になります. また設定の変更は,導入されるものを変えたい場合などに必要になります.

PC-98 にて動作する X Window System の状況は,ソース等に添付される文書 README98 に書かれています. これは本来は install の際に /usr/X11R6/lib/X11/doc/Japanese/ に置かれます. しかし,FreeBSD の X Window System のメンテナーの方が ports/packages を作成する際にこれを意識的に収録するような選択をしない場合,このファイルはありませんし Japanese という directory すら作成されません. 収録の状況は以下の通りです.

  1. XFree86 4 系の場合,FreeBSD 4.10 以前は収録されておりません.
    それ以後 (version でなく release 時期で) は収録されています.
  2. X.Org 6 系の場合,一貫して収録されておりません.
  3. X.Org 7 系の場合,このファイルおよびその代替物は存在しません.

このファイルを得るためには,次の節にて配布する patch を取得していただき,そこに記された修正を加え,ports を使って X Window System の一部を再度 install する必要があります. (当然,X.Org 7 系を除く.)

2. ports を利用してソースを修正する方法

先にも書きましたが,FreeBSD 独自の修正がされている可能性があります. ports を利用すれば,それも自動的に反映されます.

ここに修正作業に必要なマニュアルとファイルを置きます. → x98patch.tgz
この中には以下の 5 組の patch が入っています. (X.Org 7.7 用のものはさらに小分けしています.)

  1. XFree86 4.4.0 用の trident のためのもの.
  2. X.Org 6.9.0 用の trident, cirrus, README98 etc. のためのもの.
  3. X.Org 7.4 用の cirrus のためのもの.
  4. X.Org 7.5 用の cirrus のためのもの.
  5. X.Org 7.7 用の kbd, mga, savage のためのもの.

通信環境の差異も含めて作業の手順は同封の文書 (README) に書いておきました.

X.Org 7 系は FreeBSD 7.2 を導入したのを契機に使い始めたのですが,うちではこれを PC-9821 La13 に導入できません.[1] したがって,X.Org 7.4, 7.5 用の cirrus のための patch は動作試験なしのものです.[2]

[1] FreeBSD/pc98 の 5 系あたりからですが,network card が使えなくなりました. (もちろん,その気になれば他に手段はあります.) そのことと,うちに余分の HDD がないことから,PC-9821 La13 は FreeBSD(98) 4.10 を使い続けています.

[2] 2011.10.22 に,X.Org に送っていた patch が採用されました. 変更は xf86-video-cirrus-1.4.0 にて反映されます. ただし,これも動作試験なしのものです. (試験は行う予定ですが,そのためには先ず OS を更新しないと...)

3. ソースの見方

ソースは大量にありますが,注目すべきは driver でしょう. XFree86 や X.Org 6 系では,以下のところにあります.

xc/programs/Xserver/hw/xfree86/drivers/*/*_driver.c

これらのうち PC-98 をサポートしているものは,次のようにして探せます.

% grep IsPc98 */*_driver.c

また,X.Org 7 系では,ports/x11-drivers/ の各々の driver にて make すれば,そのソースが得られます.

動作するしないは,driver だけでなく server 側の問題である場合もあるので御注意下さい.

FreeBSD による独自の修正は,XFree86 や X.Org 6 系では

/usr/ports/x11-servers/XFree86-4-Server/files/
/usr/ports/x11-servers/xorg-server/files/

等にある patch file(s) により行なうので,ここから修正の有無や内容を知ることができます.
また,X.Org 7 系では,それは ports の各々の driver のところにあります.

PC-98 に関連する部分は,それらを % grep IsPc98 で見れば状況が分かります.

PC-98 にて X を動かす場合には,AT 互換機用のソースに次のような操作を追加する必要があります.

  1. console と X との画面の切り換え (必須)
  2. グラフィックボードの諸設定 (たいていは必須だが,不要な場合もある)
    どこをどのように設定すれば良いのかが分かっているものと,いないものとがある.
  3. AT 互換機用の VESA BIOS が動くことを前提としているものは,その機能の代替を作る.

XFree86 3 系から 4 系に移行する際に,driver の諸関数の機能の分け方や名前の付け方に指針ができ,ソースが見易くなりました. ただし,細かい部分までは統一されていないので,複数の driver のソースを比較しながらの解読はなおも容易ではありません.

基幹となる driver のソースは *_driver.c のように命名されています. 少なくともこのファイルに対しては PC-98 のための修正が必要になります. mga_driver.c では次のようになっています. (提示するのは話題にしている部分だけです.)

MGAModeInit()
{
    vgaHWProtect(pScrn, FALSE);

    if (xf86IsPc98()) {
        if (pMga->Chipset == PCI_CHIP_MGA2064)
            outb(0xfac, 0x01);     ← mga2064w (Millennium)
        else
            outb(0xfac, 0x02);     ← mga1064sg (Mystique)
    }
}

MGALeaveVT()
{
    MGARestore(pScrn);
    vgaHWLock(hwp);

    if (xf86IsPc98())
        outb(0xfac, 0x00);
}

MGACloseScreen()
{
    if (xf86IsPc98())
        outb(0xfac, 0x00);
}

console 画面も担っている「抜いちゃダメ」なボードのいくつかは,もう一手間かけないと X の画面の真ん中に console の画面が残ってしまいます.(trident, cirrus) その「一手間」はここでは提示しませんが,たいていは一つの関数にまとめられています.

trident_driver.c では次のようになっています.

TRIDENTModeInit()
{
    vgaHWProtect(pScrn, FALSE);

    if (xf86IsPc98())
        PC98TRIDENTEnable(pScrn);      ← ここから outb(0xfac,2) を実行する.
}

TRIDENTLeaveVT()
{
    TRIDENTRestore(pScrn);
    vgaHWLock(hwp);

    if (xf86IsPc98())
        PC98TRIDENTDisable(pScrn);     ← ここから outb(0xfac,0) を実行する.
}

TRIDENTCloseScreen()
{
    if (xf86IsPc98())
        PC98TRIDENTDisable(pScrn);     ← ここから outb(0xfac,0) を実行する.
}

alp_driver.c (cirrus) では次のようになっています.

AlpModeInit()
{
         vgaHWProtect(pScrn, FALSE);

         if (xf86IsPc98())
                 PC98CIRRUS755xEnable(pScrn);      ← ここから outb(0xfac,2) を実行する.
}

AlpLeaveVT()
{
        AlpRestore(pScrn);
        vgaHWLock(hwp);

        if (xf86IsPc98())
                PC98CIRRUS755xDisable(pScrn);     ← ここから outb(0xfac,0) を実行する.
}

AlpCloseScreen()
{
        if (xf86IsPc98())
                PC98CIRRUS755xDisable(pScrn);     ← ここから outb(0xfac,0) を実行する.
}

使用する driver のソースに最低でもこれらの追加部分がなければ,それは PC-98 では正常に動作しません. 従って,ここを見れば PC-98 に対応しているか否かを判別することができます.

(注) 上に示した例は PC-98 にとって必須の部分のみであり,これを追加しただけで PC-98 に未対応の driver が動作するようになるわけではありません.

4. 参考資料

XFree86 4 系または X.Org 6 系の以下のファイル. (これは X.Org 7 系では配布されていないようで,困ったものです.)

/usr/X11R6/lib/X11/doc/DESIGN