#include <kern/machine.h>
#include <kern/processor.h>
#include <mach/machine.h>
#include <mach/processor_info.h>
#include <mach/mach_types.h>
#include <mach/boolean.h>
#include <kern/thread.h>
#include <kern/task.h>
#include <kern/ipc_kobject.h>
#include <mach/vm_param.h>
#include <ipc/port.h>
#include <ipc/ipc_entry.h>
#include <ipc/ipc_space.h>
#include <ipc/ipc_object.h>
#include <ipc/ipc_port.h>
#include <vm/vm_kern.h>
#include <vm/vm_map.h>
#include <vm/vm_page.h>
#include <vm/pmap.h>
#include <pexpert/pexpert.h>
#include <console/video_console.h>
#include <i386/cpu_data.h>
#include <i386/Diagnostics.h>
#include <i386/mp.h>
#include <i386/pmCPU.h>
#include <i386/tsc.h>
#include <i386/hpet.h>
#include <mach/i386/syscall_sw.h>
extern uint64_t lastNapClear;
diagWork dgWork;
uint64_t lastNapClear = 0ULL;
uint64_t lastRuptClear = 0ULL;
typedef struct pmdata {
uint64_t pmNapDur;
pmStats_t pmd;
} pmdata;
int
diagCall64(__unused x86_saved_state_t * regs)
{
panic("diagCall not yet supported for 64 bit tasks\n");
}
int
diagCall(x86_saved_state_t * state)
{
uint32_t stk, curpos, i, j;
uint32_t selector, data;
int err;
uint64_t currNap, durNap;
x86_saved_state32_t *regs;
assert(is_saved_state32(state));
regs = saved_state32(state);
if (!(dgWork.dgFlags & enaDiagSCs))
return 0;
stk = regs->uesp;
err = copyin((user_addr_t) (stk + 4), (char *) &selector, sizeof(uint32_t));
if (err) {
return 0;
}
switch (selector) {
case dgRuptStat:
err = copyin((user_addr_t) (stk + 8), (char *) &data, sizeof(uint32_t));
if (data == 0) {
for (i = 0; i < real_ncpus; i++) {
for (j = 0; j < 256; j++)
cpu_data_ptr[i]->cpu_hwIntCnt[j] = 0;
}
lastRuptClear = mach_absolute_time();
return 1;
}
err = copyin((user_addr_t) (stk + 8), (char *) &data, sizeof(uint32_t));
(void) copyout((char *) &real_ncpus, data, sizeof(real_ncpus));
currNap = mach_absolute_time();
durNap = currNap - lastRuptClear;
if (durNap == 0)
durNap = 1;
curpos = data + sizeof(real_ncpus);
for (i = 0; i < real_ncpus; i++) {
(void) copyout((char *) &durNap, curpos, 8);
(void) copyout((char *) &cpu_data_ptr[i]->cpu_hwIntCnt, curpos + 8, 256 * sizeof(uint32_t));
curpos = curpos + (256 * sizeof(uint32_t) + 8);
}
break;
default:
return 0;
}
return 1;
}