arch: arc: Added benchmark related hooks.

The benchmark application timing_info needs certain hooks to be
present in the kernel to get the accurate measurements. This
patch adds these hook at all the required locations.

Signed-off-by: Adithya Baglody <adithya.nagaraj.baglody@intel.com>
This commit is contained in:
Adithya Baglody 2018-06-27 14:10:30 +05:30 committed by Anas Nashif
commit db0c5ca08b
4 changed files with 145 additions and 0 deletions

View file

@ -19,6 +19,7 @@
#include <sw_isr_table.h> #include <sw_isr_table.h>
#include <kernel_structs.h> #include <kernel_structs.h>
#include <arch/cpu.h> #include <arch/cpu.h>
#include <swap_macros.h>
GTEXT(_isr_wrapper) GTEXT(_isr_wrapper)
GTEXT(_isr_demux) GTEXT(_isr_demux)
@ -229,6 +230,43 @@ From RIRQ:
*/ */
SECTION_FUNC(TEXT, _isr_wrapper) SECTION_FUNC(TEXT, _isr_wrapper)
#ifdef CONFIG_EXECUTION_BENCHMARKING
push_s r0
push_s blink
push_s r13
push_s r12
push r11
push r10
push r9
push r8
push r7
push r6
push r5
push r4
push_s r3
push_s r2
push_s r1
bl read_timer_start_of_isr
pop_s r1
pop_s r2
pop_s r3
pop r4
pop r5
pop r6
pop r7
pop r8
pop r9
pop r10
pop r11
pop_s r12
pop_s r13
pop_s blink
pop_s r0
#endif
#if CONFIG_ARC_FIRQ #if CONFIG_ARC_FIRQ
#if CONFIG_RGF_NUM_BANKS == 1 #if CONFIG_RGF_NUM_BANKS == 1
st r0,[saved_r0] st r0,[saved_r0]
@ -288,6 +326,7 @@ rirq_path:
j_s [r2] j_s [r2]
#endif #endif
#else #else
mov r3, _rirq_exit mov r3, _rirq_exit
mov r2, _rirq_enter mov r2, _rirq_enter
j_s [r2] j_s [r2]
@ -371,6 +410,42 @@ irq_hint_handled:
add3 r0, r1, r0 /* table entries are 8-bytes wide */ add3 r0, r1, r0 /* table entries are 8-bytes wide */
ld_s r1, [r0, 4] /* ISR into r1 */ ld_s r1, [r0, 4] /* ISR into r1 */
#ifdef CONFIG_EXECUTION_BENCHMARKING
push_s r0
push_s blink
push_s r13
push_s r12
push r11
push r10
push r9
push r8
push r7
push r6
push r5
push r4
push_s r3
push_s r2
push_s r1
bl read_timer_end_of_isr
pop_s r1
pop_s r2
pop_s r3
pop r4
pop r5
pop r6
pop r7
pop r8
pop r9
pop r10
pop r11
pop_s r12
pop_s r13
pop_s blink
pop_s r0
#endif
jl_s.d [r1] jl_s.d [r1]
ld_s r0, [r0] /* delay slot: ISR parameter into r0 */ ld_s r0, [r0] /* delay slot: ISR parameter into r0 */

View file

@ -61,6 +61,21 @@ GDATA(_kernel)
SECTION_FUNC(TEXT, __swap) SECTION_FUNC(TEXT, __swap)
#ifdef CONFIG_EXECUTION_BENCHMARKING
mov r1, _kernel
ld_s r2, [r1, _kernel_offset_to_current]
_save_callee_saved_regs
push_s r31
bl read_timer_start_of_swap
pop_s r31
mov r1, _kernel
ld_s r2, [r1, _kernel_offset_to_current]
_load_callee_saved_regs
st sp, [r2, _thread_offset_to_sp]
#endif
/* interrupts are locked, interrupt key is in r0 */ /* interrupts are locked, interrupt key is in r0 */
mov r1, _kernel mov r1, _kernel
@ -144,6 +159,11 @@ _swap_return_from_coop:
/* sflag instruction is not supported in current ARC GNU */ /* sflag instruction is not supported in current ARC GNU */
.long 0x00ff302f .long 0x00ff302f
#endif #endif
#ifdef CONFIG_EXECUTION_BENCHMARKING
b _capture_value_for_benchmarking
#endif
return_loc:
pop_s r3 /* status32 into r3 */ pop_s r3 /* status32 into r3 */
kflag r3 /* write status32 */ kflag r3 /* write status32 */
@ -196,4 +216,24 @@ _return_from_exc:
ld ilink, [sp, ___isf_t_status32_OFFSET - ___isf_t_pc_OFFSET] ld ilink, [sp, ___isf_t_status32_OFFSET - ___isf_t_pc_OFFSET]
sr ilink, [_ARC_V2_ERSTATUS] sr ilink, [_ARC_V2_ERSTATUS]
add_s sp, sp, ___isf_t_status32_OFFSET - ___isf_t_pc_OFFSET + 4 add_s sp, sp, ___isf_t_status32_OFFSET - ___isf_t_pc_OFFSET + 4
rtie rtie
#ifdef CONFIG_EXECUTION_BENCHMARKING
.balign 4
_capture_value_for_benchmarking:
mov r1, _kernel
ld_s r2, [r1, _kernel_offset_to_current]
_save_callee_saved_regs
push_s blink
bl read_timer_end_of_swap
pop_s blink
mov r1, _kernel
ld_s r2, [r1, _kernel_offset_to_current]
_load_callee_saved_regs
st sp, [r2, _thread_offset_to_sp]
b return_loc
#endif /* CONFIG_EXECUTION_BENCHMARKING */

View file

@ -163,6 +163,11 @@ _arc_go_to_user_space:
mov r30, 0 mov r30, 0
mov blink, 0 mov blink, 0
#ifdef CONFIG_EXECUTION_BENCHMARKING
b _capture_value_for_benchmarking_userspace
return_loc_userspace_enter:
#endif /* CONFIG_EXECUTION_BENCHMARKING */
rtie rtie
/** /**
@ -265,3 +270,20 @@ inc_len:
/* increment length measurement, loop again */ /* increment length measurement, loop again */
add_s r0, r0, 1 add_s r0, r0, 1
b_s strlen_loop b_s strlen_loop
#ifdef CONFIG_EXECUTION_BENCHMARKING
.balign 4
_capture_value_for_benchmarking_userspace:
mov r1, _kernel
ld_s r2, [r1, _kernel_offset_to_current]
_save_callee_saved_regs
push_s blink
bl read_timer_end_of_userspace_enter
pop_s blink
mov r1, _kernel
ld_s r2, [r1, _kernel_offset_to_current]
_load_callee_saved_regs
b return_loc_userspace_enter
#endif

View file

@ -185,6 +185,10 @@ static inline void program_max_cycles(void)
*/ */
void _timer_int_handler(void *unused) void _timer_int_handler(void *unused)
{ {
#ifdef CONFIG_EXECUTION_BENCHMARKING
extern void read_timer_start_of_tick_handler(void);
read_timer_start_of_tick_handler();
#endif
ARG_UNUSED(unused); ARG_UNUSED(unused);
/* clear the interrupt by writing 0 to IP bit of the control register */ /* clear the interrupt by writing 0 to IP bit of the control register */
timer0_control_register_set(_ARC_V2_TMR_CTRL_NH | _ARC_V2_TMR_CTRL_IE); timer0_control_register_set(_ARC_V2_TMR_CTRL_NH | _ARC_V2_TMR_CTRL_IE);
@ -230,6 +234,10 @@ void _timer_int_handler(void *unused)
update_accumulated_count(); update_accumulated_count();
#endif #endif
#ifdef CONFIG_EXECUTION_BENCHMARKING
extern void read_timer_end_of_tick_handler(void);
read_timer_end_of_tick_handler();
#endif
} }
#ifdef CONFIG_TICKLESS_KERNEL #ifdef CONFIG_TICKLESS_KERNEL