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_O2 __attribute__((optimize("-O2")))
#define ES_FUNCTION_OPTIMISE_O3 __attribute__((optimize("-O3"))) #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: // --------- Algorithms:
#define ES_MACRO_SORT(_name, _type, _compar, _contextType) void _name(_type *base, size_t nmemb, _contextType context) { \ #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); KDMASegment segment = KDMABufferNextSegment(buffer);
prdt[0 + 4 * prdtEntryCount] = segment.physicalAddress; prdt[0 + 4 * prdtEntryCount] = ES_PTR64_LS32(segment.physicalAddress);
#ifdef ES_BITS_64 prdt[1 + 4 * prdtEntryCount] = ES_PTR64_MS32(segment.physicalAddress);
prdt[1 + 4 * prdtEntryCount] = segment.physicalAddress >> 32;
#else
prdt[1 + 4 * prdtEntryCount] = 0;
#endif
prdt[2 + 4 * prdtEntryCount] = 0; prdt[2 + 4 * prdtEntryCount] = 0;
prdt[3 + 4 * prdtEntryCount] = (segment.byteCount - 1) | (segment.isLast ? (1 << 31) /* IRQ when done */ : 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. // Set the registers to the physical addresses.
WR_REGISTER_PCLB(i, physicalAddress); WR_REGISTER_PCLB(i, ES_PTR64_LS32(physicalAddress));
WR_REGISTER_PFB(i, (physicalAddress + 0x400)); WR_REGISTER_PFB(i, ES_PTR64_LS32(physicalAddress + 0x400));
#ifdef ES_BITS_64 if (dma64Supported) WR_REGISTER_PCLBU(i, ES_PTR64_MS32(physicalAddress));
if (dma64Supported) WR_REGISTER_PCLBU(i, physicalAddress >> 32); if (dma64Supported) WR_REGISTER_PFBU(i, ES_PTR64_MS32(physicalAddress + 0x400));
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
// Point each command list entry to the corresponding command table. // 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++) { for (uintptr_t j = 0; j < commandSlotCount; j++) {
uintptr_t address = physicalAddress + COMMAND_LIST_SIZE + RECEIVED_FIS_SIZE + COMMAND_TABLE_SIZE * j; uintptr_t address = physicalAddress + COMMAND_LIST_SIZE + RECEIVED_FIS_SIZE + COMMAND_TABLE_SIZE * j;
commandList[j * 8 + 2] = address; commandList[j * 8 + 2] = ES_PTR64_LS32(address);
#ifdef ES_BITS_64 commandList[j * 8 + 3] = ES_PTR64_MS32(address);
commandList[j * 8 + 3] = address >> 32;
#else
commandList[j * 8 + 3] = 0;
#endif
} }
// Reset the port. // Reset the port.
@ -737,12 +724,8 @@ void AHCIController::Initialise() {
// Setup the PRDT. // Setup the PRDT.
uint32_t *prdt = (uint32_t *) (ports[i].commandTables + 0x80); uint32_t *prdt = (uint32_t *) (ports[i].commandTables + 0x80);
prdt[0] = identifyDataPhysical; prdt[0] = ES_PTR64_LS32(identifyDataPhysical);
#ifdef ES_BITS_64 prdt[1] = ES_PTR64_MS32(identifyDataPhysical);
prdt[1] = identifyDataPhysical >> 32;
#else
prdt[1] = 0;
#endif
prdt[2] = 0; prdt[2] = 0;
prdt[3] = 0x200 - 1; 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); WriteConfig32(pointer + 4, msi.address & 0xFFFFFFFF);
if (control & (1 << 7)) { if (control & (1 << 7)) {
#ifdef ES_BITS_64 WriteConfig32(pointer + 8, ES_PTR64_MS32(msi.address));
WriteConfig32(pointer + 8, msi.address >> 32);
#else
WriteConfig32(pointer + 8, 0);
#endif
WriteConfig16(pointer + 12, (ReadConfig16(pointer + 12) & 0x3800) | msi.data); WriteConfig16(pointer + 12, (ReadConfig16(pointer + 12) & 0x3800) | msi.data);
if (control & (1 << 8)) WriteConfig32(pointer + 16, 0); if (control & (1 << 8)) WriteConfig32(pointer + 16, 0);
} else { } else {