ioapic.c static void ioapicwrite(int reg, uint data)
ioapic.c
https://github.com/mit-pdos/xv6-public/blob/master/ioapic.c#L41
static void ioapicwrite(int reg, uint data) { ioapic->reg = reg; ioapic->data = data; }
ioapicwrite関数は、オフセットアドレスregに対応しているAPIC Indirect レジスタに対して、dataで指定された値を書き込みます。
引数 int reg
書き込み対象となるAPIC Indirectレジスタに対応しているオフセットアドレスです。
引数 uint data
書き込み対象となるAPIC Indirectレジスタに書き込まれる値です。
ioapic構造体
ioapic.c
// IO APIC MMIO structure: write reg, then read or write data. struct ioapic { uint reg; uint pad[3]; uint data; };
APIC Indirectレジスタへアクセスする際は、IOREGSELレジスタとIOWINレジスタを使用します。
IOREGSELレジスタとIOWINレジスタはセットになってioapic構造体として表現されています。IOREGSELレジスタがregメンバに、IOWINレジスタがdataメンバに、それぞれ対応しています。
メモリマップドI/O
IOREGSELレジスタとIOWINレジスタにはメモリマップドI/O方式でアクセスすることができます。IOREGSELレジスタにアクセスする際はアドレス0xFEC0 0000を指定し、IOWINレジスタにアクセスする際はアドレス0xFEC0 0010を指定します。
ioapicread関数やioapicwrite関数内でIOREGSELレジスタとIOWINレジスタにアクセスできるようにするために、ioapic構造体へのポインタioapicには、I/OAPICレジスタのベースアドレスIOAPIC(#define IOAPIC 0xFEC00000)を予め格納しておきます。この処理は、ioapicinit関数で行われています。
https://github.com/mit-pdos/xv6-public/blob/master/ioapic.c#L25
volatile struct ioapic *ioapic;
https://github.com/mit-pdos/xv6-public/blob/master/ioapic.c#L53
ioapic = (volatile struct ioapic*)IOAPIC;
https://github.com/mit-pdos/xv6-public/blob/master/ioapic.c#L9
#define IOAPIC 0xFEC00000
処理の内容