EN JA
BIOS(9)
BIOS(9) FreeBSD Kernel Developer's Manual BIOS(9)

名称

bios_sigsearch, bios32_SDlookup, bios32, bios_oem_stringsPC BIOS との相互作用

書式

#include < sys/param.h>
#include < vm/vm.h>
#include < vm/pmap.h>
#include < machine/param.h>
#include < machine/pmap.h>
#include < machine/pc/bios.h>

uint32_t
bios_sigsearch( uint32_t start, u_char *sig, int siglen, int paralen, int sigofs);

int
bios32_SDlookup( struct bios32_SDentry *ent);

int
bios32( struct bios_regs *br, u_int offset, u_short segment);

BIOS_PADDRTOVADDR( addr);

BIOS_VADDRTOPADDR( addr);

extern struct bios32_SDentry PCIbios;
extern struct SMBIOS_table SMBIOStable;
extern struct DMI_table DMItable;

int
bios_oem_strings( struct bios_oem *oem, u_char *buffer, size_t maxlen);

struct bios_oem_signature { 
        char * anchor;          /* BIOS メモリのアンカ文字列を検索 */ 
        size_t offset;          /* アンカからのオフセット (たぶん負) */ 
        size_t totlen;          /* コピーする BIOS 文字列の合計長 */ 
}; 
struct bios_oem_range { 
        u_int from;             /* 0xe0000 より下にあるべきでない */ 
        u_int to;               /* 0xfffff より上にあるべきでない */ 
}; 
struct bios_oem { 
        struct bios_oem_range range; 
        struct bios_oem_signature signature[]; 
};

解説

これらの関数は、x86 PC アーキテクチャシステムで遭遇する BIOS 機能とデータを処理するための汎用のインタフェースを提供しています。
bios_sigsearch()
サービスシグネチャの BIOS アドレス空間を検索します。サービスシグネチャは、大抵はアンダスコアで囲まれている大文字の ASCII 文字列です。検索は、 start から、または start が 0 の場合には BIOS の最初から始まります。 siglen バイトの BIOS イメージと sig とが、現在位置から sigofs バイトのオフセットにおいて比較されます。マッチしないことが分かると、現在位置が paralen バイト増加されて検索が繰り返されます。シグネチャが見つかった場合には、その実効物理アドレスが返されます。シグネチャが見つからなかった場合には、0 が返されます。
bios_oem_strings()
1 つ以上の文字列のために与えられた BIOS メモリ範囲を検索して、それらの見つけられた印刷可能な連結を構成します。ルーチンは、BIOS アドレスの 0xe0000 - 0xfffff の中の) range (範囲) と anchor 文字列を定義する bios_oem_signature 構造体の { NULL, 0, 0 } で終了した配列、(たぶん負の) 適合の始まりからの offset とオフセットで始まる BIOS メモリから集められる totlen バイト数を記述する構造体と予想します。一致すれば、空白に置き換えられた印刷不可能な文字と連続する空白を抑制して、それらの対応する offset から始まる BIOS メモリからコピーされるのに対して、一致しないアンカは、無視されます。この構成された文字列は、(終端の‘ \0’と後続する削除された空白を含んで) 与えられた maxlen バイトまで buffer に格納されます。エラーに遭遇するなら、すなわち、前述の BIOS 範囲外からの読み込みの試み、他の無効な入力、または buffer オーバフローは、負の整数が返されます、そうでなければ、構成された文字列の長さが返されます。特に、0 の返り値は、与えられたアンカ文字列が指定された BIOS メモリ範囲で見つけられなかったことを意味します。
BIOS_VADDRTOPADDR()
カーネル仮想アドレス addr に対応する実効物理アドレスを返します。
BIOS_PADDRTOVADDR()
実効物理アドレス addr に対応するカーネル仮想アドレスを返します。
SMBIOStable
NULL でない場合は、システム起動時にシステムマネージメント BIOS (System Management BIOS; SMBIOS) テーブルから読み込まれた情報を含んでいる struct SMBIOS_table 構造体を指します。
DMItable
NULL でない場合は、システム起動時にデスクトップマネージメントインタフェース (Desktop Management Interface; DMI) パラメータテーブルから読み込まれた情報を含んでいる struct DMI_table 構造体を指します。

BIOS32

システム起動時に、BIOS32 サービスディレクトリ (PCI 仕様の一部) のために BIOS がスキャンされ、ディレクトリの存在が記録されます。これは後で、他のサービスの場所を特定するために使用できます。
bios32_SDlookup()
引数 entident フィールドで渡される 4 バイトの識別子にマッチする BIOS32 サービスの場所を特定しようと試みます。
bios32()
bios32 関数を呼び出します。これは関数が、カーネルセグメント内で動作できることを仮定しています (通常の場合)。エントリポイントの仮想アドレスは entry で与えられ、関数へのレジスタ引数は、 args で与えられます。
PCIbios
NULL でない場合は、システム起動時に見つかった PCI BIOS エントリポイントを記述する struct bios32_SDentry 構造体を指します。
August 9, 2005 FreeBSD