1/* asmmacro.h: Assembler macros.
2 *
3 * Copyright (C) 1996 David S. Miller (davem@caipfs.rutgers.edu)
4 */
5
6#ifndef _SPARC_ASMMACRO_H
7#define _SPARC_ASMMACRO_H
8
9#include <linux/config.h>
10#include <asm/btfixup.h>
11#include <asm/asi.h>
12
13#define GET_PROCESSOR4M_ID(reg) \
14	rd	%tbr, %reg; \
15	srl	%reg, 12, %reg; \
16	and	%reg, 3, %reg;
17
18#define GET_PROCESSOR4D_ID(reg) \
19	lda	[%g0] ASI_M_VIKING_TMP1, %reg;
20
21/* Blackbox */
22#define GET_PROCESSOR_ID(reg) \
23	sethi	%hi(___b_smp_processor_id), %reg; \
24	sethi	%hi(boot_cpu_id), %reg; \
25	ldub	[%reg + %lo(boot_cpu_id)], %reg;
26
27#define GET_PROCESSOR_MID(reg, tmp) \
28	rd	%tbr, %reg; \
29	sethi	%hi(C_LABEL(mid_xlate)), %tmp; \
30	srl	%reg, 12, %reg; \
31	or	%tmp, %lo(C_LABEL(mid_xlate)), %tmp; \
32	and	%reg, 3, %reg; \
33	ldub	[%tmp + %reg], %reg;
34
35#define GET_PROCESSOR_OFFSET(reg, tmp) \
36	GET_PROCESSOR_ID(reg) \
37	sethi	%hi(C_LABEL(cpu_offset)), %tmp; \
38	sll	%reg, 2, %reg; \
39	or	%tmp, %lo(C_LABEL(cpu_offset)), %tmp; \
40	ld	[%tmp + %reg], %reg;
41
42/* All trap entry points _must_ begin with this macro or else you
43 * lose.  It makes sure the kernel has a proper window so that
44 * c-code can be called.
45 */
46#define SAVE_ALL_HEAD \
47	sethi	%hi(trap_setup), %l4; \
48	jmpl	%l4 + %lo(trap_setup), %l6;
49#define SAVE_ALL \
50	SAVE_ALL_HEAD \
51	 nop;
52
53/* All traps low-level code here must end with this macro. */
54#define RESTORE_ALL b ret_trap_entry; clr %l6;
55
56/* sun4 probably wants half word accesses to ASI_SEGMAP, while sun4c+
57   likes byte accesses. These are to avoid ifdef mania. */
58
59#ifdef CONFIG_SUN4
60#define lduXa	lduha
61#define stXa	stha
62#else
63#define lduXa	lduba
64#define stXa	stba
65#endif
66
67#endif /* !(_SPARC_ASMMACRO_H) */
68