From: Sir Richard Date: Tue, 26 Jan 2010 19:21:41 +0000 (+0000) Subject: [BOOTVID]: Fix completely broken VidInitialize routine. I have no idea what the origi... X-Git-Tag: backups/aicom-network-stable@46924^3~12 X-Git-Url: https://git.reactos.org/?p=reactos.git;a=commitdiff_plain;h=590b4a4093a18f8ca20415c474c052891a0c9bfd;hp=71162a52f50c25f959425cb2e8ceef033e16c326 [BOOTVID]: Fix completely broken VidInitialize routine. I have no idea what the original code was trying to accomplish. svn path=/trunk/; revision=45269 --- diff --git a/reactos/drivers/base/bootvid/i386/bootvid.c b/reactos/drivers/base/bootvid/i386/bootvid.c index 8cf2ba1b779..46770e23959 100644 --- a/reactos/drivers/base/bootvid/i386/bootvid.c +++ b/reactos/drivers/base/bootvid/i386/bootvid.c @@ -357,7 +357,7 @@ VidInitialize(IN BOOLEAN SetMode) { ULONG Context = 0; PHYSICAL_ADDRESS TranslatedAddress; - PHYSICAL_ADDRESS NullAddress = {{0, 0}}; + PHYSICAL_ADDRESS NullAddress = {{0, 0}}, VgaAddress; ULONG AddressSpace = 1; BOOLEAN Result; ULONG_PTR Base; @@ -373,12 +373,57 @@ VidInitialize(IN BOOLEAN SetMode) TRUE); if (!Result) return FALSE; - /* See if this is I/O Space, which we need to map */ -TryAgain: + /* Loop trying to find posssible VGA base addresses */ + while (TRUE) + { + /* See if this is I/O Space, which we need to map */ + if (!AddressSpace) + { + /* Map it */ + Base = (ULONG_PTR)MmMapIoSpace(TranslatedAddress, 0x400, MmNonCached); + } + else + { + /* The base is the translated address, no need to map I/O space */ + Base = TranslatedAddress.LowPart; + } + + /* Try to see if this is VGA */ + VgaRegisterBase = Base; + if (VgaIsPresent()) + { + /* Translate the VGA Memory Address */ + VgaAddress.LowPart = 0xA0000; + AddressSpace = 0; + Result = HalFindBusAddressTranslation(VgaAddress, + &AddressSpace, + &TranslatedAddress, + &Context, + FALSE); + if (Result) break; + + /* Try to see if there's any other address */ + Result = HalFindBusAddressTranslation(NullAddress, + &AddressSpace, + &TranslatedAddress, + &Context, + TRUE); + if (!Result) return FALSE; + } + else + { + /* It's not, so unmap the I/O space if we mapped it */ + if (!AddressSpace) MmUnmapIoSpace((PVOID)VgaRegisterBase, 0x400); + } + } + + /* Success! See if this is I/O Space, which we need to map */ if (!AddressSpace) { /* Map it */ - Base = (ULONG_PTR)MmMapIoSpace(TranslatedAddress, 0x400, MmNonCached); + Base = (ULONG_PTR)MmMapIoSpace(TranslatedAddress, + 0x20000, + MmNonCached); } else { @@ -386,67 +431,23 @@ TryAgain: Base = TranslatedAddress.LowPart; } - /* Set the VGA Register base and now check if we have a VGA device */ - VgaRegisterBase = Base; - if (VgaIsPresent()) - { - /* Translate the VGA Memory Address */ - NullAddress.LowPart = 0xA0000; - AddressSpace = 0; - Result = HalFindBusAddressTranslation(NullAddress, - &AddressSpace, - &TranslatedAddress, - &Context, - FALSE); - if (Result) - { - /* Success! See if this is I/O Space, which we need to map */ - if (!AddressSpace) - { - /* Map it */ - Base = (ULONG_PTR)MmMapIoSpace(TranslatedAddress, - 0x20000, - MmNonCached); - } - else - { - /* The base is the translated address, no need to map I/O space */ - Base = TranslatedAddress.LowPart; - } - - /* Set the VGA Memory Base */ - VgaBase = Base; + /* Set the VGA Memory Base */ + VgaBase = Base; - /* Now check if we have to set the mode */ - if (SetMode) - { - /* Reset the display */ - HalResetDisplay(); - curr_x = 0; - curr_y = 0; - - /* Initialize it */ - VgaInterpretCmdStream(AT_Initialization); - return TRUE; - } - } - } - else + /* Now check if we have to set the mode */ + if (SetMode) { - /* It's not, so unmap the I/O space if we mapped it */ - if (!AddressSpace) MmUnmapIoSpace((PVOID)VgaRegisterBase, 0x400); - } + /* Reset the display */ + HalResetDisplay(); + curr_x = 0; + curr_y = 0; - /* If we got here, then we failed...let's try again */ - Result = HalFindBusAddressTranslation(NullAddress, - &AddressSpace, - &TranslatedAddress, - &Context, - TRUE); - if (Result) goto TryAgain; - - /* If we got here, then we failed even past our re-try... */ - return FALSE; + /* Initialize it */ + VgaInterpretCmdStream(AT_Initialization); + } + + /* VGA is ready */ + return TRUE; } /*