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ピンのうち、ピン番号irqIRQピンへの割り込みを有効化します(ピン番号irqIRQピンへの割り込みと割り込みベクタ番号の対応関係をつくります)。

引数 int irq
割り込み有効化の対象となるIRQピンのピン番号です。

引数 int cpunum
割り込みの標的となるプロセッサのLocal APIC IDです。


処理の内容

ピン番号irqであるIRQピンに対応しているRedirection Table Entryに値を設定する

ピン番号irqIRQピンに対応しているRedirection Table Entryに値を設定することで、ピン番号irqIRQピンへの割り込みを有効化します。
Redirection Table Entryは、32bit幅のレジスタ2つから構成されています。
ピン番号irqIRQピンに対応している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
ピン番号irqIRQピンに送信される割り込みの識別番号(割り込み番号)を設定するフィールドです。
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
予約済みです。