stos/amd64: lapic: Clean up LAPIC IPI code

Signed-off-by: Chloe M. <chloe@mensia.org>
This commit is contained in:
Chloe M.
2026-06-27 14:23:44 -05:00
parent 798c9c2ee8
commit 89e87fc525
+9 -12
View File
@@ -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