From f754455e34963fc632cebc0c87319a954e80f507 Mon Sep 17 00:00:00 2001 From: Michael Rogenmoser Date: Wed, 2 Aug 2023 17:30:16 +0200 Subject: [PATCH] Add performance section code --- include/archi/hmr/hmr_v1.h | 3 ++ include/hal/cv32e40p/cv32e40p.h | 1 + include/hal/hmr/hmr_v1.h | 14 ++++-- include/pulp.h | 23 +++++++++ kernel/hmr_synch.c | 85 ++++++++++++++++++++++++++++++++- 5 files changed, 121 insertions(+), 5 deletions(-) diff --git a/include/archi/hmr/hmr_v1.h b/include/archi/hmr/hmr_v1.h index 7a4e0bf..6eb7b2b 100644 --- a/include/archi/hmr/hmr_v1.h +++ b/include/archi/hmr/hmr_v1.h @@ -88,6 +88,7 @@ extern "C" { #define HMR_REGISTERS_TMR_CONFIG_RELOAD_SETBACK_BIT 2 #define HMR_REGISTERS_TMR_CONFIG_RAPID_RECOVERY_BIT 3 #define HMR_REGISTERS_TMR_CONFIG_FORCE_RESYNCH_BIT 4 +#define HMR_REGISTERS_TMR_CONFIG_SYNCH_REQ_BIT 5 #ifdef __cplusplus } // extern "C" @@ -143,6 +144,7 @@ extern "C" { #define HMR_DMR_REGS_DMR_CONFIG_REG_OFFSET 0x4 #define HMR_DMR_REGS_DMR_CONFIG_RAPID_RECOVERY_BIT 0 #define HMR_DMR_REGS_DMR_CONFIG_FORCE_RECOVERY_BIT 1 +#define HMR_DMR_REGS_DMR_CONFIG_SETBACK_BIT 1 // Address for the last checkpoint. #define HMR_DMR_REGS_CHECKPOINT_ADDR_REG_OFFSET 0x8 @@ -175,6 +177,7 @@ extern "C" { #define HMR_TMR_REGS_TMR_CONFIG_RELOAD_SETBACK_BIT 2 #define HMR_TMR_REGS_TMR_CONFIG_RAPID_RECOVERY_BIT 3 #define HMR_TMR_REGS_TMR_CONFIG_FORCE_RESYNCH_BIT 4 +#define HMR_TMR_REGS_TMR_CONFIG_SYNCH_REQ_BIT 5 #ifdef __cplusplus } // extern "C" diff --git a/include/hal/cv32e40p/cv32e40p.h b/include/hal/cv32e40p/cv32e40p.h index 9319f5c..1a86ed8 100644 --- a/include/hal/cv32e40p/cv32e40p.h +++ b/include/hal/cv32e40p/cv32e40p.h @@ -26,6 +26,7 @@ #define CSR_PCMR_ACTIVE 0x1 #define SR_MTVEC 0x305 +#define CSR_MIE 0x304 diff --git a/include/hal/hmr/hmr_v1.h b/include/hal/hmr/hmr_v1.h index ea3d81c..bb7817c 100644 --- a/include/hal/hmr/hmr_v1.h +++ b/include/hal/hmr/hmr_v1.h @@ -153,24 +153,30 @@ static inline void hmr_disable_tmr(unsigned int cid, unsigned int tmr_id) { pulp_write32(ARCHI_HMR_GLOBAL_ADDR(cid) + HMR_TMR_OFFSET + HMR_TMR_INCREMENT*tmr_id + HMR_TMR_REGS_TMR_ENABLE_REG_OFFSET, 0); } -static inline void hmr_set_tmr_config(unsigned int cid, unsigned int tmr_id, bool delay_resynch, bool setback, bool reload_setback, bool rapid_recovery) { +static inline void hmr_set_tmr_config(unsigned int cid, unsigned int tmr_id, bool delay_resynch, bool setback, bool reload_setback, bool rapid_recovery, bool synch_req) { pulp_write32(ARCHI_HMR_GLOBAL_ADDR(0) + HMR_TMR_OFFSET + HMR_TMR_INCREMENT*tmr_id + HMR_TMR_REGS_TMR_CONFIG_REG_OFFSET, (delay_resynch ? 1< this should lock the cores together eu_bar_trig_wait_clr(eu_bar_addr(TMR_BARRIER_ID(TMR_GROUP_ID(core_id())))); @@ -438,6 +440,11 @@ void __attribute__((naked)) pos_hmr_tmr_synch() { pos_hmr_sw_reload(); } +void __attribute__((naked)) pos_hmr_tmr_synch() { + pos_hmr_tmr_synch_entry(); + pos_hmr_tmr_synch_exit(); +} + void __attribute__((naked)) pos_hmr_dmr_synch() { pos_hmr_store_part_to_stack(); @@ -499,6 +506,82 @@ int hmr_dmr_critical_section(int (*function_handle)()) { } } +void hmr_tmr_performance_section(void (*function_handle)()) { + __asm__ __volatile__( + "la ra, pos_hmr_perf_help\n\t" + "csrw 0x341, ra\n\t" + ); + volatile unsigned int tmr_group_id = TMR_GROUP_ID(core_id()); + unsigned int tmr_config = hmr_get_tmr_config(0, tmr_group_id); + hmr_set_tmr_config_bare(0, tmr_group_id, tmr_config & ~(1<