#ifndef _sparc_cpuvar_h
#define _sparc_cpuvar_h
#if defined(_KERNEL_OPT)
#include "opt_multiprocessor.h"
#include "opt_lockdebug.h"
#include "opt_ddb.h"
#include "opt_sparc_arch.h"
#include "opt_modular.h"
#endif
#include <sys/device.h>
#include <sys/lock.h>
#include <sys/cpu_data.h>
#include <sparc/include/reg.h>
#include <sparc/sparc/cache.h>
struct cpu_info;
struct module_info {
int cpu_type;
enum vactype vactype;
void (*cpu_match)(struct cpu_info *, struct module_info *, int);
void (*getcacheinfo)(struct cpu_info *sc, int node);
void (*hotfix)(struct cpu_info *);
void (*mmu_enable)(void);
void (*cache_enable)(void);
int (*getmid)(void);
int ncontext;
void (*get_syncflt)(void);
int (*get_asyncflt)(u_int *, u_int *);
void (*cache_flush)(void *, u_int);
void (*sp_vcache_flush_page)(int, int);
void (*ft_vcache_flush_page)(int, int);
void (*sp_vcache_flush_segment)(int, int, int);
void (*ft_vcache_flush_segment)(int, int, int);
void (*sp_vcache_flush_region)(int, int);
void (*ft_vcache_flush_region)(int, int);
void (*sp_vcache_flush_context)(int);
void (*ft_vcache_flush_context)(int);
void (*sp_vcache_flush_range)(int, int, int);
void (*ft_vcache_flush_range)(int, int, int);
void (*pcache_flush_page)(paddr_t, int);
void (*pure_vcache_flush)(void);
void (*cache_flush_all)(void);
void (*memerr)(unsigned, u_int, u_int, struct trapframe *);
void (*zero_page)(paddr_t);
void (*copy_page)(paddr_t, paddr_t);
};
#define CPUARCH_UNKNOWN 0
#define CPUARCH_SUN4 1
#define CPUARCH_SUN4C 2
#define CPUARCH_SUN4M 3
#define CPUARCH_SUN4D 4
#define CPUARCH_SUN4U 5
#define CPUCLS_UNKNOWN 0
#if defined(SUN4)
#define CPUCLS_SUN4 1
#endif
#if defined(SUN4C)
#define CPUCLS_SUN4C 5
#endif
#if defined(SUN4M) || defined(SUN4D)
#define CPUCLS_MICROSPARC 10
#define CPUCLS_SUPERSPARC 11
#define CPUCLS_HYPERSPARC 12
#endif
#define CPUTYP_UNKNOWN 0
#define CPUTYP_4_100 1
#define CPUTYP_4_200 2
#define CPUTYP_4_300 3
#define CPUTYP_4_400 4
#define CPUTYP_SLC 10
#define CPUTYP_ELC 11
#define CPUTYP_IPX 12
#define CPUTYP_IPC 13
#define CPUTYP_1 14
#define CPUTYP_1P 15
#define CPUTYP_2 16
#define CPUTYP_SS2_MBUS_MXCC 20
#define CPUTYP_SS1_MBUS_MXCC 21
#define CPUTYP_SS2_MBUS_NOMXCC 22
#define CPUTYP_SS1_MBUS_NOMXCC 23
#define CPUTYP_MS2 24
#define CPUTYP_MS1 25
#define CPUTYP_HS_MBUS 26
#define CPUTYP_CYPRESS 27
#define CPUFLG_HATCHED 0x1000
#define CPUFLG_PAUSED 0x2000
#define CPUFLG_GOTMSG 0x4000
#if defined(MULTIPROCESSOR) || defined(MODULAR) || defined(_MODULE)
#define CPU_INFO_FOREACH(cii, cp) cii = 0; (cp = cpus[cii]) && cp->eintstack && cii < sparc_ncpus; cii++
#define CPU_INFO_ITERATOR int
#else
#define CPU_INFO_FOREACH(cii, cp) cp = curcpu(); cp != NULL; cp = NULL
#define CPU_INFO_ITERATOR int __unused
#endif
void getcpuinfo (struct cpu_info *sc, int node);
void mmu_install_tables (struct cpu_info *);
void pmap_alloc_cpu (struct cpu_info *);
#define CPUSET_ALL 0xffffffffU
#if defined(MULTIPROCESSOR)
void cpu_init_system(void);
typedef void (*xcall_func_t)(int, int, int);
typedef void (*xcall_trap_t)(int, int, int);
void xcall(xcall_func_t, xcall_trap_t, int, int, int, u_int);
void xcallintr(void *);
#define XCALL0(f,cpuset) \
xcall((xcall_func_t)f, NULL, 0, 0, 0, cpuset)
#define XCALL1(f,a1,cpuset) \
xcall((xcall_func_t)f, NULL, (int)a1, 0, 0, cpuset)
#define XCALL2(f,a1,a2,cpuset) \
xcall((xcall_func_t)f, NULL, (int)a1, (int)a2, 0, cpuset)
#define XCALL3(f,a1,a2,a3,cpuset) \
xcall((xcall_func_t)f, NULL, (int)a1, (int)a2, (int)a3, cpuset)
#define FXCALL0(f,tf,cpuset) \
xcall((xcall_func_t)f, (xcall_trap_t)tf, 0, 0, 0, cpuset)
#define FXCALL1(f,tf,a1,cpuset) \
xcall((xcall_func_t)f, (xcall_trap_t)tf, (int)a1, 0, 0, cpuset)
#define FXCALL2(f,tf,a1,a2,cpuset) \
xcall((xcall_func_t)f, (xcall_trap_t)tf, (int)a1, (int)a2, 0, cpuset)
#define FXCALL3(f,tf,a1,a2,a3,cpuset) \
xcall((xcall_func_t)f, (xcall_trap_t)tf, (int)a1, (int)a2, (int)a3, cpuset)
#else
#define XCALL0(f,cpuset)
#define XCALL1(f,a1,cpuset)
#define XCALL2(f,a1,a2,cpuset)
#define XCALL3(f,a1,a2,a3,cpuset)
#define FXCALL0(f,tf,cpuset)
#define FXCALL1(f,tf,a1,cpuset)
#define FXCALL2(f,tf,a1,a2,cpuset)
#define FXCALL3(f,tf,a1,a2,a3,cpuset)
#endif
extern int bootmid;
#define CPU_MID2CPUNO(mid) ((mid) != 0 ? (mid) - 8 : 0)
extern struct cpu_info *cpus[];
#ifdef MULTIPROCESSOR
extern u_int cpu_ready_mask;
#endif
#if defined(DDB) || defined(MULTIPROCESSOR)
void cpu_debug_dump(void);
void cpu_xcall_dump(void);
#endif
#endif