Annotation of sys/arch/sparc/include/cpu.h, Revision 1.1
1.1 ! nbrk 1: /* $OpenBSD: cpu.h,v 1.29 2007/05/08 07:23:18 art Exp $ */
! 2: /* $NetBSD: cpu.h,v 1.24 1997/03/15 22:25:15 pk Exp $ */
! 3:
! 4: /*
! 5: * Copyright (c) 1992, 1993
! 6: * The Regents of the University of California. All rights reserved.
! 7: *
! 8: * This software was developed by the Computer Systems Engineering group
! 9: * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and
! 10: * contributed to Berkeley.
! 11: *
! 12: * All advertising materials mentioning features or use of this software
! 13: * must display the following acknowledgement:
! 14: * This product includes software developed by the University of
! 15: * California, Lawrence Berkeley Laboratory.
! 16: *
! 17: * Redistribution and use in source and binary forms, with or without
! 18: * modification, are permitted provided that the following conditions
! 19: * are met:
! 20: * 1. Redistributions of source code must retain the above copyright
! 21: * notice, this list of conditions and the following disclaimer.
! 22: * 2. Redistributions in binary form must reproduce the above copyright
! 23: * notice, this list of conditions and the following disclaimer in the
! 24: * documentation and/or other materials provided with the distribution.
! 25: * 3. Neither the name of the University nor the names of its contributors
! 26: * may be used to endorse or promote products derived from this software
! 27: * without specific prior written permission.
! 28: *
! 29: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
! 30: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
! 31: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
! 32: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
! 33: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
! 34: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
! 35: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
! 36: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
! 37: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
! 38: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
! 39: * SUCH DAMAGE.
! 40: *
! 41: * @(#)cpu.h 8.4 (Berkeley) 1/5/94
! 42: */
! 43:
! 44: #ifndef _SPARC_CPU_H_
! 45: #define _SPARC_CPU_H_
! 46:
! 47: /*
! 48: * CTL_MACHDEP definitions.
! 49: */
! 50: #define CPU_LED_BLINK 1 /* int: twiddle the power LED */
! 51: /* 2 formerly int: vsyncblank */
! 52: #define CPU_CPUTYPE 3 /* int: cpu type */
! 53: #define CPU_V8MUL 4
! 54: #define CPU_MAXID 5 /* 4 valid machdep IDs */
! 55:
! 56: #define CTL_MACHDEP_NAMES { \
! 57: { 0, 0 }, \
! 58: { "led_blink", CTLTYPE_INT }, \
! 59: { 0, 0 }, \
! 60: { "cputype", CTLTYPE_INT }, \
! 61: { "v8mul", CTLTYPE_INT }, \
! 62: }
! 63:
! 64: #ifdef _KERNEL
! 65: /*
! 66: * Exported definitions unique to SPARC cpu support.
! 67: */
! 68:
! 69: #include <sys/evcount.h>
! 70: #include <machine/psl.h>
! 71: #include <machine/reg.h>
! 72: #include <sparc/sparc/intreg.h>
! 73: #include <sparc/sparc/cpuvar.h>
! 74:
! 75: /*
! 76: * definitions of cpu-dependent requirements
! 77: * referenced in generic code
! 78: */
! 79: #define cpu_wait(p) /* nothing */
! 80:
! 81: /*
! 82: * Arguments to hardclock, softclock and gatherstats encapsulate the
! 83: * previous machine state in an opaque clockframe. The ipl is here
! 84: * as well for strayintr (see locore.s:interrupt and intr.c:strayintr).
! 85: * Note that CLKF_INTR is valid only if CLKF_USERMODE is false.
! 86: */
! 87: struct clockframe {
! 88: u_int psr; /* psr before interrupt, excluding PSR_ET */
! 89: u_int pc; /* pc at interrupt */
! 90: u_int npc; /* npc at interrupt */
! 91: u_int ipl; /* actual interrupt priority level */
! 92: u_int fp; /* %fp at interrupt */
! 93: };
! 94: typedef struct clockframe clockframe;
! 95:
! 96: extern int eintstack[];
! 97:
! 98: #define CLKF_USERMODE(framep) (((framep)->psr & PSR_PS) == 0)
! 99: #define CLKF_PC(framep) ((framep)->pc)
! 100: #define CLKF_INTR(framep) ((framep)->fp < (u_int)eintstack)
! 101:
! 102: /*
! 103: * Software interrupt request `register'.
! 104: */
! 105: union sir {
! 106: int sir_any;
! 107: char sir_which[4];
! 108: };
! 109: extern union sir sir;
! 110:
! 111: #define SIR_NET 0
! 112: #define SIR_CLOCK 1
! 113:
! 114: #if defined(SUN4M)
! 115: extern void raise(int, int);
! 116: #if !(defined(SUN4) || defined(SUN4C))
! 117: #define setsoftint() raise(0,1)
! 118: #else /* both defined */
! 119: #define setsoftint() (cputyp == CPU_SUN4M ? raise(0,1) : ienab_bis(IE_L1))
! 120: #endif /* !4,!4c */
! 121: #else /* 4m not defined */
! 122: #define setsoftint() ienab_bis(IE_L1)
! 123: #endif /* SUN4M */
! 124:
! 125: #define setsoftnet() (sir.sir_which[SIR_NET] = 1, setsoftint())
! 126: #define setsoftclock() (sir.sir_which[SIR_CLOCK] = 1, setsoftint())
! 127:
! 128: /*
! 129: * Preempt the current process if in interrupt from user mode,
! 130: * or after the current trap/syscall if in system mode.
! 131: */
! 132: extern int want_resched; /* resched() was called */
! 133: #define need_resched(ci) (want_resched = 1, want_ast = 1)
! 134: extern int want_ast;
! 135:
! 136: /*
! 137: * This is used during profiling to integrate system time.
! 138: */
! 139: #define PROC_PC(p) ((p)->p_md.md_tf->tf_pc)
! 140:
! 141: /*
! 142: * Give a profiling tick to the current process when the user profiling
! 143: * buffer pages are invalid. On the sparc, request an ast to send us
! 144: * through trap(), marking the proc as needing a profiling tick.
! 145: */
! 146: #define need_proftick(p) do { want_ast = 1; } while (0)
! 147:
! 148: /*
! 149: * Notify the current process (p) that it has a signal pending,
! 150: * process as soon as possible.
! 151: */
! 152: #define signotify(p) (want_ast = 1)
! 153:
! 154: extern int foundfpu; /* true => we have an FPU */
! 155:
! 156: /*
! 157: * Interrupt handler chains. Interrupt handlers should return 0 for
! 158: * ``not me'' or 1 (``I took care of it''). intr_establish() inserts a
! 159: * handler into the list. The handler is called with its (single)
! 160: * argument, or with a pointer to a clockframe if ih_arg is NULL.
! 161: * ih_ipl specifies the interrupt level that should be blocked when
! 162: * executing this handler.
! 163: */
! 164: struct intrhand {
! 165: int (*ih_fun)(void *);
! 166: void *ih_arg;
! 167: int ih_ipl;
! 168: int ih_vec; /* human readable ipl for vmstat */
! 169: struct evcount ih_count;
! 170: struct intrhand *ih_next;
! 171: };
! 172: extern struct intrhand *intrhand[15];
! 173: void intr_establish(int level, struct intrhand *, int, const char *);
! 174: void vmeintr_establish(int vec, int level, struct intrhand *, int, const char *);
! 175:
! 176: /*
! 177: * intr_fasttrap() is a lot like intr_establish, but is used for ``fast''
! 178: * interrupt vectors (vectors that are not shared and are handled in the
! 179: * trap window). Such functions must be written in assembly.
! 180: */
! 181: int intr_fasttrap(int, void (*)(void), int (*)(void *), void *);
! 182: void intr_fastuntrap(int);
! 183:
! 184: /* auxreg.c */
! 185: void led_blink(void *);
! 186: /* scf.c */
! 187: void scfblink(void *);
! 188: /* disksubr.c */
! 189: struct dkbad;
! 190: int isbad(struct dkbad *bt, int, int, int);
! 191: /* machdep.c */
! 192: int ldcontrolb(caddr_t);
! 193: void dumpconf(void);
! 194: void intr_init(void);
! 195: caddr_t reserve_dumppages(caddr_t);
! 196: /* clock.c */
! 197: struct timeval;
! 198: void lo_microtime(struct timeval *);
! 199: int statintr(void *);
! 200: int clockintr(void *);/* level 10 (clock) interrupt code */
! 201: int statintr(void *); /* level 14 (statclock) interrupt code */
! 202: /* locore.s */
! 203: struct fpstate;
! 204: void savefpstate(struct fpstate *);
! 205: void loadfpstate(struct fpstate *);
! 206: int probeget(caddr_t, int);
! 207: void write_all_windows(void);
! 208: void write_user_windows(void);
! 209: void proc_trampoline(void);
! 210: struct pcb;
! 211: void snapshot(struct pcb *);
! 212: struct frame *getfp(void);
! 213: int xldcontrolb(caddr_t, struct pcb *);
! 214: void copywords(const void *, void *, size_t);
! 215: void qcopy(const void *, void *, size_t);
! 216: void qzero(void *, size_t);
! 217: /* locore2.c */
! 218: void remrunqueue(struct proc *);
! 219: /* trap.c */
! 220: void pmap_unuse_final(struct proc *);
! 221: int rwindow_save(struct proc *);
! 222: /* amd7930intr.s */
! 223: void amd7930_trap(void);
! 224: #ifdef KGDB
! 225: /* zs_kgdb.c */
! 226: void zs_kgdb_init(void);
! 227: #endif
! 228: /* fb.c */
! 229: void fb_unblank(void);
! 230: /* cache.c */
! 231: void cache_flush(caddr_t, u_int);
! 232: /* kgdb_stub.c */
! 233: #ifdef KGDB
! 234: void kgdb_attach(int (*)(void *), void (*)(void *, int), void *);
! 235: void kgdb_connect(int);
! 236: void kgdb_panic(void);
! 237: #endif
! 238: /* iommu.c */
! 239: void iommu_enter(u_int, u_int);
! 240: void iommu_remove(u_int, u_int);
! 241: /* emul.c */
! 242: struct trapframe;
! 243: int fixalign(struct proc *, struct trapframe *);
! 244: int emulinstr(int, struct trapframe *);
! 245:
! 246: /*
! 247: *
! 248: * The SPARC has a Trap Base Register (TBR) which holds the upper 20 bits
! 249: * of the trap vector table. The next eight bits are supplied by the
! 250: * hardware when the trap occurs, and the bottom four bits are always
! 251: * zero (so that we can shove up to 16 bytes of executable code---exactly
! 252: * four instructions---into each trap vector).
! 253: *
! 254: * The hardware allocates half the trap vectors to hardware and half to
! 255: * software.
! 256: *
! 257: * Traps have priorities assigned (lower number => higher priority).
! 258: */
! 259:
! 260: struct trapvec {
! 261: int tv_instr[4]; /* the four instructions */
! 262: };
! 263: extern struct trapvec *trapbase; /* the 256 vectors */
! 264:
! 265: #endif /* _KERNEL */
! 266: #endif /* _SPARC_CPU_H_ */
CVSweb