diff options
| author | Harrison Mutai <harrison.mutai@arm.com> | 2026-06-23 14:52:19 +0000 |
|---|---|---|
| committer | TrustedFirmware Code Review <review@review.trustedfirmware.org> | 2026-06-23 14:52:19 +0000 |
| commit | c69734c36f503f99b3b8ba7453891f26404debad (patch) | |
| tree | 825f485d9015d1be8e076d7bdace5ffca2cde1d3 /include | |
| parent | d4362918f079888c3522b5f2a89497e1f416d8e5 (diff) | |
| parent | c48a114c6f875d2ee6fb61f7b70e0a68d2762c4d (diff) | |
| download | arm-trusted-firmware-c69734c36f503f99b3b8ba7453891f26404debad.tar.gz arm-trusted-firmware-c69734c36f503f99b3b8ba7453891f26404debad.zip | |
Merge changes from topic "ar/brbev1p1" into integration
* changes:
fix(cpufeat): invalidate the FEAT_BRBE buffer after reset
feat(cpufeat): add support for FEAT_BRBEv1p1
Diffstat (limited to 'include')
| -rw-r--r-- | include/arch/aarch64/arch.h | 124 | ||||
| -rw-r--r-- | include/arch/aarch64/arch_features.h | 5 | ||||
| -rw-r--r-- | include/arch/aarch64/arch_helpers.h | 117 | ||||
| -rw-r--r-- | include/lib/extensions/brbe.h | 45 |
4 files changed, 288 insertions, 3 deletions
diff --git a/include/arch/aarch64/arch.h b/include/arch/aarch64/arch.h index 966e060b1..bbd04ded1 100644 --- a/include/arch/aarch64/arch.h +++ b/include/arch/aarch64/arch.h @@ -1813,7 +1813,129 @@ /******************************************************************************* * FEAT_BRBE - Branch Record Buffer Extension Registers ******************************************************************************/ -#define BRBCR_EL2 S2_4_C9_C0_0 +#define BRBE_RECORDS_PER_BANK 32 + +#define BRBCR_EL2 S2_4_C9_C0_0 + +#define BRBFCR_EL1 S2_1_C9_C0_1 +#define BRBFCR_EL1_PAUSED_BIT BIT(7) +#define BRBFCR_EL1_INDCALL_BIT BIT(20) +#define BRBFCR_EL1_DIRCALL_BIT BIT(21) +#define BRBFCR_EL1_BANK_SHIFT U(28) +#define BRBFCR_EL1_BANK_WIDTH U(2) + +#define BRBIDR0_EL1 S2_1_C9_C2_0 +#define BRBIDR0_EL1_NUMREC_SHIFT UL(0) +#define BRBIDR0_EL1_NUMREC_WIDTH UL(8) + +#define BRBINFINJ_EL1 S2_1_C9_C1_0 +#define BRBSRCINJ_EL1 S2_1_C9_C1_1 +#define BRBTGTINJ_EL1 S2_1_C9_C1_2 + +#define BRBINF0_EL1 S2_1_C8_C0_0 +#define BRBINF1_EL1 S2_1_C8_C1_0 +#define BRBINF2_EL1 S2_1_C8_C2_0 +#define BRBINF3_EL1 S2_1_C8_C3_0 +#define BRBINF4_EL1 S2_1_C8_C4_0 +#define BRBINF5_EL1 S2_1_C8_C5_0 +#define BRBINF6_EL1 S2_1_C8_C6_0 +#define BRBINF7_EL1 S2_1_C8_C7_0 +#define BRBINF8_EL1 S2_1_C8_C8_0 +#define BRBINF9_EL1 S2_1_C8_C9_0 +#define BRBINF10_EL1 S2_1_C8_C10_0 +#define BRBINF11_EL1 S2_1_C8_C11_0 +#define BRBINF12_EL1 S2_1_C8_C12_0 +#define BRBINF13_EL1 S2_1_C8_C13_0 +#define BRBINF14_EL1 S2_1_C8_C14_0 +#define BRBINF15_EL1 S2_1_C8_C15_0 +#define BRBINF16_EL1 S2_1_C8_C0_4 +#define BRBINF17_EL1 S2_1_C8_C1_4 +#define BRBINF18_EL1 S2_1_C8_C2_4 +#define BRBINF19_EL1 S2_1_C8_C3_4 +#define BRBINF20_EL1 S2_1_C8_C4_4 +#define BRBINF21_EL1 S2_1_C8_C5_4 +#define BRBINF22_EL1 S2_1_C8_C6_4 +#define BRBINF23_EL1 S2_1_C8_C7_4 +#define BRBINF24_EL1 S2_1_C8_C8_4 +#define BRBINF25_EL1 S2_1_C8_C9_4 +#define BRBINF26_EL1 S2_1_C8_C10_4 +#define BRBINF27_EL1 S2_1_C8_C11_4 +#define BRBINF28_EL1 S2_1_C8_C12_4 +#define BRBINF29_EL1 S2_1_C8_C13_4 +#define BRBINF30_EL1 S2_1_C8_C14_4 +#define BRBINF31_EL1 S2_1_C8_C15_4 +#define BRBINF_VALID_SHIFT U(0) +#define BRBINF_VALID_WIDTH U(3) +#define BRBINF_INVALID U(0x0) +#define BRBINF_HALF_TGT U(0x1) +#define BRBINF_HALF_SRC U(0x2) +#define BRBINF_FULL U(0x3) + +#define BRBSRC0_EL1 S2_1_C8_C0_1 +#define BRBSRC1_EL1 S2_1_C8_C1_1 +#define BRBSRC2_EL1 S2_1_C8_C2_1 +#define BRBSRC3_EL1 S2_1_C8_C3_1 +#define BRBSRC4_EL1 S2_1_C8_C4_1 +#define BRBSRC5_EL1 S2_1_C8_C5_1 +#define BRBSRC6_EL1 S2_1_C8_C6_1 +#define BRBSRC7_EL1 S2_1_C8_C7_1 +#define BRBSRC8_EL1 S2_1_C8_C8_1 +#define BRBSRC9_EL1 S2_1_C8_C9_1 +#define BRBSRC10_EL1 S2_1_C8_C10_1 +#define BRBSRC11_EL1 S2_1_C8_C11_1 +#define BRBSRC12_EL1 S2_1_C8_C12_1 +#define BRBSRC13_EL1 S2_1_C8_C13_1 +#define BRBSRC14_EL1 S2_1_C8_C14_1 +#define BRBSRC15_EL1 S2_1_C8_C15_1 +#define BRBSRC16_EL1 S2_1_C8_C0_5 +#define BRBSRC17_EL1 S2_1_C8_C1_5 +#define BRBSRC18_EL1 S2_1_C8_C2_5 +#define BRBSRC19_EL1 S2_1_C8_C3_5 +#define BRBSRC20_EL1 S2_1_C8_C4_5 +#define BRBSRC21_EL1 S2_1_C8_C5_5 +#define BRBSRC22_EL1 S2_1_C8_C6_5 +#define BRBSRC23_EL1 S2_1_C8_C7_5 +#define BRBSRC24_EL1 S2_1_C8_C8_5 +#define BRBSRC25_EL1 S2_1_C8_C9_5 +#define BRBSRC26_EL1 S2_1_C8_C10_5 +#define BRBSRC27_EL1 S2_1_C8_C11_5 +#define BRBSRC28_EL1 S2_1_C8_C12_5 +#define BRBSRC29_EL1 S2_1_C8_C13_5 +#define BRBSRC30_EL1 S2_1_C8_C14_5 +#define BRBSRC31_EL1 S2_1_C8_C15_5 + +#define BRBTGT0_EL1 S2_1_C8_C0_2 +#define BRBTGT1_EL1 S2_1_C8_C1_2 +#define BRBTGT2_EL1 S2_1_C8_C2_2 +#define BRBTGT3_EL1 S2_1_C8_C3_2 +#define BRBTGT4_EL1 S2_1_C8_C4_2 +#define BRBTGT5_EL1 S2_1_C8_C5_2 +#define BRBTGT6_EL1 S2_1_C8_C6_2 +#define BRBTGT7_EL1 S2_1_C8_C7_2 +#define BRBTGT8_EL1 S2_1_C8_C8_2 +#define BRBTGT9_EL1 S2_1_C8_C9_2 +#define BRBTGT10_EL1 S2_1_C8_C10_2 +#define BRBTGT11_EL1 S2_1_C8_C11_2 +#define BRBTGT12_EL1 S2_1_C8_C12_2 +#define BRBTGT13_EL1 S2_1_C8_C13_2 +#define BRBTGT14_EL1 S2_1_C8_C14_2 +#define BRBTGT15_EL1 S2_1_C8_C15_2 +#define BRBTGT16_EL1 S2_1_C8_C0_6 +#define BRBTGT17_EL1 S2_1_C8_C1_6 +#define BRBTGT18_EL1 S2_1_C8_C2_6 +#define BRBTGT19_EL1 S2_1_C8_C3_6 +#define BRBTGT20_EL1 S2_1_C8_C4_6 +#define BRBTGT21_EL1 S2_1_C8_C5_6 +#define BRBTGT22_EL1 S2_1_C8_C6_6 +#define BRBTGT23_EL1 S2_1_C8_C7_6 +#define BRBTGT24_EL1 S2_1_C8_C8_6 +#define BRBTGT25_EL1 S2_1_C8_C9_6 +#define BRBTGT26_EL1 S2_1_C8_C10_6 +#define BRBTGT27_EL1 S2_1_C8_C11_6 +#define BRBTGT28_EL1 S2_1_C8_C12_6 +#define BRBTGT29_EL1 S2_1_C8_C13_6 +#define BRBTGT30_EL1 S2_1_C8_C14_6 +#define BRBTGT31_EL1 S2_1_C8_C15_6 /******************************************************************************* * FEAT_LS64_ACCDATA - LoadStore64B with status data diff --git a/include/arch/aarch64/arch_features.h b/include/arch/aarch64/arch_features.h index d59444f23..eac18405a 100644 --- a/include/arch/aarch64/arch_features.h +++ b/include/arch/aarch64/arch_features.h @@ -346,6 +346,10 @@ gen(feat_mec, id_aa64mmfr3_el1, ENABLE_FEAT_MEC, \ ID_AA64MMFR3_EL1_MEC, 1U, 1U, FEAT_ENABLE_ALL_WORLDS) +#define FEAT_BRBEV1P1(gen) \ + gen(feat_brbev1p1, id_aa64dfr0_el1, ENABLE_FEAT_BRBEV1P1, \ + ID_AA64DFR0_BRBE, 2U, 2U, FEAT_ENABLE_ALL_WORLDS) + /* === v9.4 features === */ #define FEAT_D128(gen) \ gen(feat_d128, id_aa64mmfr3_el1, ENABLE_FEAT_D128, \ @@ -520,6 +524,7 @@ FEAT_TRBE(gen) \ FEAT_BRBE(gen) \ FEAT_EBEP(gen) \ + FEAT_BRBEV1P1(gen) \ FEAT_SEBEP(gen) CPUFEAT_LIST(CREATE_FEATURE_FUNCS) diff --git a/include/arch/aarch64/arch_helpers.h b/include/arch/aarch64/arch_helpers.h index 923ad7156..c799b0c53 100644 --- a/include/arch/aarch64/arch_helpers.h +++ b/include/arch/aarch64/arch_helpers.h @@ -789,8 +789,123 @@ DEFINE_RENAME_SYSREG_RW_FUNCS(clusterpmmdcr_el3, CLUSTERPMMDCR_EL3) DEFINE_RENAME_SYSREG_RW_FUNCS(cpuppmcr_el3, CPUPPMCR_EL3) DEFINE_RENAME_SYSREG_RW_FUNCS(cpumpmmcr_el3, CPUMPMMCR_EL3) -/* Armv9.1 FEAT_BRBE Registers */ +/* Armv9.1 FEAT_BRBE instructions and registers */ +static inline void brbiall(void) +{ + __asm__ volatile("sys #1, c7, c2, 4" : : : "memory"); +} + +static inline void brbinj(void) +{ + __asm__ volatile("sys #1, c7, c2, 5" : : : "memory"); +} + DEFINE_RENAME_SYSREG_RW_FUNCS(brbcr_el2, BRBCR_EL2) +DEFINE_RENAME_SYSREG_RW_FUNCS(brbidr0_el1, BRBIDR0_EL1) +DEFINE_RENAME_SYSREG_RW_FUNCS(brbfcr_el1, BRBFCR_EL1) + +DEFINE_RENAME_SYSREG_RW_FUNCS(brbinfinj_el1, BRBINFINJ_EL1) +DEFINE_RENAME_SYSREG_RW_FUNCS(brbsrcinj_el1, BRBSRCINJ_EL1) +DEFINE_RENAME_SYSREG_RW_FUNCS(brbtgtinj_el1, BRBTGTINJ_EL1) + +DEFINE_RENAME_SYSREG_READ_FUNC(brbinf0_el1, BRBINF0_EL1) +DEFINE_RENAME_SYSREG_READ_FUNC(brbinf1_el1, BRBINF1_EL1) +DEFINE_RENAME_SYSREG_READ_FUNC(brbinf2_el1, BRBINF2_EL1) +DEFINE_RENAME_SYSREG_READ_FUNC(brbinf3_el1, BRBINF3_EL1) +DEFINE_RENAME_SYSREG_READ_FUNC(brbinf4_el1, BRBINF4_EL1) +DEFINE_RENAME_SYSREG_READ_FUNC(brbinf5_el1, BRBINF5_EL1) +DEFINE_RENAME_SYSREG_READ_FUNC(brbinf6_el1, BRBINF6_EL1) +DEFINE_RENAME_SYSREG_READ_FUNC(brbinf7_el1, BRBINF7_EL1) +DEFINE_RENAME_SYSREG_READ_FUNC(brbinf8_el1, BRBINF8_EL1) +DEFINE_RENAME_SYSREG_READ_FUNC(brbinf9_el1, BRBINF9_EL1) +DEFINE_RENAME_SYSREG_READ_FUNC(brbinf10_el1, BRBINF10_EL1) +DEFINE_RENAME_SYSREG_READ_FUNC(brbinf11_el1, BRBINF11_EL1) +DEFINE_RENAME_SYSREG_READ_FUNC(brbinf12_el1, BRBINF12_EL1) +DEFINE_RENAME_SYSREG_READ_FUNC(brbinf13_el1, BRBINF13_EL1) +DEFINE_RENAME_SYSREG_READ_FUNC(brbinf14_el1, BRBINF14_EL1) +DEFINE_RENAME_SYSREG_READ_FUNC(brbinf15_el1, BRBINF15_EL1) +DEFINE_RENAME_SYSREG_READ_FUNC(brbinf16_el1, BRBINF16_EL1) +DEFINE_RENAME_SYSREG_READ_FUNC(brbinf17_el1, BRBINF17_EL1) +DEFINE_RENAME_SYSREG_READ_FUNC(brbinf18_el1, BRBINF18_EL1) +DEFINE_RENAME_SYSREG_READ_FUNC(brbinf19_el1, BRBINF19_EL1) +DEFINE_RENAME_SYSREG_READ_FUNC(brbinf20_el1, BRBINF20_EL1) +DEFINE_RENAME_SYSREG_READ_FUNC(brbinf21_el1, BRBINF21_EL1) +DEFINE_RENAME_SYSREG_READ_FUNC(brbinf22_el1, BRBINF22_EL1) +DEFINE_RENAME_SYSREG_READ_FUNC(brbinf23_el1, BRBINF23_EL1) +DEFINE_RENAME_SYSREG_READ_FUNC(brbinf24_el1, BRBINF24_EL1) +DEFINE_RENAME_SYSREG_READ_FUNC(brbinf25_el1, BRBINF25_EL1) +DEFINE_RENAME_SYSREG_READ_FUNC(brbinf26_el1, BRBINF26_EL1) +DEFINE_RENAME_SYSREG_READ_FUNC(brbinf27_el1, BRBINF27_EL1) +DEFINE_RENAME_SYSREG_READ_FUNC(brbinf28_el1, BRBINF28_EL1) +DEFINE_RENAME_SYSREG_READ_FUNC(brbinf29_el1, BRBINF29_EL1) +DEFINE_RENAME_SYSREG_READ_FUNC(brbinf30_el1, BRBINF30_EL1) +DEFINE_RENAME_SYSREG_READ_FUNC(brbinf31_el1, BRBINF31_EL1) + +DEFINE_RENAME_SYSREG_READ_FUNC(brbsrc0_el1, BRBSRC0_EL1) +DEFINE_RENAME_SYSREG_READ_FUNC(brbsrc1_el1, BRBSRC1_EL1) +DEFINE_RENAME_SYSREG_READ_FUNC(brbsrc2_el1, BRBSRC2_EL1) +DEFINE_RENAME_SYSREG_READ_FUNC(brbsrc3_el1, BRBSRC3_EL1) +DEFINE_RENAME_SYSREG_READ_FUNC(brbsrc4_el1, BRBSRC4_EL1) +DEFINE_RENAME_SYSREG_READ_FUNC(brbsrc5_el1, BRBSRC5_EL1) +DEFINE_RENAME_SYSREG_READ_FUNC(brbsrc6_el1, BRBSRC6_EL1) +DEFINE_RENAME_SYSREG_READ_FUNC(brbsrc7_el1, BRBSRC7_EL1) +DEFINE_RENAME_SYSREG_READ_FUNC(brbsrc8_el1, BRBSRC8_EL1) +DEFINE_RENAME_SYSREG_READ_FUNC(brbsrc9_el1, BRBSRC9_EL1) +DEFINE_RENAME_SYSREG_READ_FUNC(brbsrc10_el1, BRBSRC10_EL1) +DEFINE_RENAME_SYSREG_READ_FUNC(brbsrc11_el1, BRBSRC11_EL1) +DEFINE_RENAME_SYSREG_READ_FUNC(brbsrc12_el1, BRBSRC12_EL1) +DEFINE_RENAME_SYSREG_READ_FUNC(brbsrc13_el1, BRBSRC13_EL1) +DEFINE_RENAME_SYSREG_READ_FUNC(brbsrc14_el1, BRBSRC14_EL1) +DEFINE_RENAME_SYSREG_READ_FUNC(brbsrc15_el1, BRBSRC15_EL1) +DEFINE_RENAME_SYSREG_READ_FUNC(brbsrc16_el1, BRBSRC16_EL1) +DEFINE_RENAME_SYSREG_READ_FUNC(brbsrc17_el1, BRBSRC17_EL1) +DEFINE_RENAME_SYSREG_READ_FUNC(brbsrc18_el1, BRBSRC18_EL1) +DEFINE_RENAME_SYSREG_READ_FUNC(brbsrc19_el1, BRBSRC19_EL1) +DEFINE_RENAME_SYSREG_READ_FUNC(brbsrc20_el1, BRBSRC20_EL1) +DEFINE_RENAME_SYSREG_READ_FUNC(brbsrc21_el1, BRBSRC21_EL1) +DEFINE_RENAME_SYSREG_READ_FUNC(brbsrc22_el1, BRBSRC22_EL1) +DEFINE_RENAME_SYSREG_READ_FUNC(brbsrc23_el1, BRBSRC23_EL1) +DEFINE_RENAME_SYSREG_READ_FUNC(brbsrc24_el1, BRBSRC24_EL1) +DEFINE_RENAME_SYSREG_READ_FUNC(brbsrc25_el1, BRBSRC25_EL1) +DEFINE_RENAME_SYSREG_READ_FUNC(brbsrc26_el1, BRBSRC26_EL1) +DEFINE_RENAME_SYSREG_READ_FUNC(brbsrc27_el1, BRBSRC27_EL1) +DEFINE_RENAME_SYSREG_READ_FUNC(brbsrc28_el1, BRBSRC28_EL1) +DEFINE_RENAME_SYSREG_READ_FUNC(brbsrc29_el1, BRBSRC29_EL1) +DEFINE_RENAME_SYSREG_READ_FUNC(brbsrc30_el1, BRBSRC30_EL1) +DEFINE_RENAME_SYSREG_READ_FUNC(brbsrc31_el1, BRBSRC31_EL1) + +DEFINE_RENAME_SYSREG_READ_FUNC(brbtgt0_el1, BRBTGT0_EL1) +DEFINE_RENAME_SYSREG_READ_FUNC(brbtgt1_el1, BRBTGT1_EL1) +DEFINE_RENAME_SYSREG_READ_FUNC(brbtgt2_el1, BRBTGT2_EL1) +DEFINE_RENAME_SYSREG_READ_FUNC(brbtgt3_el1, BRBTGT3_EL1) +DEFINE_RENAME_SYSREG_READ_FUNC(brbtgt4_el1, BRBTGT4_EL1) +DEFINE_RENAME_SYSREG_READ_FUNC(brbtgt5_el1, BRBTGT5_EL1) +DEFINE_RENAME_SYSREG_READ_FUNC(brbtgt6_el1, BRBTGT6_EL1) +DEFINE_RENAME_SYSREG_READ_FUNC(brbtgt7_el1, BRBTGT7_EL1) +DEFINE_RENAME_SYSREG_READ_FUNC(brbtgt8_el1, BRBTGT8_EL1) +DEFINE_RENAME_SYSREG_READ_FUNC(brbtgt9_el1, BRBTGT9_EL1) +DEFINE_RENAME_SYSREG_READ_FUNC(brbtgt10_el1, BRBTGT10_EL1) +DEFINE_RENAME_SYSREG_READ_FUNC(brbtgt11_el1, BRBTGT11_EL1) +DEFINE_RENAME_SYSREG_READ_FUNC(brbtgt12_el1, BRBTGT12_EL1) +DEFINE_RENAME_SYSREG_READ_FUNC(brbtgt13_el1, BRBTGT13_EL1) +DEFINE_RENAME_SYSREG_READ_FUNC(brbtgt14_el1, BRBTGT14_EL1) +DEFINE_RENAME_SYSREG_READ_FUNC(brbtgt15_el1, BRBTGT15_EL1) +DEFINE_RENAME_SYSREG_READ_FUNC(brbtgt16_el1, BRBTGT16_EL1) +DEFINE_RENAME_SYSREG_READ_FUNC(brbtgt17_el1, BRBTGT17_EL1) +DEFINE_RENAME_SYSREG_READ_FUNC(brbtgt18_el1, BRBTGT18_EL1) +DEFINE_RENAME_SYSREG_READ_FUNC(brbtgt19_el1, BRBTGT19_EL1) +DEFINE_RENAME_SYSREG_READ_FUNC(brbtgt20_el1, BRBTGT20_EL1) +DEFINE_RENAME_SYSREG_READ_FUNC(brbtgt21_el1, BRBTGT21_EL1) +DEFINE_RENAME_SYSREG_READ_FUNC(brbtgt22_el1, BRBTGT22_EL1) +DEFINE_RENAME_SYSREG_READ_FUNC(brbtgt23_el1, BRBTGT23_EL1) +DEFINE_RENAME_SYSREG_READ_FUNC(brbtgt24_el1, BRBTGT24_EL1) +DEFINE_RENAME_SYSREG_READ_FUNC(brbtgt25_el1, BRBTGT25_EL1) +DEFINE_RENAME_SYSREG_READ_FUNC(brbtgt26_el1, BRBTGT26_EL1) +DEFINE_RENAME_SYSREG_READ_FUNC(brbtgt27_el1, BRBTGT27_EL1) +DEFINE_RENAME_SYSREG_READ_FUNC(brbtgt28_el1, BRBTGT28_EL1) +DEFINE_RENAME_SYSREG_READ_FUNC(brbtgt29_el1, BRBTGT29_EL1) +DEFINE_RENAME_SYSREG_READ_FUNC(brbtgt30_el1, BRBTGT30_EL1) +DEFINE_RENAME_SYSREG_READ_FUNC(brbtgt31_el1, BRBTGT31_EL1) /* Armv9.2 RME Registers */ DEFINE_RENAME_SYSREG_RW_FUNCS(gptbr_el3, GPTBR_EL3) diff --git a/include/lib/extensions/brbe.h b/include/lib/extensions/brbe.h index 425a0377b..51e70adb4 100644 --- a/include/lib/extensions/brbe.h +++ b/include/lib/extensions/brbe.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022-2024, Arm Limited. All rights reserved. + * Copyright (c) 2022-2026, Arm Limited. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ @@ -11,10 +11,53 @@ #if ENABLE_BRBE_FOR_NS void brbe_enable(cpu_context_t *ctx); +void brbe_enable_el3(void); +void brbe_start_recording(void); +void brbe_stop_recording(void); +void _brbe_dump_branch_records(void); +static inline void brbe_dump_branch_records(void) +{ + u_register_t brbfcr = read_brbfcr_el1(); + + /* Pause branch recording so that we can dump without polluting the + * record. Do this in a static inline for zero extra branches. */ + write_brbfcr_el1(brbfcr | BRBFCR_EL1_PAUSED_BIT); + isb(); + + _brbe_dump_branch_records(); + + write_brbfcr_el1(brbfcr); + isb(); +} #else static inline void brbe_enable(cpu_context_t *ctx) { } +static inline void brbe_enable_el3(void) +{ +} +static inline void brbe_start_recording(void) +{ +} +static inline void brbe_stop_recording(void) +{ +} +static inline void brbe_dump_branch_records(void) +{ +} #endif /* ENABLE_BRBE_FOR_NS */ +/* Maximum number of branch records per bank (32 per bank, 2 banks max) */ +#define BRBE_MAX_RECORDS_PER_BANK U(32) +#define BRBE_MAX_BANKS U(2) +#define BRBE_MAX_RECORDS (BRBE_MAX_RECORDS_PER_BANK * BRBE_MAX_BANKS) + +/* BRBE context structure for save/restore */ +typedef struct brbe_regs { + u_register_t brbfcr_el1; + u_register_t records; + u_register_t brbinf[BRBE_MAX_RECORDS]; + u_register_t brbsrc[BRBE_MAX_RECORDS]; + u_register_t brbtgt[BRBE_MAX_RECORDS]; +} brbe_regs_t; #endif /* BRBE_H */ |
