diff --git a/MdeModulePkg/Bus/Ata/AtaAtapiPassThru/AhciMode.c b/MdeModulePkg/Bus/Ata/AtaAtapiPassThru/AhciMode.c index 7101c665bf..1c45312712 100644 --- a/MdeModulePkg/Bus/Ata/AtaAtapiPassThru/AhciMode.c +++ b/MdeModulePkg/Bus/Ata/AtaAtapiPassThru/AhciMode.c @@ -2202,8 +2202,19 @@ AhciModeInitialization ( return EFI_OUT_OF_RESOURCES; } - for (Port = 0; Port < MaxPortNumber; Port ++) { + for (Port = 0; Port < EFI_AHCI_MAX_PORTS; Port ++) { if ((PortImplementBitMap & (BIT0 << Port)) != 0) { + // + // According to AHCI spec, MaxPortNumber should be equal or greater than the number of implemented ports. + // + if ((MaxPortNumber--) == 0) { + // + // Should never be here. + // + ASSERT (FALSE); + return EFI_SUCCESS; + } + IdeInit->NotifyPhase (IdeInit, EfiIdeBeforeChannelEnumeration, Port); // diff --git a/MdeModulePkg/Bus/Ata/AtaAtapiPassThru/AhciMode.h b/MdeModulePkg/Bus/Ata/AtaAtapiPassThru/AhciMode.h index 052e7837f5..485b64799e 100644 --- a/MdeModulePkg/Bus/Ata/AtaAtapiPassThru/AhciMode.h +++ b/MdeModulePkg/Bus/Ata/AtaAtapiPassThru/AhciMode.h @@ -26,6 +26,8 @@ #define EFI_AHCI_IS_OFFSET 0x0008 #define EFI_AHCI_PI_OFFSET 0x000C +#define EFI_AHCI_MAX_PORTS 32 + typedef struct { UINT32 Lower32; UINT32 Upper32;