aboutsummaryrefslogtreecommitdiffstats
path: root/arch/microblaze
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2012-05-28 12:49:56 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2012-05-28 12:49:56 -0400
commitfb8b00675eb6462aacab56bca31ed6107bda5314 (patch)
treecd3c081dca9ea37d2ddc5e13b55fb4baeccf5452 /arch/microblaze
parentb48b2c3e50433ff6f7e46186daa7f986bd960215 (diff)
parentd5c15f17844b8883bc13b61a8ae114f0d3d59cdd (diff)
Merge branch 'next' of git://git.monstr.eu/linux-2.6-microblaze
Pull microblaze changes from Michal Simek. * 'next' of git://git.monstr.eu/linux-2.6-microblaze: microblaze: Setup correct pointer to TLS area microblaze: Add TLS support to sys_clone microblaze: ftrace: Pass the first calling instruction for dynamic ftrace microblaze: Port OOM changes to do_page_fault microblaze: Do not select GENERIC_GPIO by default
Diffstat (limited to 'arch/microblaze')
-rw-r--r--arch/microblaze/Kconfig2
-rw-r--r--arch/microblaze/kernel/entry.S7
-rw-r--r--arch/microblaze/kernel/mcount.S2
-rw-r--r--arch/microblaze/kernel/process.c6
-rw-r--r--arch/microblaze/mm/fault.c33
5 files changed, 39 insertions, 11 deletions
diff --git a/arch/microblaze/Kconfig b/arch/microblaze/Kconfig
index 83460468998d..0bf44231aaf9 100644
--- a/arch/microblaze/Kconfig
+++ b/arch/microblaze/Kconfig
@@ -52,7 +52,7 @@ config GENERIC_CALIBRATE_DELAY
52 def_bool y 52 def_bool y
53 53
54config GENERIC_GPIO 54config GENERIC_GPIO
55 def_bool y 55 bool
56 56
57config GENERIC_CSUM 57config GENERIC_CSUM
58 def_bool y 58 def_bool y
diff --git a/arch/microblaze/kernel/entry.S b/arch/microblaze/kernel/entry.S
index daff9e5e4a1f..03f7b8ce6b6b 100644
--- a/arch/microblaze/kernel/entry.S
+++ b/arch/microblaze/kernel/entry.S
@@ -492,10 +492,11 @@ C_ENTRY(sys_clone):
492 bnei r6, 1f; /* See if child SP arg (arg 1) is 0. */ 492 bnei r6, 1f; /* See if child SP arg (arg 1) is 0. */
493 lwi r6, r1, PT_R1; /* If so, use paret's stack ptr */ 493 lwi r6, r1, PT_R1; /* If so, use paret's stack ptr */
4941: addik r7, r1, 0; /* Arg 2: parent context */ 4941: addik r7, r1, 0; /* Arg 2: parent context */
495 add r8, r0, r0; /* Arg 3: (unused) */ 495 lwi r9, r1, PT_R8; /* parent tid. */
496 add r9, r0, r0; /* Arg 4: (unused) */ 496 lwi r10, r1, PT_R9; /* child tid. */
497 /* do_fork will pick up TLS from regs->r10. */
497 brid do_fork /* Do real work (tail-call) */ 498 brid do_fork /* Do real work (tail-call) */
498 add r10, r0, r0; /* Arg 5: (unused) */ 499 add r8, r0, r0; /* Arg 3: (unused) */
499 500
500C_ENTRY(sys_execve): 501C_ENTRY(sys_execve):
501 brid microblaze_execve; /* Do real work (tail-call).*/ 502 brid microblaze_execve; /* Do real work (tail-call).*/
diff --git a/arch/microblaze/kernel/mcount.S b/arch/microblaze/kernel/mcount.S
index e7eaa7a8cbd3..fc1e1322ce4c 100644
--- a/arch/microblaze/kernel/mcount.S
+++ b/arch/microblaze/kernel/mcount.S
@@ -138,7 +138,7 @@ NOALIGN_ENTRY(ftrace_call)
138#endif /* CONFIG_DYNAMIC_FTRACE */ 138#endif /* CONFIG_DYNAMIC_FTRACE */
139/* static normal trace */ 139/* static normal trace */
140 lwi r6, r1, 120; /* MS: load parent addr */ 140 lwi r6, r1, 120; /* MS: load parent addr */
141 addik r5, r15, 0; /* MS: load current function addr */ 141 addik r5, r15, -4; /* MS: load current function addr */
142 /* MS: here is dependency on previous code */ 142 /* MS: here is dependency on previous code */
143 brald r15, r20; /* MS: jump to ftrace handler */ 143 brald r15, r20; /* MS: jump to ftrace handler */
144 nop; 144 nop;
diff --git a/arch/microblaze/kernel/process.c b/arch/microblaze/kernel/process.c
index 883b92789cdf..1944e00f07e1 100644
--- a/arch/microblaze/kernel/process.c
+++ b/arch/microblaze/kernel/process.c
@@ -182,8 +182,12 @@ int copy_thread(unsigned long clone_flags, unsigned long usp,
182#endif 182#endif
183 ti->cpu_context.r15 = (unsigned long)ret_from_fork - 8; 183 ti->cpu_context.r15 = (unsigned long)ret_from_fork - 8;
184 184
185 /*
186 * r21 is the thread reg, r10 is 6th arg to clone
187 * which contains TLS area
188 */
185 if (clone_flags & CLONE_SETTLS) 189 if (clone_flags & CLONE_SETTLS)
186 ; 190 childregs->r21 = childregs->r10;
187 191
188 return 0; 192 return 0;
189} 193}
diff --git a/arch/microblaze/mm/fault.c b/arch/microblaze/mm/fault.c
index c38a265846de..eb365d6795fa 100644
--- a/arch/microblaze/mm/fault.c
+++ b/arch/microblaze/mm/fault.c
@@ -92,6 +92,8 @@ void do_page_fault(struct pt_regs *regs, unsigned long address,
92 int code = SEGV_MAPERR; 92 int code = SEGV_MAPERR;
93 int is_write = error_code & ESR_S; 93 int is_write = error_code & ESR_S;
94 int fault; 94 int fault;
95 unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE |
96 (is_write ? FAULT_FLAG_WRITE : 0);
95 97
96 regs->ear = address; 98 regs->ear = address;
97 regs->esr = error_code; 99 regs->esr = error_code;
@@ -138,6 +140,7 @@ void do_page_fault(struct pt_regs *regs, unsigned long address,
138 if (kernel_mode(regs) && !search_exception_tables(regs->pc)) 140 if (kernel_mode(regs) && !search_exception_tables(regs->pc))
139 goto bad_area_nosemaphore; 141 goto bad_area_nosemaphore;
140 142
143retry:
141 down_read(&mm->mmap_sem); 144 down_read(&mm->mmap_sem);
142 } 145 }
143 146
@@ -210,7 +213,11 @@ good_area:
210 * make sure we exit gracefully rather than endlessly redo 213 * make sure we exit gracefully rather than endlessly redo
211 * the fault. 214 * the fault.
212 */ 215 */
213 fault = handle_mm_fault(mm, vma, address, is_write ? FAULT_FLAG_WRITE : 0); 216 fault = handle_mm_fault(mm, vma, address, flags);
217
218 if ((fault & VM_FAULT_RETRY) && fatal_signal_pending(current))
219 return;
220
214 if (unlikely(fault & VM_FAULT_ERROR)) { 221 if (unlikely(fault & VM_FAULT_ERROR)) {
215 if (fault & VM_FAULT_OOM) 222 if (fault & VM_FAULT_OOM)
216 goto out_of_memory; 223 goto out_of_memory;
@@ -218,11 +225,27 @@ good_area:
218 goto do_sigbus; 225 goto do_sigbus;
219 BUG(); 226 BUG();
220 } 227 }
221 if (unlikely(fault & VM_FAULT_MAJOR)) 228
222 current->maj_flt++; 229 if (flags & FAULT_FLAG_ALLOW_RETRY) {
223 else 230 if (unlikely(fault & VM_FAULT_MAJOR))
224 current->min_flt++; 231 current->maj_flt++;
232 else
233 current->min_flt++;
234 if (fault & VM_FAULT_RETRY) {
235 flags &= ~FAULT_FLAG_ALLOW_RETRY;
236
237 /*
238 * No need to up_read(&mm->mmap_sem) as we would
239 * have already released it in __lock_page_or_retry
240 * in mm/filemap.c.
241 */
242
243 goto retry;
244 }
245 }
246
225 up_read(&mm->mmap_sem); 247 up_read(&mm->mmap_sem);
248
226 /* 249 /*
227 * keep track of tlb+htab misses that are good addrs but 250 * keep track of tlb+htab misses that are good addrs but
228 * just need pte's created via handle_mm_fault() 251 * just need pte's created via handle_mm_fault()