/*	$OpenBSD: asm.h,v 1.12 2013/01/11 21:19:45 miod Exp $	*/

/*
 * Mach Operating System
 * Copyright (c) 1993-1992 Carnegie Mellon University
 * Copyright (c) 1991 OMRON Corporation
 * All Rights Reserved.
 *
 * Permission to use, copy, modify and distribute this software and its
 * documentation is hereby granted, provided that both the copyright
 * notice and this permission notice appear in all copies of the
 * software, derivative works or modified versions, and any portions
 * thereof, and that both notices appear in supporting documentation.
 *
 * CARNEGIE MELLON AND OMRON ALLOW FREE USE OF THIS SOFTWARE IN ITS "AS IS"
 * CONDITION.  CARNEGIE MELLON AND OMRON DISCLAIM ANY LIABILITY OF ANY KIND
 * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
 *
 * Carnegie Mellon requests users of this software to return to
 *
 *  Software Distribution Coordinator  or  Software.Distribution@CS.CMU.EDU
 *  School of Computer Science
 *  Carnegie Mellon University
 *  Pittsburgh PA 15213-3890
 *
 * any improvements or extensions that they make and grant Carnegie the
 * rights to redistribute these changes.
 */

#ifndef _M88K_ASM_H_
#define _M88K_ASM_H_

#ifdef	__ELF__
#define	_C_LABEL(name)		name
#else
#ifdef __STDC__
#define	_C_LABEL(name)		_ ## name
#else
#define	_C_LABEL(name)		_/**/name
#endif
#endif

#define	_ASM_LABEL(name)	name

#ifdef __ELF__
#define	_ENTRY(name) \
	.text; .align 3; .globl name; .type name,@function; name:
#else
#define	_ENTRY(name) \
	.text; .align 8; .globl name; name:
#endif

#define	ENTRY(name)		_ENTRY(_C_LABEL(name))
#define	ASENTRY(name)		_ENTRY(_ASM_LABEL(name))

#define	END(name) \
	.size name,.-name

#define	GLOBAL(name) \
	.globl _C_LABEL(name); _C_LABEL(name):

#define ASGLOBAL(name) \
	.globl _ASM_LABEL(name); _ASM_LABEL(name):

#define	LOCAL(name) \
	_C_LABEL(name):

#define	ASLOCAL(name) \
	_ASM_LABEL(name):

#define	BSS(name, size) \
	.comm	_C_LABEL(name), size

#define	ASBSS(name, size) \
	.comm	_ASM_LABEL(name), size

#ifdef	__ELF__
#define	WEAK_ALIAS(alias,sym)						\
	.weak alias;							\
	alias = sym
#else
#ifdef	__STDC__
#define	WEAK_ALIAS(alias,sym)						\
	.weak _##alias;							\
	_##alias = _##sym
#else
#define	WEAK_ALIAS(alias,sym)						\
	.weak _/**/alias;						\
	_/**/alias = _/**/sym
#endif
#endif

#ifdef _KERNEL

#ifdef _LOCORE

/*
 * Control register symbolic names
 */

#define	PID	%cr0
#define	PSR	%cr1
#define	EPSR	%cr2
#define	SSBR	%cr3
#define	SXIP	%cr4		/* 88100 */
#define	EXIP	%cr4		/* 88110 */
#define	SNIP	%cr5		/* 88100 */
#define	ENIP	%cr5		/* 88110 */
#define	SFIP	%cr6		/* 88100 */
#define	VBR	%cr7
#define	DMT0	%cr8		/* 88100 */
#define	DMD0	%cr9		/* 88100 */
#define	DMA0	%cr10		/* 88100 */
#define	DMT1	%cr11		/* 88100 */
#define	DMD1	%cr12		/* 88100 */
#define	DMA1	%cr13		/* 88100 */
#define	DMT2	%cr14		/* 88100 */
#define	DMD2	%cr15		/* 88100 */
#define	DMA2	%cr16		/* 88100 */
#define	SRX	%cr16		/* 88110 */
#define	SR0	%cr17
#define	SR1	%cr18
#define	SR2	%cr19
#define	SR3	%cr20
#define	ICMD	%cr25		/* 88110 */
#define	ICTL	%cr26		/* 88110 */
#define	ISAR	%cr27		/* 88110 */
#define	ISAP	%cr28		/* 88110 */
#define	IUAP	%cr29		/* 88110 */
#define	IIR	%cr30		/* 88110 */
#define	IBP	%cr31		/* 88110 */
#define	IPPU	%cr32		/* 88110 */
#define	IPPL	%cr33		/* 88110 */
#define	ISR	%cr34		/* 88110 */
#define	ILAR	%cr35		/* 88110 */
#define	IPAR	%cr36		/* 88110 */
#define	DCMD	%cr40		/* 88110 */
#define	DCTL	%cr41		/* 88110 */
#define	DSAR	%cr42		/* 88110 */
#define	DSAP	%cr43		/* 88110 */
#define	DUAP	%cr44		/* 88110 */
#define	DIR	%cr45		/* 88110 */
#define	DBP	%cr46		/* 88110 */
#define	DPPU	%cr47		/* 88110 */
#define	DPPL	%cr48		/* 88110 */
#define	DSR	%cr49		/* 88110 */
#define	DLAR	%cr50		/* 88110 */
#define	DPAR	%cr51		/* 88110 */

#define	FPECR	%fcr0
#define	FPHS1	%fcr1		/* 88100 */
#define	FPLS1	%fcr2		/* 88100 */
#define	FPHS2	%fcr3		/* 88100 */
#define	FPLS2	%fcr4		/* 88100 */
#define	FPPT	%fcr5		/* 88100 */
#define	FPRH	%fcr6		/* 88100 */
#define	FPRL	%fcr7		/* 88100 */
#define	FPIT	%fcr8		/* 88100 */
#define	FPSR	%fcr62
#define	FPCR	%fcr63

#define	CPU	SR0

/*
 * At various times, there is the need to clear the pipeline (i.e.
 * synchronize).  A "tb1 0, r0, foo" will do that (because a trap
 * instruction always synchronizes, and this particular instruction
 * will never actually take the trap).
 */
#define	FLUSH_PIPELINE		tb1	0, %r0, 0

#define	NOP			or	%r0, %r0, %r0
#define RTE			NOP; rte

/*
 * PSR bits
 */
#define	PSR_SHADOW_FREEZE_BIT		0
#define	PSR_INTERRUPT_DISABLE_BIT	1
#define	PSR_FPU_DISABLE_BIT		3
#define	PSR_GRAPHICS_DISABLE_BIT	4	/* SFU2 - MC88110 */
#define	PSR_SERIALIZE_BIT		25	/* MC88110 */
#define	PSR_CARRY_BIT			28
#define	PSR_SERIAL_MODE_BIT		29	/* MC88110 */
#define	PSR_BIG_ENDIAN_MODE		30
#define	PSR_SUPERVISOR_MODE_BIT		31

/*
 * DMT0/DMT1/DMT2 bits
 */
#define	DMT_VALID_BIT		0
#define	DMT_WRITE_BIT		1
#define	DMT_LOCK_BIT		12
#define	DMT_DOUBLE_BIT		13
#define	DMT_DAS_BIT		14
#define	DMT_DREG_OFFSET		7
#define	DMT_DREG_WIDTH		5

/*
 * Status bits for an SXIP/SNIP/SFIP address.
 */
#define	RTE_VALID_BIT		1
#define	RTE_ERROR_BIT		0

#define	VECTOR(x) \
	.word	_C_LABEL(x)

#endif	/* _LOCORE */

#endif	/* _KERNEL */

#endif	/* _M88K_ASM_H_ */
