blob: 761f0f42e1ead0d4b27435c04441d5139c96752f [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: OS/2 32 bit protected mode
;*
;* Description: Low level assembly support for the PM library specific
;* to OS/2
;*
;****************************************************************************
IDEAL
include "scitech.mac" ; Memory model macros
header _pmos2 ; Set up memory model
begdataseg _pmos2
cglobal _PM_ioentry
cglobal _PM_gdt
_PM_ioentry dd 0 ; Offset to call gate
_PM_gdt dw 0 ; Selector to call gate
enddataseg _pmos2
begcodeseg _pmos2 ; Start of code segment
;----------------------------------------------------------------------------
; int PM_setIOPL(int iopl)
;----------------------------------------------------------------------------
; Change the IOPL level for the 32-bit task. Returns the previous level
; so it can be restored for the task correctly.
;----------------------------------------------------------------------------
cprocstart PM_setIOPL
ARG iopl:UINT
enter_c
pushfd ; Save the old EFLAGS for later
mov ecx,[iopl] ; ECX := IOPL level
xor ebx,ebx ; Change IOPL level function code (0)
ifdef USE_NASM
call far dword [_PM_ioentry]
else
call [FWORD _PM_ioentry]
endif
pop eax
and eax,0011000000000000b
shr eax,12
leave_c
ret
cprocend
;----------------------------------------------------------------------------
; void _PM_setGDTSelLimit(ushort selector, ulong limit);
;----------------------------------------------------------------------------
; Change the GDT selector limit to given value. Used to change selector
; limits to address the entire system address space.
;----------------------------------------------------------------------------
cprocstart _PM_setGDTSelLimit
ARG selector:USHORT, limit:UINT
enter_c
sub esp,20 ; Make room for selector data on stack
mov ecx,esp ; ECX := selector data structure
mov bx,[selector] ; Fill out the data structure
and bx,0FFF8h ; Kick out the LDT/GDT and DPL bits
mov [WORD ecx],bx
mov ebx,[limit]
mov [DWORD ecx+4],ebx
mov ebx,5 ; Set GDT selector limit function code
ifdef USE_NASM
call far dword [_PM_ioentry]
else
call [FWORD _PM_ioentry]
endif
add esp,20
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
;----------------------------------------------------------------------------
; ulong _MTRR_disableInt(void);
;----------------------------------------------------------------------------
; Return processor interrupt status and disable interrupts.
;----------------------------------------------------------------------------
cprocstart _MTRR_disableInt
; Do nothing!
ret
cprocend
;----------------------------------------------------------------------------
; void _MTRR_restoreInt(ulong ps);
;----------------------------------------------------------------------------
; Restore processor interrupt status.
;----------------------------------------------------------------------------
cprocstart _MTRR_restoreInt
; Do nothing!
ret
cprocend
;----------------------------------------------------------------------------
; void DebugInt(void)
;----------------------------------------------------------------------------
cprocstart DebugInt
int 3
ret
cprocend
endcodeseg _pmos2
END ; End of module