asmacros.h revision 230669
1/*-
2 * Copyright (c) 2001 Jake Burkholder.
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 *    notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 *    notice, this list of conditions and the following disclaimer in the
12 *    documentation and/or other materials provided with the distribution.
13 *
14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24 * SUCH DAMAGE.
25 *
26 * $FreeBSD: stable/9/sys/sparc64/include/asmacros.h 230669 2012-01-28 23:16:47Z marius $
27 */
28
29#ifndef	_MACHINE_ASMACROS_H_
30#define	_MACHINE_ASMACROS_H_
31
32#ifdef _KERNEL
33
34/*
35 * Normal and alternate %g6 point to the pcb of the current process.  Normal,
36 * alternate and interrupt %g7 point to per-cpu data.
37 */
38#define	PCB_REG		%g6
39#define	PCPU_REG	%g7
40
41/*
42 * Alternate %g5 points to a per-cpu panic stack, which is used as a last
43 * resort, and for temporarily saving alternate globals.
44 */
45#define	ASP_REG		%g5
46
47#ifdef LOCORE
48
49/*
50 * Atomically decrement an integer in memory.
51 */
52#define	ATOMIC_DEC_INT(r1, r2, r3)					\
53	lduw	[r1], r2 ;						\
549:	sub	r2, 1, r3 ;						\
55	casa	[r1] ASI_N, r2, r3 ;					\
56	cmp	r2, r3 ;						\
57	bne,pn	%icc, 9b ;						\
58	 mov	r3, r2
59
60/*
61 * Atomically increment an integer in memory.
62 */
63#define	ATOMIC_INC_INT(r1, r2, r3)					\
64	lduw	[r1], r2 ;						\
659:	add	r2, 1, r3 ;						\
66	casa	[r1] ASI_N, r2, r3 ;					\
67	cmp	r2, r3 ;						\
68	bne,pn	%icc, 9b ;						\
69	 mov	r3, r2
70
71/*
72 * Atomically increment a long in memory.
73 */
74#define	ATOMIC_INC_LONG(r1, r2, r3)					\
75	ldx	[r1], r2 ;						\
769:	add	r2, 1, r3 ;						\
77	casxa	[r1] ASI_N, r2, r3 ;					\
78	cmp	r2, r3 ;						\
79	bne,pn	%xcc, 9b ;						\
80	 mov	r3, r2
81
82/*
83 * Atomically clear a number of bits of an integer in memory.
84 */
85#define	ATOMIC_CLEAR_INT(r1, r2, r3, bits)				\
86	lduw	[r1], r2 ;						\
879:	andn	r2, bits, r3 ;						\
88	casa	[r1] ASI_N, r2, r3 ;					\
89	cmp	r2, r3 ;						\
90	bne,pn	%icc, 9b ;						\
91	 mov	r3, r2
92
93/*
94 * Atomically clear a number of bits of a long in memory.
95 */
96#define	ATOMIC_CLEAR_LONG(r1, r2, r3, bits)				\
97	ldx	[r1], r2 ;						\
989:	andn	r2, bits, r3 ;						\
99	casxa	[r1] ASI_N, r2, r3 ;					\
100	cmp	r2, r3 ;						\
101	bne,pn	%icc, 9b ;						\
102	 mov	r3, r2
103
104#define	PCPU(member)	PCPU_REG + PC_ ## member
105#define	PCPU_ADDR(member, reg)						\
106	add	PCPU_REG, PC_ ## member, reg
107
108#define	DEBUGGER()							\
109	ta	%xcc, 1
110
111#define	PANIC(msg, r1)							\
112	.sect	.rodata ;						\
1139:	.asciz	msg ;							\
114	.previous ;							\
115	SET(9b, r1, %o0) ;						\
116	call	panic ;							\
117	 nop
118
119#ifdef INVARIANTS
120#define	KASSERT(r1, msg)						\
121	brnz,pt	r1, 8f ;						\
122	 nop ;								\
123	PANIC(msg, r1) ;						\
1248:
125#else
126#define	KASSERT(r1, msg)
127#endif
128
129#define	PUTS(msg, r1)							\
130	.sect	.rodata ;						\
1319:	.asciz	msg ;							\
132	.previous ;							\
133	SET(9b, r1, %o0) ;						\
134	call	printf ;						\
135	 nop
136
137#define	_ALIGN_DATA	.align 8
138
139#define	DATA(name)							\
140	.data ;								\
141	_ALIGN_DATA ;							\
142	.globl	name ;							\
143	.type	name, @object ;						\
144name:
145
146#define	EMPTY
147
148/*
149 * Generate atomic compare and swap, load and store instructions for the
150 * corresponding width and ASI (or not).  Note that we want to evaluate the
151 * macro args before concatenating, so that EMPTY really turns into nothing.
152 */
153#define		_LD(w, a)	ld ## w ## a
154#define		_ST(w, a)	st ## w ## a
155#define		_CAS(w, a)	cas ## w ## a
156
157#define		LD(w, a)	_LD(w, a)
158#define		ST(w, a)	_ST(w, a)
159#define		CAS(w, a)	_CAS(w, a)
160
161#endif /* LOCORE */
162
163#endif /* _KERNEL */
164
165#endif /* !_MACHINE_ASMACROS_H_ */
166