aboutsummaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorVineet Gupta <vgupta@synopsys.com>2013-05-28 00:04:45 -0400
committerVineet Gupta <vgupta@synopsys.com>2013-06-22 09:53:21 -0400
commit283237a04fd332bddc2ac298e6ad7d23a1fc4b99 (patch)
tree227d6d2d2c2b167fb75df1835b466ed160a7994f /arch
parentbed30976e7f1077c105306597ef05895234ba600 (diff)
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: Vineet Gupta <vgupta@synopsys.com>
Diffstat (limited to 'arch')
-rw-r--r--arch/arc/include/asm/entry.h2
-rw-r--r--arch/arc/include/asm/processor.h2
-rw-r--r--arch/arc/include/asm/ptrace.h2
-rw-r--r--arch/arc/kernel/process.c2
4 files changed, 3 insertions, 5 deletions
diff --git a/arch/arc/include/asm/entry.h b/arch/arc/include/asm/entry.h
index 5bbec8ad8123..2b274fa9c5a7 100644
--- a/arch/arc/include/asm/entry.h
+++ b/arch/arc/include/asm/entry.h
@@ -252,7 +252,7 @@
252 ld \out, [\tsk, TASK_THREAD_INFO] 252 ld \out, [\tsk, TASK_THREAD_INFO]
253 253
254 /* Go to end of page where stack begins (grows upwards) */ 254 /* Go to end of page where stack begins (grows upwards) */
255 add2 \out, \out, (THREAD_SIZE - 4)/4 /* one word GUTTER */ 255 add2 \out, \out, (THREAD_SIZE)/4
256 256
257.endm 257.endm
258 258
diff --git a/arch/arc/include/asm/processor.h b/arch/arc/include/asm/processor.h
index 5f26b2c1cba0..81efbcae3839 100644
--- a/arch/arc/include/asm/processor.h
+++ b/arch/arc/include/asm/processor.h
@@ -50,7 +50,7 @@ struct task_struct;
50unsigned long thread_saved_pc(struct task_struct *t); 50unsigned long thread_saved_pc(struct task_struct *t);
51 51
52#define task_pt_regs(p) \ 52#define task_pt_regs(p) \
53 ((struct pt_regs *)(THREAD_SIZE - 4 + (void *)task_stack_page(p)) - 1) 53 ((struct pt_regs *)(THREAD_SIZE + (void *)task_stack_page(p)) - 1)
54 54
55/* Free all resources held by a thread. */ 55/* Free all resources held by a thread. */
56#define release_thread(thread) do { } while (0) 56#define release_thread(thread) do { } while (0)
diff --git a/arch/arc/include/asm/ptrace.h b/arch/arc/include/asm/ptrace.h
index 6179de7e07c2..f82a3a2201b5 100644
--- a/arch/arc/include/asm/ptrace.h
+++ b/arch/arc/include/asm/ptrace.h
@@ -110,7 +110,7 @@ struct callee_regs {
110 /* open-coded current_thread_info() */ \ 110 /* open-coded current_thread_info() */ \
111 register unsigned long sp asm ("sp"); \ 111 register unsigned long sp asm ("sp"); \
112 unsigned long pg_start = (sp & ~(THREAD_SIZE - 1)); \ 112 unsigned long pg_start = (sp & ~(THREAD_SIZE - 1)); \
113 (struct pt_regs *)(pg_start + THREAD_SIZE - 4) - 1; \ 113 (struct pt_regs *)(pg_start + THREAD_SIZE) - 1; \
114}) 114})
115 115
116static inline long regs_return_value(struct pt_regs *regs) 116static inline long regs_return_value(struct pt_regs *regs)
diff --git a/arch/arc/kernel/process.c b/arch/arc/kernel/process.c
index cad66851e0c4..949bfd5d62a0 100644
--- a/arch/arc/kernel/process.c
+++ b/arch/arc/kernel/process.c
@@ -75,8 +75,6 @@ asmlinkage void ret_from_fork(void);
75 * ~ ~ 75 * ~ ~
76 * | --to-- | (scratch Regs of user mode) 76 * | --to-- | (scratch Regs of user mode)
77 * | r0 | 77 * | r0 |
78 * ------------------
79 * | UNUSED 1 word|
80 * ------------------ <===== END of PAGE 78 * ------------------ <===== END of PAGE
81 */ 79 */
82int copy_thread(unsigned long clone_flags, 80int copy_thread(unsigned long clone_flags,