aboutsummaryrefslogtreecommitdiff
path: root/board/MAI/bios_emulator/scitech/src/pm/qnx/_mtrrqnx.asm
blob: 5a3fe105ec227e679f784f7151934d23b11ebcde (plain)
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
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
;****************************************************************************
;*
;*                  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:    NASM
;* Environment: QNX
;*
;* Description: Assembler support routines for the Memory Type Range Register
;*              (MTRR) module for QNX.
;*
;****************************************************************************

        IDEAL

include "scitech.mac"           ; Memory model macros

header      _mtrrqnx                ; Set up memory model

begdataseg  _mtrrqnx                ; Start of code segment

ifdef   USE_NASM
%define R0_FLUSH_TLB    0
%define R0_SAVE_CR4     1
%define R0_RESTORE_CR4  2
%define R0_READ_MSR     3
%define R0_WRITE_MSR    4
else
R0_FLUSH_TLB        EQU 0
R0_SAVE_CR4         EQU 1
R0_RESTORE_CR4      EQU 2
R0_READ_MSR         EQU 3
R0_WRITE_MSR        EQU 4
endif

cpublic _PM_R0
_PM_R0_service      dd  0
_PM_R0_reg          dd  0
_PM_R0_eax          dd  0
_PM_R0_edx          dd  0

enddataseg  _mtrrqnx                ; Start of code segment

begcodeseg  _mtrrqnx                ; Start of code segment

P586

;----------------------------------------------------------------------------
; 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
        push    [ULONG ps]
        popfd                   ; Restore processor status (and interrupts)
        pop     ebp
        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 _PM_ring0_isr(void);
;----------------------------------------------------------------------------
; Ring 0 clock interrupt handler that we use to execute the MTRR support
; code.
;----------------------------------------------------------------------------
cprocnear   _PM_ring0_isr

;--------------------------------------------------------
; void PM_flushTLB(void);
;--------------------------------------------------------
        pushad
        cmp     [DWORD _PM_R0_service],R0_FLUSH_TLB
        jne     @@1
        wbinvd                  ; Flush the CPU cache
        mov     eax,cr3         
        mov     cr3,eax         ; Flush the TLB
        jmp     @@Exit

;--------------------------------------------------------
; ulong _MTRR_saveCR4(void);
;--------------------------------------------------------
@@1:    cmp     [DWORD _PM_R0_service],R0_SAVE_CR4
        jne     @@2

; 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     [_PM_R0_reg],ebx
        jmp     @@Exit

;--------------------------------------------------------
; void _MTRR_restoreCR4(ulong cr4Val)
;--------------------------------------------------------
@@2:    cmp     [DWORD _PM_R0_service],R0_RESTORE_CR4
        jne     @@3

        mov     eax,cr0
        and     eax,0BFFFFFFFh
        mov     cr0,eax
        mov     eax,[_PM_R0_reg]
        mov     cr4,eax
        jmp     @@Exit

;--------------------------------------------------------
; void _MTRR_readMSR(int reg, ulong FAR *eax, ulong FAR *edx);
;--------------------------------------------------------
@@3:    cmp     [DWORD _PM_R0_service],R0_READ_MSR
        jne     @@4

        mov     ecx,[_PM_R0_reg]
        rdmsr
        mov     [_PM_R0_eax],eax
        mov     [_PM_R0_edx],edx
        jmp     @@Exit

;--------------------------------------------------------
; void _MTRR_writeMSR(int reg, ulong eax, ulong edx);
;--------------------------------------------------------
@@4:    cmp     [DWORD _PM_R0_service],R0_WRITE_MSR
        jne     @@Exit

        mov     ecx,[_PM_R0_reg]
        mov     eax,[_PM_R0_eax]
        mov     edx,[_PM_R0_edx]
        wrmsr
        jmp     @@Exit

@@Exit: mov     [DWORD _PM_R0_service],-1
        popad
        mov     eax,0
        retf

cprocend

endcodeseg  _mtrrqnx

        END                     ; End of module