context.inc

Переключить прокрутку окна
Загрузить этот исходный код

;
 ;  Исходный код среды исполнения ПВТ-ОО.
 ;
 ;  Этот исходный код является частью проекта ПВТ-ОО.
 ;
 ;  Copyright © 2021 Малик Разработчик
 ;
 ;  Это свободная программа: вы можете перераспространять её и/или
 ;  изменять её на условиях Меньшей Стандартной общественной лицензии GNU в том виде,
 ;  в каком она была опубликована Фондом свободного программного обеспечения;
 ;  либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
 ;
 ;  Эта программа распространяется в надежде, что она может быть полезна,
 ;  но БЕЗО ВСЯКИХ ГАРАНТИЙ; даже без неявной гарантии ТОВАРНОГО ВИДА
 ;  или ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЁННЫХ ЦЕЛЕЙ. Подробнее см. в Меньшей Стандартной
 ;  общественной лицензии GNU.
 ;
 ;  Вы должны были получить копию Меньшей Стандартной общественной лицензии GNU
 ;  вместе с этой программой. Если это не так, см.
 ;  <http://www.gnu.org/licenses/>.
;

; <fold context routines code (platform-dependent)>
    proc ctx$createMainContext ; <fold >
                lea     rsp, [rsp-$40]
                ; проверка наличия AVX-512
                call    ctx$isSupportedAVX512ByCPU
                test    r0d, r0d
                jnz     @F
                mov     r1d, $fffffff4
                call    qword[platform.dependent.kernel32.getStdHandle]
                mov     r1, r0
                lea     r2, [ctx$noavxCPUMessage]
                mov     r8d, ctx$noavxCPUMessage.end-ctx$noavxCPUMessage
                lea     r9, [rsp+$30]
                mov     qword[rsp+$20], $00
                call    qword[platform.dependent.kernel32.writeFile]
                xor     r1, r1
                call    qword[platform.dependent.kernel32.exitProcess]
        @@:     ; проверка поддержки AVX-512
                call    ctx$isSupportedAVX512ByOS
                test    r0d, r0d
                jnz     @F
                mov     r1d, $fffffff4
                call    qword[platform.dependent.kernel32.getStdHandle]
                mov     r1, r0
                lea     r2, [ctx$noavxOSMessage]
                mov     r8d, ctx$noavxOSMessage.end-ctx$noavxOSMessage
                lea     r9, [rsp+$30]
                mov     qword[rsp+$20], $00
                call    qword[platform.dependent.kernel32.writeFile]
                xor     r1, r1
                call    qword[platform.dependent.kernel32.exitProcess]
        @@:     ; создание тагированного стака вызовов
                mov     r6d, [ctx$threadStackDataSize]
                mov     r7, r6
                neg     r7
                and     r7, $ffff
                lea     r6, [r6+r7*1]
                xor     r1, r1
                mov     r2, r6
                shr     r2, $04
                lea     r2, [r6+r2*1+$1000]
                mov     r8d, $00001000
                mov     r9d, $00000004
                call    qword[platform.dependent.kernel32.virtualAlloc]
                lea     rax, [r0+$1000]
                lea     rcx, [rax-$1000]
                mov     rdx, r6
                mov     rbx, r6
                shr     rbx, $04
                lea     rbx, [rdx+rbx*1]
                lea     rbx, [rcx+rbx*1]
                lea     rsi, [rcx+rdx*1]
                mov     rdi, [rsp+$40]
                mov     qword[rbx+context$zero], $00
                mov     qword[rbx+context$guardEnd], rax
                mov     qword[rbx+context$dataPointer], rcx
                mov     qword[rbx+context$dataLength], rdx
                mov     qword[rbx+context$tagsPointer], rsi
                mov     qword[rbx+context$ehp], $00
                mov     qword[rbx+context$tsp], rbx
                mov     qword[rbx+context$tbp], $00
                mov     rsp, rsi
                ; инициализация FPU
                fldcw   word[ctx$fpuControlWord]
                ; инициализация AVX
                ldmxcsr dword[ctx$avxControlStatusWord]
                ; возврат управления
                jmp     rdi
    end_proc ; </fold>

    proc ctx$destroyMainContext ; <fold >
                lea     rsp, [rsp-$28]
                xor     r1, r1
                call    qword[platform.dependent.kernel32.exitProcess]
    end_proc ; </fold>

    proc ctx$isSupportedAVX512ByCPU ; <fold >
                mov     eax, $00000001
                cpuid
                test    ecx, $10000000 ; AVX
                jz      @F
                mov     eax, $00000007
                mov     ecx, $00000000
                cpuid
                test    ebx, $00000020 ; AVX2
                jz      @F
                and     ebx, $50030000 ; AVX-512
                cmp     ebx, $50030000
                jnz     @F
                mov     r0d, $ffffffff
                jmp     .exit
        @@:     xor     r0d, r0d
        .exit:  ret
    end_proc ; </fold>

    proc ctx$isSupportedAVX512ByOS ; <fold >
                mov     eax, $00000001
                cpuid
                test    ecx, $08000000 ; XGETBV включено операционной системой ?
                jz      @F
                xor     ecx, ecx
                xgetbv
                and     eax, $000000e7 ; Состояние регистров AVX-512, AVX, SSE и FPU сохраняется операционной системой при переключении контекстов ?
                cmp     eax, $000000e7
                jnz     @F
                mov     r0d, $ffffffff
                jmp     .exit
        @@:     xor     r0d, r0d
        .exit:  ret
    end_proc ; </fold>
; </fold>