#ifndef _SYS_MACHCPUVAR_H
#define _SYS_MACHCPUVAR_H
#include <sys/intr.h>
#include <sys/clock.h>
#include <sys/machparam.h>
#include <sys/machpcb.h>
#include <sys/privregs.h>
#include <sys/machlock.h>
#include <sys/async.h>
#include <sys/error.h>
#ifdef __cplusplus
extern "C" {
#endif
#ifndef _ASM
#include <sys/obpdefs.h>
#include <sys/async.h>
#include <sys/fm/protocol.h>
typedef struct ptl1_trapregs {
uint32_t ptl1_tl;
uint32_t ptl1_tt;
uint64_t ptl1_tstate;
uint64_t ptl1_tpc;
uint64_t ptl1_tnpc;
} ptl1_trapregs_t;
typedef struct ptl1_gregs {
uint64_t ptl1_gl;
uint64_t ptl1_g1;
uint64_t ptl1_g2;
uint64_t ptl1_g3;
uint64_t ptl1_g4;
uint64_t ptl1_g5;
uint64_t ptl1_g6;
uint64_t ptl1_g7;
} ptl1_gregs_t;
typedef struct ptl1_regs {
ptl1_trapregs_t ptl1_trap_regs[PTL1_MAXTL];
ptl1_gregs_t ptl1_gregs[PTL1_MAXGL + 1];
uint64_t ptl1_tick;
uint64_t ptl1_dmmu_type;
uint64_t ptl1_dmmu_addr;
uint64_t ptl1_dmmu_ctx;
uint64_t ptl1_immu_type;
uint64_t ptl1_immu_addr;
uint64_t ptl1_immu_ctx;
struct rwindow ptl1_rwindow[MAXWIN];
uint32_t ptl1_softint;
uint16_t ptl1_pstate;
uint8_t ptl1_pil;
uint8_t ptl1_cwp;
uint8_t ptl1_wstate;
uint8_t ptl1_otherwin;
uint8_t ptl1_cleanwin;
uint8_t ptl1_cansave;
uint8_t ptl1_canrestore;
} ptl1_regs_t;
typedef struct ptl1_state {
ptl1_regs_t ptl1_regs;
uint32_t ptl1_entry_count;
uintptr_t ptl1_stktop;
ulong_t ptl1_stk[1];
} ptl1_state_t;
#define CPU_CHIPID_INVALID -1
#define CPU_COREID_INVALID -1
#define CPU_L2_CACHEID_INVALID -1
struct machcpu {
struct machpcb *mpcb;
uint64_t mpcb_pa;
int mutex_ready;
int in_prom;
int tl1_hdlr;
char cpu_tstat_flags;
uint16_t divisor;
uint8_t intrcnt;
u_longlong_t tmp1;
u_longlong_t tmp2;
u_longlong_t tmp3;
u_longlong_t tmp4;
label_t *ofd[HIGH_LEVELS];
uintptr_t lfd[HIGH_LEVELS];
struct on_trap_data *otd[HIGH_LEVELS];
struct intr_vec *intr_head[PIL_LEVELS];
struct intr_vec *intr_tail[PIL_LEVELS];
boolean_t poke_cpu_outstanding;
void *cpu_private;
uint_t cpu_mmu_idx;
struct mmu_ctx *cpu_mmu_ctxp;
ptl1_state_t ptl1_state;
uint64_t pil_high_start[HIGH_LEVELS];
uint64_t intrstat[PIL_MAX+1][2];
int kwbuf_full;
caddr_t kwbuf_sp;
struct rwindow kwbuf;
caddr_t cpu_q_va;
caddr_t dev_q_va;
uint64_t cpu_q_base_pa;
uint64_t cpu_q_size;
uint64_t dev_q_base_pa;
uint64_t dev_q_size;
caddr_t cpu_rq_va;
caddr_t cpu_nrq_va;
uint64_t cpu_rq_base_pa;
uint64_t cpu_rq_size;
uint64_t cpu_nrq_base_pa;
uint64_t cpu_nrq_size;
errh_er_t *cpu_rq_lastre;
errh_er_t *cpu_nrq_lastnre;
caddr_t mondo_data;
uint64_t mondo_data_ra;
uint16_t *cpu_list;
uint64_t cpu_list_ra;
id_t cpu_ipipe;
id_t cpu_mpipe;
id_t cpu_fpu;
id_t cpu_core;
id_t cpu_chip;
kthread_t *startup_thread;
};
typedef struct machcpu machcpu_t;
#define cpu_startup_thread cpu_m.startup_thread
#define CPU_MMU_IDX(cp) ((cp)->cpu_m.cpu_mmu_idx)
#define CPU_MMU_CTXP(cp) ((cp)->cpu_m.cpu_mmu_ctxp)
#define NINTR_THREADS (LOCK_LEVEL)
#define CPU_PRIVATE(cp) ((cp)->cpu_m.cpu_private)
#define MAXSYSNAME 20
#define ECACHE_CPU_IDLE 0x0
#define ECACHE_CPU_BUSY 0x1
#define ECACHE_CPU_MIRROR 0x2
#define ECACHE_CPU_NON_MIRROR 0x3
#define CPU_FRU_FMRI FM_FMRI_SCHEME_HC":///" \
FM_FMRI_LEGACY_HC"="
struct cpu_node {
char name[MAXSYSNAME];
char fru_fmri[sizeof (CPU_FRU_FMRI) + UNUM_NAMLEN];
int cpuid;
pnode_t nodeid;
uint64_t clock_freq;
uint_t tick_nsec_scale;
union {
int dummy;
} u_info;
int ecache_size;
int ecache_linesize;
int ecache_associativity;
int ecache_setsize;
uint64_t device_id;
id_t exec_unit_mapping;
id_t fpu_mapping;
id_t l2_cache_mapping;
id_t core_mapping;
};
extern struct cpu_node cpunodes[];
#endif
#ifdef __cplusplus
}
#endif
#endif