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

Commit 83653c16 authored by Andy Lutomirski's avatar Andy Lutomirski
Browse files

x86: Clean up current_stack_pointer



There's no good reason for it to be a macro, and x86_64 will want to
use it, so it should be in a header.

Acked-by: default avatarBorislav Petkov <bp@suse.de>
Signed-off-by: default avatarAndy Lutomirski <luto@amacapital.net>
parent 95927475
Loading
Loading
Loading
Loading
+11 −0
Original line number Original line Diff line number Diff line
@@ -170,6 +170,17 @@ static inline struct thread_info *current_thread_info(void)
	return ti;
	return ti;
}
}


static inline unsigned long current_stack_pointer(void)
{
	unsigned long sp;
#ifdef CONFIG_X86_64
	asm("mov %%rsp,%0" : "=g" (sp));
#else
	asm("mov %%esp,%0" : "=g" (sp));
#endif
	return sp;
}

#else /* !__ASSEMBLY__ */
#else /* !__ASSEMBLY__ */


/* how to get the thread information struct from ASM */
/* how to get the thread information struct from ASM */
+3 −10
Original line number Original line Diff line number Diff line
@@ -69,16 +69,9 @@ static void call_on_stack(void *func, void *stack)
		     : "memory", "cc", "edx", "ecx", "eax");
		     : "memory", "cc", "edx", "ecx", "eax");
}
}


/* how to get the current stack pointer from C */
#define current_stack_pointer ({		\
	unsigned long sp;			\
	asm("mov %%esp,%0" : "=g" (sp));	\
	sp;					\
})

static inline void *current_stack(void)
static inline void *current_stack(void)
{
{
	return (void *)(current_stack_pointer & ~(THREAD_SIZE - 1));
	return (void *)(current_stack_pointer() & ~(THREAD_SIZE - 1));
}
}


static inline int
static inline int
@@ -103,7 +96,7 @@ execute_on_irq_stack(int overflow, struct irq_desc *desc, int irq)


	/* Save the next esp at the bottom of the stack */
	/* Save the next esp at the bottom of the stack */
	prev_esp = (u32 *)irqstk;
	prev_esp = (u32 *)irqstk;
	*prev_esp = current_stack_pointer;
	*prev_esp = current_stack_pointer();


	if (unlikely(overflow))
	if (unlikely(overflow))
		call_on_stack(print_stack_overflow, isp);
		call_on_stack(print_stack_overflow, isp);
@@ -156,7 +149,7 @@ void do_softirq_own_stack(void)


	/* Push the previous esp onto the stack */
	/* Push the previous esp onto the stack */
	prev_esp = (u32 *)irqstk;
	prev_esp = (u32 *)irqstk;
	*prev_esp = current_stack_pointer;
	*prev_esp = current_stack_pointer();


	call_on_stack(__do_softirq, isp);
	call_on_stack(__do_softirq, isp);
}
}