diff options
Diffstat (limited to 'big-little/virtualisor/pmu_trap_handler.c')
-rw-r--r-- | big-little/virtualisor/pmu_trap_handler.c | 240 |
1 files changed, 104 insertions, 136 deletions
diff --git a/big-little/virtualisor/pmu_trap_handler.c b/big-little/virtualisor/pmu_trap_handler.c index bf3f3b6..37eddf4 100644 --- a/big-little/virtualisor/pmu_trap_handler.c +++ b/big-little/virtualisor/pmu_trap_handler.c @@ -69,25 +69,25 @@ struct descriptor { enum { PMU_CLUSTER_A15 = 0x00, - PMU_CLUSTER_A7 = 0x01, + PMU_CLUSTER_A7 = 0x01, }; enum { - PMU_CNT_CYCLE_COUNTER = 0x00, - PMU_CNT_OVERFLOW_FLAG = 0x01, - PMU_CNT_EVENT_COUNTER_0 = 0x02, - PMU_CNT_EVENT_COUNTER_1 = 0x03, - PMU_CNT_EVENT_COUNTER_2 = 0x04, - PMU_CNT_EVENT_COUNTER_3 = 0x05, - PMU_CNT_EVENT_COUNTER_4 = 0x06, - PMU_CNT_EVENT_COUNTER_5 = 0x07, + PMU_CNT_CYCLE_COUNTER = 0x00, + PMU_CNT_OVERFLOW_FLAG = 0x01, + PMU_CNT_EVENT_COUNTER_0 = 0x02, + PMU_CNT_EVENT_COUNTER_1 = 0x03, + PMU_CNT_EVENT_COUNTER_2 = 0x04, + PMU_CNT_EVENT_COUNTER_3 = 0x05, + PMU_CNT_EVENT_COUNTER_4 = 0x06, + PMU_CNT_EVENT_COUNTER_5 = 0x07, }; enum { - PMU_REQ_DISABLE_COUNTER = 0x01, - PMU_REQ_CONF_COUNTER = 0x02, + PMU_REQ_DISABLE_COUNTER = 0x01, + PMU_REQ_CONF_COUNTER = 0x02, PMU_REQ_CONF_RESET_COUNTER = 0x03, - PMU_REQ_READ_COUNTER = 0x04, + PMU_REQ_READ_COUNTER = 0x04, PMU_REQ_READ_RESET_COUNTER = 0x05, }; @@ -138,8 +138,7 @@ void set_pmu_state(unsigned new) } static void handle_desc(struct descriptor *desc, - unsigned cluster_id, - unsigned cpu_id) + unsigned cluster_id, unsigned cpu_id) { unsigned entry_cluster = desc->u.counter.cluster_id; unsigned selected_counter = desc->u.counter.selected_counter; @@ -171,10 +170,9 @@ static void handle_desc(struct descriptor *desc, } else { switch (selected_counter) { case PMU_CNT_CYCLE_COUNTER: - clusters_ctx - [entry_cluster] - [cpu_id] - [PMCNTENSET_IDX] &= 0x7FFFFFFF; + clusters_ctx[entry_cluster] + [cpu_id] + [PMCNTENSET_IDX] &= 0x7FFFFFFF; break; case PMU_CNT_OVERFLOW_FLAG: /* Can't disable overflow flags. */ @@ -184,11 +182,10 @@ static void handle_desc(struct descriptor *desc, case PMU_CNT_EVENT_COUNTER_2: case PMU_CNT_EVENT_COUNTER_3: selected_counter -= PMU_CNT_EVENT_COUNTER_0; - clusters_ctx - [entry_cluster] - [cpu_id] - [PMCNTENSET_IDX] &= - ~(1 << selected_counter); + clusters_ctx[entry_cluster] + [cpu_id] + [PMCNTENSET_IDX] &= + ~(1 << selected_counter); break; default: break; @@ -223,14 +220,13 @@ static void handle_desc(struct descriptor *desc, }; } else { clusters_ctx[entry_cluster][cpu_id][PMCR_IDX] |= - (pmu_counters << 11) | 1; + (pmu_counters << 11) | 1; switch (selected_counter) { case PMU_CNT_CYCLE_COUNTER: - clusters_ctx - [entry_cluster] - [cpu_id] - [PMCNTENSET_IDX] |= 0x80000000; + clusters_ctx[entry_cluster] + [cpu_id] + [PMCNTENSET_IDX] |= 0x80000000; break; case PMU_CNT_OVERFLOW_FLAG: /* Can't configure overflow flags. */ @@ -240,17 +236,13 @@ static void handle_desc(struct descriptor *desc, case PMU_CNT_EVENT_COUNTER_2: case PMU_CNT_EVENT_COUNTER_3: selected_counter -= PMU_CNT_EVENT_COUNTER_0; - clusters_ctx - [entry_cluster] - [cpu_id] - [PMXEVTYPE0_IDX + - (selected_counter * 2)] = - event_type; - clusters_ctx - [entry_cluster] - [cpu_id] - [PMCNTENSET_IDX] |= - (1 << selected_counter); + clusters_ctx[entry_cluster] + [cpu_id] + [PMXEVTYPE0_IDX + + (selected_counter * 2)] = event_type; + clusters_ctx[entry_cluster] + [cpu_id] + [PMCNTENSET_IDX] |= (1 << selected_counter); break; default: break; @@ -287,19 +279,16 @@ static void handle_desc(struct descriptor *desc, }; } else { clusters_ctx[entry_cluster][cpu_id][PMCR_IDX] |= - (pmu_counters << 11) | 1; + (pmu_counters << 11) | 1; switch (selected_counter) { case PMU_CNT_CYCLE_COUNTER: - clusters_ctx - [entry_cluster] - [cpu_id] - [PMCCNTR_IDX] = reset_value; - clusters_ctx - [entry_cluster] - [cpu_id] - [PMCNTENSET_IDX] |= - 0x80000000; + clusters_ctx[entry_cluster] + [cpu_id] + [PMCCNTR_IDX] = reset_value; + clusters_ctx[entry_cluster] + [cpu_id] + [PMCNTENSET_IDX] |= 0x80000000; break; case PMU_CNT_OVERFLOW_FLAG: break; @@ -308,21 +297,17 @@ static void handle_desc(struct descriptor *desc, case PMU_CNT_EVENT_COUNTER_2: case PMU_CNT_EVENT_COUNTER_3: selected_counter -= PMU_CNT_EVENT_COUNTER_0; - clusters_ctx - [entry_cluster] - [cpu_id] - [PMXEVTYPE0_IDX + - (selected_counter * 2)] = event_type; - clusters_ctx - [entry_cluster] - [cpu_id] - [PMXEVCNT0_IDX + - (selected_counter * 2)] = reset_value; - clusters_ctx - [entry_cluster] - [cpu_id] - [PMCNTENSET_IDX] |= - (1 << selected_counter); + clusters_ctx[entry_cluster] + [cpu_id] + [PMXEVTYPE0_IDX + + (selected_counter * 2)] = event_type; + clusters_ctx[entry_cluster] + [cpu_id] + [PMXEVCNT0_IDX + + (selected_counter * 2)] = reset_value; + clusters_ctx[entry_cluster] + [cpu_id] + [PMCNTENSET_IDX] |= (1 << selected_counter); break; default: break; @@ -344,8 +329,9 @@ static void handle_desc(struct descriptor *desc, case PMU_CNT_EVENT_COUNTER_3: selected_counter -= PMU_CNT_EVENT_COUNTER_0; write_pmselr(selected_counter); - desc->u.counter.event_type=read_pmxevtyper(); - desc->u.counter.counter_value=read_pmxevcntr(); + desc->u.counter.event_type = read_pmxevtyper(); + desc->u.counter.counter_value = + read_pmxevcntr(); break; default: break; @@ -354,17 +340,15 @@ static void handle_desc(struct descriptor *desc, switch (selected_counter) { case PMU_CNT_CYCLE_COUNTER: desc->u.counter.counter_value = - clusters_ctx - [entry_cluster] - [cpu_id] - [PMCCNTR_IDX]; + clusters_ctx[entry_cluster] + [cpu_id] + [PMCCNTR_IDX]; break; case PMU_CNT_OVERFLOW_FLAG: desc->u.counter.counter_value = - clusters_ctx - [entry_cluster] - [cpu_id] - [PMOVSR_IDX]; + clusters_ctx[entry_cluster] + [cpu_id] + [PMOVSR_IDX]; break; case PMU_CNT_EVENT_COUNTER_0: case PMU_CNT_EVENT_COUNTER_1: @@ -372,17 +356,13 @@ static void handle_desc(struct descriptor *desc, case PMU_CNT_EVENT_COUNTER_3: selected_counter -= PMU_CNT_EVENT_COUNTER_0; desc->u.counter.event_type = - clusters_ctx - [entry_cluster] - [cpu_id] - [PMXEVTYPE0_IDX + - (selected_counter * 2)]; + clusters_ctx[entry_cluster] + [cpu_id] + [PMXEVTYPE0_IDX + (selected_counter * 2)]; desc->u.counter.counter_value = - clusters_ctx - [entry_cluster] - [cpu_id] - [PMXEVCNT0_IDX + - (selected_counter * 2)]; + clusters_ctx[entry_cluster] + [cpu_id] + [PMXEVCNT0_IDX + (selected_counter * 2)]; break; default: break; @@ -406,8 +386,9 @@ static void handle_desc(struct descriptor *desc, case PMU_CNT_EVENT_COUNTER_3: selected_counter -= PMU_CNT_EVENT_COUNTER_0; write_pmselr(selected_counter); - desc->u.counter.event_type=read_pmxevtyper(); - desc->u.counter.counter_value=read_pmxevcntr(); + desc->u.counter.event_type = read_pmxevtyper(); + desc->u.counter.counter_value = + read_pmxevcntr(); write_pmxevcntr(reset_value); break; default: @@ -417,24 +398,20 @@ static void handle_desc(struct descriptor *desc, switch (selected_counter) { case PMU_CNT_CYCLE_COUNTER: desc->u.counter.counter_value = - clusters_ctx - [entry_cluster] - [cpu_id] - [PMCCNTR_IDX]; - clusters_ctx - [cluster_id] - [cpu_id] - [PMCCNTR_IDX] = reset_value; + clusters_ctx[entry_cluster] + [cpu_id] + [PMCCNTR_IDX]; + clusters_ctx[cluster_id] + [cpu_id] + [PMCCNTR_IDX] = reset_value; case PMU_CNT_OVERFLOW_FLAG: desc->u.counter.counter_value = - clusters_ctx - [entry_cluster] - [cpu_id] - [PMOVSR_IDX]; - clusters_ctx - [entry_cluster] - [cpu_id] - [PMOVSR_IDX] = reset_value; + clusters_ctx[entry_cluster] + [cpu_id] + [PMOVSR_IDX]; + clusters_ctx[entry_cluster] + [cpu_id] + [PMOVSR_IDX] = reset_value; break; case PMU_CNT_EVENT_COUNTER_0: case PMU_CNT_EVENT_COUNTER_1: @@ -442,22 +419,17 @@ static void handle_desc(struct descriptor *desc, case PMU_CNT_EVENT_COUNTER_3: selected_counter -= PMU_CNT_EVENT_COUNTER_0; desc->u.counter.event_type = - clusters_ctx - [entry_cluster] - [cpu_id] - [PMXEVTYPE0_IDX + - (selected_counter * 2)]; + clusters_ctx[entry_cluster] + [cpu_id] + [PMXEVTYPE0_IDX + (selected_counter * 2)]; desc->u.counter.counter_value = - clusters_ctx - [entry_cluster] - [cpu_id] - [PMXEVCNT0_IDX + - (selected_counter * 2)]; - clusters_ctx - [entry_cluster] - [cpu_id] - [PMXEVCNT0_IDX + - (selected_counter * 2)] = reset_value; + clusters_ctx[entry_cluster] + [cpu_id] + [PMXEVCNT0_IDX + (selected_counter * 2)]; + clusters_ctx[entry_cluster] + [cpu_id] + [PMXEVCNT0_IDX + + (selected_counter * 2)] = reset_value; break; default: break; @@ -508,10 +480,9 @@ unsigned handle_pmu(unsigned opcode, unsigned first, unsigned second) ret = read_pmxevtyper(); } else { tmp = clusters_ctx[first][cpu_id][PMSELR_IDX]; - ret = clusters_ctx - [first] - [cpu_id] - [PMXEVTYPE0_IDX + (tmp * 2)]; + ret = clusters_ctx[first] + [cpu_id] + [PMXEVTYPE0_IDX + (tmp * 2)]; } break; case HVC_PMU_PMXEVTYPER_WRITE: @@ -519,10 +490,9 @@ unsigned handle_pmu(unsigned opcode, unsigned first, unsigned second) write_pmxevtyper(second); } else { tmp = clusters_ctx[first][cpu_id][PMSELR_IDX]; - clusters_ctx - [first] - [cpu_id] - [PMXEVTYPE0_IDX + (tmp * 2)] = second; + clusters_ctx[first] + [cpu_id] + [PMXEVTYPE0_IDX + (tmp * 2)] = second; } break; case HVC_PMU_PMCNTENSET_READ: @@ -578,10 +548,9 @@ unsigned handle_pmu(unsigned opcode, unsigned first, unsigned second) ret = read_pmxevcntr(); } else { tmp = clusters_ctx[first][cpu_id][PMSELR_IDX]; - ret = clusters_ctx - [first] - [cpu_id] - [PMXEVCNT0_IDX + (tmp * 2)]; + ret = clusters_ctx[first] + [cpu_id] + [PMXEVCNT0_IDX + (tmp * 2)]; } break; case HVC_PMU_PMXEVCNTR_WRITE: @@ -589,10 +558,9 @@ unsigned handle_pmu(unsigned opcode, unsigned first, unsigned second) write_pmxevcntr(second); } else { tmp = clusters_ctx[first][cpu_id][PMSELR_IDX]; - clusters_ctx - [first] - [cpu_id] - [PMXEVCNT0_IDX + (tmp * 2)] = second; + clusters_ctx[first] + [cpu_id] + [PMXEVCNT0_IDX + (tmp * 2)] = second; } break; case HVC_PMU_PMINTENSET_READ: @@ -629,7 +597,7 @@ unsigned handle_pmu(unsigned opcode, unsigned first, unsigned second) ret = sizeof(struct descriptor) * ENTRIES; break; case HVC_PMU_SYNC_PMU_COUNTERS: - { + { int i; int entries; unsigned int *pentries; @@ -641,8 +609,8 @@ unsigned handle_pmu(unsigned opcode, unsigned first, unsigned second) for (i = 0, desc++; i < entries; i++, desc++) { handle_desc(desc, cluster_id, cpu_id); } - } - break; + } + break; } return ret; |