1145332Smarcel/*-
2200928Srpaulo * Copyright (c) 2009 Rui Paulo <rpaulo@FreeBSD.org>
3200928Srpaulo * All rights reserved.
4145332Smarcel *
5200928Srpaulo * Redistribution and use in source and binary forms, with or without
6200928Srpaulo * modification, are permitted provided that the following conditions
7200928Srpaulo * are met:
8200928Srpaulo * 1. Redistributions of source code must retain the above copyright
9200928Srpaulo *    notice, this list of conditions and the following disclaimer.
10200928Srpaulo * 2. Redistributions in binary form must reproduce the above copyright
11200928Srpaulo *    notice, this list of conditions and the following disclaimer in the
12200928Srpaulo *    documentation and/or other materials provided with the distribution.
13200928Srpaulo *
14200928Srpaulo * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
15200928Srpaulo * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
16200928Srpaulo * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
17200928Srpaulo * DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
18200928Srpaulo * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
19200928Srpaulo * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
20200928Srpaulo * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21200928Srpaulo * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
22200928Srpaulo * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
23200928Srpaulo * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
24200928Srpaulo * POSSIBILITY OF SUCH DAMAGE.
25200928Srpaulo *
26145332Smarcel * $FreeBSD$
27145332Smarcel */
28145332Smarcel
29145332Smarcel#ifndef _MACHINE_PMC_MDEP_H_
30145332Smarcel#define	_MACHINE_PMC_MDEP_H_
31145332Smarcel
32233628Sfabient#define	PMC_MDEP_CLASS_INDEX_XSCALE	1
33277835Sbr#define	PMC_MDEP_CLASS_INDEX_ARMV7	1
34200928Srpaulo/*
35200928Srpaulo * On the ARM platform we support the following PMCs.
36200928Srpaulo *
37200928Srpaulo * XSCALE	Intel XScale processors
38277835Sbr * ARMV7	ARM Cortex-A processors
39200928Srpaulo */
40200928Srpaulo#include <dev/hwpmc/hwpmc_xscale.h>
41277835Sbr#include <dev/hwpmc/hwpmc_armv7.h>
42200928Srpaulo
43147191Sjkoshyunion pmc_md_op_pmcallocate {
44147191Sjkoshy	uint64_t	__pad[4];
45147191Sjkoshy};
46147191Sjkoshy
47147191Sjkoshy/* Logging */
48147191Sjkoshy#define	PMCLOG_READADDR		PMCLOG_READ32
49147191Sjkoshy#define	PMCLOG_EMITADDR		PMCLOG_EMIT32
50147191Sjkoshy
51200928Srpaulo#ifdef	_KERNEL
52147191Sjkoshyunion pmc_md_pmc {
53200928Srpaulo	struct pmc_md_xscale_pmc	pm_xscale;
54277835Sbr	struct pmc_md_armv7_pmc		pm_armv7;
55147191Sjkoshy};
56147191Sjkoshy
57236997Sfabient#define	PMC_IN_KERNEL_STACK(S,START,END)		\
58236997Sfabient	((S) >= (START) && (S) < (END))
59280737Sbz#define	PMC_IN_KERNEL(va)	INKERNEL((va))
60174405Sjkoshy
61236997Sfabient#define	PMC_IN_USERSPACE(va) ((va) <= VM_MAXUSER_ADDRESS)
62236997Sfabient
63236997Sfabient#define	PMC_TRAPFRAME_TO_PC(TF)		((TF)->tf_pc)
64236997Sfabient#define	PMC_TRAPFRAME_TO_FP(TF)		((TF)->tf_r11)
65236997Sfabient#define	PMC_TRAPFRAME_TO_SVC_SP(TF)	((TF)->tf_svc_sp)
66236997Sfabient#define	PMC_TRAPFRAME_TO_USR_SP(TF)	((TF)->tf_usr_sp)
67280737Sbz#define	PMC_TRAPFRAME_TO_SVC_LR(TF)	((TF)->tf_svc_lr)
68280737Sbz#define	PMC_TRAPFRAME_TO_USR_LR(TF)	((TF)->tf_usr_lr)
69236997Sfabient
70235831Sfabient/* Build a fake kernel trapframe from current instruction pointer. */
71235831Sfabient#define PMC_FAKE_TRAPFRAME(TF)						\
72235831Sfabient	do {								\
73235831Sfabient	__asm __volatile("mov %0, pc" : "=r" ((TF)->tf_pc));		\
74235831Sfabient	} while (0)
75235831Sfabient
76200928Srpaulo/*
77200928Srpaulo * Prototypes
78200928Srpaulo */
79200928Srpaulostruct pmc_mdep *pmc_xscale_initialize(void);
80200928Srpaulovoid		pmc_xscale_finalize(struct pmc_mdep *_md);
81277835Sbrstruct pmc_mdep *pmc_armv7_initialize(void);
82277835Sbrvoid		pmc_armv7_finalize(struct pmc_mdep *_md);
83200928Srpaulo#endif /* _KERNEL */
84147191Sjkoshy
85145332Smarcel#endif /* !_MACHINE_PMC_MDEP_H_ */
86