introduce ES_PTR64_MS/LS32

This commit is contained in:
nakst 2021-11-04 11:33:38 +00:00
parent a88271904d
commit fd2729c98d
3 changed files with 19 additions and 32 deletions

View File

@ -176,6 +176,14 @@ ES_EXTERN_C uintptr_t _APISyscall(uintptr_t argument0, uintptr_t argument1, uint
#define ES_FUNCTION_OPTIMISE_O2 __attribute__((optimize("-O2")))
#define ES_FUNCTION_OPTIMISE_O3 __attribute__((optimize("-O3")))
#ifdef ES_BITS_64
#define ES_PTR64_MS32(x) ((uint32_t) ((uintptr_t) (x) >> 32))
#define ES_PTR64_LS32(x) ((uint32_t) ((uintptr_t) (x) & 0xFFFFFFFF))
#else
#define ES_PTR64_MS32(x) ((uint32_t) (0))
#define ES_PTR64_LS32(x) ((uint32_t) (x))
#endif
// --------- Algorithms:
#define ES_MACRO_SORT(_name, _type, _compar, _contextType) void _name(_type *base, size_t nmemb, _contextType context) { \

View File

@ -280,12 +280,8 @@ bool AHCIController::Access(uintptr_t portIndex, uint64_t offsetBytes, size_t co
KDMASegment segment = KDMABufferNextSegment(buffer);
prdt[0 + 4 * prdtEntryCount] = segment.physicalAddress;
#ifdef ES_BITS_64
prdt[1 + 4 * prdtEntryCount] = segment.physicalAddress >> 32;
#else
prdt[1 + 4 * prdtEntryCount] = 0;
#endif
prdt[0 + 4 * prdtEntryCount] = ES_PTR64_LS32(segment.physicalAddress);
prdt[1 + 4 * prdtEntryCount] = ES_PTR64_MS32(segment.physicalAddress);
prdt[2 + 4 * prdtEntryCount] = 0;
prdt[3 + 4 * prdtEntryCount] = (segment.byteCount - 1) | (segment.isLast ? (1 << 31) /* IRQ when done */ : 0);
@ -575,15 +571,10 @@ void AHCIController::Initialise() {
// Set the registers to the physical addresses.
WR_REGISTER_PCLB(i, physicalAddress);
WR_REGISTER_PFB(i, (physicalAddress + 0x400));
#ifdef ES_BITS_64
if (dma64Supported) WR_REGISTER_PCLBU(i, physicalAddress >> 32);
if (dma64Supported) WR_REGISTER_PFBU(i, (physicalAddress + 0x400) >> 32);
#else
if (dma64Supported) WR_REGISTER_PCLBU(i, 0);
if (dma64Supported) WR_REGISTER_PFBU(i, 0);
#endif
WR_REGISTER_PCLB(i, ES_PTR64_LS32(physicalAddress));
WR_REGISTER_PFB(i, ES_PTR64_LS32(physicalAddress + 0x400));
if (dma64Supported) WR_REGISTER_PCLBU(i, ES_PTR64_MS32(physicalAddress));
if (dma64Supported) WR_REGISTER_PFBU(i, ES_PTR64_MS32(physicalAddress + 0x400));
// Point each command list entry to the corresponding command table.
@ -591,12 +582,8 @@ void AHCIController::Initialise() {
for (uintptr_t j = 0; j < commandSlotCount; j++) {
uintptr_t address = physicalAddress + COMMAND_LIST_SIZE + RECEIVED_FIS_SIZE + COMMAND_TABLE_SIZE * j;
commandList[j * 8 + 2] = address;
#ifdef ES_BITS_64
commandList[j * 8 + 3] = address >> 32;
#else
commandList[j * 8 + 3] = 0;
#endif
commandList[j * 8 + 2] = ES_PTR64_LS32(address);
commandList[j * 8 + 3] = ES_PTR64_MS32(address);
}
// Reset the port.
@ -737,12 +724,8 @@ void AHCIController::Initialise() {
// Setup the PRDT.
uint32_t *prdt = (uint32_t *) (ports[i].commandTables + 0x80);
prdt[0] = identifyDataPhysical;
#ifdef ES_BITS_64
prdt[1] = identifyDataPhysical >> 32;
#else
prdt[1] = 0;
#endif
prdt[0] = ES_PTR64_LS32(identifyDataPhysical);
prdt[1] = ES_PTR64_MS32(identifyDataPhysical);
prdt[2] = 0;
prdt[3] = 0x200 - 1;

View File

@ -287,11 +287,7 @@ bool KPCIDevice::EnableMSI(KIRQHandler irqHandler, void *context, const char *cO
WriteConfig32(pointer + 4, msi.address & 0xFFFFFFFF);
if (control & (1 << 7)) {
#ifdef ES_BITS_64
WriteConfig32(pointer + 8, msi.address >> 32);
#else
WriteConfig32(pointer + 8, 0);
#endif
WriteConfig32(pointer + 8, ES_PTR64_MS32(msi.address));
WriteConfig16(pointer + 12, (ReadConfig16(pointer + 12) & 0x3800) | msi.data);
if (control & (1 << 8)) WriteConfig32(pointer + 16, 0);
} else {