stos/amd64: lapic: Clean up LAPIC IPI code
Signed-off-by: Chloe M. <chloe@mensia.org>
This commit is contained in:
@@ -191,7 +191,6 @@ MdLapicSendIpi(UCHAR Vector, UCHAR DestId, BOOLEAN LogicalDest,
|
|||||||
KPCR *ThisCore;
|
KPCR *ThisCore;
|
||||||
MCB *Mcb;
|
MCB *Mcb;
|
||||||
ULONG IcrLow, IcrHigh;
|
ULONG IcrLow, IcrHigh;
|
||||||
ULONG Icr = 0;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If the shorthand is refering to ourselves and we are x2APIC we
|
* If the shorthand is refering to ourselves and we are x2APIC we
|
||||||
@@ -204,30 +203,29 @@ MdLapicSendIpi(UCHAR Vector, UCHAR DestId, BOOLEAN LogicalDest,
|
|||||||
}
|
}
|
||||||
|
|
||||||
Mcb = &ThisCore->Mcb;
|
Mcb = &ThisCore->Mcb;
|
||||||
|
IcrLow = 0;
|
||||||
|
IcrHigh = 0;
|
||||||
|
|
||||||
/* Clamp these fields */
|
/* Clamp these fields */
|
||||||
DelMod &= 7;
|
DelMod &= 7;
|
||||||
Xnd &= 3;
|
Xnd &= 3;
|
||||||
|
|
||||||
/* Encode the ICR */
|
/* Encode the ICR */
|
||||||
Icr |= Vector & 0xFF;
|
IcrLow |= Vector & 0xFF;
|
||||||
Icr |= Xnd << 18;
|
IcrLow |= Xnd << 18;
|
||||||
Icr |= DelMod << 8;
|
IcrLow |= DelMod << 8;
|
||||||
Icr |= LogicalDest << 11;
|
IcrLow |= LogicalDest << 11;
|
||||||
|
|
||||||
/* For xAPIC only */
|
/* For xAPIC only */
|
||||||
if (!Mcb->HasX2Apic) {
|
if (!Mcb->HasX2Apic) {
|
||||||
IcrHigh = ((UQUAD)Icr >> 32) & (ULONG)-1;
|
|
||||||
IcrLow = Icr & (ULONG)-1;
|
|
||||||
IcrHigh |= (UQUAD)DestId << 24;
|
IcrHigh |= (UQUAD)DestId << 24;
|
||||||
|
|
||||||
LapicRegWrite(Mcb, LAPIC_ICRHI, IcrHigh);
|
LapicRegWrite(Mcb, LAPIC_ICRHI, IcrHigh);
|
||||||
LapicRegWrite(Mcb, LAPIC_ICRLO, IcrLow);
|
LapicRegWrite(Mcb, LAPIC_ICRLO, IcrLow);
|
||||||
|
|
||||||
/* Only on legacy xAPICs do we poll */
|
/* Only on legacy xAPICs do we poll */
|
||||||
for (;;) {
|
for (;;) {
|
||||||
Icr = LapicRegRead(Mcb, LAPIC_ICRLO);
|
IcrLow = LapicRegRead(Mcb, LAPIC_ICRLO);
|
||||||
if (ISSET(Icr, IPI_DELSTAT_PENDING))
|
if (ISSET(IcrLow, IPI_DELSTAT_PENDING))
|
||||||
HalCpuSpinWait();
|
HalCpuSpinWait();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -235,8 +233,7 @@ MdLapicSendIpi(UCHAR Vector, UCHAR DestId, BOOLEAN LogicalDest,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* On x2APICs only as it queues */
|
/* On x2APICs only as it queues */
|
||||||
Icr |= (UQUAD)DestId << 32;
|
LapicRegWrite(Mcb, LAPIC_ICRLO, ((UQUAD)DestId << 32) | IcrLow);
|
||||||
LapicRegWrite(Mcb, LAPIC_ICRLO, Icr);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
|
|||||||
Reference in New Issue
Block a user