Merge pull request #85 from LukeUsher/Implement_HalReadWritePciSpace

Implemented HalReadWritePciSpace
This commit is contained in:
Luke Usher 2017-01-07 00:37:57 +00:00 committed by GitHub
commit d6e7e8bbb0
4 changed files with 126 additions and 1 deletions

View File

@ -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
// ******************************************************************

View File

@ -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
}
// ******************************************************************

View File

@ -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)
{

View File

@ -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