Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 28923f6b authored by Liav Rehana's avatar Liav Rehana Committed by Vineet Gupta
Browse files

ARC: [plat-eznps] handle extra aux regs #2: kernel/entry exit



Preserve eflags and gpa1 aux during entry/exit into kernel as these
could be modified by kernel mode

These registers used by compare exchange instructions.
  - GPA1 is used for compare value,
  - EFLAGS got bit reflects atomic operation response.

EFLAGS is zeroed for each new user task so it won't get its
parent value.

Signed-off-by: default avatarLiav Rehana <liavr@mellanox.com>
Signed-off-by: default avatarNoam Camus <noamc@ezchip.com>
Signed-off-by: default avatarVineet Gupta <vgupta@synopsys.com>
parent 5b2189ab
Loading
Loading
Loading
Loading
+24 −0
Original line number Diff line number Diff line
@@ -192,6 +192,12 @@
	PUSHAX	lp_start
	PUSHAX	erbta

#ifdef CONFIG_ARC_PLAT_EZNPS
	.word CTOP_INST_SCHD_RW
	PUSHAX  CTOP_AUX_GPA1
	PUSHAX  CTOP_AUX_EFLAGS
#endif

	lr	r9, [ecr]
	st      r9, [sp, PT_event]    /* EV_Trap expects r9 to have ECR */
.endm
@@ -208,6 +214,12 @@
 * by hardware and that is not good.
 *-------------------------------------------------------------*/
.macro EXCEPTION_EPILOGUE
#ifdef CONFIG_ARC_PLAT_EZNPS
	.word CTOP_INST_SCHD_RW
	POPAX   CTOP_AUX_EFLAGS
	POPAX   CTOP_AUX_GPA1
#endif

	POPAX	erbta
	POPAX	lp_start
	POPAX	lp_end
@@ -265,6 +277,12 @@
	PUSHAX	lp_end
	PUSHAX	lp_start
	PUSHAX	bta_l\LVL\()

#ifdef CONFIG_ARC_PLAT_EZNPS
	.word CTOP_INST_SCHD_RW
	PUSHAX  CTOP_AUX_GPA1
	PUSHAX  CTOP_AUX_EFLAGS
#endif
.endm

/*--------------------------------------------------------------
@@ -277,6 +295,12 @@
 * by hardware and that is not good.
 *-------------------------------------------------------------*/
.macro INTERRUPT_EPILOGUE  LVL
#ifdef CONFIG_ARC_PLAT_EZNPS
	.word CTOP_INST_SCHD_RW
	POPAX   CTOP_AUX_EFLAGS
	POPAX   CTOP_AUX_GPA1
#endif

	POPAX	bta_l\LVL\()
	POPAX	lp_start
	POPAX	lp_end
+5 −0
Original line number Diff line number Diff line
@@ -19,6 +19,11 @@
#ifdef CONFIG_ISA_ARCOMPACT
struct pt_regs {

#ifdef CONFIG_ARC_PLAT_EZNPS
	unsigned long eflags;	/* Extended FLAGS */
	unsigned long gpa1;	/* General Purpose Aux */
#endif

	/* Real registers */
	unsigned long bta;	/* bta_l1, bta_l2, erbta */

+4 −0
Original line number Diff line number Diff line
@@ -234,6 +234,10 @@ void start_thread(struct pt_regs * regs, unsigned long pc, unsigned long usp)
	 */
	regs->status32 = STATUS_U_MASK | STATUS_L_MASK | ISA_INIT_STATUS_BITS;

#ifdef CONFIG_EZNPS_MTM_EXT
	regs->eflags = 0;
#endif

	/* bogus seed values for debugging */
	regs->lp_start = 0x10;
	regs->lp_end = 0x80;