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>
diff --git a/arch/arc/core/isr_wrapper.S b/arch/arc/core/isr_wrapper.S
index ad5ef5a..30eb0fe 100644
--- a/arch/arc/core/isr_wrapper.S
+++ b/arch/arc/core/isr_wrapper.S
@@ -19,6 +19,7 @@
 #include <sw_isr_table.h>
 #include <kernel_structs.h>
 #include <arch/cpu.h>
+#include <swap_macros.h>
 
 GTEXT(_isr_wrapper)
 GTEXT(_isr_demux)
@@ -229,6 +230,43 @@
  */
 
 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_RGF_NUM_BANKS == 1
 	st r0,[saved_r0]
@@ -288,6 +326,7 @@
 	j_s [r2]
 #endif
 #else
+
 	mov r3, _rirq_exit
 	mov r2, _rirq_enter
 	j_s [r2]
@@ -371,6 +410,42 @@
 	add3 r0, r1, r0   /* table entries are 8-bytes wide */
 
 	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]
 	ld_s r0, [r0] /* delay slot: ISR parameter into r0  */
 
diff --git a/arch/arc/core/swap.S b/arch/arc/core/swap.S
index d4b1c14..500e8d1 100644
--- a/arch/arc/core/swap.S
+++ b/arch/arc/core/swap.S
@@ -61,6 +61,21 @@
 
 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 */
 
 	mov r1, _kernel
@@ -144,6 +159,11 @@
 	/* sflag instruction is not supported in current ARC GNU */
 	.long 0x00ff302f
 #endif
+#ifdef CONFIG_EXECUTION_BENCHMARKING
+	b _capture_value_for_benchmarking
+#endif
+return_loc:
+
 	pop_s r3    /* status32 into r3 */
 	kflag r3    /* write status32 */
 
@@ -196,4 +216,24 @@
 	ld ilink, [sp, ___isf_t_status32_OFFSET - ___isf_t_pc_OFFSET]
 	sr ilink, [_ARC_V2_ERSTATUS]
 	add_s sp, sp, ___isf_t_status32_OFFSET - ___isf_t_pc_OFFSET + 4
+
 	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 */
diff --git a/arch/arc/core/userspace.S b/arch/arc/core/userspace.S
index d62eb9f..ee15a35 100644
--- a/arch/arc/core/userspace.S
+++ b/arch/arc/core/userspace.S
@@ -163,6 +163,11 @@
 	mov r30, 0
 	mov blink, 0
 
+#ifdef CONFIG_EXECUTION_BENCHMARKING
+	b _capture_value_for_benchmarking_userspace
+return_loc_userspace_enter:
+#endif /* CONFIG_EXECUTION_BENCHMARKING */
+
 	rtie
 
 /**
@@ -265,3 +270,20 @@
 	/* increment length measurement, loop again */
 	add_s r0, r0, 1
 	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
diff --git a/drivers/timer/arcv2_timer0.c b/drivers/timer/arcv2_timer0.c
index 38bf0b2..e487493 100644
--- a/drivers/timer/arcv2_timer0.c
+++ b/drivers/timer/arcv2_timer0.c
@@ -185,6 +185,10 @@
  */
 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);
 	/* 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);
@@ -230,6 +234,10 @@
 
 	update_accumulated_count();
 #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