ARC: ARCv3 64: adopt ARC SMP code for ARCv3 64 bit

Rewrite ARC SMP code with ASM-compat macros so it can be
used for ARCv3 64 bit.

Signed-off-by: Eugeniy Paltsev <Eugeniy.Paltsev@synopsys.com>
Signed-off-by: Evgeniy Paltsev <PaltsevEvgeniy@gmail.com>
This commit is contained in:
Evgeniy Paltsev 2021-07-21 19:18:26 +03:00 committed by Christopher Friedt
commit 5ed232b62c
2 changed files with 16 additions and 7 deletions

View file

@ -159,7 +159,7 @@ _slave_core_wait:
ld r1, [arc_cpu_wake_flag] ld r1, [arc_cpu_wake_flag]
brne r0, r1, _slave_core_wait brne r0, r1, _slave_core_wait
ld sp, [arc_cpu_sp] LDR sp, arc_cpu_sp
/* signal master core that slave core runs */ /* signal master core that slave core runs */
st 0, [arc_cpu_wake_flag] st 0, [arc_cpu_wake_flag]

View file

@ -308,8 +308,11 @@
*/ */
.macro _check_and_inc_int_nest_counter, reg1, reg2 .macro _check_and_inc_int_nest_counter, reg1, reg2
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
/* get pointer to _cpu_t of this CPU */
_get_cpu_id MACRO_ARG(reg1) _get_cpu_id MACRO_ARG(reg1)
ld.as MACRO_ARG(reg1), [_curr_cpu, MACRO_ARG(reg1)] ASLR MACRO_ARG(reg1), MACRO_ARG(reg1), ARC_REGSHIFT
LDR MACRO_ARG(reg1), MACRO_ARG(reg1), _curr_cpu
/* _cpu_t.nested is 32 bit despite of platform bittnes */
ld MACRO_ARG(reg2), [MACRO_ARG(reg1), ___cpu_t_nested_OFFSET] ld MACRO_ARG(reg2), [MACRO_ARG(reg1), ___cpu_t_nested_OFFSET]
#else #else
MOVR MACRO_ARG(reg1), _kernel MOVR MACRO_ARG(reg1), _kernel
@ -331,8 +334,11 @@
*/ */
.macro _dec_int_nest_counter, reg1, reg2 .macro _dec_int_nest_counter, reg1, reg2
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
/* get pointer to _cpu_t of this CPU */
_get_cpu_id MACRO_ARG(reg1) _get_cpu_id MACRO_ARG(reg1)
ld.as MACRO_ARG(reg1), [_curr_cpu, MACRO_ARG(reg1)] ASLR MACRO_ARG(reg1), MACRO_ARG(reg1), ARC_REGSHIFT
LDR MACRO_ARG(reg1), MACRO_ARG(reg1), _curr_cpu
/* _cpu_t.nested is 32 bit despite of platform bittnes */
ld MACRO_ARG(reg2), [MACRO_ARG(reg1), ___cpu_t_nested_OFFSET] ld MACRO_ARG(reg2), [MACRO_ARG(reg1), ___cpu_t_nested_OFFSET]
#else #else
MOVR MACRO_ARG(reg1), _kernel MOVR MACRO_ARG(reg1), _kernel
@ -368,7 +374,7 @@
* the result will be in reg (a reg) * the result will be in reg (a reg)
*/ */
.macro _get_cpu_id, reg .macro _get_cpu_id, reg
lr MACRO_ARG(reg), [_ARC_V2_IDENTITY] LRR MACRO_ARG(reg), [_ARC_V2_IDENTITY]
xbfu MACRO_ARG(reg), MACRO_ARG(reg), 0xe8 xbfu MACRO_ARG(reg), MACRO_ARG(reg), 0xe8
.endm .endm
@ -377,9 +383,12 @@
*/ */
.macro _get_curr_cpu_irq_stack, irq_sp .macro _get_curr_cpu_irq_stack, irq_sp
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
/* get pointer to _cpu_t of this CPU */
_get_cpu_id MACRO_ARG(irq_sp) _get_cpu_id MACRO_ARG(irq_sp)
ld.as MACRO_ARG(irq_sp), [_curr_cpu, MACRO_ARG(irq_sp)] ASLR MACRO_ARG(irq_sp), MACRO_ARG(irq_sp), ARC_REGSHIFT
ld MACRO_ARG(irq_sp), [MACRO_ARG(irq_sp), ___cpu_t_irq_stack_OFFSET] LDR MACRO_ARG(irq_sp), MACRO_ARG(irq_sp), @_curr_cpu
/* get pointer to irq_stack itself */
LDR MACRO_ARG(irq_sp), MACRO_ARG(irq_sp), ___cpu_t_irq_stack_OFFSET
#else #else
MOVR MACRO_ARG(irq_sp), _kernel MOVR MACRO_ARG(irq_sp), _kernel
LDR MACRO_ARG(irq_sp), MACRO_ARG(irq_sp), _kernel_offset_to_irq_stack LDR MACRO_ARG(irq_sp), MACRO_ARG(irq_sp), _kernel_offset_to_irq_stack
@ -407,7 +416,7 @@
/* save old thread into switch handle which is required by /* save old thread into switch handle which is required by
* wait_for_switch * wait_for_switch
*/ */
st r2, [r2, ___thread_t_switch_handle_OFFSET] STR r2, r2, ___thread_t_switch_handle_OFFSET
#endif #endif
.endm .endm