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

Commit 16f9afe6 authored by Vineet Gupta's avatar Vineet Gupta
Browse files

ARC: pt_regs update #3: Remove unused gutter at start of callee_regs



This is trickier than prev two:

* context switching code saves kernel mode callee regs in the format of
  struct callee_regs thus needs adjustment. This also reduces the height
  of topmost kernel stack frame by 1 word.

* Since kernel stack unwinder is sensitive to height of topmost kernel
  stack frame, that needs a word of adjustment too.

ptrace needs a bit of updating since pt_regs now diverges from
user_regs_struct.

Signed-off-by: default avatarVineet Gupta <vgupta@synopsys.com>
parent 2fa91904
Loading
Loading
Loading
Loading
+3 −11
Original line number Diff line number Diff line
@@ -124,8 +124,6 @@
	st.a    r25, [sp, -4]
#endif

	/* move up by 1 word to "create" callee_regs->"stack_place_holder" */
	sub sp, sp, 4
.endm

/*--------------------------------------------------------------
@@ -148,10 +146,9 @@
	st.a    r23, [sp, -4]
	st.a    r24, [sp, -4]
#ifdef CONFIG_ARC_CURR_IN_REG
	sub     sp, sp, 8
	sub     sp, sp, 4
#else
	st.a    r25, [sp, -4]
	sub     sp, sp, 4
#endif
.endm

@@ -168,14 +165,11 @@
 *-------------------------------------------------------------*/
.macro RESTORE_CALLEE_SAVED_KERNEL


#ifdef CONFIG_ARC_CURR_IN_REG
	add     sp, sp, 8  /* skip callee_reg gutter and user r25 placeholder */
	add     sp, sp, 4  /* skip usual r25 placeholder */
#else
	add     sp, sp, 4   /* skip "callee_regs->stack_place_holder" */
	ld.ab   r25, [sp, 4]
#endif

	ld.ab   r24, [sp, 4]
	ld.ab   r23, [sp, 4]
	ld.ab   r22, [sp, 4]
@@ -203,8 +197,6 @@
 *-------------------------------------------------------------*/
.macro RESTORE_CALLEE_SAVED_USER

	add     sp, sp, 4   /* skip "callee_regs->stack_place_holder" */

#ifdef CONFIG_ARC_CURR_IN_REG
	ld.ab   r12, [sp, 4]
	st      r12, [r25, TASK_THREAD + THREAD_USER_R25]
@@ -230,7 +222,7 @@
 * Super FAST Restore callee saved regs by simply re-adjusting SP
 *-------------------------------------------------------------*/
.macro DISCARD_CALLEE_SAVED_USER
	add     sp, sp, 14 * 4
	add     sp, sp, SZ_CALLEE_REGS
.endm

/*--------------------------------------------------------------
+8 −3
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@
#ifndef __ASSEMBLY__

#include <asm/arcregs.h>	/* for STATUS_E1_MASK et all */
#include <asm/ptrace.h>

/* Arch specific stuff which needs to be saved per task.
 * However these items are not so important so as to earn a place in
@@ -75,11 +76,15 @@ unsigned long thread_saved_pc(struct task_struct *t);

/*
 * Where abouts of Task's sp, fp, blink when it was last seen in kernel mode.
 * These can't be derived from pt_regs as that would give correp user-mode val
 * Look in process.c for details of kernel stack layout
 */
#define KSTK_ESP(tsk)   (tsk->thread.ksp)
#define KSTK_BLINK(tsk) (*((unsigned int *)((KSTK_ESP(tsk)) + (13+1+1)*4)))
#define KSTK_FP(tsk)    (*((unsigned int *)((KSTK_ESP(tsk)) + (13+1)*4)))

#define KSTK_REG(tsk, off)	(*((unsigned int *)(KSTK_ESP(tsk) + \
					sizeof(struct callee_regs) + off)))

#define KSTK_BLINK(tsk) KSTK_REG(tsk, 4)
#define KSTK_FP(tsk)    KSTK_REG(tsk, 0)

/*
 * Do necessary setup to start up a newly executed thread.
+0 −1
Original line number Diff line number Diff line
@@ -59,7 +59,6 @@ struct pt_regs {
/* Callee saved registers - need to be saved only when you are scheduled out */

struct callee_regs {
	long res;	/* Again this is not needed */
	long r25;
	long r24;
	long r23;
+1 −1
Original line number Diff line number Diff line
@@ -38,8 +38,8 @@ struct user_regs_struct {
		long r12, r11, r10, r9, r8, r7, r6, r5, r4, r3, r2, r1, r0;
		long sp;
	} scratch;
	long pad2;
	struct {
		long pad;
		long r25, r24, r23, r22, r21, r20;
		long r19, r18, r17, r16, r15, r14, r13;
	} callee;
+1 −0
Original line number Diff line number Diff line
@@ -60,5 +60,6 @@ int main(void)
	DEFINE(PT_r6, offsetof(struct pt_regs, r6));
	DEFINE(PT_r7, offsetof(struct pt_regs, r7));

	DEFINE(SZ_CALLEE_REGS, sizeof(struct callee_regs));
	return 0;
}
Loading