Home | History | Annotate | Line # | Download | only in include
cpu.h revision 1.8
      1  1.1      mw /*
      2  1.1      mw  * Copyright (c) 1988 University of Utah.
      3  1.1      mw  * Copyright (c) 1982, 1990 The Regents of the University of California.
      4  1.1      mw  * All rights reserved.
      5  1.1      mw  *
      6  1.1      mw  * This code is derived from software contributed to Berkeley by
      7  1.1      mw  * the Systems Programming Group of the University of Utah Computer
      8  1.1      mw  * Science Department.
      9  1.1      mw  *
     10  1.1      mw  * Redistribution and use in source and binary forms, with or without
     11  1.1      mw  * modification, are permitted provided that the following conditions
     12  1.1      mw  * are met:
     13  1.1      mw  * 1. Redistributions of source code must retain the above copyright
     14  1.1      mw  *    notice, this list of conditions and the following disclaimer.
     15  1.1      mw  * 2. Redistributions in binary form must reproduce the above copyright
     16  1.1      mw  *    notice, this list of conditions and the following disclaimer in the
     17  1.1      mw  *    documentation and/or other materials provided with the distribution.
     18  1.1      mw  * 3. All advertising materials mentioning features or use of this software
     19  1.1      mw  *    must display the following acknowledgement:
     20  1.1      mw  *	This product includes software developed by the University of
     21  1.1      mw  *	California, Berkeley and its contributors.
     22  1.1      mw  * 4. Neither the name of the University nor the names of its contributors
     23  1.1      mw  *    may be used to endorse or promote products derived from this software
     24  1.1      mw  *    without specific prior written permission.
     25  1.1      mw  *
     26  1.1      mw  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
     27  1.1      mw  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     28  1.1      mw  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     29  1.1      mw  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
     30  1.1      mw  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     31  1.1      mw  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     32  1.1      mw  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     33  1.1      mw  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     34  1.1      mw  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     35  1.1      mw  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     36  1.1      mw  * SUCH DAMAGE.
     37  1.1      mw  *
     38  1.4      mw  * from: Utah $Hdr: cpu.h 1.16 91/03/25$
     39  1.4      mw  *
     40  1.4      mw  *	@(#)cpu.h	7.7 (Berkeley) 6/27/91
     41  1.8  chopps  *	$Id: cpu.h,v 1.8 1994/04/10 02:06:34 chopps Exp $
     42  1.1      mw  */
     43  1.8  chopps #ifndef _MACHINE_CPU_H
     44  1.8  chopps #define _MACHINE_CPU_H
     45  1.1      mw 
     46  1.1      mw /*
     47  1.1      mw  * Exported definitions unique to amiga/68k cpu support.
     48  1.1      mw  */
     49  1.1      mw 
     50  1.1      mw /*
     51  1.1      mw  * definitions of cpu-dependent requirements
     52  1.1      mw  * referenced in generic code
     53  1.1      mw  */
     54  1.1      mw #define	COPY_SIGCODE		/* copy sigcode above user stack in exec */
     55  1.1      mw 
     56  1.1      mw /*
     57  1.1      mw  * function vs. inline configuration;
     58  1.1      mw  * these are defined to get generic functions
     59  1.1      mw  * rather than inline or machine-dependent implementations
     60  1.1      mw  */
     61  1.1      mw #define	NEED_MINMAX		/* need {,i,l,ul}{min,max} functions */
     62  1.1      mw #undef	NEED_FFS		/* don't need ffs function */
     63  1.1      mw #undef	NEED_BCMP		/* don't need bcmp function */
     64  1.1      mw #undef	NEED_STRLEN		/* don't need strlen function */
     65  1.1      mw 
     66  1.1      mw #define	cpu_exec(p)	/* nothing */
     67  1.1      mw #define	cpu_wait(p)	/* nothing */
     68  1.1      mw 
     69  1.1      mw /*
     70  1.1      mw  * Arguments to hardclock, softclock and gatherstats
     71  1.1      mw  * encapsulate the previous machine state in an opaque
     72  1.1      mw  * clockframe; for hp300, use just what the hardware
     73  1.1      mw  * leaves on the stack.
     74  1.6  chopps  *
     75  1.6  chopps  * which is now in this format.  note if m68k/frame.h
     76  1.6  chopps  * changes this may need too also.
     77  1.1      mw  */
     78  1.1      mw typedef struct intrframe {
     79  1.6  chopps 	int	ps;
     80  1.1      mw 	int	pc;
     81  1.1      mw } clockframe;
     82  1.1      mw 
     83  1.1      mw #define	CLKF_USERMODE(framep)	(((framep)->ps & PSL_S) == 0)
     84  1.1      mw #define	CLKF_BASEPRI(framep)	(((framep)->ps & PSL_IPL7) == 0)
     85  1.1      mw #define	CLKF_PC(framep)		((framep)->pc)
     86  1.1      mw 
     87  1.1      mw 
     88  1.1      mw /*
     89  1.1      mw  * Preempt the current process if in interrupt from user mode,
     90  1.1      mw  * or after the current trap/syscall if in system mode.
     91  1.1      mw  */
     92  1.1      mw #define	need_resched()	{ want_resched++; aston(); }
     93  1.1      mw 
     94  1.1      mw /*
     95  1.1      mw  * Give a profiling tick to the current process from the softclock
     96  1.1      mw  * interrupt.  On hp300, request an ast to send us through trap(),
     97  1.1      mw  * marking the proc as needing a profiling tick.
     98  1.1      mw  */
     99  1.1      mw #define	profile_tick(p, framep)	{ (p)->p_flag |= SOWEUPC; aston(); }
    100  1.1      mw 
    101  1.1      mw /*
    102  1.1      mw  * Notify the current process (p) that it has a signal pending,
    103  1.1      mw  * process as soon as possible.
    104  1.1      mw  */
    105  1.1      mw #define	signotify(p)	aston()
    106  1.1      mw 
    107  1.1      mw #define aston() (astpending++)
    108  1.1      mw 
    109  1.1      mw int	astpending;		/* need to trap before returning to user mode */
    110  1.1      mw int	want_resched;		/* resched() was called */
    111  1.1      mw 
    112  1.1      mw 
    113  1.1      mw /*
    114  1.1      mw  * simulated software interrupt register
    115  1.1      mw  */
    116  1.1      mw extern unsigned char ssir;
    117  1.1      mw 
    118  1.1      mw #define SIR_NET		0x1
    119  1.1      mw #define SIR_CLOCK	0x2
    120  1.1      mw 
    121  1.1      mw #define siroff(x)	ssir &= ~(x)
    122  1.1      mw #define setsoftnet()	ssir |= SIR_NET
    123  1.1      mw #define setsoftclock()	ssir |= SIR_CLOCK
    124  1.1      mw 
    125  1.1      mw 
    126  1.1      mw /*
    127  1.1      mw  * The rest of this should probably be moved to ../amiga/amigacpu.h,
    128  1.1      mw  * although some of it could probably be put into generic 68k headers.
    129  1.1      mw  */
    130  1.1      mw 
    131  1.1      mw /* values for machineid (happen to be AFF_* settings of AttnFlags)
    132  1.5      mw  * NOTE: '40 support does exist! */
    133  1.1      mw #define AMIGA_68020	(1L<<1)
    134  1.1      mw #define AMIGA_68030	(1L<<2)
    135  1.1      mw #define AMIGA_68040	(1L<<3)
    136  1.1      mw #define AMIGA_68881	(1L<<4)
    137  1.1      mw #define AMIGA_68882	(1L<<5)
    138  1.1      mw #define	AMIGA_FPU40	(1L<<6)
    139  1.1      mw 
    140  1.1      mw 
    141  1.1      mw /* values for mmutype (assigned for quick testing) */
    142  1.1      mw #define	MMU_68030	-1	/* 68030 on-chip subset of 68851 */
    143  1.1      mw #define	MMU_68851	1	/* Motorola 68851 */
    144  1.5      mw #define MMU_68040	0	/* 68040 on-chip subsubset */
    145  1.1      mw 
    146  1.1      mw /* values for cpuspeed (not really related to clock speed due to caches) */
    147  1.1      mw #define	MHZ_8		1
    148  1.1      mw #define	MHZ_16		2
    149  1.1      mw #define	MHZ_25		3
    150  1.1      mw #define	MHZ_33		4
    151  1.1      mw #define	MHZ_50		6
    152  1.1      mw 
    153  1.1      mw #ifdef KERNEL
    154  1.5      mw extern	int machineid, mmutype, cpu040;
    155  1.1      mw 
    156  1.1      mw /* what is this supposed to do? i.e. how is it different than startrtclock?
    157  1.1      mw    #define	enablertclock()
    158  1.1      mw 
    159  1.1      mw    Answer (MW): startrtclock is supposed to start the clock chip (to get an
    160  1.1      mw    accurate uptime, enablertclock is called later (after *vital* stuff
    161  1.1      mw    has been setup) to enable clock interrupts. Enabling clock interrupts
    162  1.1      mw    at startrtclock-time can get you into big troubles...  */
    163  1.1      mw 
    164  1.1      mw #endif
    165  1.1      mw 
    166  1.1      mw /* physical memory sections */
    167  1.1      mw #define CHIPMEMBASE	(0x00000000)
    168  1.1      mw /* maximum for mapping, not the whole range is needed in physical equivalence */
    169  1.1      mw #define CHIPMEMTOP	(0x00200000)
    170  1.1      mw #define CHIPMEMSIZE	btoc(CHIPMEMTOP-CHIPMEMBASE)
    171  1.1      mw /* CIA-A and CIA-B */
    172  1.1      mw #define CIABASE		(0x00BFC000)
    173  1.1      mw #define CIATOP		(0x00C00000)
    174  1.1      mw #define CIASIZE		btoc(CIATOP-CIABASE)
    175  1.3      mw #if 0
    176  1.1      mw #define CUSTOMBASE	(0x00DFE000)
    177  1.1      mw #define CUSTOMTOP	(0x00E00000)
    178  1.1      mw #define CUSTOMSIZE	btoc(CUSTOMTOP-CUSTOMBASE)
    179  1.1      mw #ifdef A3000
    180  1.1      mw #define SCSIBASE	(0x00DD0000)
    181  1.1      mw #define SCSITOP		(0x00DD0000+AMIGA_PAGE_SIZE)
    182  1.1      mw #define SCSISIZE	btoc(SCSITOP-SCSIBASE)
    183  1.1      mw #endif
    184  1.3      mw #else
    185  1.3      mw /* zorro2 really starts at 0x00E00000, but starting mapping at D8 also
    186  1.3      mw    includes the clock and scsi space on the A3000, as well as the
    187  1.3      mw    normal custom chip area on any amiga. That's nice :-)) */
    188  1.3      mw #define ZORRO2BASE	(0x00D80000)
    189  1.3      mw #define ZORRO2TOP	(0x00F80000)
    190  1.3      mw #define ZORRO2SIZE	btoc(ZORRO2TOP-ZORRO2BASE)
    191  1.3      mw #define CUSTOMBASE	(0x00DFF000)	/* now just offset rel to zorro2 */
    192  1.3      mw #endif
    193  1.1      mw 
    194  1.1      mw /* XXX only correct for A3000 memory map!
    195  1.1      mw  * corresponds to address of last physical memory page, for A3000
    196  1.1      mw  * this is always 0x08000000 - pagesize (== NBPS)
    197  1.1      mw  */
    198  1.1      mw #define MAXADDR		(0x08000000 - UPAGES)
    199  1.1      mw 
    200  1.1      mw 
    201  1.3      mw #if 0
    202  1.3      mw /* these are not used, verbatim from hp300, but not used :-)) */
    203  1.3      mw 
    204  1.1      mw /* Amiga specific mappings:
    205  1.1      mw  *
    206  1.1      mw  * phys-start	map-start	  phys-end	map-end		name
    207  1.1      mw  *
    208  1.1      mw  * 0x00000000	chipmembase	- 0x00200000	chipmemlimit	CHIP MEM
    209  1.1      mw  * 0x00be0000	ciabase		- 0x00c00000	cialimit	CIA-B/CIA-A
    210  1.1      mw  * 0x00d80000	customchipbase	- 0x00f00000	customchiplimit	CUSTOM/ZORRO2
    211  1.1      mw  */
    212  1.1      mw #define ISCHIPMEM(va) \
    213  1.1      mw 	((char *)(va) >= chipmembase && (char *)(va) < chipmemlimit)
    214  1.1      mw #define	CHIPMEMV(pa)	((int)(pa)-CHIPMEMBASE+(int)chipmembase)
    215  1.1      mw #define	CHIPMEMP(va)	((int)(va)-(int)chipmembase+CHIPMEMBASE)
    216  1.1      mw #define	CHIPMEMPOFF(pa)	((int)(pa)-CHIPMEMBASE)
    217  1.1      mw #define	CHIPMEMMAPSIZE	btoc(CHIPMEMTOP-CHIPMEMBASE)	/* 2mb */
    218  1.1      mw 
    219  1.1      mw #define ISCIA(va) \
    220  1.1      mw 	((char *)(va) >= ciabase && (char *)(va) < cialimit)
    221  1.1      mw #define	CIAV(pa)	((int)(pa)-CIABASE+(int)ciabase)
    222  1.1      mw #define	CIAP(va)	((int)(va)-(int)ciabase+CIABASE)
    223  1.1      mw #define	CIAPOFF(pa)	((int)(pa)-CIABASE)
    224  1.1      mw #define	CIAMAPSIZE	btoc(CIATOP-CIABASE)	/* 8k */
    225  1.1      mw 
    226  1.1      mw #define ISCUSTOMCHIP(va) \
    227  1.1      mw 	((char *)(va) >= customchipbase && (char *)(va) < customchiplimit)
    228  1.1      mw #define	CUSTOMCHIPV(pa)	((int)(pa)-CUSTOMCHIPBASE+(int)customchipbase)
    229  1.1      mw #define	CUSTOMCHIPP(va)	((int)(va)-(int)customchipbase+CUSTOMCHIPBASE)
    230  1.1      mw #define	CUSTOMCHIPPOFF(pa)	((int)(pa)-CUSTOMCHIPBASE)
    231  1.1      mw #define	CUSTOMCHIPMAPSIZE	btoc(CUSTOMCHIPTOP-CUSTOMCHIPBASE)	/* 1.5mb */
    232  1.3      mw #endif
    233  1.1      mw 
    234  1.1      mw 
    235  1.1      mw /*
    236  1.1      mw  * 68851 and 68030 MMU
    237  1.1      mw  */
    238  1.1      mw #define	PMMU_LVLMASK	0x0007
    239  1.1      mw #define	PMMU_INV	0x0400
    240  1.1      mw #define	PMMU_WP		0x0800
    241  1.1      mw #define	PMMU_ALV	0x1000
    242  1.1      mw #define	PMMU_SO		0x2000
    243  1.1      mw #define	PMMU_LV		0x4000
    244  1.1      mw #define	PMMU_BE		0x8000
    245  1.1      mw #define	PMMU_FAULT	(PMMU_WP|PMMU_INV)
    246  1.1      mw 
    247  1.1      mw /* 680X0 function codes */
    248  1.1      mw #define	FC_USERD	1	/* user data space */
    249  1.1      mw #define	FC_USERP	2	/* user program space */
    250  1.1      mw #define	FC_SUPERD	5	/* supervisor data space */
    251  1.1      mw #define	FC_SUPERP	6	/* supervisor program space */
    252  1.1      mw #define	FC_CPU		7	/* CPU space */
    253  1.1      mw 
    254  1.1      mw /* fields in the 68020 cache control register */
    255  1.1      mw #define	IC_ENABLE	0x0001	/* enable instruction cache */
    256  1.1      mw #define	IC_FREEZE	0x0002	/* freeze instruction cache */
    257  1.1      mw #define	IC_CE		0x0004	/* clear instruction cache entry */
    258  1.1      mw #define	IC_CLR		0x0008	/* clear entire instruction cache */
    259  1.1      mw 
    260  1.1      mw /* additional fields in the 68030 cache control register */
    261  1.1      mw #define	IC_BE		0x0010	/* instruction burst enable */
    262  1.1      mw #define	DC_ENABLE	0x0100	/* data cache enable */
    263  1.1      mw #define	DC_FREEZE	0x0200	/* data cache freeze */
    264  1.1      mw #define	DC_CE		0x0400	/* clear data cache entry */
    265  1.1      mw #define	DC_CLR		0x0800	/* clear entire data cache */
    266  1.1      mw #define	DC_BE		0x1000	/* data burst enable */
    267  1.1      mw #define	DC_WA		0x2000	/* write allocate */
    268  1.1      mw 
    269  1.5      mw /* fields in the 68040 cache control register */
    270  1.5      mw #define	IC40_ENABLE	0x00008000	/* enable instruction cache */
    271  1.5      mw #define DC40_ENABLE	0x80000000	/* enable data cache */
    272  1.5      mw 
    273  1.1      mw #define	CACHE_ON	(DC_WA|DC_BE|DC_CLR|DC_ENABLE|IC_BE|IC_CLR|IC_ENABLE)
    274  1.1      mw #define	CACHE_OFF	(DC_CLR|IC_CLR)
    275  1.1      mw #define	CACHE_CLR	(CACHE_ON)
    276  1.1      mw #define	IC_CLEAR	(DC_WA|DC_BE|DC_ENABLE|IC_BE|IC_CLR|IC_ENABLE)
    277  1.1      mw #define	DC_CLEAR	(DC_WA|DC_BE|DC_CLR|DC_ENABLE|IC_BE|IC_ENABLE)
    278  1.5      mw 
    279  1.5      mw /* 68040 cache control */
    280  1.5      mw #define	CACHE40_ON	(IC40_ENABLE|DC40_ENABLE)
    281  1.5      mw #define	CACHE40_OFF	0x00000000
    282  1.8  chopps 
    283  1.8  chopps #endif /* !_MACHINE_CPU_H */
    284