github.com/icexin/eggos@v0.4.2-0.20220216025428-78b167e4f349/kernel/syscall.s (about)

     1  #include "textflag.h"
     2  
     3  #define tls_my 0
     4  #define tls_ax 8
     5  #define m_kstack 40
     6  #define ucode_idx  3
     7  #define udata_idx  4
     8  #define rpl_user   3
     9  
    10  #define SYS_clockgettime 228
    11  
    12  TEXT ·syscallEntry(SB), NOSPLIT, $0
    13  	// save AX
    14  	MOVQ AX, tls_ax(GS)
    15  
    16  	// AX == pointer of current thread
    17  	MOVQ tls_my(GS), AX
    18  
    19  	// AX == kernel stack
    20  	MOVQ m_kstack(AX), AX
    21  
    22  	// push regs like INT 0x80
    23  	SUBQ $40, AX
    24  
    25  	// CX store IP
    26  	MOVQ CX, 0(AX)
    27  
    28  	// save CS
    29  	MOVQ $ucode_idx<<3|rpl_user, 8(AX)
    30  
    31  	// R11 store FLAGS
    32  	MOVQ R11, 16(AX)
    33  
    34  	// save SP
    35  	MOVQ SP, 24(AX)
    36  
    37  	// save SS
    38  	MOVQ $udata_idx<<3|rpl_user, 32(AX)
    39  
    40  	// change SP
    41  	MOVQ AX, SP
    42  
    43  	// restore AX
    44  	MOVQ tls_ax(GS), AX
    45  
    46  	// jmp INT 0x80
    47  	JMP ·trap128(SB)
    48  
    49  TEXT ·vdsoGettimeofday(SB), NOSPLIT, $0
    50  	MOVQ $SYS_clockgettime, AX
    51  
    52  	// DI store *TimeSpec, but clockgettime need SI
    53  	MOVQ DI, SI
    54  	MOVQ $0, DI
    55  	INT  $0x80
    56  	RET
    57