ioapic.c void ioapicenable(int irq, int cpunum)
トップページ
jupiteroak.hatenablog.com
ioapic.c
https://github.com/mit-pdos/xv6-public/blob/master/ioapic.c#L67
void ioapicenable(int irq, int cpunum) { // Mark interrupt edge-triggered, active high, // enabled, and routed to the given cpunum, // which happens to be that cpu's APIC ID. ioapicwrite(REG_TABLE+2*irq, T_IRQ0 + irq); ioapicwrite(REG_TABLE+2*irq+1, cpunum << 24); }
ioapicenable関数は、I/OAPICが持つIRQピンのうち、ピン番号irqのIRQピンへの割り込みを有効化します(ピン番号irqのIRQピンへの割り込みと割り込みベクタ番号の対応関係をつくります)。
引数 int irq
割り込み有効化の対象となるIRQピンのピン番号です。
引数 int cpunum
割り込みの標的となるプロセッサのLocal APIC IDです。
処理の内容
ピン番号irqであるIRQピンに対応しているRedirection Table Entryに値を設定する
ピン番号irqのIRQピンに対応しているRedirection Table Entryに値を設定することで、ピン番号irqのIRQピンへの割り込みを有効化します。
Redirection Table Entryは、32bit幅のレジスタ2つから構成されています。
ピン番号irqのIRQピンに対応しているRedirection Table Entryのオフセットアドレスは、
Redirection Table Entryのbit31-0を指定するREG_TABLE(#define REG_TABLE 0x10)+2*irq、
Redirection Table Entryのbit63-32を指定するREG_TABLE(#define REG_TABLE 0x10)+2*irq+1
の2つになります。
Redirection Table Entryのbit31-0に割り込みの有効化と割り込みベクタ番号を設定する
ioapicwrite(REG_TABLE+2*irq, T_IRQ0 + irq);
ioapicwrite関数を呼び出して、オフセットアドレスREG_TABLE+2*irqに対応しているRedirection Table Entryのbit31-0に対し、T_IRQ0(#define T_IRQ0 32) + irqを書き込みます。この書き込みにより、Redirection Table Entryのbit31-0のフィールド・フラグには以下のように値が設定されます。
bit31-17
予約済みです。
bit16 maskフラグ:設定値 0
このフラグが0の時は、割り込みが有効化されます。
bit11 Destination Modeフラグ:設定値 0
Destinationフィールド(Redirection Table Entryのbit63-56)がプロセッサを指定する方式を選択するフラグです。
このフラグが0の時は、physical desitination mode(Local APIC IDを用いてプロセッサを指定する方式)が選択されていることを示しています。
bit7-0 vectorフィールド:設定値 T_IRQ0 + irq
ピン番号irqのIRQピンに送信される割り込みの識別番号(割り込み番号)を設定するフィールドです。
Intel 64 IA-32architectureでは0から31までの割り込みベクタ番号は予約済みなので、ユーザーが設定できる割り込みベクタ番号は32から255までとなります。
Redirection Table Entryのbit63-32に割り込みの標的となるプロセッサのLocal APIC IDを設定する
ioapicwrite(REG_TABLE+2*irq+1, cpunum << 24);
ioapicwrite関数を呼び出して、オフセットアドレスREG_TABLE+2*irq+1に対応しているRedirection Table Entryのbit63-32に対し、cpunum << 24を書き込みます。この書き込みにより、Redirection Table Entryのbit63-32のフィールド・フラグには以下のように値が設定されます。
bit63-56 Destinationフィールド:設定値 cpunum << 24
割り込みの標的となるプロセッサを指定するフィールドです。
bit11のDestination Modeフラグに0(physical desitination mode)が設定されているので、このフィールドにはLocal APIC IDを指定する必要があります。
cpunumを24bit左シフト演算することで)、cpunumの下位8bitをbit63-56のDestinationフィールドに設定しています。
bit55-32
予約済みです。