1. Fixed a logical error in PciReadBuffer() and PciWriteBuffer()

2. Fixed GetInterruptState() on IPF to return the state of interrupts correctly

git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@850 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
bxing 2006-07-10 02:56:56 +00:00
parent ace425da36
commit 9748aecca6
3 changed files with 63 additions and 35 deletions

View File

@ -22,6 +22,6 @@
.type GetInterruptState, @function .type GetInterruptState, @function
GetInterruptState:: GetInterruptState::
mov r8 = psr mov r8 = psr
dep.z r8 = r8, 14, 1 extr.u r8 = r8, 14, 1
br.ret.sptk.many b0 br.ret.sptk.many b0
.endp GetInterruptState .endp GetInterruptState

View File

@ -1295,18 +1295,21 @@ PciCf8ReadBuffer (
OUT VOID *Buffer OUT VOID *Buffer
) )
{ {
UINTN EndAddress; UINTN ReturnValue;
ASSERT_INVALID_PCI_ADDRESS (StartAddress, 0); ASSERT_INVALID_PCI_ADDRESS (StartAddress);
ASSERT (((StartAddress & 0xFFF) + Size) <= 0x100); ASSERT (((StartAddress & 0xFFF) + Size) <= 0x100);
if (Size == 0) { if (Size == 0) {
return 0; return Size;
} }
ASSERT (Buffer != NULL); ASSERT (Buffer != NULL);
EndAddress = StartAddress + Size; //
// Save Size for return
//
ReturnValue = Size;
if ((StartAddress & 1) != 0) { if ((StartAddress & 1) != 0) {
// //
@ -1314,44 +1317,48 @@ PciCf8ReadBuffer (
// //
*(UINT8*)Buffer = PciCf8Read8 (StartAddress); *(UINT8*)Buffer = PciCf8Read8 (StartAddress);
StartAddress += sizeof (UINT8); StartAddress += sizeof (UINT8);
Size -= sizeof (UINT8);
Buffer = (UINT8*)Buffer + 1; Buffer = (UINT8*)Buffer + 1;
} }
if ((StartAddress < EndAddress) && ((StartAddress & 2) != 0)) { if (Size >= sizeof (UINT16) && (StartAddress & 2) != 0) {
// //
// Read a word if StartAddress is word aligned // Read a word if StartAddress is word aligned
// //
*(UINT16*)Buffer = PciCf8Read16 (StartAddress); *(UINT16*)Buffer = PciCf8Read16 (StartAddress);
StartAddress += sizeof (UINT16); StartAddress += sizeof (UINT16);
Size -= sizeof (UINT16);
Buffer = (UINT16*)Buffer + 1; Buffer = (UINT16*)Buffer + 1;
} }
while ((EndAddress - StartAddress) >= 4) { while (Size >= sizeof (UINT32)) {
// //
// Read as many double words as possible // Read as many double words as possible
// //
*(UINT32*)Buffer = PciCf8Read32 (StartAddress); *(UINT32*)Buffer = PciCf8Read32 (StartAddress);
StartAddress += sizeof (UINT32); StartAddress += sizeof (UINT32);
Size -= sizeof (UINT32);
Buffer = (UINT32*)Buffer + 1; Buffer = (UINT32*)Buffer + 1;
} }
if ((EndAddress & 2) != 0) { if (Size >= sizeof (UINT16)) {
// //
// Read the last remaining word if exist // Read the last remaining word if exist
// //
*(UINT16*)Buffer = PciCf8Read16 (StartAddress); *(UINT16*)Buffer = PciCf8Read16 (StartAddress);
StartAddress += sizeof (UINT16); StartAddress += sizeof (UINT16);
Size -= sizeof (UINT16);
Buffer = (UINT16*)Buffer + 1; Buffer = (UINT16*)Buffer + 1;
} }
if ((EndAddress & 1) != 0) { if (Size >= sizeof (UINT8)) {
// //
// Read the last remaining byte if exist // Read the last remaining byte if exist
// //
*(UINT8*)Buffer = PciCf8Read8 (StartAddress); *(UINT8*)Buffer = PciCf8Read8 (StartAddress);
} }
return Size; return ReturnValue;
} }
/** /**
@ -1387,18 +1394,21 @@ PciCf8WriteBuffer (
IN VOID *Buffer IN VOID *Buffer
) )
{ {
UINTN EndAddress; UINTN ReturnValue;
ASSERT_INVALID_PCI_ADDRESS (StartAddress, 0); ASSERT_INVALID_PCI_ADDRESS (StartAddress);
ASSERT (((StartAddress & 0xFFF) + Size) <= 0x100); ASSERT (((StartAddress & 0xFFF) + Size) <= 0x100);
if (Size == 0) { if (Size == 0) {
return 0; return 0;
} }
ASSERT (Buffer != 0); ASSERT (Buffer != NULL);
EndAddress = StartAddress + Size; //
// Save Size for return
//
ReturnValue = Size;
if ((StartAddress & 1) != 0) { if ((StartAddress & 1) != 0) {
// //
@ -1406,42 +1416,46 @@ PciCf8WriteBuffer (
// //
PciCf8Write8 (StartAddress, *(UINT8*)Buffer); PciCf8Write8 (StartAddress, *(UINT8*)Buffer);
StartAddress += sizeof (UINT8); StartAddress += sizeof (UINT8);
Size -= sizeof (UINT8);
Buffer = (UINT8*)Buffer + 1; Buffer = (UINT8*)Buffer + 1;
} }
if ((StartAddress < EndAddress) && ((StartAddress & 2) != 0)) { if (Size >= sizeof (UINT16) && (StartAddress & 2) != 0) {
// //
// Write a word if StartAddress is word aligned // Write a word if StartAddress is word aligned
// //
PciCf8Write16 (StartAddress, *(UINT16*)Buffer); PciCf8Write16 (StartAddress, *(UINT16*)Buffer);
StartAddress += sizeof (UINT16); StartAddress += sizeof (UINT16);
Size -= sizeof (UINT16);
Buffer = (UINT16*)Buffer + 1; Buffer = (UINT16*)Buffer + 1;
} }
while ((EndAddress - StartAddress) >= 4) { while (Size >= sizeof (UINT32)) {
// //
// Write as many double words as possible // Write as many double words as possible
// //
PciCf8Write32 (StartAddress, *(UINT32*)Buffer); PciCf8Write32 (StartAddress, *(UINT32*)Buffer);
StartAddress += sizeof (UINT32); StartAddress += sizeof (UINT32);
Size -= sizeof (UINT32);
Buffer = (UINT32*)Buffer + 1; Buffer = (UINT32*)Buffer + 1;
} }
if ((EndAddress & 2) != 0) { if (Size >= sizeof (UINT16)) {
// //
// Write the last remaining word if exist // Write the last remaining word if exist
// //
PciCf8Write16 (StartAddress, *(UINT16*)Buffer); PciCf8Write16 (StartAddress, *(UINT16*)Buffer);
StartAddress += sizeof (UINT16); StartAddress += sizeof (UINT16);
Size -= sizeof (UINT16);
Buffer = (UINT16*)Buffer + 1; Buffer = (UINT16*)Buffer + 1;
} }
if ((EndAddress & 1) != 0) { if (Size >= sizeof (UINT8)) {
// //
// Write the last remaining byte if exist // Write the last remaining byte if exist
// //
PciCf8Write8 (StartAddress, *(UINT8*)Buffer); PciCf8Write8 (StartAddress, *(UINT8*)Buffer);
} }
return Size; return ReturnValue;
} }

View File

@ -1192,18 +1192,21 @@ PciExpressReadBuffer (
OUT VOID *Buffer OUT VOID *Buffer
) )
{ {
UINTN EndAddress; UINTN ReturnValue;
ASSERT_INVALID_PCI_ADDRESS (StartAddress); ASSERT_INVALID_PCI_ADDRESS (StartAddress);
ASSERT (((StartAddress & 0xFFF) + Size) <= 0x1000); ASSERT (((StartAddress & 0xFFF) + Size) <= 0x1000);
if (Size == 0) { if (Size == 0) {
return 0; return Size;
} }
ASSERT (Buffer != NULL); ASSERT (Buffer != NULL);
EndAddress = StartAddress + Size; //
// Save Size for return
//
ReturnValue = Size;
if ((StartAddress & 1) != 0) { if ((StartAddress & 1) != 0) {
// //
@ -1211,44 +1214,48 @@ PciExpressReadBuffer (
// //
*(UINT8*)Buffer = PciExpressRead8 (StartAddress); *(UINT8*)Buffer = PciExpressRead8 (StartAddress);
StartAddress += sizeof (UINT8); StartAddress += sizeof (UINT8);
Size -= sizeof (UINT8);
Buffer = (UINT8*)Buffer + 1; Buffer = (UINT8*)Buffer + 1;
} }
if ((StartAddress < EndAddress) && ((StartAddress & 2) != 0)) { if (Size >= sizeof (UINT16) && (StartAddress & 2) != 0) {
// //
// Read a word if StartAddress is word aligned // Read a word if StartAddress is word aligned
// //
*(UINT16*)Buffer = PciExpressRead16 (StartAddress); *(UINT16*)Buffer = PciExpressRead16 (StartAddress);
StartAddress += sizeof (UINT16); StartAddress += sizeof (UINT16);
Size -= sizeof (UINT16);
Buffer = (UINT16*)Buffer + 1; Buffer = (UINT16*)Buffer + 1;
} }
while ((EndAddress - StartAddress) >= 4) { while (Size >= sizeof (UINT32)) {
// //
// Read as many double words as possible // Read as many double words as possible
// //
*(UINT32*)Buffer = PciExpressRead32 (StartAddress); *(UINT32*)Buffer = PciExpressRead32 (StartAddress);
StartAddress += sizeof (UINT32); StartAddress += sizeof (UINT32);
Size -= sizeof (UINT32);
Buffer = (UINT32*)Buffer + 1; Buffer = (UINT32*)Buffer + 1;
} }
if ((EndAddress & 2) != 0) { if (Size >= sizeof (UINT16)) {
// //
// Read the last remaining word if exist // Read the last remaining word if exist
// //
*(UINT16*)Buffer = PciExpressRead16 (StartAddress); *(UINT16*)Buffer = PciExpressRead16 (StartAddress);
StartAddress += sizeof (UINT16); StartAddress += sizeof (UINT16);
Size -= sizeof (UINT16);
Buffer = (UINT16*)Buffer + 1; Buffer = (UINT16*)Buffer + 1;
} }
if ((EndAddress & 1) != 0) { if (Size >= sizeof (UINT8)) {
// //
// Read the last remaining byte if exist // Read the last remaining byte if exist
// //
*(UINT8*)Buffer = PciExpressRead8 (StartAddress); *(UINT8*)Buffer = PciExpressRead8 (StartAddress);
} }
return Size; return ReturnValue;
} }
/** /**
@ -1283,7 +1290,7 @@ PciExpressWriteBuffer (
IN VOID *Buffer IN VOID *Buffer
) )
{ {
UINTN EndAddress; UINTN ReturnValue;
ASSERT_INVALID_PCI_ADDRESS (StartAddress); ASSERT_INVALID_PCI_ADDRESS (StartAddress);
ASSERT (((StartAddress & 0xFFF) + Size) <= 0x1000); ASSERT (((StartAddress & 0xFFF) + Size) <= 0x1000);
@ -1294,7 +1301,10 @@ PciExpressWriteBuffer (
ASSERT (Buffer != NULL); ASSERT (Buffer != NULL);
EndAddress = StartAddress + Size; //
// Save Size for return
//
ReturnValue = Size;
if ((StartAddress & 1) != 0) { if ((StartAddress & 1) != 0) {
// //
@ -1302,42 +1312,46 @@ PciExpressWriteBuffer (
// //
PciExpressWrite8 (StartAddress, *(UINT8*)Buffer); PciExpressWrite8 (StartAddress, *(UINT8*)Buffer);
StartAddress += sizeof (UINT8); StartAddress += sizeof (UINT8);
Size -= sizeof (UINT8);
Buffer = (UINT8*)Buffer + 1; Buffer = (UINT8*)Buffer + 1;
} }
if ((StartAddress < EndAddress) && ((StartAddress & 2) != 0)) { if (Size >= sizeof (UINT16) && (StartAddress & 2) != 0) {
// //
// Write a word if StartAddress is word aligned // Write a word if StartAddress is word aligned
// //
PciExpressWrite16 (StartAddress, *(UINT16*)Buffer); PciExpressWrite16 (StartAddress, *(UINT16*)Buffer);
StartAddress += sizeof (UINT16); StartAddress += sizeof (UINT16);
Size -= sizeof (UINT16);
Buffer = (UINT16*)Buffer + 1; Buffer = (UINT16*)Buffer + 1;
} }
while ((EndAddress - StartAddress) >= 4) { while (Size >= sizeof (UINT32)) {
// //
// Write as many double words as possible // Write as many double words as possible
// //
PciExpressWrite32 (StartAddress, *(UINT32*)Buffer); PciExpressWrite32 (StartAddress, *(UINT32*)Buffer);
StartAddress += sizeof (UINT32); StartAddress += sizeof (UINT32);
Size -= sizeof (UINT32);
Buffer = (UINT32*)Buffer + 1; Buffer = (UINT32*)Buffer + 1;
} }
if ((EndAddress & 2) != 0) { if (Size >= sizeof (UINT16)) {
// //
// Write the last remaining word if exist // Write the last remaining word if exist
// //
PciExpressWrite16 (StartAddress, *(UINT16*)Buffer); PciExpressWrite16 (StartAddress, *(UINT16*)Buffer);
StartAddress += sizeof (UINT16); StartAddress += sizeof (UINT16);
Size -= sizeof (UINT16);
Buffer = (UINT16*)Buffer + 1; Buffer = (UINT16*)Buffer + 1;
} }
if ((EndAddress & 1) != 0) { if (Size >= sizeof (UINT8)) {
// //
// Write the last remaining byte if exist // Write the last remaining byte if exist
// //
PciExpressWrite8 (StartAddress, *(UINT8*)Buffer); PciExpressWrite8 (StartAddress, *(UINT8*)Buffer);
} }
return Size; return ReturnValue;
} }