Add MMIO read/write functions.
This commit is contained in:
parent
48f574a170
commit
35715d1501
|
@ -5,6 +5,8 @@
|
||||||
*** Chroma ***
|
*** Chroma ***
|
||||||
***********************/
|
***********************/
|
||||||
|
|
||||||
|
#define PAUSE __asm__ __volatile__("pause")
|
||||||
|
|
||||||
uint8_t kbdSBuffer[8];
|
uint8_t kbdSBuffer[8];
|
||||||
uint8_t InputBuffer[128];
|
uint8_t InputBuffer[128];
|
||||||
|
|
||||||
|
@ -37,6 +39,10 @@ void WriteTSR(uint16_t TSRData);
|
||||||
|
|
||||||
uint32_t ReadPort(uint16_t Port, int Length);
|
uint32_t ReadPort(uint16_t Port, int Length);
|
||||||
uint32_t WritePort(uint16_t Port, uint32_t Data, int Length);
|
uint32_t WritePort(uint16_t Port, uint32_t Data, int Length);
|
||||||
|
|
||||||
|
size_t ReadMMIO(size_t Address, int Length);
|
||||||
|
void WriteMMIO(size_t Address, size_t Data, int Length);
|
||||||
|
|
||||||
size_t ReadModelSpecificRegister(size_t MSR);
|
size_t ReadModelSpecificRegister(size_t MSR);
|
||||||
size_t WriteModelSpecificRegister(size_t MSR, size_t Data);
|
size_t WriteModelSpecificRegister(size_t MSR, size_t Data);
|
||||||
|
|
||||||
|
@ -52,6 +58,8 @@ size_t WriteControlRegister(int CRX, size_t Data);
|
||||||
size_t ReadExtendedControlRegister(size_t XCRX);
|
size_t ReadExtendedControlRegister(size_t XCRX);
|
||||||
size_t WriteExtendedControlRegister(size_t XCRX, size_t Data);
|
size_t WriteExtendedControlRegister(size_t XCRX, size_t Data);
|
||||||
|
|
||||||
|
void InvalidatePage(size_t Page);
|
||||||
|
|
||||||
// XCS = Extended Code Segment
|
// XCS = Extended Code Segment
|
||||||
size_t ReadXCS(void);
|
size_t ReadXCS(void);
|
||||||
|
|
||||||
|
|
|
@ -7,6 +7,9 @@
|
||||||
|
|
||||||
/* This file serves to allow us to communicate with the computer through raw I/O.
|
/* This file serves to allow us to communicate with the computer through raw I/O.
|
||||||
* It provides interfaces for Ports and commonly used Registers (Control Registers, Model-Specific Registers, GDT, IDT..)
|
* It provides interfaces for Ports and commonly used Registers (Control Registers, Model-Specific Registers, GDT, IDT..)
|
||||||
|
*
|
||||||
|
* Additionally, there are wrapper functions for MMIO accesses.
|
||||||
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
uint32_t ReadPort(uint16_t Port, int Length) {
|
uint32_t ReadPort(uint16_t Port, int Length) {
|
||||||
|
@ -41,6 +44,31 @@ uint32_t WritePort(uint16_t Port, uint32_t Data, int Length) {
|
||||||
return Data;
|
return Data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
size_t ReadMMIO(size_t Address, int Length) {
|
||||||
|
if (Length == 1) {
|
||||||
|
return *((volatile uint8_t*)(Address));
|
||||||
|
} else if (Length == 2) {
|
||||||
|
return *((volatile uint16_t*)(Address));
|
||||||
|
} else if (Length == 4) {
|
||||||
|
return *((volatile uint32_t*)(Address));
|
||||||
|
} else {
|
||||||
|
return *((volatile size_t*)(Address));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void WriteMMIO(size_t Address, size_t Data, int Length) {
|
||||||
|
if(Length == 1) {
|
||||||
|
(*((volatile uint8_t*)(Address))) = ((uint8_t) Data);
|
||||||
|
} else if (Length == 2) {
|
||||||
|
(*((volatile uint16_t*)(Address))) = ((uint16_t) Data);
|
||||||
|
} else if (Length == 4) {
|
||||||
|
(*((volatile uint32_t*)(Address))) = ((uint32_t) Data);
|
||||||
|
} else {
|
||||||
|
(*((volatile uint8_t*)(Address))) = (Data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
size_t ReadModelSpecificRegister(size_t MSR) {
|
size_t ReadModelSpecificRegister(size_t MSR) {
|
||||||
size_t RegHigh = 0, RegLow = 0;
|
size_t RegHigh = 0, RegLow = 0;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user