Commit 283237a0 authored by Vineet Gupta's avatar Vineet Gupta

ARC: pt_regs update #1: Align pt_regs end with end of kernel stack page

Historically, pt_regs would end at offset of 1 word from end of stack
page.

        -----------------  -> START of page (task->stack)
        |               |
        | thread_info   |
        -----------------
        |               |
   ^    ~               ~
   |    ~               ~
   |    |               |
   |    |               | <---- pt_regs used to END here
        -----------------
        | 1 word GUTTER |
        ----------------- -> End of page (START of kernel stack)

This required special "one-off" considerations in low level code.

The root cause is very likely assumption of "empty" SP by the original
ARC kernel hackers, despite ARC700 always been "full" SP.

So finally RIP one word gutter !
Signed-off-by: default avatarVineet Gupta <vgupta@synopsys.com>
parent bed30976
...@@ -252,7 +252,7 @@ ...@@ -252,7 +252,7 @@
ld \out, [\tsk, TASK_THREAD_INFO] ld \out, [\tsk, TASK_THREAD_INFO]
/* Go to end of page where stack begins (grows upwards) */ /* Go to end of page where stack begins (grows upwards) */
add2 \out, \out, (THREAD_SIZE - 4)/4 /* one word GUTTER */ add2 \out, \out, (THREAD_SIZE)/4
.endm .endm
......
...@@ -50,7 +50,7 @@ struct task_struct; ...@@ -50,7 +50,7 @@ struct task_struct;
unsigned long thread_saved_pc(struct task_struct *t); unsigned long thread_saved_pc(struct task_struct *t);
#define task_pt_regs(p) \ #define task_pt_regs(p) \
((struct pt_regs *)(THREAD_SIZE - 4 + (void *)task_stack_page(p)) - 1) ((struct pt_regs *)(THREAD_SIZE + (void *)task_stack_page(p)) - 1)
/* Free all resources held by a thread. */ /* Free all resources held by a thread. */
#define release_thread(thread) do { } while (0) #define release_thread(thread) do { } while (0)
......
...@@ -110,7 +110,7 @@ struct callee_regs { ...@@ -110,7 +110,7 @@ struct callee_regs {
/* open-coded current_thread_info() */ \ /* open-coded current_thread_info() */ \
register unsigned long sp asm ("sp"); \ register unsigned long sp asm ("sp"); \
unsigned long pg_start = (sp & ~(THREAD_SIZE - 1)); \ unsigned long pg_start = (sp & ~(THREAD_SIZE - 1)); \
(struct pt_regs *)(pg_start + THREAD_SIZE - 4) - 1; \ (struct pt_regs *)(pg_start + THREAD_SIZE) - 1; \
}) })
static inline long regs_return_value(struct pt_regs *regs) static inline long regs_return_value(struct pt_regs *regs)
......
...@@ -75,8 +75,6 @@ asmlinkage void ret_from_fork(void); ...@@ -75,8 +75,6 @@ asmlinkage void ret_from_fork(void);
* ~ ~ * ~ ~
* | --to-- | (scratch Regs of user mode) * | --to-- | (scratch Regs of user mode)
* | r0 | * | r0 |
* ------------------
* | UNUSED 1 word|
* ------------------ <===== END of PAGE * ------------------ <===== END of PAGE
*/ */
int copy_thread(unsigned long clone_flags, int copy_thread(unsigned long clone_flags,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment