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 


処理の内容

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

ioapic->reg = reg;

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

IOWINレジスタ(dataレジスタ)の値を読み取る

return ioapic->data;

読み取り対象となるAPIC Indirectレジスタの値をioapic->data(IOWINレジスタ)から取得し、戻り値としてリターンします。