From 70a31e656a1ed12008173089193d97f98bdeefc3 Mon Sep 17 00:00:00 2001 From: Aleksandar Andrejevic Date: Fri, 12 Jun 2015 16:25:23 +0000 Subject: [PATCH] [NTVDM] Make fast memory hooks FASTCALL. Only register the VGA memory hook for the region that needs to be hooked. svn path=/trunk/; revision=68110 --- reactos/subsystems/mvdm/ntvdm/bios/bios.c | 2 +- .../mvdm/ntvdm/dos/dos32krnl/emsdrv.c | 4 +- .../mvdm/ntvdm/hardware/video/vga.c | 45 +++++++++++++------ .../mvdm/ntvdm/hardware/video/vga.h | 2 + reactos/subsystems/mvdm/ntvdm/memory.h | 4 +- 5 files changed, 39 insertions(+), 18 deletions(-) diff --git a/reactos/subsystems/mvdm/ntvdm/bios/bios.c b/reactos/subsystems/mvdm/ntvdm/bios/bios.c index 25ca71054b4..24bdc17d01f 100644 --- a/reactos/subsystems/mvdm/ntvdm/bios/bios.c +++ b/reactos/subsystems/mvdm/ntvdm/bios/bios.c @@ -42,7 +42,7 @@ PBIOS_CONFIG_TABLE Bct; /* PRIVATE FUNCTIONS **********************************************************/ -static BOOLEAN NTAPI BiosRomWrite(ULONG Address, PVOID Buffer, ULONG Size) +static BOOLEAN FASTCALL BiosRomWrite(ULONG Address, PVOID Buffer, ULONG Size) { /* Prevent writing to ROM */ return FALSE; diff --git a/reactos/subsystems/mvdm/ntvdm/dos/dos32krnl/emsdrv.c b/reactos/subsystems/mvdm/ntvdm/dos/dos32krnl/emsdrv.c index a913ad4041f..77fb7b12f74 100644 --- a/reactos/subsystems/mvdm/ntvdm/dos/dos32krnl/emsdrv.c +++ b/reactos/subsystems/mvdm/ntvdm/dos/dos32krnl/emsdrv.c @@ -402,7 +402,7 @@ static VOID WINAPI EmsIntHandler(LPWORD Stack) } } -static VOID NTAPI EmsReadMemory(ULONG Address, PVOID Buffer, ULONG Size) +static VOID FASTCALL EmsReadMemory(ULONG Address, PVOID Buffer, ULONG Size) { ULONG i; ULONG RelativeAddress = Address - TO_LINEAR(EMS_SEGMENT, 0); @@ -422,7 +422,7 @@ static VOID NTAPI EmsReadMemory(ULONG Address, PVOID Buffer, ULONG Size) } } -static BOOLEAN NTAPI EmsWriteMemory(ULONG Address, PVOID Buffer, ULONG Size) +static BOOLEAN FASTCALL EmsWriteMemory(ULONG Address, PVOID Buffer, ULONG Size) { ULONG i; ULONG RelativeAddress = Address - TO_LINEAR(EMS_SEGMENT, 0); diff --git a/reactos/subsystems/mvdm/ntvdm/hardware/video/vga.c b/reactos/subsystems/mvdm/ntvdm/hardware/video/vga.c index b6fb591552e..bafe9eec3ae 100644 --- a/reactos/subsystems/mvdm/ntvdm/hardware/video/vga.c +++ b/reactos/subsystems/mvdm/ntvdm/hardware/video/vga.c @@ -21,8 +21,8 @@ /* PRIVATE VARIABLES **********************************************************/ -static CONST DWORD MemoryBase[] = { 0xA0000, 0xA0000, 0xB0000, 0xB8000 }; -static CONST DWORD MemoryLimit[] = { 0xBFFFF, 0xAFFFF, 0xB7FFF, 0xBFFFF }; +static CONST DWORD MemoryBase[] = { 0xA0000, 0xA0000, 0xB0000, 0xB8000 }; +static CONST DWORD MemorySize[] = { 0x20000, 0x10000, 0x8000, 0x8000 }; /* * Activate this line if you want to use the real @@ -429,11 +429,6 @@ static inline DWORD VgaGetVideoBaseAddress(VOID) return MemoryBase[(VgaGcRegisters[VGA_GC_MISC_REG] >> 2) & 0x03]; } -static inline DWORD VgaGetVideoLimitAddress(VOID) -{ - return MemoryLimit[(VgaGcRegisters[VGA_GC_MISC_REG] >> 2) & 0x03]; -} - static VOID VgaUpdateCursorPosition(VOID) { /* @@ -1535,6 +1530,20 @@ static inline VOID VgaWriteGc(BYTE Data) { case VGA_GC_MISC_REG: { + /* Remove any existing VGA memory hook */ + MemRemoveFastMemoryHook((PVOID)0xA0000, 0x20000); + + if (VgaMiscRegister & VGA_MISC_RAM_ENABLED) + { + UCHAR MemoryMap = (VgaGcRegisters[VGA_GC_MISC_REG] >> 2) & 0x03; + + /* Register a memory hook */ + MemInstallFastMemoryHook((PVOID)MemoryBase[MemoryMap], + MemorySize[MemoryMap], + VgaReadMemory, + VgaWriteMemory); + } + /* The GC misc register decides if it's text or graphics mode */ ModeChanged = TRUE; break; @@ -1687,7 +1696,20 @@ static VOID WINAPI VgaWritePort(USHORT Port, BYTE Data) UnregisterIoPort(0x3DA); // VGA_INSTAT1_READ_COLOR, VGA_FEATURE_WRITE_COLOR } - // if (VgaMiscRegister & 0x02) { /* Enable RAM access */ } else { /* Disable RAM access */ } + /* Remove any existing VGA memory hook */ + MemRemoveFastMemoryHook((PVOID)0xA0000, 0x20000); + + if (VgaMiscRegister & VGA_MISC_RAM_ENABLED) + { + UCHAR MemoryMap = (VgaGcRegisters[VGA_GC_MISC_REG] >> 2) & 0x03; + + /* Register a memory hook */ + MemInstallFastMemoryHook((PVOID)MemoryBase[MemoryMap], + MemorySize[MemoryMap], + VgaReadMemory, + VgaWriteMemory); + } + break; } @@ -1946,7 +1968,7 @@ VOID VgaRefreshDisplay(VOID) VgaVerticalRetrace(0); } -VOID NTAPI VgaReadMemory(ULONG Address, PVOID Buffer, ULONG Size) +VOID FASTCALL VgaReadMemory(ULONG Address, PVOID Buffer, ULONG Size) { DWORD i, j; DWORD VideoAddress; @@ -2007,7 +2029,7 @@ VOID NTAPI VgaReadMemory(ULONG Address, PVOID Buffer, ULONG Size) VgaLatchRegisters[3] = VgaMemory[(3 * VGA_BANK_SIZE) + LOWORD(VideoAddress)]; } -BOOLEAN NTAPI VgaWriteMemory(ULONG Address, PVOID Buffer, ULONG Size) +BOOLEAN FASTCALL VgaWriteMemory(ULONG Address, PVOID Buffer, ULONG Size) { DWORD i, j; DWORD VideoAddress; @@ -2177,9 +2199,6 @@ BOOLEAN VgaInitialize(HANDLE TextHandle) /* Clear the VGA memory */ VgaClearMemory(); - - /* Register the memory hook */ - MemInstallFastMemoryHook((PVOID)0xA0000, 0x20000, VgaReadMemory, VgaWriteMemory); /* Register the I/O Ports */ RegisterIoPort(0x3CC, VgaReadPort, NULL); // VGA_MISC_READ diff --git a/reactos/subsystems/mvdm/ntvdm/hardware/video/vga.h b/reactos/subsystems/mvdm/ntvdm/hardware/video/vga.h index 083f807ff3d..e62e79c740f 100644 --- a/reactos/subsystems/mvdm/ntvdm/hardware/video/vga.h +++ b/reactos/subsystems/mvdm/ntvdm/hardware/video/vga.h @@ -256,6 +256,8 @@ VOID VgaDetachFromConsole(BOOL ChangeMode); COORD VgaGetDisplayResolution(VOID); VOID VgaRefreshDisplay(VOID); +VOID FASTCALL VgaReadMemory(ULONG Address, PVOID Buffer, ULONG Size); +BOOLEAN FASTCALL VgaWriteMemory(ULONG Address, PVOID Buffer, ULONG Size); VOID VgaWriteFont(UINT FontNumber, CONST UCHAR *FontData, UINT Height); VOID VgaClearMemory(VOID); BOOLEAN VgaGetDoubleVisionState(PBOOLEAN Horizontal, PBOOLEAN Vertical); diff --git a/reactos/subsystems/mvdm/ntvdm/memory.h b/reactos/subsystems/mvdm/ntvdm/memory.h index d3a352096ae..f3bc537f6ef 100644 --- a/reactos/subsystems/mvdm/ntvdm/memory.h +++ b/reactos/subsystems/mvdm/ntvdm/memory.h @@ -14,7 +14,7 @@ #define TOTAL_PAGES (MAX_ADDRESS / PAGE_SIZE) typedef VOID -(WINAPI *PMEMORY_READ_HANDLER) +(FASTCALL *PMEMORY_READ_HANDLER) ( ULONG Address, PVOID Buffer, @@ -22,7 +22,7 @@ typedef VOID ); typedef BOOLEAN -(WINAPI *PMEMORY_WRITE_HANDLER) +(FASTCALL *PMEMORY_WRITE_HANDLER) ( ULONG Address, PVOID Buffer,