1ff7125a6SMarcel Moolenaar /*- 2*4d846d26SWarner Losh * SPDX-License-Identifier: BSD-2-Clause 3af3dc4a7SPedro F. Giffuni * 40ce207d2SRui Paulo * Copyright (c) 2009 Rui Paulo <rpaulo@FreeBSD.org> 50ce207d2SRui Paulo * All rights reserved. 60ce207d2SRui Paulo * 70ce207d2SRui Paulo * Redistribution and use in source and binary forms, with or without 80ce207d2SRui Paulo * modification, are permitted provided that the following conditions 90ce207d2SRui Paulo * are met: 100ce207d2SRui Paulo * 1. Redistributions of source code must retain the above copyright 110ce207d2SRui Paulo * notice, this list of conditions and the following disclaimer. 120ce207d2SRui Paulo * 2. Redistributions in binary form must reproduce the above copyright 130ce207d2SRui Paulo * notice, this list of conditions and the following disclaimer in the 140ce207d2SRui Paulo * documentation and/or other materials provided with the distribution. 150ce207d2SRui Paulo * 160ce207d2SRui Paulo * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 170ce207d2SRui Paulo * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 180ce207d2SRui Paulo * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 190ce207d2SRui Paulo * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, 200ce207d2SRui Paulo * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 210ce207d2SRui Paulo * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 220ce207d2SRui Paulo * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 230ce207d2SRui Paulo * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 240ce207d2SRui Paulo * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 250ce207d2SRui Paulo * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 260ce207d2SRui Paulo * POSSIBILITY OF SUCH DAMAGE. 27ff7125a6SMarcel Moolenaar */ 28ff7125a6SMarcel Moolenaar 29ff7125a6SMarcel Moolenaar #ifndef _MACHINE_PMC_MDEP_H_ 30ff7125a6SMarcel Moolenaar #define _MACHINE_PMC_MDEP_H_ 31ff7125a6SMarcel Moolenaar 326411d14dSRuslan Bukin #define PMC_MDEP_CLASS_INDEX_ARMV7 1 330ce207d2SRui Paulo /* 340ce207d2SRui Paulo * On the ARM platform we support the following PMCs. 350ce207d2SRui Paulo * 366411d14dSRuslan Bukin * ARMV7 ARM Cortex-A processors 370ce207d2SRui Paulo */ 386411d14dSRuslan Bukin #include <dev/hwpmc/hwpmc_armv7.h> 390ce207d2SRui Paulo 40f263522aSJoseph Koshy union pmc_md_op_pmcallocate { 41f263522aSJoseph Koshy uint64_t __pad[4]; 42f263522aSJoseph Koshy }; 43f263522aSJoseph Koshy 44f263522aSJoseph Koshy /* Logging */ 45f263522aSJoseph Koshy #define PMCLOG_READADDR PMCLOG_READ32 46f263522aSJoseph Koshy #define PMCLOG_EMITADDR PMCLOG_EMIT32 47f263522aSJoseph Koshy 480ce207d2SRui Paulo #ifdef _KERNEL 49f263522aSJoseph Koshy union pmc_md_pmc { 506411d14dSRuslan Bukin struct pmc_md_armv7_pmc pm_armv7; 51f263522aSJoseph Koshy }; 52f263522aSJoseph Koshy 53aba91805SMitchell Horne #define PMC_IN_KERNEL_STACK(va) kstack_contains(curthread, (va), sizeof(va)) 540ede88a4SBjoern A. Zeeb #define PMC_IN_KERNEL(va) INKERNEL((va)) 55790fb4edSFabien Thomas #define PMC_IN_USERSPACE(va) ((va) <= VM_MAXUSER_ADDRESS) 56790fb4edSFabien Thomas 570ce207d2SRui Paulo #define PMC_TRAPFRAME_TO_PC(TF) ((TF)->tf_pc) 58790fb4edSFabien Thomas #define PMC_TRAPFRAME_TO_FP(TF) ((TF)->tf_r11) 59790fb4edSFabien Thomas #define PMC_TRAPFRAME_TO_SVC_SP(TF) ((TF)->tf_svc_sp) 60790fb4edSFabien Thomas #define PMC_TRAPFRAME_TO_USR_SP(TF) ((TF)->tf_usr_sp) 610ede88a4SBjoern A. Zeeb #define PMC_TRAPFRAME_TO_SVC_LR(TF) ((TF)->tf_svc_lr) 620ede88a4SBjoern A. Zeeb #define PMC_TRAPFRAME_TO_USR_LR(TF) ((TF)->tf_usr_lr) 630da7aa7aSJoseph Koshy 644cc50ab4SFabien Thomas /* Build a fake kernel trapframe from current instruction pointer. */ 654cc50ab4SFabien Thomas #define PMC_FAKE_TRAPFRAME(TF) \ 664cc50ab4SFabien Thomas do { \ 67d42aefeeSFabien Thomas (TF)->tf_spsr = PSR_SVC32_MODE; \ 684cc50ab4SFabien Thomas __asm __volatile("mov %0, pc" : "=r" ((TF)->tf_pc)); \ 69d42aefeeSFabien Thomas __asm __volatile("mov %0, r11" : "=r" ((TF)->tf_r11)); \ 704cc50ab4SFabien Thomas } while (0) 714cc50ab4SFabien Thomas 720ce207d2SRui Paulo /* 730ce207d2SRui Paulo * Prototypes 740ce207d2SRui Paulo */ 756411d14dSRuslan Bukin struct pmc_mdep *pmc_armv7_initialize(void); 766411d14dSRuslan Bukin void pmc_armv7_finalize(struct pmc_mdep *_md); 770ce207d2SRui Paulo #endif /* _KERNEL */ 78f263522aSJoseph Koshy 79ff7125a6SMarcel Moolenaar #endif /* !_MACHINE_PMC_MDEP_H_ */ 80