#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>
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)
{
char modname[MODMAXNAMELEN];
char *p, *q;
int len, stat;
extern char *boot_cpu_compatible_list;
for (stat = -1, p = boot_cpu_compatible_list; p != NULL; p = q) {
q = strchr(p, ':');
len = (q) ? (q - p) : strlen(p);
if (len < sizeof (modname)) {
(void) strncpy(modname, p, len);
modname[len] = '\0';
stat = kcpc_pcbe_tryload(modname, 0, 0, 0);
if (stat == 0)
break;
}
if (q)
q++;
}
return (stat);
}
int
kcpc_hw_cpu_hook(processorid_t cpuid, ulong_t *kcpc_cpumap)
{
return (0);
}
int
kcpc_hw_lwp_hook(void)
{
return (0);
}