153899Smckusick /*
2*63306Sbostic  * Copyright (c) 1992, 1993
3*63306Sbostic  *	The Regents of the University of California.  All rights reserved.
453899Smckusick  *
553899Smckusick  * This code is derived from software contributed to Berkeley by
653899Smckusick  * Ralph Campbell, and Kazumasa Utashiro of Software Research
753899Smckusick  * Associates, Inc.
853899Smckusick  *
953899Smckusick  * %sccs.include.redist.c%
1053899Smckusick  *
11*63306Sbostic  *	@(#)machConst.h	8.1 (Berkeley) 06/11/93
1253899Smckusick  *
1353899Smckusick  * machConst.h --
1453899Smckusick  *
1553899Smckusick  *	Machine dependent constants.
1653899Smckusick  *
1753899Smckusick  *	Copyright (C) 1989 Digital Equipment Corporation.
1853899Smckusick  *	Permission to use, copy, modify, and distribute this software and
1953899Smckusick  *	its documentation for any purpose and without fee is hereby granted,
2053899Smckusick  *	provided that the above copyright notice appears in all copies.
2153899Smckusick  *	Digital Equipment Corporation makes no representations about the
2253899Smckusick  *	suitability of this software for any purpose.  It is provided "as is"
2353899Smckusick  *	without express or implied warranty.
2453899Smckusick  *
2553899Smckusick  * from: $Header: /sprite/src/kernel/mach/ds3100.md/RCS/machConst.h,
2653899Smckusick  *	v 9.2 89/10/21 15:55:22 jhh Exp $ SPRITE (DECWRL)
2753899Smckusick  * from: $Header: /sprite/src/kernel/mach/ds3100.md/RCS/machAddrs.h,
2853899Smckusick  *	v 1.2 89/08/15 18:28:21 rab Exp $ SPRITE (DECWRL)
2953899Smckusick  * from: $Header: /sprite/src/kernel/vm/ds3100.md/RCS/vmPmaxConst.h,
3053899Smckusick  *	v 9.1 89/09/18 17:33:00 shirriff Exp $ SPRITE (DECWRL)
3153899Smckusick  */
3253899Smckusick 
3353899Smckusick #ifndef _MACHCONST
3453899Smckusick #define _MACHCONST
3553899Smckusick 
3653899Smckusick #define MACH_KUSEG_ADDR			0x0
3753899Smckusick #define MACH_CACHED_MEMORY_ADDR		0x80000000
3853899Smckusick #define MACH_UNCACHED_MEMORY_ADDR	0xa0000000
3953899Smckusick #define MACH_KSEG2_ADDR			0xc0000000
4053899Smckusick 
4153899Smckusick #define	MACH_CACHED_TO_PHYS(x)		MACH_UNMAPPED_TO_PHYS(x)
4253899Smckusick #define	MACH_UNCACHED_TO_PHYS(x)	MACH_UNMAPPED_TO_PHYS(x)
4353899Smckusick #define	MACH_UNMAPPED_TO_PHYS(x)	((unsigned)(x) & 0x1fffffff)
4453899Smckusick 
4553899Smckusick #define	MACH_PHYS_TO_CACHED(x)	((unsigned)(x) | MACH_CACHED_MEMORY_ADDR)
4653899Smckusick #define	MACH_PHYS_TO_UNCACHED(x) ((unsigned)(x) | MACH_UNCACHED_MEMORY_ADDR)
4753899Smckusick 
4853899Smckusick #define	MACH_CACHED_TO_UNCACHED(x) ((unsigned)(x) | MACH_UNCACHED_MEMORY_ADDR)
4958615Sutashiro #define	MACH_UNCACHED_TO_CACHED(x) ((unsigned)(x) & 0x9fffffff)
5053899Smckusick 
5153899Smckusick #define BETWEEN(x,a,b)	((unsigned)(x) >= (a) && (unsigned)(x) < (b))
5253899Smckusick 
5353899Smckusick #define	MACH_IS_UNMAPPED(x) \
5453899Smckusick 	BETWEEN(x, MACH_CACHED_MEMORY_ADDR, MACH_KSEG2_ADDR)
5553899Smckusick #define	MACH_IS_CACHED(x) \
5653899Smckusick 	BETWEEN(x, MACH_CACHED_MEMORY_ADDR, MACH_UNCACHED_MEMORY_ADDR)
5753899Smckusick #define	MACH_IS_UNCACHED(x) \
5853899Smckusick 	BETWEEN(x, MACH_UNCACHED_MEMORY_ADDR, MACH_KSEG2_ADDR)
5953899Smckusick #define	MACH_IS_MAPPED(x) \
6053899Smckusick 	BETWEEN(x, MACH_CACHED_MEMORY_ADDR, MACH_KSEG2_ADDR)
6153899Smckusick #define	MACH_IS_USPACE(x) \
6253899Smckusick 	((unsigned)(x) < MACH_CACHED_MEMORY_ADDR)
6353899Smckusick 
6453899Smckusick #define MACH_CODE_START			0x80001000
6553899Smckusick #define MACH_RESERVED_ADDR		0xb3000000	/* KU:XXX need this? */
6653899Smckusick #define	MACH_KERNWORK_ADDR		0x800001c0
6758615Sutashiro #define	MACH_MAXMEMSIZE_ADDR		(MACH_KERNWORK_ADDR + 0 * 4)
6858615Sutashiro #define	MACH_BOOTSW_ADDR		(MACH_KERNWORK_ADDR + 1 * 4)
6958615Sutashiro #define	MACH_BOOTDEV_ADDR		(MACH_KERNWORK_ADDR + 2 * 4)
7058615Sutashiro #define	MACH_HOWTO_ADDR			(MACH_KERNWORK_ADDR + 3 * 4)
7158615Sutashiro #define	MACH_BP_ADDR			(MACH_KERNWORK_ADDR + 4 * 4)
7258615Sutashiro #define	MACH_MONARG_ADDR		(MACH_KERNWORK_ADDR + 5 * 4)
7353899Smckusick 
7453899Smckusick /*
7553899Smckusick  * The bits in the cause register.
7653899Smckusick  *
7753899Smckusick  *	MACH_CR_BR_DELAY	Exception happened in branch delay slot.
7853899Smckusick  *	MACH_CR_COP_ERR		Coprocessor error.
7953899Smckusick  *				Interrupt pending bits defined below.
8053899Smckusick  *	MACH_CR_EXC_CODE	The exception type (see exception codes below).
8153899Smckusick  */
8253899Smckusick #define MACH_CR_BR_DELAY	0x80000000
8353899Smckusick #define MACH_CR_COP_ERR		0x30000000
8453899Smckusick #define MACH_CR_EXC_CODE	0x0000003C
8553899Smckusick #define MACH_CR_EXC_CODE_SHIFT	2
8653899Smckusick 
8753899Smckusick /*
8853899Smckusick  * The bits in the status register.  All bits are active when set to 1.
8953899Smckusick  *
9053899Smckusick  *	MACH_SR_CO_USABILITY	Control the usability of the four coprocessors.
9153899Smckusick  *	MACH_SR_BOOT_EXC_VEC	Use alternate exception vectors.
9253899Smckusick  *	MACH_SR_TLB_SHUTDOWN	TLB disabled.
9353899Smckusick  *	MACH_SR_PARITY_ERR	Parity error.
9453899Smckusick  *	MACH_SR_CACHE_MISS	Most recent D-cache load resulted in a miss.
9553899Smckusick  *	MACH_SR_PARITY_ZERO	Zero replaces outgoing parity bits.
9653899Smckusick  *	MACH_SR_SWAP_CACHES	Swap I-cache and D-cache.
9753899Smckusick  *	MACH_SR_ISOL_CACHES	Isolate D-cache from main memory.
9853899Smckusick  *				Interrupt enable bits defined below.
9953899Smckusick  *	MACH_SR_KU_OLD		Old kernel/user mode bit. 1 => user mode.
10053899Smckusick  *	MACH_SR_INT_ENA_OLD	Old interrupt enable bit.
10153899Smckusick  *	MACH_SR_KU_PREV		Previous kernel/user mode bit. 1 => user mode.
10253899Smckusick  *	MACH_SR_INT_ENA_PREV	Previous interrupt enable bit.
10353899Smckusick  *	MACH_SR_KU_CUR		Current kernel/user mode bit. 1 => user mode.
10453899Smckusick  *	MACH_SR_INT_ENA_CUR	Current interrupt enable bit.
10553899Smckusick  */
10653899Smckusick #define MACH_SR_COP_USABILITY	0xf0000000
10753899Smckusick #define MACH_SR_COP_0_BIT	0x10000000
10853899Smckusick #define MACH_SR_COP_1_BIT	0x20000000
10953899Smckusick #define MACH_SR_BOOT_EXC_VEC	0x00400000
11053899Smckusick #define MACH_SR_TLB_SHUTDOWN	0x00200000
11153899Smckusick #define MACH_SR_PARITY_ERR	0x00100000
11253899Smckusick #define MACH_SR_CACHE_MISS	0x00080000
11353899Smckusick #define MACH_SR_PARITY_ZERO	0x00040000
11453899Smckusick #define MACH_SR_SWAP_CACHES	0x00020000
11553899Smckusick #define MACH_SR_ISOL_CACHES	0x00010000
11653899Smckusick #define MACH_SR_KU_OLD		0x00000020
11753899Smckusick #define MACH_SR_INT_ENA_OLD	0x00000010
11853899Smckusick #define MACH_SR_KU_PREV		0x00000008
11953899Smckusick #define MACH_SR_INT_ENA_PREV	0x00000004
12053899Smckusick #define MACH_SR_KU_CUR		0x00000002
12153899Smckusick #define MACH_SR_INT_ENA_CUR	0x00000001
12253899Smckusick #define MACH_SR_MBZ		0x0f8000c0
12353899Smckusick 
12453899Smckusick /*
12553899Smckusick  * The interrupt masks.
12653899Smckusick  * If a bit in the mask is 1 then the interrupt is enabled (or pending).
12753899Smckusick  */
12853899Smckusick #define MACH_INT_MASK		0xff00
12953899Smckusick #define MACH_INT_MASK_5		0x8000
13053899Smckusick #define MACH_INT_MASK_4		0x4000
13153899Smckusick #define MACH_INT_MASK_3		0x2000
13253899Smckusick #define MACH_INT_MASK_2		0x1000
13353899Smckusick #define MACH_INT_MASK_1		0x0800
13453899Smckusick #define MACH_INT_MASK_0		0x0400
13553899Smckusick #define MACH_HARD_INT_MASK	0xfc00
13653899Smckusick #define MACH_SOFT_INT_MASK	0x0300
13753899Smckusick #define MACH_SOFT_INT_MASK_1	0x0200
13853899Smckusick #define MACH_SOFT_INT_MASK_0	0x0100
13953899Smckusick 
14053899Smckusick #define	MACH_SPL_MASK_8		0x0000
14153899Smckusick #define	MACH_SPL_MASK_7		MACH_SPL_MASK_8 | MACH_INT_MASK_5
14253899Smckusick #define	MACH_SPL_MASK_6		MACH_SPL_MASK_7 | MACH_INT_MASK_4
14353899Smckusick #define	MACH_SPL_MASK_5		MACH_SPL_MASK_6 | MACH_INT_MASK_3
14453899Smckusick #define	MACH_SPL_MASK_4		MACH_SPL_MASK_5 | MACH_INT_MASK_2
14553899Smckusick #define	MACH_SPL_MASK_3		MACH_SPL_MASK_4 | MACH_INT_MASK_1
14653899Smckusick #define	MACH_SPL_MASK_2		MACH_SPL_MASK_3 | MACH_INT_MASK_0
14753899Smckusick #define	MACH_SPL_MASK_1		MACH_SPL_MASK_2 | MACH_SOFT_INT_MASK_1
14853899Smckusick #define	MACH_SPL_MASK_0		MACH_SPL_MASK_1 | MACH_SOFT_INT_MASK_0
14953899Smckusick 
15053899Smckusick /*
15153899Smckusick  * The system control status register.
15253899Smckusick  */
15353899Smckusick 
15453899Smckusick /*
15553899Smckusick  * The bits in the context register.
15653899Smckusick  */
15753899Smckusick #define MACH_CNTXT_PTE_BASE	0xFFE00000
15853899Smckusick #define MACH_CNTXT_BAD_VPN	0x001FFFFC
15953899Smckusick 
16053899Smckusick /*
16153899Smckusick  * Location of exception vectors.
16253899Smckusick  */
16353899Smckusick #define MACH_RESET_EXC_VEC	0xBFC00000
16453899Smckusick #define MACH_UTLB_MISS_EXC_VEC	0x80000000
16553899Smckusick #define MACH_GEN_EXC_VEC	0x80000080
16653899Smckusick 
16753899Smckusick /*
16853899Smckusick  * Coprocessor 0 registers:
16953899Smckusick  *
17053899Smckusick  *	MACH_COP_0_TLB_INDEX	TLB index.
17153899Smckusick  *	MACH_COP_0_TLB_RANDOM	TLB random.
17253899Smckusick  *	MACH_COP_0_TLB_LOW	TLB entry low.
17353899Smckusick  *	MACH_COP_0_TLB_CONTEXT	TLB context.
17453899Smckusick  *	MACH_COP_0_BAD_VADDR	Bad virtual address.
17553899Smckusick  *	MACH_COP_0_TLB_HI	TLB entry high.
17653899Smckusick  *	MACH_COP_0_STATUS_REG	Status register.
17753899Smckusick  *	MACH_COP_0_CAUSE_REG	Exception cause register.
17853899Smckusick  *	MACH_COP_0_EXC_PC	Exception PC.
17953899Smckusick  *	MACH_COP_0_PRID		Processor revision identifier.
18053899Smckusick  */
18153899Smckusick #define MACH_COP_0_TLB_INDEX	$0
18253899Smckusick #define MACH_COP_0_TLB_RANDOM	$1
18353899Smckusick #define MACH_COP_0_TLB_LOW	$2
18453899Smckusick #define MACH_COP_0_TLB_CONTEXT	$4
18553899Smckusick #define MACH_COP_0_BAD_VADDR	$8
18653899Smckusick #define MACH_COP_0_TLB_HI	$10
18753899Smckusick #define MACH_COP_0_STATUS_REG	$12
18853899Smckusick #define MACH_COP_0_CAUSE_REG	$13
18953899Smckusick #define MACH_COP_0_EXC_PC	$14
19053899Smckusick #define MACH_COP_0_PRID		$15
19153899Smckusick 
19253899Smckusick /*
19353899Smckusick  * Values for the code field in a break instruction.
19453899Smckusick  */
19553899Smckusick #define MACH_BREAK_INSTR	0x0000000d
19653899Smckusick #define MACH_BREAK_VAL_MASK	0x03ff0000
19753899Smckusick #define MACH_BREAK_VAL_SHIFT	16
19853899Smckusick #define MACH_BREAK_KDB_VAL	512
19953899Smckusick #define MACH_BREAK_SSTEP_VAL	513
20053899Smckusick #define MACH_BREAK_BRKPT_VAL	514
20153899Smckusick #define MACH_BREAK_KDB		(MACH_BREAK_INSTR | \
20253899Smckusick 				(MACH_BREAK_KDB_VAL << MACH_BREAK_VAL_SHIFT))
20353899Smckusick #define MACH_BREAK_SSTEP	(MACH_BREAK_INSTR | \
20453899Smckusick 				(MACH_BREAK_SSTEP_VAL << MACH_BREAK_VAL_SHIFT))
20553899Smckusick #define MACH_BREAK_BRKPT	(MACH_BREAK_INSTR | \
20653899Smckusick 				(MACH_BREAK_BRKPT_VAL << MACH_BREAK_VAL_SHIFT))
20753899Smckusick 
20853899Smckusick /*
20953899Smckusick  * Mininum and maximum cache sizes.
21053899Smckusick  */
21153899Smckusick #define MACH_MIN_CACHE_SIZE	(16 * 1024)
21253899Smckusick #define MACH_MAX_CACHE_SIZE	(256 * 1024)
21353899Smckusick 
21453899Smckusick /*
21553899Smckusick  * The floating point version and status registers.
21653899Smckusick  */
21753899Smckusick #define	MACH_FPC_ID	$0
21853899Smckusick #define	MACH_FPC_CSR	$31
21953899Smckusick 
22053899Smckusick /*
22153899Smckusick  * The floating point coprocessor status register bits.
22253899Smckusick  */
22353899Smckusick #define MACH_FPC_ROUNDING_BITS		0x00000003
22453899Smckusick #define MACH_FPC_ROUND_RN		0x00000000
22553899Smckusick #define MACH_FPC_ROUND_RZ		0x00000001
22653899Smckusick #define MACH_FPC_ROUND_RP		0x00000002
22753899Smckusick #define MACH_FPC_ROUND_RM		0x00000003
22853899Smckusick #define MACH_FPC_STICKY_BITS		0x0000007c
22953899Smckusick #define MACH_FPC_STICKY_INEXACT		0x00000004
23053899Smckusick #define MACH_FPC_STICKY_UNDERFLOW	0x00000008
23153899Smckusick #define MACH_FPC_STICKY_OVERFLOW	0x00000010
23253899Smckusick #define MACH_FPC_STICKY_DIV0		0x00000020
23353899Smckusick #define MACH_FPC_STICKY_INVALID		0x00000040
23453899Smckusick #define MACH_FPC_ENABLE_BITS		0x00000f80
23553899Smckusick #define MACH_FPC_ENABLE_INEXACT		0x00000080
23653899Smckusick #define MACH_FPC_ENABLE_UNDERFLOW	0x00000100
23753899Smckusick #define MACH_FPC_ENABLE_OVERFLOW	0x00000200
23853899Smckusick #define MACH_FPC_ENABLE_DIV0		0x00000400
23953899Smckusick #define MACH_FPC_ENABLE_INVALID		0x00000800
24053899Smckusick #define MACH_FPC_EXCEPTION_BITS		0x0003f000
24153899Smckusick #define MACH_FPC_EXCEPTION_INEXACT	0x00001000
24253899Smckusick #define MACH_FPC_EXCEPTION_UNDERFLOW	0x00002000
24353899Smckusick #define MACH_FPC_EXCEPTION_OVERFLOW	0x00004000
24453899Smckusick #define MACH_FPC_EXCEPTION_DIV0		0x00008000
24553899Smckusick #define MACH_FPC_EXCEPTION_INVALID	0x00010000
24653899Smckusick #define MACH_FPC_EXCEPTION_UNIMPL	0x00020000
24753899Smckusick #define MACH_FPC_COND_BIT		0x00800000
24853899Smckusick #define MACH_FPC_MBZ_BITS		0xff7c0000
24953899Smckusick 
25053899Smckusick /*
25153899Smckusick  * Constants to determine if have a floating point instruction.
25253899Smckusick  */
25353899Smckusick #define MACH_OPCODE_SHIFT	26
25453899Smckusick #define MACH_OPCODE_C1		0x11
25553899Smckusick 
25653899Smckusick /*
25753899Smckusick  * The low part of the TLB entry.
25853899Smckusick  */
25953899Smckusick #define VMMACH_TLB_PF_NUM		0xfffff000
26053899Smckusick #define VMMACH_TLB_NON_CACHEABLE_BIT	0x00000800
26153899Smckusick #define VMMACH_TLB_MOD_BIT		0x00000400
26253899Smckusick #define VMMACH_TLB_VALID_BIT		0x00000200
26353899Smckusick #define VMMACH_TLB_GLOBAL_BIT		0x00000100
26453899Smckusick 
26553899Smckusick #define VMMACH_TLB_PHYS_PAGE_SHIFT	12
26653899Smckusick 
26753899Smckusick /*
26853899Smckusick  * The high part of the TLB entry.
26953899Smckusick  */
27053899Smckusick #define VMMACH_TLB_VIRT_PAGE_NUM	0xfffff000
27153899Smckusick #define VMMACH_TLB_PID			0x00000fc0
27253899Smckusick #define VMMACH_TLB_PID_SHIFT		6
27353899Smckusick #define VMMACH_TLB_VIRT_PAGE_SHIFT	12
27453899Smckusick 
27553899Smckusick /*
27653899Smckusick  * The shift to put the index in the right spot.
27753899Smckusick  */
27853899Smckusick #define VMMACH_TLB_INDEX_SHIFT		8
27953899Smckusick 
28053899Smckusick /*
28153899Smckusick  * The number of TLB entries and the first one that write random hits.
28253899Smckusick  */
28353899Smckusick #define VMMACH_NUM_TLB_ENTRIES		64
28453899Smckusick #define VMMACH_FIRST_RAND_ENTRY 	8
28553899Smckusick 
28653899Smckusick /*
28753899Smckusick  * The number of process id entries.
28853899Smckusick  */
28953899Smckusick #define	VMMACH_NUM_PIDS			64
29053899Smckusick 
29153899Smckusick /*
29253899Smckusick  * TLB probe return codes.
29353899Smckusick  */
29453899Smckusick #define VMMACH_TLB_NOT_FOUND		0
29553899Smckusick #define VMMACH_TLB_FOUND		1
29653899Smckusick #define VMMACH_TLB_FOUND_WITH_PATCH	2
29753899Smckusick #define VMMACH_TLB_PROBE_ERROR		3
29853899Smckusick 
29953899Smckusick /*
30053899Smckusick  * Kernel virtual address for user page table entries
30153899Smckusick  * (i.e., the address for the context register).
30253899Smckusick  */
30353899Smckusick #define VMMACH_PTE_BASE		0xFFC00000
30453899Smckusick 
30553899Smckusick #endif /* _MACHCONST */
306