#include <sys/types.h>
#include <sys/time.h>
#include <sys/atomic.h>
#include <sys/thread.h>
#include <sys/regset.h>
#include <sys/archsystm.h>
#include <sys/machsystm.h>
#include <sys/cpc_impl.h>
#include <sys/cpc_ultra.h>
#include <sys/sunddi.h>
#include <sys/intr.h>
#include <sys/ivintr.h>
#include <sys/x_call.h>
#include <sys/cpuvar.h>
#include <sys/machcpuvar.h>
#include <sys/cpc_pcbe.h>
#include <sys/modctl.h>
#include <sys/sdt.h>
#include <sys/kcpc.h>
uint64_t cpc_level15_inum = 0;
int cpc_has_overflow_intr;
extern kcpc_ctx_t *kcpc_overflow_intr(caddr_t arg, uint64_t bitmap);
extern int kcpc_counts_include_idle;
void
kcpc_hw_init(void)
{
if ((cpc_has_overflow_intr) && (cpc_level15_inum == 0)) {
cpc_level15_inum = add_softintr(PIL_15,
kcpc_hw_overflow_intr, NULL, SOFTINT_MT);
}
kcpc_hw_startup_cpu(CPU->cpu_flags);
}
void
kcpc_hw_startup_cpu(ushort_t cpflags)
{
cpu_t *cp = CPU;
kthread_t *t = cp->cpu_idle_thread;
ASSERT(t->t_bound_cpu == cp);
if (cpc_has_overflow_intr && (cpflags & CPU_FROZEN) == 0) {
int pstate_save = disable_vec_intr();
ASSERT(cpc_level15_inum != 0);
intr_enqueue_req(PIL_15, cpc_level15_inum);
enable_vec_intr(pstate_save);
}
mutex_init(&cp->cpu_cpc_ctxlock, "cpu_cpc_ctxlock", MUTEX_DEFAULT, 0);
if (kcpc_counts_include_idle)
return;
kcpc_idle_ctxop_install(t, cp);
}
int
kcpc_hw_load_pcbe(void)
{
uint64_t ver = ultra_getver();
return (kcpc_pcbe_tryload(NULL, ULTRA_VER_MANUF(ver),
ULTRA_VER_IMPL(ver), ULTRA_VER_MASK(ver)));
}
int
kcpc_hw_cpu_hook(processorid_t cpuid, ulong_t *kcpc_cpumap)
{
return (0);
}
int
kcpc_hw_lwp_hook(void)
{
return (0);
}