ioapic.c static uint ioapicread(int reg)
トップページ
jupiteroak.hatenablog.com
ioapic.c
https://github.com/mit-pdos/xv6-public/blob/master/ioapic.c#L34
static uint ioapicread(int reg) { ioapic->reg = reg; return ioapic->data; }
ioapicread関数は、オフセットアドレスregに対応しているAPIC Indirectレジスタの値を取得します。
引数 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
処理の内容