aboutsummaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorMichal Simek <monstr@monstr.eu>2010-06-22 15:11:49 -0400
committerMichal Simek <monstr@monstr.eu>2010-08-04 04:45:15 -0400
commit0e41c90908881a1b8205c66a66becec7d8d4eb4a (patch)
tree467e3f03d165b4390eb0b051418a0a8d79619fc0 /arch
parent0a6b08fda6e3229713e779e30028598c067e904d (diff)
microblaze: Simplify syscall rutine
Syscall can be called only from userspace that's why we don't need to check which space kernel come from. Kernel syscall calling is not check and shouldn't come throught this part of code. Signed-off-by: Michal Simek <monstr@monstr.eu>
Diffstat (limited to 'arch')
-rw-r--r--arch/microblaze/kernel/entry.S46
1 files changed, 7 insertions, 39 deletions
diff --git a/arch/microblaze/kernel/entry.S b/arch/microblaze/kernel/entry.S
index 6c117ceaabea..bf6b2b122485 100644
--- a/arch/microblaze/kernel/entry.S
+++ b/arch/microblaze/kernel/entry.S
@@ -318,42 +318,23 @@
318 * are masked. This is nice, means we don't have to CLI before state save 318 * are masked. This is nice, means we don't have to CLI before state save
319 */ 319 */
320C_ENTRY(_user_exception): 320C_ENTRY(_user_exception):
321 swi r1, r0, TOPHYS(PER_CPU(ENTRY_SP)) /* save stack */
322 addi r14, r14, 4 /* return address is 4 byte after call */ 321 addi r14, r14, 4 /* return address is 4 byte after call */
322 swi r1, r0, TOPHYS(PER_CPU(ENTRY_SP)) /* save stack */
323 323
324 mfs r1, rmsr
325 nop
326 andi r1, r1, MSR_UMS
327 bnei r1, 1f
328
329/* Kernel-mode state save - kernel execve */
330 lwi r1, r0, TOPHYS(PER_CPU(ENTRY_SP)); /* Reload kernel stack-ptr*/
331 tophys(r1,r1);
332
333 addik r1, r1, -STATE_SAVE_SIZE; /* Make room on the stack. */
334 SAVE_REGS
335
336 swi r1, r1, PTO + PT_MODE; /* pt_regs -> kernel mode */
337 brid 2f;
338 nop; /* Fill delay slot */
339
340/* User-mode state save. */
3411:
342 lwi r1, r0, TOPHYS(PER_CPU(CURRENT_SAVE)); /* get saved current */ 324 lwi r1, r0, TOPHYS(PER_CPU(CURRENT_SAVE)); /* get saved current */
343 tophys(r1,r1); 325 tophys(r1,r1);
344 lwi r1, r1, TS_THREAD_INFO; /* get stack from task_struct */ 326 lwi r1, r1, TS_THREAD_INFO; /* get stack from task_struct */
345/* calculate kernel stack pointer from task struct 8k */ 327 /* MS these three instructions can be added to one */
346 addik r1, r1, THREAD_SIZE; 328 /* addik r1, r1, THREAD_SIZE; */
347 tophys(r1,r1); 329 /* tophys(r1,r1); */
348 330 /* addik r1, r1, -STATE_SAVE_SIZE; */
349 addik r1, r1, -STATE_SAVE_SIZE; /* Make room on the stack. */ 331 addik r1, r1, THREAD_SIZE + CONFIG_KERNEL_BASE_ADDR - CONFIG_KERNEL_START - STATE_SAVE_SIZE;
350 SAVE_REGS 332 SAVE_REGS
351 333
352 swi r0, r1, PTO + PT_MODE; /* Was in user-mode. */
353 lwi r11, r0, TOPHYS(PER_CPU(ENTRY_SP)); 334 lwi r11, r0, TOPHYS(PER_CPU(ENTRY_SP));
354 swi r11, r1, PTO+PT_R1; /* Store user SP. */ 335 swi r11, r1, PTO+PT_R1; /* Store user SP. */
355 clear_ums; 336 clear_ums;
3562: lwi CURRENT_TASK, r0, TOPHYS(PER_CPU(CURRENT_SAVE)); 337 lwi CURRENT_TASK, r0, TOPHYS(PER_CPU(CURRENT_SAVE));
357 /* Save away the syscall number. */ 338 /* Save away the syscall number. */
358 swi r12, r1, PTO+PT_R0; 339 swi r12, r1, PTO+PT_R0;
359 tovirt(r1,r1) 340 tovirt(r1,r1)
@@ -423,9 +404,6 @@ C_ENTRY(ret_from_trap):
423 swi r3, r1, PTO + PT_R3 404 swi r3, r1, PTO + PT_R3
424 swi r4, r1, PTO + PT_R4 405 swi r4, r1, PTO + PT_R4
425 406
426 lwi r11, r1, PTO + PT_MODE;
427/* See if returning to kernel mode, if so, skip resched &c. */
428 bnei r11, 2f;
429 /* We're returning to user mode, so check for various conditions that 407 /* We're returning to user mode, so check for various conditions that
430 * trigger rescheduling. */ 408 * trigger rescheduling. */
431 /* FIXME: Restructure all these flag checks. */ 409 /* FIXME: Restructure all these flag checks. */
@@ -468,16 +446,6 @@ C_ENTRY(ret_from_trap):
468 RESTORE_REGS; 446 RESTORE_REGS;
469 addik r1, r1, STATE_SAVE_SIZE /* Clean up stack space. */ 447 addik r1, r1, STATE_SAVE_SIZE /* Clean up stack space. */
470 lwi r1, r1, PT_R1 - PT_SIZE;/* Restore user stack pointer. */ 448 lwi r1, r1, PT_R1 - PT_SIZE;/* Restore user stack pointer. */
471 bri 6f;
472
473/* Return to kernel state. */
4742: set_bip; /* Ints masked for state restore */
475 VM_OFF;
476 tophys(r1,r1);
477 RESTORE_REGS;
478 addik r1, r1, STATE_SAVE_SIZE /* Clean up stack space. */
479 tovirt(r1,r1);
4806:
481TRAP_return: /* Make global symbol for debugging */ 449TRAP_return: /* Make global symbol for debugging */
482 rtbd r14, 0; /* Instructions to return from an IRQ */ 450 rtbd r14, 0; /* Instructions to return from an IRQ */
483 nop; 451 nop;