1/*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License, Version 1.0 only
6 * (the "License").  You may not use this file except in compliance
7 * with the License.
8 *
9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10 * or http://www.opensolaris.org/os/licensing.
11 * See the License for the specific language governing permissions
12 * and limitations under the License.
13 *
14 * When distributing Covered Code, include this CDDL HEADER in each
15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16 * If applicable, add the following below this CDDL HEADER, with the
17 * fields enclosed by brackets "[]" replaced with your own identifying
18 * information: Portions Copyright [yyyy] [name of copyright owner]
19 *
20 * CDDL HEADER END
21 */
22/*
23 * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
24 * Use is subject to license terms.
25 */
26
27#ifndef _ASM_ATOMIC_H
28#define	_ASM_ATOMIC_H
29
30#pragma ident	"%Z%%M%	%I%	%E% SMI"
31
32#include <sys/types.h>
33
34#ifdef	__cplusplus
35extern "C" {
36#endif
37
38#if !defined(__lint) && defined(__GNUC__)
39
40#if defined(__amd64)
41
42extern __inline__ void atomic_or_long(ulong_t *target, ulong_t bits)
43{
44	__asm__ __volatile__(
45		"lock; orq %1, (%0)"
46		: /* no output */
47		: "r" (target), "r" (bits));
48}
49
50extern __inline__ void atomic_and_long(ulong_t *target, ulong_t bits)
51{
52	__asm__ __volatile__(
53		"lock; andq %1, (%0)"
54		: /* no output */
55		: "r" (target), "r" (bits));
56}
57
58#ifdef notdef
59extern __inline__ uint64_t cas64(uint64_t *target, uint64_t cmp,
60	uint64_t newval)
61{
62	uint64_t retval;
63
64	__asm__ __volatile__(
65		"movq %2, %%rax; lock; cmpxchgq %3, (%1)"
66		: "=a" (retval)
67		: "r" (target), "r" (cmp), "r" (newval));
68	return (retval);
69}
70#endif
71
72#elif defined(__i386)
73
74extern __inline__ void atomic_or_long(ulong_t *target, ulong_t bits)
75{
76	__asm__ __volatile__(
77		"lock; orl %1, (%0)"
78		: /* no output */
79		: "r" (target), "r" (bits));
80}
81
82extern __inline__ void atomic_and_long(ulong_t *target, ulong_t bits)
83{
84	__asm__ __volatile__(
85		"lock; andl %1, (%0)"
86		: /* no output */
87		: "r" (target), "r" (bits));
88}
89
90#else
91#error	"port me"
92#endif
93
94#endif /* !__lint && __GNUC__ */
95
96#ifdef __cplusplus
97}
98#endif
99
100#endif	/* _ASM_ATOMIC_H */
101