static unsigned long phs_ptr_offset;
#define pmu_get_hart_state_ptr(__scratch) \
- sbi_scratch_read_type((__scratch), void *, phs_ptr_offset)
+ phs_ptr_offset ? sbi_scratch_read_type((__scratch), void *, phs_ptr_offset) : NULL
#define pmu_thishart_state_ptr() \
pmu_get_hart_state_ptr(sbi_scratch_thishart_ptr())
uint32_t event_code;
struct sbi_pmu_hart_state *phs = pmu_thishart_state_ptr();
+ if (unlikely(!phs))
+ return SBI_EINVAL;
+
event_idx_type = pmu_ctr_validate(phs, cidx, &event_code);
if (event_idx_type != SBI_PMU_EVENT_TYPE_FW)
return SBI_EINVAL;
unsigned long flags, uint64_t ival)
{
struct sbi_pmu_hart_state *phs = pmu_thishart_state_ptr();
+
+ if (unlikely(!phs))
+ return SBI_EINVAL;
+
int event_idx_type;
uint32_t event_code;
int ret = SBI_EINVAL;
unsigned long flag)
{
struct sbi_pmu_hart_state *phs = pmu_thishart_state_ptr();
+
+ if (unlikely(!phs))
+ return SBI_EINVAL;
+
int ret = SBI_EINVAL;
int event_idx_type;
uint32_t event_code;
uint64_t event_data)
{
struct sbi_pmu_hart_state *phs = pmu_thishart_state_ptr();
+
+ if (unlikely(!phs))
+ return SBI_EINVAL;
+
int ret, event_type, ctr_idx = SBI_ENOTSUPP;
u32 event_code;
uint64_t *fcounter = NULL;
struct sbi_pmu_hart_state *phs = pmu_thishart_state_ptr();
+ if (unlikely(!phs))
+ return 0;
+
if (likely(!phs->fw_counters_started))
return 0;
void sbi_pmu_exit(struct sbi_scratch *scratch)
{
+ struct sbi_pmu_hart_state *phs = pmu_get_hart_state_ptr(scratch);
+
if (sbi_hart_priv_version(scratch) >= SBI_HART_PRIV_VER_1_11)
csr_write(CSR_MCOUNTINHIBIT, 0xFFFFFFF8);
if (sbi_hart_priv_version(scratch) >= SBI_HART_PRIV_VER_1_10)
csr_write(CSR_MCOUNTEREN, -1);
- pmu_reset_event_map(pmu_get_hart_state_ptr(scratch));
+ if (unlikely(!phs))
+ return;
+
+ pmu_reset_event_map(phs);
}
int sbi_pmu_init(struct sbi_scratch *scratch, bool cold_boot)