blob: d5504505c87c2f3ee47bc0938b4b4ab677ae4da0 [file] [log] [blame]
/*
* pstat() interface
* e.g. HP-UX
*/
#include <net-snmp/net-snmp-config.h>
#include <net-snmp/net-snmp-includes.h>
#include <net-snmp/agent/net-snmp-agent-includes.h>
#include <net-snmp/agent/hardware/cpu.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/pstat.h>
#include <sys/dk.h>
/*
* Initialise the list of CPUs on the system
* (including descriptions)
*/
void init_cpu_pstat( void ) {
int i, cpuversion;
struct pst_dynamic psd;
struct pst_processor *psp;
char descr[ SNMP_MAXBUF ];
netsnmp_cpu_info *cpu = netsnmp_cpu_get_byIdx( -1, 1 );
strcpy(cpu->name, "Overall CPU statistics");
#ifdef _SC_CPU_VERSION
cpuversion = sysconf( _SC_CPU_VERSION );
switch (cpuversion) {
case CPU_HP_MC68020:
snprintf(descr, SNMP_MAXBUF, " Motorola MC68020 ");
break;
case CPU_HP_MC68030:
snprintf(descr, SNMP_MAXBUF, " Motorola MC68030 ");
break;
case CPU_HP_MC68040:
snprintf(descr, SNMP_MAXBUF, " Motorola MC68040 ");
break;
case CPU_PA_RISC1_0:
snprintf(descr, SNMP_MAXBUF, " HP PA-RISC 1.0 ");
break;
case CPU_PA_RISC1_1:
snprintf(descr, SNMP_MAXBUF, " HP PA-RISC 1.1 ");
break;
case CPU_PA_RISC1_2:
snprintf(descr, SNMP_MAXBUF, " HP PA-RISC 1.2 ");
break;
case CPU_PA_RISC2_0:
snprintf(descr, SNMP_MAXBUF, " HP PA-RISC 2.0 ");
break;
default:
snprintf(descr, SNMP_MAXBUF, "An electronic chip with an HP label");
break;
}
#else
snprintf(descr, SNMP_MAXBUF, "An electronic chip without(?) an HP label");
#endif
(void)memset(&psd, 0, sizeof(struct pst_dynamic));
if (pstat_getdynamic(&psd, sizeof(psd), 1, 0) > 0) {
size_t nspu = psd.psd_max_proc_cnt;
psp = (struct pst_processor *)
malloc(nspu * sizeof(struct pst_processor));
(void)memset(psp, 0, nspu * sizeof(struct pst_processor));
if (pstat_getprocessor(psp, sizeof(struct pst_processor), nspu, 0) != -1) {
for (i = 0; i < nspu; i++) {
if (psp[i].psp_processor_state == PSP_SPU_ENABLED) {
cpu = netsnmp_cpu_get_byIdx( i, 1 );
sprintf( cpu->name, "cpu%d", i );
sprintf( cpu->descr, descr );
}
}
}
free(psp);
}
cpu_num = psd.psd_proc_cnt;
}
/*
* Load the latest CPU usage statistics
*/
int netsnmp_cpu_arch_load( netsnmp_cache *cache, void *magic )
{
int i;
struct pst_dynamic psd;
struct pst_processor *psp;
struct pst_vminfo psv;
netsnmp_cpu_info *cpu = netsnmp_cpu_get_byIdx( -1, 0 );
if (pstat_getdynamic(&psd, sizeof(psd), 1, 0) > 0) {
size_t nspu = psd.psd_max_proc_cnt;
/* XXX - Compare cpu_num against psd.psd_proc_cnt */
cpu->user_ticks = (unsigned long long)psd.psd_cpu_time[CP_USER];
cpu->nice_ticks = (unsigned long long)psd.psd_cpu_time[CP_NICE];
cpu->sys2_ticks = (unsigned long long)psd.psd_cpu_time[CP_SYS]+
(unsigned long long)psd.psd_cpu_time[CP_WAIT];
cpu->idle_ticks = (unsigned long long)psd.psd_cpu_time[CP_IDLE];
cpu->wait_ticks = (unsigned long long)psd.psd_cpu_time[CP_WAIT];
cpu->kern_ticks = (unsigned long long)psd.psd_cpu_time[CP_SYS];
/* XXX - record (sum of) "all other ticks" */
/* intrpt_ticks, sirq_ticks unused */
/*
* Interrupt/Context Switch statistics
* XXX - Do these really belong here ?
*/
pstat_getvminfo(&psv, sizeof(psv), 1, 0);
cpu->swapIn = (unsigned long long)psv.psv_sswpin;
cpu->swapOut = (unsigned long long)psv.psv_sswpout;
cpu->nInterrupts = (unsigned long long)psv.psv_sintr;
cpu->nCtxSwitches = (unsigned long long)psv.psv_sswtch;
psp = (struct pst_processor *)
malloc(nspu * sizeof(struct pst_processor));
(void)memset(psp, 0, nspu * sizeof(struct pst_processor));
if (pstat_getprocessor(psp, sizeof(struct pst_processor), nspu, 0) != -1) {
for (i = 0; i < nspu; i++) {
if (psp[i].psp_processor_state == PSP_SPU_ENABLED) {
cpu = netsnmp_cpu_get_byIdx( i, 0 );
cpu->user_ticks = (unsigned long long)psp[i].psp_cpu_time[CP_USER];
cpu->nice_ticks = (unsigned long long)psp[i].psp_cpu_time[CP_NICE];
cpu->sys2_ticks = (unsigned long long)psp[i].psp_cpu_time[CP_SYS]+
(unsigned long long)psp[i].psp_cpu_time[CP_WAIT];
cpu->idle_ticks = (unsigned long long)psp[i].psp_cpu_time[CP_IDLE];
cpu->wait_ticks = (unsigned long long)psp[i].psp_cpu_time[CP_WAIT];
cpu->kern_ticks = (unsigned long long)psp[i].psp_cpu_time[CP_SYS];
}
}
}
free(psp);
}
return 0;
}