File indexing completed on 2025-05-11 08:24:24
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036 #ifdef HAVE_CONFIG_H
0037 #include "config.h"
0038 #endif
0039
0040 #include <rtems/asm.h>
0041 #include <rtems/score/cpu.h>
0042
0043 #ifndef CPU_STACK_ALIGNMENT
0044 #error "Missing header? CPU_STACK_ALIGNMENT not defined"
0045 #endif
0046
0047
0048
0049
0050
0051 .set REG_EFLAGS, I386_CONTEXT_CONTROL_EFLAGS_OFFSET
0052 .set REG_ESP, I386_CONTEXT_CONTROL_ESP_OFFSET
0053 .set REG_EBP, I386_CONTEXT_CONTROL_EBP_OFFSET
0054 .set REG_EBX, I386_CONTEXT_CONTROL_EBX_OFFSET
0055 .set REG_ESI, I386_CONTEXT_CONTROL_ESI_OFFSET
0056 .set REG_EDI, I386_CONTEXT_CONTROL_EDI_OFFSET
0057 .set REG_GS_0, I386_CONTEXT_CONTROL_GS_0_OFFSET
0058 .set REG_GS_1, I386_CONTEXT_CONTROL_GS_1_OFFSET
0059
0060 BEGIN_CODE
0061
0062
0063
0064
0065
0066
0067
0068 .p2align 1
0069 PUBLIC (_CPU_Context_switch)
0070 PUBLIC (_CPU_Context_switch_no_return)
0071
0072 .set RUNCONTEXT_ARG, 4
0073 .set HEIRCONTEXT_ARG, 8
0074
0075 SYM (_CPU_Context_switch):
0076 SYM (_CPU_Context_switch_no_return):
0077 movl RUNCONTEXT_ARG(esp),eax
0078 GET_SELF_CPU_CONTROL edx
0079 movl PER_CPU_ISR_DISPATCH_DISABLE(edx),ecx
0080 pushf
0081 popl REG_EFLAGS(eax)
0082 movl esp,REG_ESP(eax)
0083 movl ebp,REG_EBP(eax)
0084 movl ebx,REG_EBX(eax)
0085 movl esi,REG_ESI(eax)
0086 movl edi,REG_EDI(eax)
0087 movl ecx, I386_CONTEXT_CONTROL_ISR_DISPATCH_DISABLE(eax)
0088
0089 movl eax,ecx
0090 movl HEIRCONTEXT_ARG(esp),eax
0091
0092 #ifdef RTEMS_SMP
0093
0094
0095
0096
0097
0098 leal PER_CPU_INTERRUPT_FRAME_AREA + CPU_INTERRUPT_FRAME_SIZE(edx),esp
0099 movb $0, I386_CONTEXT_CONTROL_IS_EXECUTING_OFFSET(ecx)
0100
0101 .L_check_is_executing:
0102 lock bts $0,I386_CONTEXT_CONTROL_IS_EXECUTING_OFFSET(eax)
0103 jc .L_get_potential_new_heir
0104 #endif
0105
0106
0107 .L_restore:
0108 movl I386_CONTEXT_CONTROL_ISR_DISPATCH_DISABLE(eax),ecx
0109 movl ecx,PER_CPU_ISR_DISPATCH_DISABLE(edx)
0110 movl REG_ESP(eax),esp
0111 pushl REG_EFLAGS(eax)
0112 popf
0113 movl REG_EBP(eax),ebp
0114 movl REG_EBX(eax),ebx
0115 movl REG_ESI(eax),esi
0116 movl REG_EDI(eax),edi
0117 GET_CPU_ID ecx
0118 movl REG_GS_0(eax), edx
0119 movl edx, _Global_descriptor_table+24(,ecx,8)
0120 movl REG_GS_1(eax), edx
0121 movl edx, _Global_descriptor_table+28(,ecx,8)
0122 leal 24(,ecx,8), edx
0123 movl edx, gs
0124 ret
0125
0126
0127
0128
0129
0130
0131
0132
0133
0134
0135
0136 PUBLIC (_CPU_Context_restore)
0137
0138 .set NEWCONTEXT_ARG, 4
0139
0140 SYM (_CPU_Context_restore):
0141 movl NEWCONTEXT_ARG(esp),eax
0142 GET_SELF_CPU_CONTROL edx
0143 jmp .L_restore
0144
0145 #ifdef RTEMS_SMP
0146
0147 .L_get_potential_new_heir:
0148
0149
0150
0151
0152 movl PER_CPU_OFFSET_EXECUTING(edx),ebx
0153 movl PER_CPU_OFFSET_HEIR(edx),esi
0154
0155
0156
0157
0158
0159 cmp esi,ebx
0160 je .L_check_is_executing
0161
0162
0163 addl esi,eax
0164 subl ebx,eax
0165
0166
0167 movl esi,PER_CPU_OFFSET_EXECUTING(edx)
0168
0169 jmp .L_check_is_executing
0170 #endif
0171
0172
0173
0174
0175
0176
0177
0178
0179 .set FPCONTEXT_ARG, 4
0180
0181 #ifndef __SSE__
0182 .p2align 1
0183 PUBLIC (_CPU_Context_save_fp)
0184 SYM (_CPU_Context_save_fp):
0185 movl FPCONTEXT_ARG(esp),eax
0186 movl (eax),eax
0187 fsave (eax)
0188 ret
0189
0190 .p2align 1
0191 PUBLIC (_CPU_Context_restore_fp)
0192 SYM (_CPU_Context_restore_fp):
0193 movl FPCONTEXT_ARG(esp),eax
0194 movl (eax),eax
0195 frstor (eax)
0196 ret
0197 #endif
0198
0199 #ifdef __SSE__
0200 #define SSE_OFF 16
0201 #endif
0202
0203 PUBLIC (_Exception_Handler)
0204 SYM (_Exception_Handler):
0205 pusha
0206 pushl $0
0207 movl esp, ebp
0208 #ifndef __SSE__
0209 subl $4, esp
0210
0211 andl $ - CPU_STACK_ALIGNMENT, esp
0212 #else
0213 subl $512, esp
0214
0215 andl $ - CPU_STACK_ALIGNMENT, esp
0216
0217
0218
0219 fxsave 0(esp)
0220 fninit
0221 movl $0x1f80, 0(ebp)
0222 ldmxcsr 0(ebp)
0223 movl esp, 0(ebp)
0224 subl $SSE_OFF, esp
0225 #endif
0226 movl ebp, (esp)
0227 movl _currentExcHandler, eax
0228 call * eax
0229 #ifdef __SSE__
0230 fwait
0231 fxrstor 16(esp)
0232 #endif
0233 movl ebp, esp
0234 addl $4, esp
0235 popa
0236 addl $8, esp
0237 iret
0238
0239 #define DISTINCT_EXCEPTION_WITH_FAULTCODE_ENTRY(_vector) \
0240 .p2align 4 ; \
0241 PUBLIC (rtems_exception_prologue_ ## _vector ) ; \
0242 SYM (rtems_exception_prologue_ ## _vector ): \
0243 pushl $ _vector ; \
0244 jmp SYM (_Exception_Handler) ;
0245
0246 #define DISTINCT_EXCEPTION_WITHOUT_FAULTCODE_ENTRY(_vector) \
0247 .p2align 4 ; \
0248 PUBLIC (rtems_exception_prologue_ ## _vector ) ; \
0249 SYM (rtems_exception_prologue_ ## _vector ): \
0250 pushl $ 0 ; \
0251 pushl $ _vector ; \
0252 jmp SYM (_Exception_Handler) ;
0253
0254
0255
0256
0257 DISTINCT_EXCEPTION_WITHOUT_FAULTCODE_ENTRY (0)
0258
0259
0260
0261 DISTINCT_EXCEPTION_WITHOUT_FAULTCODE_ENTRY (1)
0262
0263
0264
0265 DISTINCT_EXCEPTION_WITHOUT_FAULTCODE_ENTRY (2)
0266
0267
0268
0269 DISTINCT_EXCEPTION_WITHOUT_FAULTCODE_ENTRY (3)
0270
0271
0272
0273 DISTINCT_EXCEPTION_WITHOUT_FAULTCODE_ENTRY (4)
0274
0275
0276
0277 DISTINCT_EXCEPTION_WITHOUT_FAULTCODE_ENTRY (5)
0278
0279
0280
0281 DISTINCT_EXCEPTION_WITHOUT_FAULTCODE_ENTRY (6)
0282
0283
0284
0285 DISTINCT_EXCEPTION_WITHOUT_FAULTCODE_ENTRY (7)
0286
0287
0288
0289 DISTINCT_EXCEPTION_WITH_FAULTCODE_ENTRY (8)
0290
0291
0292
0293 DISTINCT_EXCEPTION_WITHOUT_FAULTCODE_ENTRY (9)
0294
0295
0296
0297 DISTINCT_EXCEPTION_WITH_FAULTCODE_ENTRY (10)
0298
0299
0300
0301 DISTINCT_EXCEPTION_WITH_FAULTCODE_ENTRY (11)
0302
0303
0304
0305 DISTINCT_EXCEPTION_WITH_FAULTCODE_ENTRY (12)
0306
0307
0308
0309 DISTINCT_EXCEPTION_WITH_FAULTCODE_ENTRY (13)
0310
0311
0312
0313 DISTINCT_EXCEPTION_WITH_FAULTCODE_ENTRY (14)
0314
0315
0316
0317 DISTINCT_EXCEPTION_WITHOUT_FAULTCODE_ENTRY (16)
0318
0319
0320
0321 DISTINCT_EXCEPTION_WITH_FAULTCODE_ENTRY (17)
0322
0323
0324
0325 DISTINCT_EXCEPTION_WITH_FAULTCODE_ENTRY (18)
0326
0327 #ifdef __SSE__
0328
0329
0330
0331 DISTINCT_EXCEPTION_WITHOUT_FAULTCODE_ENTRY (19)
0332 #endif
0333
0334
0335
0336
0337
0338
0339
0340
0341
0342
0343
0344 .set SEGMENT_ARG, 4
0345 .set ADDRESS_ARG, 8
0346
0347 PUBLIC (i386_Logical_to_physical)
0348
0349 SYM (i386_Logical_to_physical):
0350
0351 xorl eax,eax
0352 movzwl SEGMENT_ARG(esp),ecx
0353 movl $ SYM (_Global_descriptor_table),edx
0354
0355 addl ecx,edx
0356 movb 7(edx),ah
0357 movb 4(edx),al
0358 shll $16,eax
0359 movw 2(edx),ax
0360 movl ADDRESS_ARG(esp),ecx
0361 addl eax,ecx
0362 movl ecx,eax
0363 ret
0364
0365
0366
0367
0368
0369
0370
0371
0372
0373
0374
0375
0376
0377
0378
0379 PUBLIC (i386_Physical_to_logical)
0380
0381 SYM (i386_Physical_to_logical):
0382 xorl eax,eax
0383 movzwl SEGMENT_ARG(esp),ecx
0384 movl $ SYM (_Global_descriptor_table),edx
0385
0386 addl ecx,edx
0387 movb 7(edx),ah
0388 movb 4(edx),al
0389 shll $16,eax
0390 movw 2(edx),ax
0391 movl ADDRESS_ARG(esp),ecx
0392 subl eax,ecx
0393 movl ecx,eax
0394 ret
0395
0396
0397
0398
0399
0400
0401
0402
0403
0404
0405
0406
0407
0408 .set PHYS_PTR_ARG, 4
0409 .set RM_PTR_SEG_ARG, 8
0410 .set RM_PTR_OFF_ARG, 12
0411
0412 PUBLIC (i386_Physical_to_real)
0413
0414 SYM (i386_Physical_to_real):
0415 movl PHYS_PTR_ARG(esp),eax
0416 cmpl $0x10FFF0, eax
0417 js 1f
0418 movl $0, eax
0419 ret
0420 1: cmpl $0x100000, eax
0421 js 2f
0422 subl $0xFFFF0, eax
0423 movl RM_PTR_OFF_ARG(esp), ecx
0424 movw ax, (ecx)
0425 movl RM_PTR_SEG_ARG(esp), ecx
0426 movw $0xFFFF, (ecx)
0427 movl $1, eax
0428 ret
0429 2: movl eax, edx
0430 and $0xF, ax
0431 movl RM_PTR_OFF_ARG(esp), ecx
0432 movw ax, (ecx)
0433 shrl $4, edx
0434 movl RM_PTR_SEG_ARG(esp), ecx
0435 movw dx, (ecx)
0436 movl $1, eax
0437 ret
0438
0439 END_CODE
0440
0441 END