Subversion Repositories Kolibri OS

Rev

Rev 387 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 387 Rev 388
Line 1... Line -...
1
tmp_page_tab      equ HEAP_BASE
-
 
2
 
-
 
3
align 4
-
 
4
proc mem_test
-
 
5
 
-
 
6
           mov eax, cr0
-
 
7
           and eax, not (CR0_CD+CR0_NW)
-
 
8
           or eax, CR0_CD         ;disable caching
-
 
9
           mov cr0, eax
-
 
10
           wbinvd                 ;invalidate cache
-
 
11
 
-
 
12
           xor edi, edi
-
 
13
           mov ebx, 'TEST'
-
 
14
@@:
-
 
15
           add edi, 0x400000
-
 
16
           xchg ebx, dword [edi]
-
 
17
           cmp dword [edi], 'TEST'
-
 
18
           xchg ebx, dword [edi]
-
 
19
           je @b
-
 
20
           mov [MEM_AMOUNT], edi
-
 
21
 
-
 
22
           and eax, not (CR0_CD+CR0_NW)  ;enable caching
-
 
23
           mov cr0, eax
-
 
24
           mov eax, edi
-
 
25
           mov [LFBSize], 0x00800000
-
 
26
           ret
-
 
27
endp
-
 
28
 
-
 
29
align 4
-
 
30
proc init_mem
-
 
31
 
-
 
32
           mov eax, [MEM_AMOUNT]
-
 
33
 
-
 
34
           mov [pg_data.mem_amount], eax
-
 
35
           mov [pg_data.kernel_max], eax
-
 
36
 
-
 
37
           shr eax, 12
-
 
38
           mov edx, eax
-
 
39
           mov [pg_data.pages_count], eax
-
 
40
           mov [pg_data.kernel_pages], eax
-
 
41
 
-
 
42
           shr eax, 3
-
 
43
           mov [pg_data.pagemap_size], eax
-
 
44
 
-
 
45
           shr edx, 10
-
 
46
           cmp edx, 3
-
 
47
           ja @f
-
 
48
           inc edx       ;at least 4Mb for kernel heap
-
 
49
@@:
-
 
50
           mov [pg_data.kernel_tables], edx
-
 
51
 
-
 
52
           xor eax, eax
-
 
53
           mov edi, sys_pgdir
-
 
54
           mov ecx, 2048
-
 
55
           cld
-
 
56
           rep stosd
-
 
57
 
-
 
58
           mov edx, sys_pgdir
-
 
59
           bt [cpu_caps], CAPS_PSE
-
 
60
           jnc .no_PSE
-
 
61
 
-
 
62
           mov ebx, cr4
-
 
63
           or ebx, CR4_PSE
-
 
64
           mov eax, PG_LARGE+PG_SW
-
 
65
           bt [cpu_caps], CAPS_PGE
-
 
66
           jnc @F
-
 
67
           or eax, PG_GLOBAL
-
 
68
           or ebx, CR4_PGE
-
 
69
@@:
-
 
70
           mov cr4, ebx
-
 
71
           sub [pg_data.kernel_tables], 2
-
 
72
 
-
 
73
           mov [edx], eax
-
 
74
           add eax, 0x00400000
-
 
75
           mov [edx+4], eax
-
 
76
           add edx, 8
-
 
77
 
-
 
78
           mov eax, 0x800000+PG_SW
-
 
79
           mov ecx, (HEAP_BASE-0x800000)/4096
-
 
80
           jmp .map_low
-
 
81
.no_PSE:
-
 
82
           mov eax, PG_SW
-
 
83
           mov ecx, HEAP_BASE/4096
-
 
84
.map_low:
-
 
85
           mov edi, tmp_page_tab
-
 
86
@@:                                   ;
-
 
87
           stosd
-
 
88
           add eax, 0x1000
-
 
89
           dec ecx
-
 
90
           jnz @B
-
 
91
 
-
 
92
           mov ecx, [pg_data.kernel_tables]
-
 
93
           shl ecx, 10
-
 
94
           xor eax, eax
-
 
95
           rep stosd
-
 
96
 
-
 
97
           mov ecx, [pg_data.kernel_tables]
-
 
98
           mov eax, tmp_page_tab+PG_SW
-
 
99
           mov edi, edx
-
 
100
 
-
 
101
.map_kernel_tabs:
-
 
102
 
-
 
103
           stosd
-
 
104
           add eax, 0x1000
-
 
105
           dec ecx
-
 
106
           jnz .map_kernel_tabs
-
 
107
 
-
 
108
           mov dword [sys_pgdir+(page_tabs shr 20)], sys_pgdir+PG_SW
-
 
109
           ret
-
 
110
endp
-
 
111
 
-
 
112
align 4
-
 
113
proc init_page_map
-
 
114
 
-
 
115
           mov edi, sys_pgmap
-
 
116
           mov ecx, (HEAP_BASE/4096)/32      ;384/4
-
 
117
           mov ebx, ecx
-
 
118
           xor eax,eax
-
 
119
           cld
-
 
120
           rep stosd
-
 
121
 
-
 
122
           not eax
-
 
123
           mov ecx, [pg_data.pagemap_size]
-
 
124
           sub ecx, ebx
-
 
125
           shr ecx, 2
-
 
126
           rep stosd
-
 
127
 
-
 
128
           lea edi, [sys_pgmap+ebx*4]         ;+384
-
 
129
           mov edx, [pg_data.pages_count]
-
 
130
           mov ecx, [pg_data.kernel_tables]
-
 
131
           add ecx, (HEAP_BASE/4096) and 31
-
 
132
           sub edx, HEAP_BASE/4096
-
 
133
           sub edx, ecx
-
 
134
           mov [pg_data.pages_free], edx
-
 
135
 
-
 
136
           xor eax, eax
-
 
137
           mov ebx, ecx
-
 
138
           shr ecx, 5
-
 
139
           rep stosd
-
 
140
 
-
 
141
           not eax
-
 
142
           mov ecx, ebx
-
 
143
           and ecx, 31
-
 
144
           shl eax, cl
-
 
145
           mov [page_start], edi;           sys_pgmap+384
-
 
146
           stosd
-
 
147
 
-
 
148
           mov ebx, sys_pgmap
-
 
149
           add ebx, [pg_data.pagemap_size]
-
 
150
           mov [page_end], ebx
-
 
151
 
-
 
152
           mov [pg_data.pg_mutex], 0
-
 
153
 
-
 
154
           ret
-
 
155
endp
-
 
156
 
-
 
157
align 4
1
align 4
158
proc alloc_page
2
proc alloc_page
Line 159... Line 3...
159
 
3
 
160
           pushfd
4
           pushfd
Line 380... Line 224...
380
           endl
224
           endl
381
 
225
 
Line 382... Line 226...
382
           cmp dword [LFBAddress], -1
226
           cmp dword [LFBAddress], -1
383
           jne @f
227
           jne @f
384
           mov [0x2f0000+0x901c],byte 2
228
           mov [BOOT_VAR+0x901c],byte 2
385
           stdcall kernel_alloc, 0x280000
229
           stdcall kernel_alloc, 0x280000
386
           mov [LFBAddress], eax
230
           mov [LFBAddress], eax
387
           ret
231
           ret
388
@@:
232
@@:
389
           test [SCR_MODE],word 0100000000000000b
233
           test [SCR_MODE],word 0100000000000000b
390
           jnz @f
234
           jnz @f
391
           mov [0x2f0000+0x901c],byte 2
235
           mov [BOOT_VAR+0x901c],byte 2
392
           ret
236
           ret
393
@@:
237
@@:
394
           mov edx, LFB_BASE
238
           mov edx, LFB_BASE
395
           mov esi, [LFBAddress]
239
           mov esi, [LFBAddress]
396
           mov edi, [LFBSize]
240
           mov edi, 0x00800000
397
           mov dword [exp_lfb+4], edx
241
           mov dword [exp_lfb+4], edx
Line -... Line 242...
-
 
242
 
-
 
243
     push eax
-
 
244
     push edx
-
 
245
     mov edx, 0x400   ;bocsh
-
 
246
     mov al,0xff      ;bocsh
-
 
247
     out dx, al       ;bocsh
-
 
248
     pop edx
-
 
249
     pop eax
398
 
250
 
399
           shr edi, 12
251
           shr edi, 12
400
           mov [pg_count], edi
252
           mov [pg_count], edi
Line 401... Line 253...
401
           shr edi, 10
253
           shr edi, 10
Line 425... Line 277...
425
 
277
 
Line 426... Line 278...
426
@@:
278
@@:
427
           call alloc_page
279
           call alloc_page
428
           stdcall map_page_table, edx, eax
280
           stdcall map_page_table, edx, eax
429
           add esi, 0x00400000
281
           add edx, 0x00400000
430
           dec edi
282
           dec edi
431
           jnz @B
283
           jnz @B
Line 432... Line 284...
432
 
284
 
433
           mov eax, [LFBAddress]
285
           mov eax, [LFBAddress]
434
           mov edi, page_tabs + (LFB_BASE shr 10)
286
           mov edi, page_tabs + (LFB_BASE shr 10)
435
           or eax, PG_UW
287
           or eax, PG_UW
436
           mov ecx, [pg_count]
288
           mov ecx, [pg_count]
-
 
289
           cld
437
           cld
290
@@:
-
 
291
           stosd
-
 
292
           add eax, 0x1000
-
 
293
           dec ecx
Line 438... Line 294...
438
           rep stosd
294
           jnz @B
439
 
295
 
440
           mov dword [LFBAddress], LFB_BASE
296
           mov dword [LFBAddress], LFB_BASE
Line 603... Line 459...
603
align 4
459
align 4
604
proc page_fault_handler
460
proc page_fault_handler
605
           pushad
461
           pushad
Line -... Line 462...
-
 
462
 
-
 
463
     push eax
-
 
464
     push edx
-
 
465
     mov edx, 0x400   ;bocsh
-
 
466
     mov al,0xff      ;bocsh
-
 
467
     out dx, al       ;bocsh
-
 
468
     pop edx
-
 
469
     pop eax
606
 
470
 
607
           mov ebp, esp
471
           mov ebp, esp
608
           mov eax, cr2
472
           mov eax, cr2
609
           push eax
473
           push eax
610
           push ds
474
           push ds
Line 668... Line 532...
668
           pop ds
532
           pop ds
669
           mov esp, ebp
533
           mov esp, ebp
670
           popad
534
           popad
671
           add esp, 4
535
           add esp, 4
672
 
536
           iretd
-
 
537
 
Line 673... Line 538...
673
           save_ring3_context     ;debugger support
538
           save_ring3_context     ;debugger support
Line 674... Line 539...
674
 
539
 
675
           mov bl, 14
540
           mov bl, 14
Line 1084... Line 949...
1084
           mov [esp+36], eax
949
           mov [esp+36], eax
1085
           ret
950
           ret
1086
 
951
 
Line 1087... Line 952...
1087
align 4
952
align 4
1088
proc strncmp stdcall, str1:dword, str2:dword, count:dword
-
 
1089
 
-
 
1090
          mov ecx,[count]
-
 
1091
          jecxz .end
-
 
1092
 
-
 
1093
          mov ebx,ecx
-
 
1094
 
-
 
1095
          mov edi,[str1]
-
 
1096
          mov esi,edi
-
 
1097
          xor eax,eax
-
 
1098
          repne scasb
-
 
1099
          neg ecx             ; cx = count - strlen
-
 
1100
          add ecx,ebx         ; strlen + count - strlen
-
 
1101
 
-
 
1102
.okay:
-
 
1103
          mov edi,esi
-
 
1104
          mov esi,[str2]
-
 
1105
          repe cmpsb
-
 
1106
          mov al,[esi-1]
-
 
1107
          xor ecx,ecx
-
 
1108
 
-
 
1109
          cmp al,[edi-1]
-
 
1110
          ja .str2_big
-
 
1111
          je .end
-
 
1112
 
-
 
1113
.str1_big:
-
 
1114
          sub ecx,2
-
 
1115
 
-
 
1116
.str2_big:
-
 
1117
          not ecx
-
 
1118
.end:
-
 
1119
          mov eax,ecx
-
 
1120
          ret
-
 
1121
endp
-
 
1122
 
-
 
1123
align 4
-
 
1124
proc test_cpu
-
 
1125
           locals
-
 
1126
              cpu_type   dd ?
-
 
1127
              cpu_id     dd ?
-
 
1128
              cpu_Intel  dd ?
-
 
1129
              cpu_AMD    dd ?
-
 
1130
           endl
-
 
1131
 
-
 
1132
           mov [cpu_type], 0
-
 
1133
           xor eax, eax
-
 
1134
           mov [cpu_caps], eax
-
 
1135
           mov [cpu_caps+4], eax
-
 
1136
 
-
 
1137
           pushfd
-
 
1138
           pop eax
-
 
1139
           mov ecx, eax
-
 
1140
           xor eax, 0x40000
-
 
1141
           push eax
-
 
1142
           popfd
-
 
1143
           pushfd
-
 
1144
           pop eax
-
 
1145
           xor eax, ecx
-
 
1146
           mov [cpu_type], CPU_386
-
 
1147
           jz .end_cpuid
-
 
1148
           push ecx
-
 
1149
           popfd
-
 
1150
 
-
 
1151
           mov [cpu_type], CPU_486
-
 
1152
           mov eax, ecx
-
 
1153
           xor eax, 0x200000
-
 
1154
           push eax
-
 
1155
           popfd
-
 
1156
           pushfd
-
 
1157
           pop eax
-
 
1158
           xor eax, ecx
-
 
1159
           je .end_cpuid
-
 
1160
           mov [cpu_id], 1
-
 
1161
 
-
 
1162
           xor eax, eax
-
 
1163
           cpuid
-
 
1164
           mov [cpu_vendor], ebx
-
 
1165
           mov [cpu_vendor+4], edx
-
 
1166
           mov [cpu_vendor+8], ecx
-
 
1167
           cmp ebx, dword [intel_str]
-
 
1168
           jne .check_AMD
-
 
1169
           cmp edx, dword [intel_str+4]
-
 
1170
           jne .check_AMD
-
 
1171
           cmp ecx, dword [intel_str+8]
-
 
1172
           jne .check_AMD
-
 
1173
           mov [cpu_Intel], 1
-
 
1174
           cmp eax, 1
-
 
1175
           jl .end_cpuid
-
 
1176
           mov eax, 1
-
 
1177
           cpuid
-
 
1178
           mov [cpu_sign], eax
-
 
1179
           mov [cpu_info],  ebx
-
 
1180
           mov [cpu_caps],  edx
-
 
1181
           mov [cpu_caps+4],ecx
-
 
1182
 
-
 
1183
           shr eax, 8
-
 
1184
           and eax, 0x0f
-
 
1185
           ret
-
 
1186
.end_cpuid:
-
 
1187
           mov eax, [cpu_type]
-
 
1188
           ret
-
 
1189
 
-
 
1190
.check_AMD:
-
 
1191
           cmp ebx, dword [AMD_str]
-
 
1192
           jne .unknown
-
 
1193
           cmp edx, dword [AMD_str+4]
-
 
1194
           jne .unknown
-
 
1195
           cmp ecx, dword [AMD_str+8]
-
 
1196
           jne .unknown
-
 
1197
           mov [cpu_AMD], 1
-
 
1198
           cmp eax, 1
-
 
1199
           jl .unknown
-
 
1200
           mov eax, 1
-
 
1201
           cpuid
-
 
1202
           mov [cpu_sign], eax
-
 
1203
           mov [cpu_info],  ebx
-
 
1204
           mov [cpu_caps],  edx
-
 
1205
           mov [cpu_caps+4],ecx
-
 
1206
           shr eax, 8
-
 
1207
           and eax, 0x0f
-
 
1208
           ret
-
 
1209
.unknown:
-
 
1210
           mov eax, 1
-
 
1211
           cpuid
-
 
1212
           mov [cpu_sign], eax
-
 
1213
           mov [cpu_info],  ebx
-
 
1214
           mov [cpu_caps],  edx
-
 
1215
           mov [cpu_caps+4],ecx
-
 
1216
           shr eax, 8
-
 
1217
           and eax, 0x0f
-
 
1218
           ret
-
 
1219
endp
-
 
1220
 
-
 
1221
MEM_WB     equ 6               ;write-back memory
-
 
1222
MEM_WC     equ 1               ;write combined memory
-
 
1223
MEM_UC     equ 0               ;uncached memory
-
 
1224
 
-
 
1225
align 4
-
 
1226
proc init_mtrr
953
proc init_mtrr
Line 1227... Line 954...
1227
 
954
 
1228
           cmp [0x2f0000+0x901c],byte 2
955
           cmp [BOOT_VAR+0x901c],byte 2
Line 1229... Line 956...
1229
           je  .exit
956
           je  .exit
1230
 
957
 
Line 1295... Line 1022...
1295
           wrmsr
1022
           wrmsr
1296
           ret
1023
           ret
1297
endp
1024
endp
1298
 
1025
 
Line -... Line 1026...
-
 
1026
 
-
 
1027
align 4
-
 
1028
proc strncmp stdcall, str1:dword, str2:dword, count:dword
-
 
1029
 
-
 
1030
          mov ecx,[count]
-
 
1031
          jecxz .end
-
 
1032
 
-
 
1033
          mov ebx,ecx
-
 
1034
 
-
 
1035
          mov edi,[str1]
-
 
1036
          mov esi,edi
-
 
1037
          xor eax,eax
-
 
1038
          repne scasb
-
 
1039
          neg ecx             ; cx = count - strlen
-
 
1040
          add ecx,ebx         ; strlen + count - strlen
-
 
1041
 
-
 
1042
.okay:
-
 
1043
          mov edi,esi
-
 
1044
          mov esi,[str2]
-
 
1045
          repe cmpsb
-
 
1046
          mov al,[esi-1]
-
 
1047
          xor ecx,ecx
-
 
1048
 
-
 
1049
          cmp al,[edi-1]
-
 
1050
          ja .str2_big
-
 
1051
          je .end
-
 
1052
 
-
 
1053
.str1_big:
-
 
1054
          sub ecx,2
-
 
1055
 
-
 
1056
.str2_big:
-
 
1057
          not ecx
-
 
1058
.end:
-
 
1059
          mov eax,ecx
-
 
1060
          ret
-
 
1061
endp
-
 
1062
 
1299
align 4
1063
align 4
1300
proc stall stdcall, delay:dword
1064
proc stall stdcall, delay:dword
1301
           push ecx
1065
           push ecx
1302
           push edx
1066
           push edx
1303
           push ebx
1067
           push ebx
Line 1322... Line 1086...
1322
           pop ecx
1086
           pop ecx
1323
           ret
1087
           ret
1324
endp
1088
endp
1325
 
1089
 
Line 1326... Line -...
1326
iglobal
-
 
1327
align 4
-
 
1328
  intel_str    db "GenuineIntel",0
-
 
1329
  AMD_str      db "AuthenticAMD",0
-
 
1330
endg
-
 
1331
 
-
 
1332
uglobal
-
 
1333
align 16
-
 
1334
  irq_tab           rd 16
-
 
1335
 
-
 
1336
  MEM_FreeSpace     rd 1
-
 
1337
 
-
 
1338
  ipc_tmp           rd 1
-
 
1339
  ipc_pdir          rd 1
-
 
1340
  ipc_ptab          rd 1
-
 
1341
 
-
 
1342
  proc_mem_map      rd 1
-
 
1343
  proc_mem_pdir     rd 1
-
 
1344
  proc_mem_tab      rd 1
-
 
1345
 
-
 
1346
  tmp_task_pdir     rd 1
-
 
1347
  tmp_task_ptab     rd 1
-
 
1348
 
-
 
1349
  fdd_buff          rd 1
-
 
1350
  LFBSize           rd 1
-
 
1351
 
-
 
1352
  stall_mcs         rd 1
-
 
1353
;;CPUID information
-
 
1354
 
-
 
1355
  cpu_vendor        rd 3
-
 
1356
  cpu_sign          rd 1
-
 
1357
  cpu_info          rd 1
-
 
1358
 
-
 
1359
;;;;;   cursors data
-
 
1360
 
-
 
1361
align 16
-
 
1362
cur_saved_data   rb 4096
-
 
1363
 
-
 
1364
def_cursor       rd 1
-
 
1365
hw_cursor        rd 1
-
 
1366
 
-
 
1367
scr_width        rd 1
-
 
1368
scr_height       rd 1
-
 
1369
 
-
 
1370
cur_def_interl   rd 1
-
 
1371
cur_saved_base   rd 1
-
 
1372
cur_saved_interl rd 1
-
 
1373
cur_saved_w      rd 1
-
 
1374
cur_saved_h      rd 1
-
 
1375
 
-
 
1376
endg
-
 
1377
 
-
 
1378
uglobal
-
 
1379
align 16
-
 
1380
   fpu_data:
-
 
1381
                   rb 512
-
 
1382
 
-
 
1383
   mst MEM_STATE
-
 
1384
 
-
 
1385
   mem_block_map   rb 512
-
 
1386
   event_map       rb 64
-
 
1387
   mem_block_list  rd 64
-
 
1388
   mem_block_mask  rd 2
-
 
1389
 
-
 
1390
   srv.fd          rd 1
-
 
1391
   srv.bk          rd 1
-
 
1392
 
-
 
1393
   mem_used.fd     rd 1
-
 
1394
   mem_used.bk     rd 1
-
 
1395
 
-
 
1396
   mem_block_arr   rd 1
-
 
1397
   mem_block_start rd 1
-
 
1398
   mem_block_end   rd 1
-
 
1399
 
-
 
1400
   heap_mutex      rd 1
-
 
1401
   heap_size       rd 1
-
 
1402
   heap_free       rd 1
-
 
1403
   heap_blocks     rd 1
-
 
1404
   free_blocks     rd 1
-
 
1405
 
-
 
1406
   page_start      rd 1
-
 
1407
   page_end        rd 1
-
 
1408
   events          rd 1
-
 
1409
   event_start     rd 1
-
 
1410
   event_end       rd 1
-
 
1411
   event_uid       rd 1
-
 
1412
   sys_page_map    rd 1
-
 
1413
   os_stack        rd 1
-
 
1414
endg
-
 
1415
 
-
 
1416
if 0
-
 
1417
     push eax
-
 
1418
     push edx
-
 
1419
     mov edx, 0x400   ;bocsh
-
 
1420
     mov al,0xff      ;bocsh
-
 
1421
     out dx, al       ;bocsh
-
 
1422
     pop edx
-
 
1423
     pop eax
-
 
1424
end if
-
 
1425
 
-
 
1426
align 4
1090
align 4
1427
k_strrchr:
1091
k_strrchr:
1428
        push eax
1092
        push eax
1429
        xor eax,eax
1093
        xor eax,eax
1430
        or  ecx,-1
1094
        or  ecx,-1
Line 1641... Line 1305...
1641
        sub eax, [esp+4]
1305
        sub eax, [esp+4]
1642
	ret
1306
	ret
1643
 
1307
 
Line 1644... Line 1308...
1644
end if
1308
end if
-
 
1309
 
-
 
1310
if 0
-
 
1311
     push eax
-
 
1312
     push edx
-
 
1313
     mov edx, 0x400   ;bocsh
-
 
1314
     mov al,0xff      ;bocsh
-
 
1315
     out dx, al       ;bocsh
-
 
1316
     pop edx
-
 
1317
     pop eax
-
 
1318
end if
-
 
1319
-
 
1320