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 


処理の内容

IOREGSELレジスタ(indexレジスタ)にオフセットアドレスを設定する

ioapic->reg = reg;

書き込み対象となるAPIC Indirectレジスタに対応しているオフセットアドレスregをioapic->reg(IOREGSELレジスタ)に設定します。

IOWINレジスタ(dataレジスタ)に値を書き込む

ioapic->data = data;

引数dateの値をioapic->data(IOWINレジスタ)に設定することで、書き込み対象となるAPIC Indirectレジスタへの書き込みを行なっています。