mirror of
				https://github.com/ossrs/srs.git
				synced 2025-03-09 15:49:59 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			151 lines
		
	
	
	
		
			3.8 KiB
		
	
	
	
		
			ArmAsm
		
	
	
		
			Executable file
		
	
	
	
	
			
		
		
	
	
			151 lines
		
	
	
	
		
			3.8 KiB
		
	
	
	
		
			ArmAsm
		
	
	
		
			Executable file
		
	
	
	
	
/*
 | 
						|
 * Portions created by SGI are Copyright (C) 2000 Silicon Graphics, Inc.
 | 
						|
 * All Rights Reserved.
 | 
						|
 */
 | 
						|
 | 
						|
/****************************************************************/
 | 
						|
 | 
						|
#if defined(__i386__)
 | 
						|
 | 
						|
/*
 | 
						|
 * Internal __jmp_buf layout
 | 
						|
 */
 | 
						|
#define JB_BX  0
 | 
						|
#define JB_SI  1
 | 
						|
#define JB_DI  2
 | 
						|
#define JB_BP  3
 | 
						|
#define JB_SP  4
 | 
						|
#define JB_PC  5
 | 
						|
 | 
						|
        .file "md.S"
 | 
						|
        .text
 | 
						|
 | 
						|
        /* _st_md_cxt_save(__jmp_buf env) */
 | 
						|
.globl _st_md_cxt_save
 | 
						|
        .type _st_md_cxt_save, @function
 | 
						|
        .align 16
 | 
						|
_st_md_cxt_save:
 | 
						|
        movl 4(%esp), %eax
 | 
						|
 | 
						|
        /*
 | 
						|
         * Save registers.
 | 
						|
         */
 | 
						|
        movl %ebx, (JB_BX*4)(%eax)
 | 
						|
        movl %esi, (JB_SI*4)(%eax)
 | 
						|
        movl %edi, (JB_DI*4)(%eax)
 | 
						|
        /* Save SP */
 | 
						|
        leal 4(%esp), %ecx
 | 
						|
        movl %ecx, (JB_SP*4)(%eax)
 | 
						|
        /* Save PC we are returning to */
 | 
						|
        movl 0(%esp), %ecx
 | 
						|
        movl %ecx, (JB_PC*4)(%eax)
 | 
						|
        /* Save caller frame pointer */
 | 
						|
        movl %ebp, (JB_BP*4)(%eax)
 | 
						|
        xorl %eax, %eax
 | 
						|
        ret
 | 
						|
        .size _st_md_cxt_save, .-_st_md_cxt_save
 | 
						|
 | 
						|
 | 
						|
/****************************************************************/
 | 
						|
 | 
						|
        /* _st_md_cxt_restore(__jmp_buf env, int val) */
 | 
						|
.globl _st_md_cxt_restore
 | 
						|
        .type _st_md_cxt_restore, @function
 | 
						|
        .align 16
 | 
						|
_st_md_cxt_restore:
 | 
						|
        /* First argument is jmp_buf */
 | 
						|
        movl 4(%esp), %ecx
 | 
						|
        /* Second argument is return value */
 | 
						|
        movl 8(%esp), %eax
 | 
						|
        /* Set the return address */
 | 
						|
        movl (JB_PC*4)(%ecx), %edx
 | 
						|
        /*
 | 
						|
         * Restore registers.
 | 
						|
         */
 | 
						|
        movl (JB_BX*4)(%ecx), %ebx
 | 
						|
        movl (JB_SI*4)(%ecx), %esi
 | 
						|
        movl (JB_DI*4)(%ecx), %edi
 | 
						|
        movl (JB_BP*4)(%ecx), %ebp
 | 
						|
        movl (JB_SP*4)(%ecx), %esp
 | 
						|
        testl %eax, %eax
 | 
						|
        jnz  1f
 | 
						|
        incl %eax
 | 
						|
        /* Jump to saved PC */
 | 
						|
1:      jmp *%edx
 | 
						|
        .size _st_md_cxt_restore, .-_st_md_cxt_restore
 | 
						|
 | 
						|
/****************************************************************/
 | 
						|
 | 
						|
#elif defined(__amd64__) || defined(__x86_64__)
 | 
						|
 | 
						|
/*
 | 
						|
 * Internal __jmp_buf layout
 | 
						|
 */
 | 
						|
#define JB_RBX  0
 | 
						|
#define JB_RBP  1
 | 
						|
#define JB_R12  2
 | 
						|
#define JB_R13  3
 | 
						|
#define JB_R14  4
 | 
						|
#define JB_R15  5
 | 
						|
#define JB_RSP  6
 | 
						|
#define JB_PC   7
 | 
						|
 | 
						|
        .file "md.S"
 | 
						|
        .text
 | 
						|
 | 
						|
        /* _st_md_cxt_save(__jmp_buf env) */
 | 
						|
.globl _st_md_cxt_save
 | 
						|
        .type _st_md_cxt_save, @function
 | 
						|
        .align 16
 | 
						|
_st_md_cxt_save:
 | 
						|
        /*
 | 
						|
         * Save registers.
 | 
						|
         */
 | 
						|
        movq %rbx, (JB_RBX*8)(%rdi)
 | 
						|
        movq %rbp, (JB_RBP*8)(%rdi)
 | 
						|
        movq %r12, (JB_R12*8)(%rdi)
 | 
						|
        movq %r13, (JB_R13*8)(%rdi)
 | 
						|
        movq %r14, (JB_R14*8)(%rdi)
 | 
						|
        movq %r15, (JB_R15*8)(%rdi)
 | 
						|
        /* Save SP */
 | 
						|
        leaq 8(%rsp), %rdx
 | 
						|
        movq %rdx, (JB_RSP*8)(%rdi)
 | 
						|
        /* Save PC we are returning to */
 | 
						|
        movq (%rsp), %rax
 | 
						|
        movq %rax, (JB_PC*8)(%rdi)
 | 
						|
        xorq %rax, %rax
 | 
						|
        ret
 | 
						|
        .size _st_md_cxt_save, .-_st_md_cxt_save
 | 
						|
 | 
						|
 | 
						|
/****************************************************************/
 | 
						|
 | 
						|
        /* _st_md_cxt_restore(__jmp_buf env, int val) */
 | 
						|
.globl _st_md_cxt_restore
 | 
						|
        .type _st_md_cxt_restore, @function
 | 
						|
        .align 16
 | 
						|
_st_md_cxt_restore:
 | 
						|
        /*
 | 
						|
         * Restore registers.
 | 
						|
         */
 | 
						|
        movq (JB_RBX*8)(%rdi), %rbx
 | 
						|
        movq (JB_RBP*8)(%rdi), %rbp
 | 
						|
        movq (JB_R12*8)(%rdi), %r12
 | 
						|
        movq (JB_R13*8)(%rdi), %r13
 | 
						|
        movq (JB_R14*8)(%rdi), %r14
 | 
						|
        movq (JB_R15*8)(%rdi), %r15
 | 
						|
        /* Set return value */
 | 
						|
        test %esi, %esi
 | 
						|
        mov $01, %eax
 | 
						|
        cmove %eax, %esi
 | 
						|
        mov %esi, %eax
 | 
						|
        movq (JB_PC*8)(%rdi), %rdx
 | 
						|
        movq (JB_RSP*8)(%rdi), %rsp
 | 
						|
        /* Jump to saved PC */
 | 
						|
        jmpq *%rdx
 | 
						|
        .size _st_md_cxt_restore, .-_st_md_cxt_restore
 | 
						|
 | 
						|
/****************************************************************/
 | 
						|
 | 
						|
#endif
 | 
						|
 |