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