Merge pull request #85 from LukeUsher/Implement_HalReadWritePciSpace
Implemented HalReadWritePciSpace
This commit is contained in:
commit
d6e7e8bbb0
|
@ -1068,10 +1068,30 @@ typedef struct _PCI_SLOT_NUMBER
|
|||
}
|
||||
PCI_SLOT_NUMBER, *PPCI_SLOT_NUMBER;
|
||||
|
||||
|
||||
#define PCI_TYPE0_ADDRESSES 6
|
||||
#define PCI_TYPE1_ADDRESSES 2
|
||||
#define PCI_TYPE2_ADDRESSES 5
|
||||
|
||||
#define PCI_TYPE1_ADDR_PORT ((PULONG) 0xCF8)
|
||||
#define PCI_TYPE1_DATA_PORT 0xCFC
|
||||
|
||||
typedef struct _PCI_TYPE1_CFG_BITS {
|
||||
union {
|
||||
struct {
|
||||
ULONG Reserved1:2;
|
||||
ULONG RegisterNumber:6;
|
||||
ULONG FunctionNumber:3;
|
||||
ULONG DeviceNumber:5;
|
||||
ULONG BusNumber:8;
|
||||
ULONG Reserved2:7;
|
||||
ULONG Enable:1;
|
||||
} bits;
|
||||
|
||||
ULONG AsULONG;
|
||||
} u;
|
||||
} PCI_TYPE1_CFG_BITS, *PPCI_TYPE1_CFG_BITS;
|
||||
|
||||
// ******************************************************************
|
||||
// * PCI_COMMON_CONFIG
|
||||
// ******************************************************************
|
||||
|
|
|
@ -47,6 +47,7 @@ namespace xboxkrnl
|
|||
#include "EmuKrnlLogging.h"
|
||||
#include "CxbxKrnl.h" // For CxbxKrnlCleanup
|
||||
#include "Emu.h" // For EmuWarning()
|
||||
#include "EmuX86.h" // HalReadWritePciSpace needs this
|
||||
|
||||
// prevent name collisions
|
||||
namespace NtDll
|
||||
|
@ -283,7 +284,71 @@ XBSYSAPI EXPORTNUM(46) xboxkrnl::VOID NTAPI xboxkrnl::HalReadWritePCISpace
|
|||
LOG_FUNC_ARG(WritePCISpace)
|
||||
LOG_FUNC_END;
|
||||
|
||||
LOG_UNIMPLEMENTED();
|
||||
// TODO: Disable Interrupt Processing
|
||||
|
||||
PCI_SLOT_NUMBER PCISlotNumber;
|
||||
PCI_TYPE1_CFG_BITS CfgBits;
|
||||
|
||||
PCISlotNumber.u.AsULONG = SlotNumber;
|
||||
CfgBits.u.AsULONG = 0;
|
||||
CfgBits.u.bits.BusNumber = BusNumber;
|
||||
CfgBits.u.bits.DeviceNumber = PCISlotNumber.u.bits.DeviceNumber;
|
||||
CfgBits.u.bits.FunctionNumber = PCISlotNumber.u.bits.FunctionNumber;
|
||||
CfgBits.u.bits.Enable = 1;
|
||||
|
||||
// TODO: Verify this calculation is actually correct
|
||||
size_t Size = Length / sizeof(ULONG);
|
||||
ULONG RegisterByteOffset = 0;
|
||||
|
||||
while (Length > 0) {
|
||||
switch (Size) {
|
||||
case 4:
|
||||
CfgBits.u.bits.RegisterNumber = RegisterNumber / sizeof(ULONG);
|
||||
EmuX86_IOWrite32((uint32_t)PCI_TYPE1_ADDR_PORT, CfgBits.u.AsULONG);
|
||||
|
||||
if (WritePCISpace) {
|
||||
EmuX86_IOWrite32((uint32_t)PCI_TYPE1_DATA_PORT, *((PULONG)Buffer));
|
||||
}
|
||||
else {
|
||||
*((PULONG)Buffer) = EmuX86_IORead32((uint32_t)PCI_TYPE1_DATA_PORT);
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
RegisterByteOffset = RegisterNumber % sizeof(ULONG);
|
||||
CfgBits.u.bits.RegisterNumber = RegisterNumber / sizeof(ULONG);
|
||||
|
||||
EmuX86_IOWrite32((uint32_t)PCI_TYPE1_ADDR_PORT, CfgBits.u.AsULONG);
|
||||
|
||||
if (WritePCISpace) {
|
||||
EmuX86_IOWrite16((uint32_t)PCI_TYPE1_DATA_PORT + RegisterByteOffset, *((PUSHORT)Buffer));
|
||||
}
|
||||
else {
|
||||
*((PUSHORT)Buffer) = EmuX86_IORead16((uint32_t)PCI_TYPE1_DATA_PORT + RegisterByteOffset);
|
||||
}
|
||||
break;
|
||||
case 1: {
|
||||
RegisterByteOffset = RegisterNumber % sizeof(ULONG);
|
||||
CfgBits.u.bits.RegisterNumber = RegisterNumber / sizeof(ULONG);
|
||||
|
||||
EmuX86_IOWrite32((uint32_t)PCI_TYPE1_ADDR_PORT, CfgBits.u.AsULONG);
|
||||
|
||||
if (WritePCISpace) {
|
||||
EmuX86_IOWrite8((uint32_t)PCI_TYPE1_DATA_PORT + RegisterByteOffset, *((PUCHAR)Buffer));
|
||||
}
|
||||
else {
|
||||
*((PUCHAR)Buffer) = EmuX86_IORead8((uint32_t)PCI_TYPE1_DATA_PORT + RegisterByteOffset);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
RegisterNumber += Size;
|
||||
Buffer = (PUCHAR)Buffer + Size;
|
||||
Length -= Size;
|
||||
}
|
||||
|
||||
|
||||
// TODO: Enable Interrupt Processing1
|
||||
}
|
||||
|
||||
// ******************************************************************
|
||||
|
|
|
@ -43,6 +43,38 @@
|
|||
#include "EmuX86.h"
|
||||
#include "EmuNV2A.h"
|
||||
|
||||
uint32_t EmuX86_IORead32(uint32_t addr)
|
||||
{
|
||||
EmuWarning("EmuX86_IORead32(0x%08X) Not Implemented", addr);
|
||||
return 0;
|
||||
}
|
||||
|
||||
uint16_t EmuX86_IORead16(uint32_t addr)
|
||||
{
|
||||
EmuWarning("EmuX86_IORead16(0x%08X) Not Implemented", addr);
|
||||
return 0;
|
||||
}
|
||||
|
||||
uint8_t EmuX86_IORead8(uint32_t addr)
|
||||
{
|
||||
EmuWarning("EmuX86_IORead8(0x%08X) Not Implemented", addr);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void EmuX86_IOWrite32(uint32_t addr, uint32_t value)
|
||||
{
|
||||
EmuWarning("EmuX86_IOWrite32(0x%08X, 0x%04X) [Unknown address]", addr, value);
|
||||
}
|
||||
|
||||
void EmuX86_IOWrite16(uint32_t addr, uint16_t value)
|
||||
{
|
||||
EmuWarning("EmuX86_IOWrite16(0x%08X, 0x%04X) [Unknown address]", addr, value);
|
||||
}
|
||||
|
||||
void EmuX86_IOWrite8(uint32_t addr, uint8_t value)
|
||||
{
|
||||
EmuWarning("EmuX86_IOWrite8(0x%08X, 0x%02X) [Unknown address]", addr, value);
|
||||
}
|
||||
|
||||
uint32_t EmuX86_Read32(uint32_t addr)
|
||||
{
|
||||
|
|
|
@ -34,6 +34,8 @@
|
|||
#ifndef EMUX86_H
|
||||
#define EMUX86_H
|
||||
|
||||
#include <cstdint>
|
||||
|
||||
#define EMUX86_EFLAG_CF 0
|
||||
#define EMUX86_EFLAG_PF 2
|
||||
#define EMUX86_EFLAG_AF 4
|
||||
|
@ -54,5 +56,11 @@
|
|||
#define EMUX86_EFLAG_ID 21
|
||||
|
||||
bool EmuX86_DecodeException(LPEXCEPTION_POINTERS e);
|
||||
uint32_t EmuX86_IORead32(uint32_t addr);
|
||||
uint16_t EmuX86_IORead16(uint32_t addr);
|
||||
uint8_t EmuX86_IORead8(uint32_t addr);
|
||||
void EmuX86_IOWrite32(uint32_t addr, uint32_t value);
|
||||
void EmuX86_IOWrite16(uint32_t addr, uint16_t value);
|
||||
void EmuX86_IOWrite8(uint32_t addr, uint8_t value);
|
||||
|
||||
#endif
|
||||
|
|
Loading…
Reference in New Issue