1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
|
;****************************************************************************
;*
;* 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
|