asmacros.h revision 89032
1273257Srpaulo/*-
2273257Srpaulo * Copyright (c) 2001 Jake Burkholder.
3273257Srpaulo * All rights reserved.
4273257Srpaulo *
5273257Srpaulo * Redistribution and use in source and binary forms, with or without
6273257Srpaulo * modification, are permitted provided that the following conditions
7273257Srpaulo * are met:
8273257Srpaulo * 1. Redistributions of source code must retain the above copyright
9273257Srpaulo *    notice, this list of conditions and the following disclaimer.
10273257Srpaulo * 2. Redistributions in binary form must reproduce the above copyright
11273257Srpaulo *    notice, this list of conditions and the following disclaimer in the
12273257Srpaulo *    documentation and/or other materials provided with the distribution.
13273257Srpaulo *
14273257Srpaulo * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15273257Srpaulo * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16273257Srpaulo * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17273257Srpaulo * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18273257Srpaulo * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19273257Srpaulo * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20273257Srpaulo * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21273257Srpaulo * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22273257Srpaulo * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23273257Srpaulo * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24273257Srpaulo * SUCH DAMAGE.
25273257Srpaulo *
26273257Srpaulo * $FreeBSD: head/sys/sparc64/include/asmacros.h 89032 2002-01-08 04:34:20Z jake $
27273257Srpaulo */
28273257Srpaulo
29273257Srpaulo#ifndef	_MACHINE_ASMACROS_H_
30273257Srpaulo#define	_MACHINE_ASMACROS_H_
31273257Srpaulo
32273257Srpaulo#ifdef _KERNEL
33273257Srpaulo
34273257Srpaulo/*
35273257Srpaulo * Normal and alternate %g6 point to the pcb of the current process.  Normal,
36273257Srpaulo & alternate and interrupt %g7 point to per-cpu data.
37273257Srpaulo */
38273257Srpaulo#define	PCB_REG		%g6
39273257Srpaulo#define	PCPU_REG	%g7
40273257Srpaulo
41273257Srpaulo/*
42273257Srpaulo * Alternate %g5 points to a per-cpu panic stack, which is used as a last
43273257Srpaulo * resort, and for temporarily saving alternate globals.
44273257Srpaulo */
45273257Srpaulo#define	ASP_REG		%g5
46273257Srpaulo
47273257Srpaulo/*
48273257Srpaulo * MMU %g7 points to the user tsb.
49273257Srpaulo */
50273257Srpaulo#define	TSB_REG		%g7
51273257Srpaulo
52273257Srpaulo#ifdef LOCORE
53273257Srpaulo
54273257Srpaulo/*
55273257Srpaulo * Atomically decrement an integer in memory.
56273257Srpaulo */
57273257Srpaulo#define	ATOMIC_DEC_INT(r1, r2, r3) \
58273257Srpaulo	lduw	[r1], r2 ; \
59273257Srpaulo9:	sub	r2, 1, r3 ; \
60273257Srpaulo	casa	[r1] ASI_N, r2, r3 ; \
61273257Srpaulo	cmp	r2, r3 ; \
62273257Srpaulo	bne,pn	%xcc, 9b ; \
63273257Srpaulo	 mov	r3, r2
64273257Srpaulo
65273257Srpaulo/*
66273257Srpaulo * Atomically increment an integer in memory.
67273257Srpaulo */
68273257Srpaulo#define	ATOMIC_INC_INT(r1, r2, r3) \
69273257Srpaulo	lduw	[r1], r2 ; \
70273257Srpaulo9:	add	r2, 1, r3 ; \
71273257Srpaulo	casa	[r1] ASI_N, r2, r3 ; \
72273257Srpaulo	cmp	r2, r3 ; \
73273257Srpaulo	bne,pn	%xcc, 9b ; \
74273257Srpaulo	 mov	r3, r2
75273257Srpaulo
76273257Srpaulo#define	PCPU(member)	%g7 + PC_ ## member
77273257Srpaulo#define	PCPU_ADDR(member, reg) add %g7, PC_ ## member, reg
78273257Srpaulo
79273257Srpaulo#define	DEBUGGER()	ta %xcc, 1
80273257Srpaulo
81273257Srpaulo#define	PANIC(msg, r1) \
82273257Srpaulo	.sect	.rodata ; \
83273257Srpaulo9:	.asciz	msg ; \
84273257Srpaulo	.previous ; \
85273257Srpaulo	SET(9b, r1, %o0) ; \
86273257Srpaulo	call	panic ; \
87273257Srpaulo	 nop
88273257Srpaulo
89273257Srpaulo#ifdef INVARIANTS
90273257Srpaulo#define	KASSERT(r1, msg) \
91273257Srpaulo	brnz	r1, 8f ; \
92273257Srpaulo	 nop ; \
93273257Srpaulo	PANIC(msg, r1) ; \
94273257Srpaulo8:
95273257Srpaulo#else
96273257Srpaulo#define	KASSERT(r1, msg)
97276029Sian#endif
98273257Srpaulo
99273257Srpaulo#define	PUTS(msg, r1) \
100273281Srpaulo	.sect	.rodata ; \
101273257Srpaulo9:	.asciz	msg ; \
102273257Srpaulo	.previous ; \
103273257Srpaulo	SET(9b, r1, %o0) ; \
104273257Srpaulo	call	printf ; \
105273257Srpaulo	 nop
106273257Srpaulo
107273281Srpaulo/*
108273257Srpaulo * If the kernel can be located above 4G, setx needs to be used to load
109273257Srpaulo * symbol values, otherwise set is sufficient.
110273257Srpaulo */
111273257Srpaulo#ifdef HIGH_KERNEL
112273257Srpaulo#define	SET(sym, tmp, dst) \
113273257Srpaulo	setx	sym, tmp, dst
114273257Srpaulo#else
115273257Srpaulo#define	SET(sym, tmp, dst) \
116273257Srpaulo	set	sym, dst
117273281Srpaulo#endif
118273257Srpaulo
119273257Srpaulo#endif /* LOCORE */
120273257Srpaulo
121273257Srpaulo#endif /* _KERNEL */
122273257Srpaulo
123273257Srpaulo#define	DATA(name) \
124273257Srpaulo	.data ; \
125273281Srpaulo	.globl	name ; \
126273257Srpaulo	.type	name, @object ; \
127273257Srpauloname ## :
128273257Srpaulo
129273257Srpaulo#define	EMPTY
130273257Srpaulo
131273257Srpaulo#define	ENTRY(name) \
132273257Srpaulo	.text ; \
133273257Srpaulo	.align	16 ; \
134273257Srpaulo	.globl	name ; \
135273257Srpaulo	.type	name, @function ; \
136273281Srpauloname ## :
137273257Srpaulo
138273257Srpaulo#define	END(name) \
139273257Srpaulo	.size	name, . - name
140273257Srpaulo
141273257Srpaulo#endif /* !_MACHINE_ASMACROS_H_ */
142273257Srpaulo