예제 #1
0
static void TimeSamplingHandler (int sig, siginfo_t *siginfo, void *context)
{
	caddr_t pc;
#if defined(OS_FREEBSD) || defined(OS_DARWIN)
	ucontext_t *uc = (ucontext_t *) context;
#else
	struct ucontext *uc = (struct ucontext *) context;
	struct sigcontext *sc = (struct sigcontext *) &uc->uc_mcontext;
#endif

	UNREFERENCED_PARAMETER(sig);
	UNREFERENCED_PARAMETER(siginfo);

#if defined(IS_BGP_MACHINE) || defined(IS_BGQ_MACHINE)
	pc = (caddr_t)UCONTEXT_REG(uc, PPC_REG_PC);
#elif defined(OS_LINUX) || defined(OS_ANDROID)
# if defined(ARCH_IA32) && !defined(ARCH_IA32_x64)
	pc = (caddr_t)sc->eip;
# elif defined(ARCH_IA32) && defined(ARCH_IA32_x64)
	pc = (caddr_t)sc->rip;
# elif defined(ARCH_IA64)
	pc = (caddr_t)sc->sc_ip;
# elif defined(ARCH_PPC)
	pc = (caddr_t)sc->regs->nip;
# elif defined(ARCH_ARM) && !defined(ARCH_ARM64)
	pc = (caddr_t)sc->arm_pc;
# elif defined(ARCH_ARM) && defined(ARCH_ARM64)
	pc = (caddr_t)sc->pc;
# elif defined(ARCH_SPARC64)
    //pc = (caddr_t)sc->sigc_regs->tpc;
    //pc = (caddr_t)sc->mc_gregs->tpc;
    //pc = (caddr_t)sc->mc_gregs[MC_PC];
	pc = 0;
# else
#  error "Don't know how to get the PC for this architecture in Linux!"
# endif
#elif defined(OS_FREEBSD)
# if defined(ARCH_IA32) && !defined(ARCH_IA32_x64)
	pc = (caddr_t)(uc->uc_mcontext.mc_eip);
# elif defined (ARCH_IA32) && defined(ARCH_IA32_x64)
	pc = (caddr_t)(uc->uc_mcontext.mc_rip);
# else
#  error "Don't know how to get the PC for this architecture in FreeBSD!"
# endif
#elif defined(OS_DARWIN)
# if defined(ARCH_IA32) && !defined(ARCH_IA32_x64)
	pc = (caddr_t)((uc->uc_mcontext)->__ss.__eip);
# elif defined (ARCH_IA32) && defined(ARCH_IA32_x64)
	pc = (caddr_t)((uc->uc_mcontext)->__ss.__rip);
# else
#  error "Don't know how to get the PC for this architecture in Darwin!"
# endif
#else
# error "Don't know how to get the PC for this OS!"
#endif

	Extrae_SamplingHandler ((void*) pc);

	PrepareNextAlarm ();
}
예제 #2
0
void PAPI_sampling_handler (int EventSet, void *address, long_long overflow_vector, void *context)
{
	UNREFERENCED_PARAMETER(overflow_vector);
	UNREFERENCED_PARAMETER(context);
	UNREFERENCED_PARAMETER(EventSet);

	Extrae_SamplingHandler (address);
}