⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dtrace_asm.s

📁 Sun Solaris 10 中的 DTrace 组件的源代码。请参看: http://www.sun.com/software/solaris/observability.jsp
💻 S
字号:
/* * Copyright 2005 Sun Microsystems, Inc.  All rights reserved. * * The contents of this file are subject to the terms of the * Common Development and Distribution License, Version 1.0 only. * See the file usr/src/LICENSING.NOTICE in this distribution or * http://www.opensolaris.org/license/ for details. */#pragma ident	"@(#)dtrace_asm.s	1.5	04/11/17 SMI"#include <sys/asm_linkage.h>#include <sys/regset.h>#if defined(lint)#include <sys/dtrace_impl.h>#endif#if defined(lint) || defined(__lint)greg_tdtrace_getfp(void){ return (0); }#else	/* lint */#if defined(__amd64)	ENTRY_NP(dtrace_getfp)	movq	%rbp, %rax	ret	SET_SIZE(dtrace_getfp)#elif defined(__i386)	ENTRY_NP(dtrace_getfp)	movl	%ebp, %eax	ret	SET_SIZE(dtrace_getfp)#endif	/* __i386 */#endif	/* lint */#if defined(lint) || defined(__lint)uint32_tdtrace_cas32(uint32_t *target, uint32_t cmp, uint32_t new){	uint32_t old;	if ((old = *target) == cmp)		*target = new;	return (old);}void *dtrace_casptr(void *target, void *cmp, void *new){	void *old;	if ((old = *(void **)target) == cmp)		*(void **)target = new;	return (old);}#else	/* lint */#if defined(__amd64)	ENTRY(dtrace_cas32)	movl	%esi, %eax	lock	cmpxchgl %edx, (%rdi)	ret	SET_SIZE(dtrace_cas32)	ENTRY(dtrace_casptr)	movq	%rsi, %rax	lock	cmpxchgq %rdx, (%rdi)	ret	SET_SIZE(dtrace_casptr)#elif defined(__i386)	ENTRY(dtrace_cas32)	ALTENTRY(dtrace_casptr)	movl	4(%esp), %edx	movl	8(%esp), %eax	movl	12(%esp), %ecx	lock	cmpxchgl %ecx, (%edx)	ret	SET_SIZE(dtrace_casptr)	SET_SIZE(dtrace_cas32)#endif	/* __i386 */#endif	/* lint */#if defined(lint)/*ARGSUSED*/uintptr_tdtrace_caller(int aframes){	return (0);}#else	/* lint */#if defined(__amd64)	ENTRY(dtrace_caller)	movq	$-1, %rax	ret	SET_SIZE(dtrace_caller)#elif defined(__i386)	ENTRY(dtrace_caller)	movl	$-1, %eax	ret	SET_SIZE(dtrace_caller)#endif	/* __i386 */#endif	/* lint */#if defined(lint)/*ARGSUSED*/voiddtrace_copy(uintptr_t src, uintptr_t dest, size_t size){}#else#if defined(__amd64)	ENTRY(dtrace_copy)	pushq	%rbp	movq	%rsp, %rbp	xchgq	%rdi, %rsi		/* make %rsi source, %rdi dest */	movq	%rdx, %rcx		/* load count */	repz				/* repeat for count ... */	smovb				/*   move from %ds:rsi to %ed:rdi */	leave	ret	SET_SIZE(dtrace_copy)#elif defined(__i386)	ENTRY(dtrace_copy)	pushl	%ebp	movl	%esp, %ebp	pushl	%esi	pushl	%edi	movl	8(%ebp), %esi		/ Load source address	movl	12(%ebp), %edi		/ Load destination address	movl	16(%ebp), %ecx		/ Load count	repz				/ Repeat for count...	smovb				/   move from %ds:si to %es:di	popl	%edi	popl	%esi	movl	%ebp, %esp	popl	%ebp	ret	SET_SIZE(dtrace_copy)#endif	/* __i386 */#endif#if defined(lint)/*ARGSUSED*/voiddtrace_copystr(uintptr_t uaddr, uintptr_t kaddr, size_t size){}#else#if defined(__amd64)	ENTRY(dtrace_copystr)	pushq	%rbp	movq	%rsp, %rbp0:	movb	(%rdi), %al		/* load from source */	movb	%al, (%rsi)		/* store to destination */	addq	$1, %rdi		/* increment source pointer */	addq	$1, %rsi		/* increment destination pointer */	subq	$1, %rdx		/* decrement remaining count */	cmpb	$0, %al	je	1f	cmpq	$0, %rdx	jne	0b1:	leave	ret	SET_SIZE(dtrace_copystr)#elif defined(__i386)	ENTRY(dtrace_copystr)	pushl	%ebp			/ Setup stack frame	movl	%esp, %ebp	pushl	%ebx			/ Save registers	movl	8(%ebp), %ebx		/ Load source address	movl	12(%ebp), %edx		/ Load destination address	movl	16(%ebp), %ecx		/ Load count0:	movb	(%ebx), %al		/ Load from source	movb	%al, (%edx)		/ Store to destination	incl	%ebx			/ Increment source pointer	incl	%edx			/ Increment destination pointer	decl	%ecx			/ Decrement remaining count	cmpb	$0, %al	je	1f	cmpl	$0, %ecx	jne	0b1:	popl	%ebx	movl	%ebp, %esp	popl	%ebp	ret	SET_SIZE(dtrace_copystr)#endif	/* __i386 */#endif#if defined(lint)/*ARGSUSED*/uintptr_tdtrace_fulword(void *addr){ return (0); }#else#if defined(__amd64)	ENTRY(dtrace_fulword)	movq	(%rdi), %rax	ret	SET_SIZE(dtrace_fulword)#elif defined(__i386)	ENTRY(dtrace_fulword)	movl	4(%esp), %ecx	xorl	%eax, %eax	movl	(%ecx), %eax	ret	SET_SIZE(dtrace_fulword)#endif	/* __i386 */#endif#if defined(lint)/*ARGSUSED*/uint8_tdtrace_fuword8_nocheck(void *addr){ return (0); }#else#if defined(__amd64)	ENTRY(dtrace_fuword8_nocheck)	xorq	%rax, %rax	movb	(%rdi), %al	ret	SET_SIZE(dtrace_fuword8_nocheck)#elif defined(__i386)	ENTRY(dtrace_fuword8_nocheck)	movl	4(%esp), %ecx	xorl	%eax, %eax	movzbl	(%ecx), %eax	ret	SET_SIZE(dtrace_fuword8_nocheck)#endif	/* __i386 */#endif#if defined(lint)/*ARGSUSED*/uint16_tdtrace_fuword16_nocheck(void *addr){ return (0); }#else#if defined(__amd64)	ENTRY(dtrace_fuword16_nocheck)	xorq	%rax, %rax	movw	(%rdi), %ax	ret	SET_SIZE(dtrace_fuword16_nocheck)#elif defined(__i386)	ENTRY(dtrace_fuword16_nocheck)	movl	4(%esp), %ecx	xorl	%eax, %eax	movzwl	(%ecx), %eax	ret	SET_SIZE(dtrace_fuword16_nocheck)#endif	/* __i386 */#endif#if defined(lint)/*ARGSUSED*/uint32_tdtrace_fuword32_nocheck(void *addr){ return (0); }#else#if defined(__amd64)	ENTRY(dtrace_fuword32_nocheck)	xorq	%rax, %rax	movl	(%rdi), %eax	ret	SET_SIZE(dtrace_fuword32_nocheck)#elif defined(__i386)	ENTRY(dtrace_fuword32_nocheck)	movl	4(%esp), %ecx	xorl	%eax, %eax	movl	(%ecx), %eax	ret	SET_SIZE(dtrace_fuword32_nocheck)#endif	/* __i386 */#endif#if defined(lint)/*ARGSUSED*/uint64_tdtrace_fuword64_nocheck(void *addr){ return (0); }#else#if defined(__amd64)	ENTRY(dtrace_fuword64_nocheck)	movq	(%rdi), %rax	ret	SET_SIZE(dtrace_fuword64_nocheck)#elif defined(__i386)	ENTRY(dtrace_fuword64_nocheck)	movl	4(%esp), %ecx	xorl	%eax, %eax	xorl	%edx, %edx	movl	(%ecx), %eax	movl	4(%ecx), %edx	ret	SET_SIZE(dtrace_fuword64_nocheck)#endif	/* __i386 */#endif#if defined(lint) || defined(__lint)/*ARGSUSED*/voiddtrace_probe_error(dtrace_state_t *state, dtrace_epid_t epid, int which,    int fault, int fltoffs, uintptr_t illval){}#else	/* lint */#if defined(__amd64)	ENTRY(dtrace_probe_error)	pushq	%rbp	movq	%rsp, %rbp	subq	$0x8, %rsp	movq	%r9, (%rsp)	movq	%r8, %r9	movq	%rcx, %r8	movq	%rdx, %rcx	movq	%rsi, %rdx	movq	%rdi, %rsi	movl	dtrace_probeid_error(%rip), %edi	call	dtrace_probe	addq	$0x8, %rsp	leave	ret	SET_SIZE(dtrace_probe_error)	#elif defined(__i386)	ENTRY(dtrace_probe_error)	pushl	%ebp	movl	%esp, %ebp	pushl	0x1c(%ebp)	pushl	0x18(%ebp)	pushl	0x14(%ebp)	pushl	0x10(%ebp)	pushl	0xc(%ebp)	pushl	0x8(%ebp)	pushl	dtrace_probeid_error	call	dtrace_probe	movl	%ebp, %esp	popl	%ebp	ret	SET_SIZE(dtrace_probe_error)#endif	/* __i386 */#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -