[BACK]Return to cpu.h CVS log [TXT][DIR] Up to [local] / sys / arch / m88k / include

Annotation of sys/arch/m88k/include/cpu.h, Revision 1.1.1.1

1.1       nbrk        1: /*     $OpenBSD: cpu.h,v 1.22 2007/05/19 20:34:32 miod Exp $ */
                      2: /*
                      3:  * Copyright (c) 1996 Nivas Madhur
                      4:  * Copyright (c) 1992, 1993
                      5:  *     The Regents of the University of California.  All rights reserved.
                      6:  *
                      7:  * This software was developed by the Computer Systems Engineering group
                      8:  * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and
                      9:  * contributed to Berkeley.
                     10:  *
                     11:  * All advertising materials mentioning features or use of this software
                     12:  * must display the following acknowledgement:
                     13:  *     This product includes software developed by the University of
                     14:  *     California, Lawrence Berkeley Laboratory.
                     15:  *
                     16:  * Redistribution and use in source and binary forms, with or without
                     17:  * modification, are permitted provided that the following conditions
                     18:  * are met:
                     19:  * 1. Redistributions of source code must retain the above copyright
                     20:  *    notice, this list of conditions and the following disclaimer.
                     21:  * 2. Redistributions in binary form must reproduce the above copyright
                     22:  *    notice, this list of conditions and the following disclaimer in the
                     23:  *    documentation and/or other materials provided with the distribution.
                     24:  * 3. Neither the name of the University nor the names of its contributors
                     25:  *    may be used to endorse or promote products derived from this software
                     26:  *    without specific prior written permission.
                     27:  *
                     28:  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
                     29:  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
                     30:  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
                     31:  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
                     32:  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
                     33:  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
                     34:  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
                     35:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
                     36:  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
                     37:  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
                     38:  * SUCH DAMAGE.
                     39:  */
                     40:
                     41: #ifndef __M88K_CPU_H__
                     42: #define __M88K_CPU_H__
                     43:
                     44: /*
                     45:  * CTL_MACHDEP definitinos.
                     46:  */
                     47: #define        CPU_CONSDEV     1       /* dev_t: console terminal device */
                     48: #define        CPU_MAXID       2       /* number of valid machdep ids */
                     49:
                     50: #define        CTL_MACHDEP_NAMES { \
                     51:        { 0, 0 }, \
                     52:        { "console_device", CTLTYPE_STRUCT }, \
                     53: }
                     54:
                     55: #ifdef _KERNEL
                     56:
                     57: #include <machine/atomic.h>
                     58: #include <machine/pcb.h>
                     59: #include <machine/psl.h>
                     60: #include <machine/intr.h>
                     61: #include <sys/sched.h>
                     62:
                     63: #if defined(MULTIPROCESSOR)
                     64: #if !defined(MAX_CPUS) || MAX_CPUS > 4
                     65: #undef MAX_CPUS
                     66: #define        MAX_CPUS        4
                     67: #endif
                     68: #else
                     69: #if !defined(MAX_CPUS)
                     70: #undef MAX_CPUS
                     71: #define        MAX_CPUS        1
                     72: #endif
                     73: #endif
                     74:
                     75: #ifndef _LOCORE
                     76:
                     77: extern u_int max_cpus;
                     78:
                     79: /*
                     80:  * Per-CPU data structure
                     81:  */
                     82:
                     83: struct cpu_info {
                     84:        u_int   ci_alive;                       /* nonzero if CPU present */
                     85:
                     86:        struct proc *ci_curproc;                /* current process... */
                     87:        struct pcb *ci_curpcb;                  /* ...and its pcb */
                     88:
                     89:        u_int   ci_cpuid;                       /* cpu number */
                     90:        u_int   ci_primary;                     /* set if master cpu */
                     91:        u_int   ci_pfsr_i0, ci_pfsr_i1;         /* instruction... */
                     92:        u_int   ci_pfsr_d0, ci_pfsr_d1;         /* ... and data CMMU PFSRs */
                     93:
                     94:        struct schedstate_percpu ci_schedstate; /* scheduling state */
                     95:        int     ci_want_resched;                /* need_resched() invoked */
                     96:
                     97:        struct pcb *ci_idle_pcb;                /* idle pcb (and stack) */
                     98:
                     99:        u_int   ci_intrdepth;                   /* interrupt depth */
                    100:
                    101:        u_long  ci_spin_locks;                  /* spin locks counter */
                    102:
                    103:        volatile int ci_ddb_state;              /* ddb status */
                    104: #define        CI_DDB_RUNNING  0
                    105: #define        CI_DDB_ENTERDDB 1
                    106: #define        CI_DDB_INDDB    2
                    107: #define        CI_DDB_PAUSE    3
                    108:
                    109:        volatile int ci_ipi;                    /* pending ipis */
                    110: #define        CI_IPI_NOTIFY           0x00000001
                    111: #define        CI_IPI_HARDCLOCK        0x00000002
                    112: #define        CI_IPI_STATCLOCK        0x00000004
                    113: #define        CI_IPI_DDB              0x00000008
                    114: };
                    115:
                    116: extern cpuid_t master_cpu;
                    117: extern struct cpu_info m88k_cpus[MAX_CPUS];
                    118:
                    119: #define        CPU_INFO_ITERATOR       cpuid_t
                    120: #define        CPU_INFO_FOREACH(cii, ci) \
                    121:        for ((cii) = 0; (cii) < MAX_CPUS; (cii)++) \
                    122:                if (((ci) = &m88k_cpus[cii])->ci_alive != 0)
                    123: #define        CPU_INFO_UNIT(ci)       ((ci)->ci_cpuid)
                    124:
                    125: #if defined(MULTIPROCESSOR)
                    126:
                    127: #define        curcpu() \
                    128: ({                                                                     \
                    129:        struct cpu_info *cpuptr;                                        \
                    130:                                                                        \
                    131:        __asm__ __volatile__ ("ldcr %0, cr17" : "=r" (cpuptr));         \
                    132:        cpuptr;                                                         \
                    133: })
                    134:
                    135: #define        CPU_IS_PRIMARY(ci)      ((ci)->ci_primary != 0)
                    136:
                    137: void   cpu_boot_secondary_processors(void);
                    138: void   m88k_send_ipi(int, cpuid_t);
                    139: void   m88k_broadcast_ipi(int);
                    140:
                    141: #else  /* MULTIPROCESSOR */
                    142:
                    143: #define        curcpu()        (&m88k_cpus[0])
                    144: #define        CPU_IS_PRIMARY(ci)      1
                    145:
                    146: #endif /* MULTIPROCESSOR */
                    147:
                    148: void   set_cpu_number(cpuid_t);
                    149:
                    150: /*
                    151:  * The md code may hardcode this in some very specific situations.
                    152:  */
                    153: #if !defined(cpu_number)
                    154: #define        cpu_number()            curcpu()->ci_cpuid
                    155: #endif
                    156:
                    157: #define        curpcb                  curcpu()->ci_curpcb
                    158:
                    159: #endif /* _LOCORE */
                    160:
                    161: /*
                    162:  * definitions of cpu-dependent requirements
                    163:  * referenced in generic code
                    164:  */
                    165: #define        cpu_exec(p)             do { /* nothing */ } while (0)
                    166: #define        cpu_wait(p)             do { /* nothing */ } while (0)
                    167:
                    168: #if defined(MULTIPROCESSOR)
                    169: #include <sys/lock.h>
                    170: #include <sys/mplock.h>
                    171: #endif
                    172:
                    173: /*
                    174:  * Arguments to hardclock and gatherstats encapsulate the previous
                    175:  * machine state in an opaque clockframe. CLKF_INTR is only valid
                    176:  * if the process is in kernel mode. Clockframe is really trapframe,
                    177:  * so pointer to clockframe can be safely cast into a pointer to
                    178:  * trapframe.
                    179:  */
                    180: struct clockframe {
                    181:        struct trapframe tf;
                    182: };
                    183:
                    184: #define        CLKF_USERMODE(framep)   (((framep)->tf.tf_epsr & PSR_MODE) == 0)
                    185: #define        CLKF_PC(framep)         ((framep)->tf.tf_sxip & XIP_ADDR)
                    186: #define        CLKF_INTR(framep) \
                    187:        (((struct cpu_info *)(framep)->tf.tf_cpu)->ci_intrdepth > 1)
                    188:
                    189: /*
                    190:  * Get interrupt glue.
                    191:  */
                    192: #include <machine/intr.h>
                    193:
                    194: #define SIR_NET                0x01
                    195: #define SIR_CLOCK      0x02
                    196:
                    197: extern unsigned int ssir;
                    198: #define setsoftint(x)  atomic_setbits_int(&ssir, x)
                    199: #define setsoftnet()   setsoftint(SIR_NET)
                    200: #define setsoftclock() setsoftint(SIR_CLOCK)
                    201:
                    202: #define        aston(p)        ((p)->p_md.md_astpending = 1)
                    203:
                    204: /*
                    205:  * This is used during profiling to integrate system time.
                    206:  */
                    207: #define        PC_REGS(regs)                                                   \
                    208:        (CPU_IS88110 ? ((regs)->exip & XIP_ADDR) :                      \
                    209:         ((regs)->sxip & XIP_V ? (regs)->sxip & XIP_ADDR :              \
                    210:          ((regs)->snip & NIP_V ? (regs)->snip & NIP_ADDR :             \
                    211:                                   (regs)->sfip & FIP_ADDR)))
                    212: #define        PROC_PC(p)      PC_REGS((struct reg *)((p)->p_md.md_tf))
                    213:
                    214: /*
                    215:  * Preempt the current process if in interrupt from user mode,
                    216:  * or after the current trap/syscall if in system mode.
                    217:  */
                    218: #define        need_resched(ci) \
                    219: do {                                                                   \
                    220:        ci->ci_want_resched = 1;                                        \
                    221:        if (ci->ci_curproc != NULL)                                     \
                    222:                aston(ci->ci_curproc);                                  \
                    223: } while (0)
                    224:
                    225: /*
                    226:  * Give a profiling tick to the current process when the user profiling
                    227:  * buffer pages are invalid.  On the m88k, request an ast to send us
                    228:  * through trap(), marking the proc as needing a profiling tick.
                    229:  */
                    230: #define        need_proftick(p)        aston(p)
                    231:
                    232: void   signotify(struct proc *);
                    233:
                    234: /*
                    235:  * switchframe - should be double word aligned.
                    236:  */
                    237: struct switchframe {
                    238:        u_int   sf_pc;                  /* pc */
                    239:        void    *sf_proc;               /* proc pointer */
                    240: };
                    241:
                    242: int    badaddr(vaddr_t addr, int size);
                    243:
                    244: #endif /* _KERNEL */
                    245: #endif /* __M88K_CPU_H__ */

CVSweb