From: NIIBE Y. <gn...@m1...> - 2002-03-22 02:00:01
|
Another follow up to 2.5.5. 2002-03-22 NIIBE Yutaka <gn...@m1...> * arch/sh/kernel/entry.S (ret_from_fork): Follow the change of switch_to. Don't call schedule_tail (it's now SMP only function). Move the label to syscall_exit. * include/asm-sh/system.h (switch_to): Change the API (removing last argument). * include/asm-sh/page.h (VM_DATA_DEFAULT_FLAGS): Defined. * include/asm-sh/bitops.h (sched_find_first_bit): 140-bit implementation. It's moved to here... * include/asm-sh/mmu_context.h: ... from here. (Removed). Index: arch/sh/kernel/entry.S =================================================================== RCS file: /cvsroot/linuxsh/linux/arch/sh/kernel/entry.S,v retrieving revision 1.5 diff -u -3 -p -r1.5 entry.S --- arch/sh/kernel/entry.S 19 Mar 2002 23:48:05 -0000 1.5 +++ arch/sh/kernel/entry.S 22 Mar 2002 01:57:26 -0000 @@ -268,19 +268,9 @@ error: nop ! -ENTRY(ret_from_fork) - mov.l @r15+,r0 - mov r0, r4 - ! Call schedule_tail - mov.l 3f, r1 - mova syscall_exit, r0 - jmp @r1 - lds r0, pr - .align 2 1: .long SYMBOL_NAME(break_point_trap_software) 2: .long SYMBOL_NAME(do_exception_error) -3: .long SYMBOL_NAME(schedule_tail) .align 2 work_pending: @@ -406,6 +396,7 @@ syscall_call: jsr @r11 ! jump to specific syscall handler nop mov.l r0, @(OFF_R0,r15) ! save the return value +ENTRY(ret_from_fork): syscall_exit: /* CLI */ stc sr, r0 Index: include/asm-sh/bitops.h =================================================================== RCS file: /cvsroot/linuxsh/linux/include/asm-sh/bitops.h,v retrieving revision 1.2 diff -u -3 -p -r1.2 bitops.h --- include/asm-sh/bitops.h 26 Feb 2002 09:15:15 -0000 1.2 +++ include/asm-sh/bitops.h 22 Mar 2002 01:57:26 -0000 @@ -262,6 +262,26 @@ found_middle: #define hweight16(x) generic_hweight16(x) #define hweight8(x) generic_hweight8(x) +/* + * Every architecture must define this function. It's the fastest + * way of searching a 140-bit bitmap where the first 100 bits are + * unlikely to be set. It's guaranteed that at least one of the 140 + * bits is cleared. + */ + +static inline int sched_find_first_bit(unsigned long *b) +{ + if (unlikely(b[0])) + return __ffs(b[0]); + if (unlikely(b[1])) + return __ffs(b[1]) + 32; + if (unlikely(b[2])) + return __ffs(b[2]) + 64; + if (b[3]) + return __ffs(b[3]) + 96; + return __ffs(b[4]) + 128; +} + #ifdef __LITTLE_ENDIAN__ #define ext2_set_bit(nr, addr) test_and_set_bit((nr), (addr)) #define ext2_clear_bit(nr, addr) test_and_clear_bit((nr), (addr)) Index: include/asm-sh/mmu_context.h =================================================================== RCS file: /cvsroot/linuxsh/linux/include/asm-sh/mmu_context.h,v retrieving revision 1.5 diff -u -3 -p -r1.5 mmu_context.h --- include/asm-sh/mmu_context.h 26 Feb 2002 09:15:16 -0000 1.5 +++ include/asm-sh/mmu_context.h 22 Mar 2002 01:57:26 -0000 @@ -186,38 +186,4 @@ enter_lazy_tlb(struct mm_struct *mm, str { } -/* - * Every architecture must define this function. It's the fastest - * way of searching a 168-bit bitmap where the first 128 bits are - * unlikely to be set. It's guaranteed that at least one of the 168 - * bits is cleared. - */ -#if MAX_RT_PRIO != 128 || MAX_PRIO != 168 -# error update this function. -#endif - -static inline int sched_find_first_bit(unsigned long *b) -{ - unsigned int rt; - - rt = b[0] & b[1] & b[2] & b[3]; - if (unlikely(rt != 0xffffffff)) - return find_first_zero_bit(b, MAX_RT_PRIO); - - if (b[4] != ~0) - return ffz(b[4]) + MAX_RT_PRIO; - return ffz(b[5]) + 32 + MAX_RT_PRIO; - if (unlikely(b[0])) - return __ffs(b[0]); - if (unlikely(b[1])) - return __ffs(b[1]) + 32; - if (unlikely(b[2])) - return __ffs(b[2]) + 64; - if (unlikely(b[3])) - return __ffs(b[3]) + 96; - if (b[4]) - return __ffs(b[4]) + 128; - return __ffs(b[5]) + 32 + 128; -} - #endif /* __ASM_SH_MMU_CONTEXT_H */ Index: include/asm-sh/page.h =================================================================== RCS file: /cvsroot/linuxsh/linux/include/asm-sh/page.h,v retrieving revision 1.1.1.1 diff -u -3 -p -r1.1.1.1 page.h --- include/asm-sh/page.h 15 Oct 2001 20:45:10 -0000 1.1.1.1 +++ include/asm-sh/page.h 22 Mar 2002 01:57:26 -0000 @@ -86,6 +86,9 @@ typedef struct { unsigned long pgprot; } #define page_to_phys(page) (((page - mem_map) << PAGE_SHIFT) + __MEMORY_START) #endif +#define VM_DATA_DEFAULT_FLAGS (VM_READ | VM_WRITE | VM_EXEC | \ + VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC) + #define virt_to_page(kaddr) phys_to_page(__pa(kaddr)) #ifndef __ASSEMBLY__ Index: include/asm-sh/system.h =================================================================== RCS file: /cvsroot/linuxsh/linux/include/asm-sh/system.h,v retrieving revision 1.1.1.1 diff -u -3 -p -r1.1.1.1 system.h --- include/asm-sh/system.h 15 Oct 2001 20:45:11 -0000 1.1.1.1 +++ include/asm-sh/system.h 22 Mar 2002 01:57:26 -0000 @@ -20,8 +20,7 @@ typedef struct { #error no SMP SuperH #else #define prepare_to_switch() do { } while(0) -#define switch_to(prev,next,last) do { \ - register struct task_struct *__last; \ +#define switch_to(prev, next) do { \ register unsigned long *__ts1 __asm__ ("r1") = &prev->thread.sp; \ register unsigned long *__ts2 __asm__ ("r2") = &prev->thread.pc; \ register unsigned long *__ts4 __asm__ ("r4") = (unsigned long *)prev; \ @@ -40,7 +39,6 @@ typedef struct { "mov.l r14, @-r15\n\t" \ "mov.l r15, @r1 ! save SP\n\t" \ "mov.l @r6, r15 ! change to new stack\n\t" \ - "mov.l %0, @-r15 ! push R0 onto new stack\n\t" \ "mova 1f, %0\n\t" \ "mov.l %0, @r2 ! save PC\n\t" \ "mov.l 2f, %0\n\t" \ @@ -50,7 +48,6 @@ typedef struct { "2:\n\t" \ ".long " "__switch_to\n" \ "1:\n\t" \ - "mov.l @r15+, %0 ! pop R0 from new stack\n\t" \ "mov.l @r15+, r14\n\t" \ "mov.l @r15+, r13\n\t" \ "mov.l @r15+, r12\n\t" \ @@ -60,12 +57,11 @@ typedef struct { "mov.l @r15+, r8\n\t" \ "lds.l @r15+, pr\n\t" \ "ldc.l @r15+, gbr\n\t" \ - :"=&z" (__last) \ - :"0" (prev), \ - "r" (__ts1), "r" (__ts2), \ - "r" (__ts4), "r" (__ts5), "r" (__ts6), "r" (__ts7) \ - :"r3", "t"); \ - last = __last; \ + : /* No output */ \ + : "r" (prev), \ + "r" (__ts1), "r" (__ts2), \ + "r" (__ts4), "r" (__ts5), "r" (__ts6), "r" (__ts7) \ + : "r3", "t"); \ } while (0) #endif |