blob: 1e0a6966ce9ba421d2e9b2653f1cf9830012ca36 [file] [log] [blame]
;****************************************************************************
;*
;* SciTech OS Portability Manager Library
;*
;* ========================================================================
;*
;* The contents of this file are subject to the SciTech MGL Public
;* License Version 1.0 (the "License"); you may not use this file
;* except in compliance with the License. You may obtain a copy of
;* the License at http://www.scitechsoft.com/mgl-license.txt
;*
;* Software distributed under the License is distributed on an
;* "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
;* implied. See the License for the specific language governing
;* rights and limitations under the License.
;*
;* The Original Code is Copyright (C) 1991-1998 SciTech Software, Inc.
;*
;* The Initial Developer of the Original Code is SciTech Software, Inc.
;* All Rights Reserved.
;*
;* ========================================================================
;*
;* Language: 80386 Assembler, TASM 4.0 or NASM
;* Environment: 16/32 bit Ring 0 device driver
;*
;* Description: Assembler support routines for the Memory Type Range Register
;* (MTRR) module.
;*
;****************************************************************************
IDEAL
include "scitech.mac" ; Memory model macros
header _mtrr ; Set up memory model
begdataseg _mtrr
ifdef DOS4GW
cextern _PM_haveCauseWay,UINT
endif
enddataseg _mtrr
begcodeseg _mtrr ; Start of code segment
P586
;----------------------------------------------------------------------------
; ibool _MTRR_isRing0(void);
;----------------------------------------------------------------------------
; Checks to see if we are running at ring 0. This check is only relevant
; for 32-bit DOS4GW and compatible programs. If we are not running under
; DOS4GW, then we simply assume we are a ring 0 device driver.
;----------------------------------------------------------------------------
cprocnear _MTRR_isRing0
; Are we running under CauseWay?
ifdef DOS4GW
enter_c
mov ax,cs
and eax,3
xor eax,3
jnz @@Exit
; CauseWay runs the apps at ring 3, but implements support for specific
; ring 0 instructions that we need to get stuff done under real DOS.
mov eax,1
cmp [UINT _PM_haveCauseWay],0
jnz @@Exit
@@Fail: xor eax,eax
@@Exit: leave_c
ret
else
ifdef __SMX32__
mov eax,1 ; SMX is ring 0!
ret
else
ifdef __VXD__
mov eax,1 ; VxD is ring 0!
ret
else
ifdef __NT_DRIVER__
mov eax,1 ; NT/W2K is ring 0!
ret
else
else
xor eax,eax ; Assume ring 3 for 32-bit DOS
ret
endif
endif
endif
endif
cprocend
;----------------------------------------------------------------------------
; ulong _MTRR_disableInt(void);
;----------------------------------------------------------------------------
; Return processor interrupt status and disable interrupts.
;----------------------------------------------------------------------------
cprocstart _MTRR_disableInt
pushfd ; Put flag word on stack
cli ; Disable interrupts!
pop eax ; deposit flag word in return register
ret
cprocend
;----------------------------------------------------------------------------
; void _MTRR_restoreInt(ulong ps);
;----------------------------------------------------------------------------
; Restore processor interrupt status.
;----------------------------------------------------------------------------
cprocstart _MTRR_restoreInt
ARG ps:ULONG
push ebp
mov ebp,esp ; Set up stack frame
mov ecx,[ps]
test ecx,200h ; SMP safe interrupt flag restore!
jz @@1
sti
@@1: pop ebp
ret
cprocend
;----------------------------------------------------------------------------
; ulong _MTRR_saveCR4(void);
;----------------------------------------------------------------------------
; Save the value of CR4 and clear the Page Global Enable (bit 7). We also
; disable and flush the caches.
;----------------------------------------------------------------------------
cprocstart _MTRR_saveCR4
enter_c
; Save value of CR4 and clear Page Global Enable (bit 7)
mov ebx,cr4
mov eax,ebx
and al,7Fh
mov cr4,eax
; Disable and flush caches
mov eax,cr0
or eax,40000000h
wbinvd
mov cr0,eax
wbinvd
; Return value from CR4
mov eax,ebx
leave_c
ret
cprocend
;----------------------------------------------------------------------------
; void _MTRR_restoreCR4(ulong cr4Val)
;----------------------------------------------------------------------------
; Save the value of CR4 and clear the Page Global Enable (bit 7). We also
; disable and flush the caches.
;----------------------------------------------------------------------------
cprocstart _MTRR_restoreCR4
ARG cr4Val:ULONG
enter_c
; Enable caches
mov eax,cr0
and eax,0BFFFFFFFh
mov cr0,eax
mov eax,[cr4Val]
mov cr4,eax
leave_c
ret
cprocend
;----------------------------------------------------------------------------
; uchar _MTRR_getCx86(uchar reg);
;----------------------------------------------------------------------------
; Read a Cyrix CPU indexed register
;----------------------------------------------------------------------------
cprocstart _MTRR_getCx86
ARG reg:UCHAR
enter_c
mov al,[reg]
out 22h,al
in al,23h
leave_c
ret
cprocend
;----------------------------------------------------------------------------
; uchar _MTRR_setCx86(uchar reg,uchar val);
;----------------------------------------------------------------------------
; Write a Cyrix CPU indexed register
;----------------------------------------------------------------------------
cprocstart _MTRR_setCx86
ARG reg:UCHAR, val:UCHAR
enter_c
mov al,[reg]
out 22h,al
mov al,[val]
out 23h,al
leave_c
ret
cprocend
;----------------------------------------------------------------------------
; void _MTRR_readMSR(uong reg, ulong FAR *eax, ulong FAR *edx);
;----------------------------------------------------------------------------
; Writes the specific Machine Status Register used on the newer Intel
; Pentium Pro and Pentium II motherboards.
;----------------------------------------------------------------------------
cprocnear _MTRR_readMSR
ARG reg:ULONG, v_eax:DPTR, v_edx:DPTR
enter_c
mov ecx,[reg]
rdmsr
mov ebx,[v_eax]
mov [ebx],eax
mov ebx,[v_edx]
mov [ebx],edx
leave_c
ret
cprocend
;----------------------------------------------------------------------------
; void _MTRR_writeMSR(uong reg, ulong eax, ulong edx);
;----------------------------------------------------------------------------
; Writes the specific Machine Status Register used on the newer Intel
; Pentium Pro and Pentium II motherboards.
;----------------------------------------------------------------------------
cprocnear _MTRR_writeMSR
ARG reg:ULONG, v_eax:ULONG, v_edx:ULONG
enter_c
mov ecx,[reg]
mov eax,[v_eax]
mov edx,[v_edx]
wrmsr
leave_c
ret
cprocend
endcodeseg _mtrr
END ; End of module