ARC: [plat-eznps] handle extra aux regs #2: kernel/entry exit
authorLiav Rehana <liavr@mellanox.com>
Thu, 15 Jun 2017 08:44:00 +0000 (11:44 +0300)
committerVineet Gupta <vgupta@synopsys.com>
Mon, 28 Aug 2017 22:17:36 +0000 (15:17 -0700)
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: Liav Rehana <liavr@mellanox.com>
Signed-off-by: Noam Camus <noamc@ezchip.com>
Signed-off-by: Vineet Gupta <vgupta@synopsys.com>
arch/arc/include/asm/entry-compact.h
arch/arc/include/asm/ptrace.h
arch/arc/kernel/process.c

index 14c310f..ec36d5b 100644 (file)
        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
  * 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
        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
 
 /*--------------------------------------------------------------
  * 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
index 5297faa..5a8cb22 100644 (file)
 #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 */
 
index 5c631a1..5ac3b54 100644 (file)
@@ -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;