|
@@ -0,0 +1,148 @@
|
|
|
+/*
|
|
|
+ * This file is subject to the terms and conditions of the GNU General Public
|
|
|
+ * License. See the file "COPYING" in the main directory of this archive
|
|
|
+ * for more details.
|
|
|
+ *
|
|
|
+ * Copyright (C) 1995, 1996, 1997, 1999, 2001 by Ralf Baechle
|
|
|
+ * Copyright (C) 1999 by Silicon Graphics, Inc.
|
|
|
+ * Copyright (C) 2001 MIPS Technologies, Inc.
|
|
|
+ * Copyright (C) 2002 Maciej W. Rozycki
|
|
|
+ *
|
|
|
+ * Some useful macros for MIPS assembler code
|
|
|
+ *
|
|
|
+ * Some of the routines below contain useless nops that will be optimized
|
|
|
+ * away by gas in -O mode. These nops are however required to fill delay
|
|
|
+ * slots in noreorder mode.
|
|
|
+ */
|
|
|
+#ifndef __ASM_ASM_H
|
|
|
+#define __ASM_ASM_H
|
|
|
+
|
|
|
+#include <asm/sgidefs.h>
|
|
|
+
|
|
|
+#ifndef CAT
|
|
|
+#ifdef __STDC__
|
|
|
+#define __CAT(str1, str2) str1##str2
|
|
|
+#else
|
|
|
+#define __CAT(str1, str2) str1/**/str2
|
|
|
+#endif
|
|
|
+#define CAT(str1, str2) __CAT(str1, str2)
|
|
|
+#endif
|
|
|
+
|
|
|
+/*
|
|
|
+ * PIC specific declarations
|
|
|
+ * Not used for the kernel but here seems to be the right place.
|
|
|
+ */
|
|
|
+#ifdef __PIC__
|
|
|
+#define CPRESTORE(register) \
|
|
|
+ .cprestore register
|
|
|
+#define CPADD(register) \
|
|
|
+ .cpadd register
|
|
|
+#define CPLOAD(register) \
|
|
|
+ .cpload register
|
|
|
+#else
|
|
|
+#define CPRESTORE(register)
|
|
|
+#define CPADD(register)
|
|
|
+#define CPLOAD(register)
|
|
|
+#endif
|
|
|
+
|
|
|
+/*
|
|
|
+ * LEAF - declare leaf routine
|
|
|
+ */
|
|
|
+#define LEAF(symbol) \
|
|
|
+ .globl symbol; \
|
|
|
+ .align 2; \
|
|
|
+ .type symbol, @function; \
|
|
|
+ .ent symbol, 0; \
|
|
|
+symbol: .frame sp, 0, ra
|
|
|
+
|
|
|
+/*
|
|
|
+ * NESTED - declare nested routine entry point
|
|
|
+ */
|
|
|
+#define NESTED(symbol, framesize, rpc) \
|
|
|
+ .globl symbol; \
|
|
|
+ .align 2; \
|
|
|
+ .type symbol, @function; \
|
|
|
+ .ent symbol, 0; \
|
|
|
+symbol: .frame sp, framesize, rpc
|
|
|
+
|
|
|
+/*
|
|
|
+ * END - mark end of function
|
|
|
+ */
|
|
|
+#define END(function) \
|
|
|
+ .end function; \
|
|
|
+ .size function, .-function
|
|
|
+
|
|
|
+/*
|
|
|
+ * EXPORT - export definition of symbol
|
|
|
+ */
|
|
|
+#define EXPORT(symbol) \
|
|
|
+ .globl symbol; \
|
|
|
+symbol:
|
|
|
+
|
|
|
+/*
|
|
|
+ * FEXPORT - export definition of a function symbol
|
|
|
+ */
|
|
|
+#define FEXPORT(symbol) \
|
|
|
+ .globl symbol; \
|
|
|
+ .type symbol, @function; \
|
|
|
+symbol:
|
|
|
+
|
|
|
+/*
|
|
|
+ * ABS - export absolute symbol
|
|
|
+ */
|
|
|
+#define ABS(symbol,value) \
|
|
|
+ .globl symbol; \
|
|
|
+symbol = value
|
|
|
+
|
|
|
+#define PANIC(msg) \
|
|
|
+ .set push; \
|
|
|
+ .set reorder; \
|
|
|
+ PTR_LA a0, 8f; \
|
|
|
+ jal panic; \
|
|
|
+9: b 9b; \
|
|
|
+ .set pop; \
|
|
|
+ TEXT(msg)
|
|
|
+
|
|
|
+/*
|
|
|
+ * Print formatted string
|
|
|
+ */
|
|
|
+#ifdef CONFIG_PRINTK
|
|
|
+#define PRINT(string) \
|
|
|
+ .set push; \
|
|
|
+ .set reorder; \
|
|
|
+ PTR_LA a0, 8f; \
|
|
|
+ jal printk; \
|
|
|
+ .set pop; \
|
|
|
+ TEXT(string)
|
|
|
+#else
|
|
|
+#define PRINT(string)
|
|
|
+#endif
|
|
|
+
|
|
|
+#define TEXT(msg) \
|
|
|
+ .pushsection .data; \
|
|
|
+8: .asciiz msg; \
|
|
|
+ .popsection;
|
|
|
+
|
|
|
+/*
|
|
|
+ * Build text tables
|
|
|
+ */
|
|
|
+#define TTABLE(string) \
|
|
|
+ .pushsection .text; \
|
|
|
+ .word 1f; \
|
|
|
+ .popsection \
|
|
|
+ .pushsection .data; \
|
|
|
+1: .asciiz string; \
|
|
|
+ .popsection
|
|
|
+
|
|
|
+/*
|
|
|
+ * MIPS IV pref instruction.
|
|
|
+ * Use with .set noreorder only!
|
|
|
+ *
|
|
|
+ * MIPS IV implementations are free to treat this as a nop. The R5000
|
|
|
+ * is one of them. So we should have an option not to use this instruction.
|
|
|
+ */
|
|
|
+#ifdef CONFIG_CPU_HAS_PREFETCH
|
|
|
+
|
|
|
+#define PREF(hint,addr) \
|
|
|
+ .set push; \
|
|
|
+ .set mips4; \
|