diff options
author | Giuseppe Calderaro <giuseppe.calderaro@arm.com> | 2012-05-09 15:47:45 +0100 |
---|---|---|
committer | Dietmar Eggemann <dietmar.eggemann@arm.com> | 2012-05-23 12:44:35 +0100 |
commit | 176c33821004226f380ce9a6fcf464d4bed06c29 (patch) | |
tree | f5ae4efdc76b702cce5e8489404d02184a4d5c6b /big-little | |
parent | 1c64fd3eacd9e163854aaf8042a28eef889580e4 (diff) |
Fixed PMCR event counters number on first cluster switch.
Diffstat (limited to 'big-little')
-rw-r--r-- | big-little/virtualisor/pmu_trap_handler.c | 50 |
1 files changed, 27 insertions, 23 deletions
diff --git a/big-little/virtualisor/pmu_trap_handler.c b/big-little/virtualisor/pmu_trap_handler.c index 7ebd8bf..d0ae63c 100644 --- a/big-little/virtualisor/pmu_trap_handler.c +++ b/big-little/virtualisor/pmu_trap_handler.c @@ -47,6 +47,7 @@ unsigned int migration_ctx[MAX_CORES][REGS]; * Defines for PMU states */ static int pmu_mode = PMU_STATE0; +static int pmu_counters; #define ENTRIES 15 struct descriptor { @@ -96,6 +97,7 @@ void set_pmu_vcnt(unsigned vcnts) unsigned long hdcr = read_hdcr(); hdcr |= vcnts & HDCR_HPMN_MASK; + pmu_counters = vcnts; write_hdcr(hdcr); #undef HDCR_HPMN_MASK @@ -170,7 +172,7 @@ static void handle_desc(struct descriptor *desc, switch (selected_counter) { case PMU_CNT_CYCLE_COUNTER: clusters_ctx - [cluster_id] + [entry_cluster] [cpu_id] [PMCNTENSET_IDX] &= 0x7FFFFFFF; break; @@ -183,7 +185,7 @@ static void handle_desc(struct descriptor *desc, case PMU_CNT_EVENT_COUNTER_3: selected_counter -= PMU_CNT_EVENT_COUNTER_0; clusters_ctx - [cluster_id] + [entry_cluster] [cpu_id] [PMCNTENSET_IDX] &= ~(1 << selected_counter); @@ -220,12 +222,13 @@ static void handle_desc(struct descriptor *desc, break; }; } else { - clusters_ctx[cluster_id][cpu_id][PMCR_IDX] |= 1; + clusters_ctx[entry_cluster][cpu_id][PMCR_IDX] |= + (pmu_counters << 11) | 1; switch (selected_counter) { case PMU_CNT_CYCLE_COUNTER: clusters_ctx - [cluster_id] + [entry_cluster] [cpu_id] [PMCNTENSET_IDX] |= 0x80000000; break; @@ -238,13 +241,13 @@ static void handle_desc(struct descriptor *desc, case PMU_CNT_EVENT_COUNTER_3: selected_counter -= PMU_CNT_EVENT_COUNTER_0; clusters_ctx - [cluster_id] + [entry_cluster] [cpu_id] [PMXEVTYPE0_IDX + - (selected_counter *2)] = + (selected_counter * 2)] = event_type; clusters_ctx - [cluster_id] + [entry_cluster] [cpu_id] [PMCNTENSET_IDX] |= (1 << selected_counter); @@ -283,16 +286,17 @@ static void handle_desc(struct descriptor *desc, break; }; } else { - clusters_ctx[cluster_id][cpu_id][PMCR_IDX] |= 1; + clusters_ctx[entry_cluster][cpu_id][PMCR_IDX] |= + (pmu_counters << 11) | 1; switch (selected_counter) { case PMU_CNT_CYCLE_COUNTER: clusters_ctx - [cluster_id] + [entry_cluster] [cpu_id] [PMCCNTR_IDX] = reset_value; clusters_ctx - [cluster_id] + [entry_cluster] [cpu_id] [PMCNTENSET_IDX] |= 0x80000000; @@ -305,17 +309,17 @@ static void handle_desc(struct descriptor *desc, case PMU_CNT_EVENT_COUNTER_3: selected_counter -= PMU_CNT_EVENT_COUNTER_0; clusters_ctx - [cluster_id] + [entry_cluster] [cpu_id] [PMXEVTYPE0_IDX + (selected_counter * 2)] = event_type; clusters_ctx - [cluster_id] + [entry_cluster] [cpu_id] [PMXEVCNT0_IDX + (selected_counter * 2)] = reset_value; clusters_ctx - [cluster_id] + [entry_cluster] [cpu_id] [PMCNTENSET_IDX] |= (1 << selected_counter); @@ -351,14 +355,14 @@ static void handle_desc(struct descriptor *desc, case PMU_CNT_CYCLE_COUNTER: desc->u.counter.counter_value = clusters_ctx - [cluster_id] + [entry_cluster] [cpu_id] [PMCCNTR_IDX]; break; case PMU_CNT_OVERFLOW_FLAG: desc->u.counter.counter_value = clusters_ctx - [cluster_id] + [entry_cluster] [cpu_id] [PMOVSR_IDX]; break; @@ -369,13 +373,13 @@ static void handle_desc(struct descriptor *desc, selected_counter -= PMU_CNT_EVENT_COUNTER_0; desc->u.counter.event_type = clusters_ctx - [cluster_id] + [entry_cluster] [cpu_id] [PMXEVTYPE0_IDX + (selected_counter * 2)]; desc->u.counter.counter_value = clusters_ctx - [cluster_id] + [entry_cluster] [cpu_id] [PMXEVCNT0_IDX + (selected_counter * 2)]; @@ -414,7 +418,7 @@ static void handle_desc(struct descriptor *desc, case PMU_CNT_CYCLE_COUNTER: desc->u.counter.counter_value = clusters_ctx - [cluster_id] + [entry_cluster] [cpu_id] [PMCCNTR_IDX]; clusters_ctx @@ -424,11 +428,11 @@ static void handle_desc(struct descriptor *desc, case PMU_CNT_OVERFLOW_FLAG: desc->u.counter.counter_value = clusters_ctx - [cluster_id] + [entry_cluster] [cpu_id] [PMOVSR_IDX]; clusters_ctx - [cluster_id] + [entry_cluster] [cpu_id] [PMOVSR_IDX] = reset_value; break; @@ -439,18 +443,18 @@ static void handle_desc(struct descriptor *desc, selected_counter -= PMU_CNT_EVENT_COUNTER_0; desc->u.counter.event_type = clusters_ctx - [cluster_id] + [entry_cluster] [cpu_id] [PMXEVTYPE0_IDX + (selected_counter * 2)]; desc->u.counter.counter_value = clusters_ctx - [cluster_id] + [entry_cluster] [cpu_id] [PMXEVCNT0_IDX + (selected_counter * 2)]; clusters_ctx - [cluster_id] + [entry_cluster] [cpu_id] [PMXEVCNT0_IDX + (selected_counter * 2)] = reset_value; |