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