github.com/epfl-dcsl/gotee@v0.0.0-20200909122901-014b35f5e5e9/src/gosec/assembly_amd64.s (about)

     1  #include "textflag.h"
     2  
     3  // func asm_eenter(tcs, xcpt, rdi, rsi uint64)
     4  TEXT gosec·asm_eenter(SB),$0-40
     5      MOVQ $2, AX				//EENTER
     6      MOVQ tcs+0(FP),BX
     7      MOVQ xcpt+8(FP), CX
     8      BYTE $0x0f; BYTE $0x01; BYTE $0xd7 //ENCLU EENTER
     9      MOVQ rdi+16(FP), AX
    10      MOVQ DI, (AX)
    11      MOVQ rdi+24(FP), AX
    12      MOVQ SI, (AX)
    13      RET
    14  
    15  // func asm_exception()
    16  TEXT gosec·asm_exception(SB),$0
    17      BYTE $0x0f; BYTE $0x01; BYTE $0xd7
    18  
    19  // func asm_eresume(tcs, xcpt uint64)
    20  TEXT gosec·asm_eresume(SB),$0-40
    21      MOVQ $2, AX				//EENTER
    22      MOVQ tcs+0(FP),BX
    23      MOVQ xcpt+8(FP), CX
    24  		MOVQ $0xdead, R10
    25      BYTE $0x0f; BYTE $0x01; BYTE $0xd7 //ENCLU EENTER
    26      // Should never return
    27  		MOVQ $123, 123
    28  		RET
    29  
    30  // The goals is to push req *runtime.OExitRequest on the stack before the call
    31  // According to our current implementation, req is in SI
    32  // This function does the dispatch for the enclave
    33  // func asm_oentry() 
    34  TEXT gosec·asm_oentry(SB),NOSPLIT,$8-8
    35  	PUSHQ SI
    36  	MOVQ (SI), R9
    37  	CMPQ R9, $1 // SpawnRequest (runtime/gosec.go)
    38  	JNE futsleep
    39  	CALL gosec·spawnEnclaveThread(SB)
    40  	JMP end
    41  futsleep:
    42  	CMPQ R9, $2 // FutexSleepRequest (runtime/gosec.go)
    43  	JNE futwake
    44  	CALL gosec·FutexSleep(SB)
    45  	JMP end
    46  futwake:
    47  	CMPQ R9, $3
    48  	JNE epoll
    49  	CALL gosec·FutexWakeup(SB)
    50  	JMP end
    51  epoll:
    52  	CALL gosec·EpollPWait(SB)
    53  end:
    54  	POPQ SI
    55  	RET