OpenSolaris_b135/uts/sparc/sys/simulate.h

/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License (the "License").
 * You may not use this file except in compliance with the License.
 *
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 * or http://www.opensolaris.org/os/licensing.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information: Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 */
/*
 * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
 * Use is subject to license terms.
 */

#ifndef	_SYS_SIMULATE_H
#define	_SYS_SIMULATE_H

#ifdef __cplusplus
extern "C" {
#endif

/* SPARC instruction simulator return codes.  */

#define	SIMU_SUCCESS	1	/* simulation worked */
#define	SIMU_ILLEGAL	2	/* tried to simulate an illegal instuction */
#define	SIMU_FAULT	3	/* simulation generated an illegal access */
#define	SIMU_DZERO	4	/* simulation generated divide by zero */
#define	SIMU_UNALIGN	5	/* simulation generated an unaligned access */
#define	SIMU_RETRY	6	/* fixed up instruction, now retry it */


/*
 * Opcode types.
 */
#define	OP_V8_BRANCH	0
#define	OP_V8_CALL	1
#define	OP_V8_ARITH	2	/* includes control xfer (e.g. JMPL) */
#define	OP_V8_LDSTR	3

/*
 * Relevant instruction opcodes.
 */

/* OP_V8_LDSTR  */
#define	IOP_V8_LD	0x00
#define	IOP_V8_LDA	0x10
#define	IOP_V8_LDUBA	0x11
#define	IOP_V8_LDUHA	0x12
#define	IOP_V8_LDDA	0x13
#define	IOP_V8_STA	0x14
#define	IOP_V8_STBA	0x15
#define	IOP_V8_STHA	0x16
#define	IOP_V8_STDA	0x17
#define	IOP_V8_LDSBA	0x19
#define	IOP_V8_LDSHA	0x1a
#define	IOP_V8_LDSTUBA	0x1d
#define	IOP_V8_SWAPA	0x1f
#define	IOP_V8_LDFSR	0x21
#define	IOP_V8_LDQF	0x22
#define	IOP_V8_STFSR	0x25
#define	IOP_V8_STQF	0x26
#define	IOP_V8_LDQFA	0x32
#define	IOP_V8_LDDFA	0x33
#define	IOP_V8_STQFA	0x36
#define	IOP_V8_STDFA	0x37

/* OP_V8_ARITH */
#define	IOP_V8_ADD	0x00
#define	IOP_V8_AND	0x01
#define	IOP_V8_OR	0x02
#define	IOP_V8_XOR	0x03
#define	IOP_V8_SUB	0x04
#define	IOP_V8_ANDN	0x05
#define	IOP_V8_ORN	0x06
#define	IOP_V8_XNOR	0x07
#define	IOP_V8_ADDC	0x08
#define	IOP_V8_UMUL	0x0a
#define	IOP_V8_SMUL	0x0b
#define	IOP_V8_SUBC	0x0c
#define	IOP_V8_UDIV	0x0e
#define	IOP_V8_SDIV	0x0f
#define	IOP_V8_ADDcc	0x10
#define	IOP_V8_ANDcc	0x11
#define	IOP_V8_ORcc	0x12
#define	IOP_V8_XORcc	0x13
#define	IOP_V8_SUBcc	0x14
#define	IOP_V8_ANDNcc	0x15
#define	IOP_V8_ORNcc	0x16
#define	IOP_V8_XNORcc	0x17
#define	IOP_V8_ADDCcc	0x18
#define	IOP_V8_UMULcc	0x1a
#define	IOP_V8_SMULcc	0x1b
#define	IOP_V8_SUBCcc	0x1c
#define	IOP_V8_UDIVcc	0x1e
#define	IOP_V8_SDIVcc	0x1f
#define	IOP_V8_TADDcc	0x20
#define	IOP_V8_TSUBcc	0x21
#define	IOP_V8_TADDccTV	0x22
#define	IOP_V8_TSUBccTV	0x23
#define	IOP_V8_MULScc	0x24
#define	IOP_V8_SLL	0x25
#define	IOP_V8_SRL	0x26
#define	IOP_V8_SRA	0x27
#define	IOP_V8_RDASR	0x28
#define	IOP_V8_POPC	0x2e
#define	IOP_V8_WRASR	0x30
#define	IOP_V8_FCMP	0x35
#define	IOP_V8_JMPL	0x38
#define	IOP_V8_RETT	0x39
#define	IOP_V8_TCC	0x3a
#define	IOP_V8_FLUSH	0x3b
#define	IOP_V8_SAVE	0x3c
#define	IOP_V8_RESTORE	0x3d

/*
 * Check for a load/store to alternate space. All other ld/st
 * instructions should have bits 12-5 clear, if the i-bit is 0.
 */
#define	IS_LDST_ALT(x) \
	(((x) == IOP_V8_LDA || (x) == IOP_V8_LDDA || \
	    (x) == IOP_V8_LDSBA || (x) == IOP_V8_LDSHA || \
	    (x) == IOP_V8_LDSTUBA || (x) == IOP_V8_LDUBA || \
	    (x) == IOP_V8_LDUHA || (x) == IOP_V8_STA || \
	    (x) == IOP_V8_STBA || (x) == IOP_V8_STDA || \
	    (x) == IOP_V8_STHA || (x) == IOP_V8_SWAPA) ? 1 : 0)


#ifndef _ASM

#include <vm/seg_enum.h>

extern int32_t fetch_user_instr(caddr_t);
extern int simulate_unimp(struct regs *, caddr_t *);
extern int simulate_lddstd(struct regs *, caddr_t *);
extern int simulate_rdtick(struct regs *);
extern int do_unaligned(struct regs *, caddr_t *);
extern int calc_memaddr(struct regs *, caddr_t *);
extern int is_atomic(struct regs *);
extern int instr_size(struct regs *, caddr_t *, enum seg_rw);
extern int getreg(struct regs *, uint_t, uint64_t *, caddr_t *);
extern int putreg(uint64_t *, struct regs *, uint_t, caddr_t *);
extern int extended_asi_size(int asi);

#endif /* _ASM */

#ifdef __cplusplus
}
#endif

#endif /* _SYS_SIMULATE_H */