8e4a9661a1c1845abd8ebe8c8c191e9203838477
* Copyright (c) 1992, 1993
* The Regents of the University of California. All rights reserved.
* This software was developed by the Computer Systems Engineering group
* at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and
* contributed to Berkeley.
* All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Lawrence Berkeley Laboratory.
* %sccs.include.redist.c%
* @(#)cpu.h 8.4 (Berkeley) %G%
* from: $Header: cpu.h,v 1.12 93/05/25 10:36:34 torek Exp $ (LBL)
* CTL_MACHDEP definitinos.
#define CPU_MAXID 1 /* no valid machdep ids */
#define CTL_MACHDEP_NAMES { \
* Exported definitions unique to SPARC cpu support.
#include <sparc/sparc/intreg.h>
* definitions of cpu-dependent requirements
* referenced in generic code
#define COPY_SIGCODE /* copy sigcode above user stack in exec */
#define cpu_exec(p) /* nothing */
#define cpu_swapin(p) /* nothing */
#define cpu_wait(p) /* nothing */
#define cpu_setstack(p, ap) ((p)->p_md.md_tf->tf_out[6] = (ap) - 64)
* See syscall() for an explanation of the following. Note that the
* locore bootstrap code follows the syscall stack protocol. The
* framep argument is unused.
#define cpu_set_init_frame(p, fp) \
(p)->p_md.md_tf = (struct trapframe *) \
((caddr_t)(p)->p_addr + UPAGES * NBPG - sizeof(struct trapframe))
* Arguments to hardclock, softclock and gatherstats encapsulate the
* previous machine state in an opaque clockframe. The ipl is here
* as well for strayintr (see locore.s:interrupt and intr.c:strayintr).
* Note that CLKF_INTR is valid only if CLKF_USERMODE is false.
u_int psr
; /* psr before interrupt, excluding PSR_ET */
u_int pc
; /* pc at interrupt */
u_int npc
; /* npc at interrupt */
u_int ipl
; /* actual interrupt priority level */
u_int fp
; /* %fp at interrupt */
#define CLKF_USERMODE(framep) (((framep)->psr & PSR_PS) == 0)
#define CLKF_BASEPRI(framep) (((framep)->psr & PSR_PIL) == 0)
#define CLKF_PC(framep) ((framep)->pc)
#define CLKF_INTR(framep) ((framep)->fp < (u_int)eintstack)
* Software interrupt request `register'.
#define setsoftint() ienab_bis(IE_L1)
#define setsoftnet() (sir.sir_which[SIR_NET] = 1, setsoftint())
#define setsoftclock() (sir.sir_which[SIR_CLOCK] = 1, setsoftint())
* Preempt the current process if in interrupt from user mode,
* or after the current trap/syscall if in system mode.
int want_resched
; /* resched() was called */
#define need_resched() (want_resched = 1, want_ast = 1)
* Give a profiling tick to the current process when the user profiling
* buffer pages are invalid. On the sparc, request an ast to send us
* through trap(), marking the proc as needing a profiling tick.
#define need_proftick(p) ((p)->p_flag |= P_OWEUPC, want_ast = 1)
* Notify the current process (p) that it has a signal pending,
* process as soon as possible.
#define signotify(p) (want_ast = 1)
* Only one process may own the FPU state.
* XXX this must be per-cpu (eventually)
struct proc
*fpproc
; /* FPU owner */
int foundfpu
; /* true => we have an FPU */
* Interrupt handler chains. Interrupt handlers should return 0 for
* ``not me'' or 1 (``I took care of it''). intr_establish() inserts a
* handler into the list. The handler is called with its (single)
* argument, or with a pointer to a clockframe if ih_arg is NULL.
int (*ih_fun
) __P((void *));
struct intrhand
*ih_next
;
void intr_establish
__P((int level
, struct intrhand
*));
* intr_fasttrap() is a lot like intr_establish, but is used for ``fast''
* interrupt vectors (vectors that are not shared and are handled in the
* trap window). Such functions must be written in assembly.
void intr_fasttrap
__P((int level
, void (*vec
)(void)));