arch/i386/stand/libsa/apmprobe.c

apm_check関数

apm_check関数では、INT 0x15(AX=5300h)を使用してBIOS経由でAPMのサポート状況を調査します。

入力
レジスタ 内容
AX 5300h
BX device ID of system BIOS (0000h固定)
INT 15H(AX=5300h)のパラメータ
出力
レジスタ 内容
CF 正常:CF clear 異常:CF set
AH major version (BCD表現?)
AL major version (BCD表現?)
BX 504Dh ("PM")
CX APM flagsのビットフィールド
bit0: 16-bit protected mode interface supported
bit1: 32-bit protected mode interface supported
bit2: CPU idle call reduces processor speed
bit3: BIOS power management disabled
bit4: BIOS power management disengaged (APM v1.1)
bit5-7: reserved

INT 0x15からの出力値「major version」と「APM flags」を変数detailに代入して返り値として返えします。

detail変数の内容
reserved APM flags major version major version

apm_disconnect関数

apm_disconnect関数では、INT 0x15(5304h)を使用し、apmのdisconnectを行います。

入力
レジスタ 内容
AX 5304h
BX device ID of system BIOS (0000h固定)
INT 15H(AX=5304h)のパラメータ
出力
レジスタ 内容
CF 正常:CF clear 異常:CF set
AH エラーコード
01h power management functionality disabled
02h interface connection already in effect
03h interface not connected
04h real-mode interface not connected
05h 16-bit protected-mode interface already connected
06h 16-bit protected-mode interface not supported
07h 32-bit protected-mode interface already connected
08h 32-bit protected-mode interface not supported
09h unrecognized device ID
0Ah invalid parameter value in CX
0Bh (APM v1.1) interface not engaged
0Ch (APM v1.2) function not supported
0Dh (APM v1.2) Resume Timer disabled
0Eh-1Fh reserved for other interface and general errors
20h-3Fh reserved for CPU errors
40h-5Fh reserved for device errors
60h can't enter requested state
61h-7Fh reserved for other system errors
80h no power management events pending
81h-85h reserved for other power management event errors
86h APM not present
87h-9Fh reserved for other power management event errors
A0h-FEh reserved
FFh undefined

INT 15H(AX=5304h)のエラーコードを関数の戻値として返します。

apm_connect関数

apmのconnect

apm_connect関数では、INT 0x15(5303h)を使用し、APM 32-BIT PROTMODE INTERFACEでのconnectを行います。

入力
aレジスタ 内容
AX 5303h
BX device ID of system BIOS (0000h固定)
INT 15H(AX=5304h)のパラメータ
出力
レジスタ 内容
CF 正常:CF clear 異常:CF set
AX APM 32-bit code segment (real mode segment base address)
EBX エントリーポイントのオフセット
CX APM 16-bit code segment (real-mode segment base address)
DX APM 16-bit data segment (real-mode segment base address)
ESI APM BIOS 32-bit code segment length (low word of ESI)
APM BIOS 16-bit code segment length (high word of ESI)
DI APM BIOS data segment length
AH(エラーの場合) エラーコード
01h power management functionality disabled
02h interface connection already in effect
03h interface not connected
04h real-mode interface not connected
05h 16-bit protected-mode interface already connected
06h 16-bit protected-mode interface not supported
07h 32-bit protected-mode interface already connected
08h 32-bit protected-mode interface not supported
09h unrecognized device ID
0Ah invalid parameter value in CX
0Bh (APM v1.1) interface not engaged
0Ch (APM v1.2) function not supported
0Dh (APM v1.2) Resume Timer disabled
0Eh-1Fh reserved for other interface and general errors
20h-3Fh reserved for CPU errors
40h-5Fh reserved for device errors
60h can't enter requested state
61h-7Fh reserved for other system errors
80h no power management events pending
81h-85h reserved for other power management event errors
86h APM not present
87h-9Fh reserved for other power management event errors
A0h-FEh reserved
FFh undefined

エントリーポイントのチェック

BXレジスタに返ってくる、エントリーポイントのチェックを行っているのだが、良くわからない....

値のセット

connectの結果が返るので、この値をbios_apminfo_t型の変数aiにセットします。

APMのDriver Versionを取得

Int 15h(AX=530Eh)でAPMのDriver Versionを取得します。

apmprobe関数

APMのチェック

apm_check関数をcallして、apmがサポートされているかチェックします。サポートされていなければ、この関数を抜けます。

APMのdisconnect

apm_disconnect関数をcallして、apmをdisconnectする。

APMのconnect

apm_connect関数をcallして、apmに接続します。接続出来た場合は、変数aiにapm情報が返ります。接続出来なかった場合画面にエラーを表示しreturnします。

Using drive 0 , partition 4 .
Loading........
probing:pc0 com1 com2 
apm: connect error
	

APMのProbe表示

APMのProbeが正常に完了したら、画面に出力します。

Using drive 0 , partition 4 .
Loading........
probing:pc0 com1 com2 apm 
      

bootargにAPM情報をセット

変数aiの値をbootagに追加します。

boottagに追加したapm情報
boottagに追加したapm情報
Last modified: Fri Apr 25 18:50:18 2008 JST