From: NIIBE Y. <gn...@m1...> - 2002-03-22 12:54:25
|
And bug fixes. 2002-03-22 NIIBE Yutaka <gn...@m1...> * include/asm-sh/thread_info.h: Define cpu and preempt_count as 16-bit to fit cache (for SH-3). (INIT_THREAD_INFO): Initialize the member 'cpu'. * include/asm-sh/system.h (switch_to): Use __dummy output argument for r0. * include/asm-sh/pgtable.h (pte_offset): Removed. (pte_offset_map, pte_offset_map_nested): Define as pte_offset_kernel. * include/asm-sh/pgalloc.h (pte_alloc_one): Bug fix for clear_page. * arch/sh/mm/cache-sh4.c (flush_cache_range): Don't need to check find_vma. * arch/sh/mm/cache-sh4.c (flush_cache_range, flush_cache_page, clear_user_page, copy_user_page): Use pte_offset_kernel. * arch/sh/mm/fault.c (__do_page_fault): Likewise. * arch/sh/kernel/signal.c (restore_sigcontext): Use tsk. * arch/sh/kernel/setup.c (setup_arch): Bug fix for FPU initialization. * arch/sh/kernel/ptrace.c (sys_ptrace): Remove unused variable tsk. (do_syscall_trace): Use tsk. * arch/sh/kernel/process.c (alloc_task_struct, free_task_struct): Removed. (copy_thread): Bug fix for thread_info. Clear TIF_USEDFPU flag. (copy_thread, dump_thread): Don't distingush init_task specially. (switch_to): Bug fix, use next->thread_info. * arch/sh/kernel/entry.S (work_resched, resume_userspace, syscall_exit): Use r8 for current_thread_info. (syscall_exit_work): Bug fix, load do_syscall_trace. (system_call): Don't need to ext.u. Micro opt. for syscall_nr. (syscall_trace_entry, syscall_badsys): Bug fix for error return value. Index: arch/sh/kernel/entry.S =================================================================== RCS file: /cvsroot/linuxsh/linux/arch/sh/kernel/entry.S,v retrieving revision 1.8 diff -u -3 -p -r1.8 entry.S --- arch/sh/kernel/entry.S 22 Mar 2002 10:52:09 -0000 1.8 +++ arch/sh/kernel/entry.S 22 Mar 2002 12:49:43 -0000 @@ -129,7 +129,7 @@ SYSCALL_NR = (16*4+6*4) mov.l __INV_IMASK, r11; \ stc sr, r10; \ and r11, r10; \ - stc k_g_imask, r11; \ + stc k_g_imask, r11; \ or r11, r10; \ ldc r10, sr @@ -257,7 +257,7 @@ debug_trap: shll r0 ! kernel space? bt/s debug_kernel #endif - mov.l @r15, r0 + mov.l @r15, r0 ! Restore R0 value mov.l 1f, r8 jmp @r8 nop @@ -278,22 +278,21 @@ error: .align 2 work_pending: ! r0: current_thread_info->flags + ! r8: current_thread_info tst #_TIF_NEED_RESCHED, r0 bt work_notifysig .align 2 work_resched: mov.l 1f, r1 - jsr @r1 + jsr @r1 ! schedule nop /* CLI */ stc sr, r0 or #0xf0, r0 ldc r0, sr ! - GET_THREAD_INFO(r1) - add #TI_FLAGS, r1 - mov.l @r1, r0 ! current_thread_info->flags + mov.l @(TI_FLAGS,r8), r0 ! current_thread_info->flags tst #_TIF_WORK_MASK, r0 bt restore_all bra work_pending @@ -317,9 +316,8 @@ ENTRY(resume_userspace) or #0xf0, r0 ldc r0, sr ! - GET_THREAD_INFO(r1) - add #TI_FLAGS, r1 - mov.l @r1, r0 ! current_thread_info->flags + GET_THREAD_INFO(r8) + mov.l @(TI_FLAGS,r8), r0 ! current_thread_info->flags tst #_TIF_WORK_MASK, r0 bf work_pending bra restore_all @@ -327,17 +325,17 @@ ENTRY(resume_userspace) .align 2 1: .long SYMBOL_NAME(schedule) -2: - .long SYMBOL_NAME(do_signal) +2: .long SYMBOL_NAME(do_signal) .align 2 syscall_exit_work: ! r0: current_thread_info->flags + ! r8: current_thread_info tst #_TIF_SYSCALL_TRACE, r0 bt work_pending STI() ! XXX setup arguments... - mov.l 1f, r0 + mov.l 4f, r0 ! do_syscall_trace jsr @r0 nop bra resume_userspace @@ -373,7 +371,6 @@ system_call: ! ! Is the trap argument >= 0x20? (TRA will be >= 0x80) mov #0x20, r9 - extu.b r9, r9 shll2 r9 cmp/hs r9, r8 bt debug_trap @@ -385,31 +382,29 @@ system_call: shlr2 r8 shll8 r8 shll8 r8 ! r8 = num_args<<16 - mov r3, r10 - or r8, r10 ! Encode syscall # and # of arguments - mov.l r10, @r14 ! set syscall_nr + or r3, r8 ! Encode syscall # and # of arguments + mov.l r8, @r14 ! set syscall_nr STI() ! Call the system call handler through the table. ! First check for bad syscall number mov r3, r9 - mov.l 2f, r10 ! Number of syscalls - cmp/hs r10, r9 + mov.l 2f, r8 ! Number of syscalls + cmp/hs r8, r9 bt syscall_badsys ! ! Good syscall number - GET_THREAD_INFO(r11) - add #TI_FLAGS, r11 - mov.l @r11, r10 - mov #_TIF_SYSCALL_TRACE, r11 - tst r11, r10 + GET_THREAD_INFO(r8) + mov.l @(TI_FLAGS,r8), r8 + mov #_TIF_SYSCALL_TRACE, r10 + tst r10, r8 bf syscall_trace_entry ! syscall_call: shll2 r9 ! x4 - mov.l 3f, r11 ! Load the address of sys_call_table - add r11, r9 - mov.l @r9, r11 - jsr @r11 ! jump to specific syscall handler + mov.l 3f, r8 ! Load the address of sys_call_table + add r8, r9 + mov.l @r9, r8 + jsr @r8 ! jump to specific syscall handler nop mov.l r0, @(OFF_R0,r15) ! save the return value ENTRY(ret_from_fork) @@ -419,9 +414,8 @@ syscall_exit: or #0xf0, r0 ldc r0, sr ! - GET_THREAD_INFO(r1) - add #TI_FLAGS, r1 - mov.l @r1, r0 ! current_thread_info->flags + GET_THREAD_INFO(r8) + mov.l @(TI_FLAGS,r8), r0 ! current_thread_info->flags tst #_TIF_ALLWORK_MASK, r0 bf syscall_exit_work restore_all: @@ -483,6 +477,7 @@ restore_all: 1: .long TRA 2: .long NR_syscalls 3: .long SYMBOL_NAME(sys_call_table) +4: .long SYMBOL_NAME(do_syscall_trace) 7: .long 0x30000000 8: .long 0x00008000 ! FD 9: .long 0xffff7f0f ! ~(IMASK+FD) @@ -511,8 +506,9 @@ syscall_trace_entry: mov.l 2f, r10 ! Number of syscalls cmp/hs r10, r3 bf syscall_call + mov #-ENOSYS, r0 bra syscall_exit - mov #-ENOSYS, r0 + mov.l r0, @(OFF_R0,r15) ! Return value .align 2 1: .long SYMBOL_NAME(do_syscall_trace) @@ -522,8 +518,9 @@ __INV_IMASK: .align 2 syscall_badsys: ! Bad syscall number + mov #-ENOSYS, r0 bra resume_userspace - mov #-ENOSYS, r0 + mov.l r0, @(OFF_R0,r15) ! Return value .align 2 ret_from_irq: @@ -590,7 +587,7 @@ handle_exception: mov r15, k0 ! save original stack to k0 /* User space to kernel */ mov #0x20, k1 - shll8 k1 ! k1 <= 8192 == THREAD_SIZE + shll8 k1 ! k1 := 8192 (== THREAD_SIZE) add current, k1 mov k1, r15 ! change to kernel stack ! Index: arch/sh/kernel/head.S =================================================================== RCS file: /cvsroot/linuxsh/linux/arch/sh/kernel/head.S,v retrieving revision 1.2 diff -u -3 -p -r1.2 head.S --- arch/sh/kernel/head.S 29 Dec 2001 06:50:38 -0000 1.2 +++ arch/sh/kernel/head.S 22 Mar 2002 12:49:43 -0000 @@ -48,7 +48,7 @@ ENTRY(_stext) mov #0x20, r1 ! shll8 r1 ! r1 = 8192 sub r1, r0 ! - ldc r0, r7_bank ! ... and init_task + ldc r0, r7_bank ! ... and initial thread_info ! ! Enable cache mov.l 6f, r0 Index: arch/sh/kernel/process.c =================================================================== RCS file: /cvsroot/linuxsh/linux/arch/sh/kernel/process.c,v retrieving revision 1.7 diff -u -3 -p -r1.7 process.c --- arch/sh/kernel/process.c 22 Mar 2002 03:58:40 -0000 1.7 +++ arch/sh/kernel/process.c 22 Mar 2002 12:49:43 -0000 @@ -96,17 +96,6 @@ void show_regs(struct pt_regs * regs) regs->mach, regs->macl, regs->gbr, regs->pr); } -struct task_struct * alloc_task_struct(void) -{ - /* Get two pages */ - return (struct task_struct *) __get_free_pages(GFP_KERNEL,1); -} - -void free_task_struct(struct task_struct *p) -{ - free_pages((unsigned long) p, 1); -} - /* * Create a kernel thread */ @@ -197,26 +186,14 @@ int copy_thread(int nr, unsigned long cl struct task_struct *p, struct pt_regs *regs) { struct pt_regs *childregs; -#if defined(__SH4__) - struct task_struct *tsk = current; - - if (tsk != &init_task) { - unsigned long flags; - save_and_cli(flags); - unlazy_fpu(tsk); - restore_flags(flags); - p->thread.fpu = current->thread.fpu; - p->used_math = tsk->used_math; - } -#endif - childregs = ((struct pt_regs *)(THREAD_SIZE + (unsigned long) p)) - 1; + childregs = ((struct pt_regs *)(THREAD_SIZE + (unsigned long) p->thread_info)) - 1; *childregs = *regs; if (user_mode(regs)) { childregs->regs[15] = usp; } else { - childregs->regs[15] = (unsigned long)p+2*PAGE_SIZE; + childregs->regs[15] = (unsigned long)p->thread_info+THREAD_SIZE; } childregs->regs[0] = 0; /* Set return value for child */ childregs->sr |= SR_FD; /* Invalidate FPU flag */ @@ -224,6 +201,19 @@ int copy_thread(int nr, unsigned long cl p->thread.sp = (unsigned long) childregs; p->thread.pc = (unsigned long) ret_from_fork; +#if defined(__SH4__) + { + unsigned long flags; + struct task_struct *tsk = current; + + save_and_cli(flags); + unlazy_fpu(tsk); + restore_flags(flags); + p->thread.fpu = tsk->thread.fpu; + p->used_math = tsk->used_math; + clear_ti_thread_flag(p->thread_info, TIF_USEDFPU); + } +#endif return 0; } @@ -254,7 +244,7 @@ void dump_thread(struct pt_regs * regs, void __switch_to(struct task_struct *prev, struct task_struct *next) { #if defined(__SH4__) - if (prev != &init_task) { + { unsigned long flags; save_and_cli(flags); @@ -268,7 +258,7 @@ void __switch_to(struct task_struct *pre */ asm volatile("ldc %0, r7_bank" : /* no output */ - :"r" (next)); + : "r" (next->thread_info)); } asmlinkage int sys_fork(unsigned long r4, unsigned long r5, Index: arch/sh/kernel/ptrace.c =================================================================== RCS file: /cvsroot/linuxsh/linux/arch/sh/kernel/ptrace.c,v retrieving revision 1.3 diff -u -3 -p -r1.3 ptrace.c --- arch/sh/kernel/ptrace.c 1 Mar 2002 01:55:10 -0000 1.3 +++ arch/sh/kernel/ptrace.c 22 Mar 2002 12:49:43 -0000 @@ -159,7 +159,7 @@ void ptrace_disable(struct task_struct * asmlinkage int sys_ptrace(long request, long pid, long addr, long data) { - struct task_struct *child, *tsk = current; + struct task_struct *child; struct user * dummy = NULL; int ret; @@ -378,11 +378,11 @@ asmlinkage void do_syscall_trace(void) if (!test_thread_flag(TIF_SYSCALL_TRACE)) return; - if (!(current->ptrace & PT_PTRACED)) + if (!(tsk->ptrace & PT_PTRACED)) return; /* the 0x80 provides a way for the tracing parent to distinguish between a syscall stop and SIGTRAP delivery */ - tsk->exit_code = SIGTRAP | ((current->ptrace & PT_TRACESYSGOOD) + tsk->exit_code = SIGTRAP | ((tsk->ptrace & PT_TRACESYSGOOD) ? 0x80 : 0); tsk->state = TASK_STOPPED; notify_parent(tsk, SIGCHLD); Index: arch/sh/kernel/setup.c =================================================================== RCS file: /cvsroot/linuxsh/linux/arch/sh/kernel/setup.c,v retrieving revision 1.4 diff -u -3 -p -r1.4 setup.c --- arch/sh/kernel/setup.c 1 Mar 2002 01:55:10 -0000 1.4 +++ arch/sh/kernel/setup.c 22 Mar 2002 12:49:43 -0000 @@ -474,9 +474,9 @@ void __init setup_arch(char **cmdline_p) } #if defined(__SH4__) - /* We already grab/initialized FPU in head.S. Make it consisitent. */ - init_task.used_math = 1; - set_thread_flag(TIF_USEDFPU); + /* FPU initialization */ + clear_thread_flag(TIF_USEDFPU); + current->used_math = 0; #endif paging_init(); } Index: arch/sh/kernel/signal.c =================================================================== RCS file: /cvsroot/linuxsh/linux/arch/sh/kernel/signal.c,v retrieving revision 1.5 diff -u -3 -p -r1.5 signal.c --- arch/sh/kernel/signal.c 22 Mar 2002 10:52:09 -0000 1.5 +++ arch/sh/kernel/signal.c 22 Mar 2002 12:49:43 -0000 @@ -1,4 +1,4 @@ -/* $Id: signal.c,v 1.5 2002/03/22 10:52:09 gniibe Exp $ +/* $Id: signal.c,v 1.4 2002/03/22 00:59:15 gniibe Exp $ * * linux/arch/sh/kernel/signal.c * @@ -250,7 +250,7 @@ restore_sigcontext(struct pt_regs *regs, regs->sr |= SR_FD; /* Release FPU */ clear_fpu(tsk); - current->used_math = 0; + tsk->used_math = 0; __get_user (owned_fp, &sc->sc_ownedfp); if (owned_fp) err |= restore_sigcontext_fpu(sc); Index: arch/sh/mm/cache-sh4.c =================================================================== RCS file: /cvsroot/linuxsh/linux/arch/sh/mm/cache-sh4.c,v retrieving revision 1.5 diff -u -3 -p -r1.5 cache-sh4.c --- arch/sh/mm/cache-sh4.c 22 Mar 2002 03:58:40 -0000 1.5 +++ arch/sh/mm/cache-sh4.c 22 Mar 2002 12:49:43 -0000 @@ -329,8 +329,6 @@ void flush_cache_range(struct vm_area_st start &= PAGE_MASK; - if (!find_vma(mm, start)) - return; if (mm->context != current->active_mm->context) { flush_cache_all(); } else { @@ -344,7 +342,7 @@ void flush_cache_range(struct vm_area_st for (start; start < end; start += PAGE_SIZE) { pgd = pgd_offset(mm, start); pmd = pmd_offset(pgd, start); - pte = pte_offset(pmd, start); + pte = pte_offset_kernel(pmd, start); if (pte_val(*pte) & _PAGE_PRESENT) { __flush_icache_page(start); @@ -375,7 +373,7 @@ void flush_cache_page(struct vm_area_str pmd = pmd_offset(dir, address); if (pmd_none(*pmd) || pmd_bad(*pmd)) return; - pte = pte_offset(pmd, address); + pte = pte_offset_kernel(pmd, address); entry = *pte; if (pte_none(entry) || !pte_present(entry)) return; @@ -459,7 +457,7 @@ void clear_user_page(void *to, unsigned unsigned long p3_addr = P3SEG + (address & CACHE_ALIAS); pgd_t *dir = pgd_offset_k(p3_addr); pmd_t *pmd = pmd_offset(dir, p3_addr); - pte_t *pte = pte_offset(pmd, p3_addr); + pte_t *pte = pte_offset_kernel(pmd, p3_addr); pte_t entry; unsigned long flags; @@ -498,7 +496,7 @@ void copy_user_page(void *to, void *from unsigned long p3_addr = P3SEG + (address & CACHE_ALIAS); pgd_t *dir = pgd_offset_k(p3_addr); pmd_t *pmd = pmd_offset(dir, p3_addr); - pte_t *pte = pte_offset(pmd, p3_addr); + pte_t *pte = pte_offset_kernel(pmd, p3_addr); pte_t entry; unsigned long flags; Index: arch/sh/mm/fault.c =================================================================== RCS file: /cvsroot/linuxsh/linux/arch/sh/mm/fault.c,v retrieving revision 1.4 diff -u -3 -p -r1.4 fault.c --- arch/sh/mm/fault.c 24 Jan 2002 11:04:15 -0000 1.4 +++ arch/sh/mm/fault.c 22 Mar 2002 12:49:43 -0000 @@ -261,7 +261,7 @@ asmlinkage int __do_page_fault(struct pt pmd_clear(pmd); return 1; } - pte = pte_offset(pmd, address); + pte = pte_offset_kernel(pmd, address); entry = *pte; if (pte_none(entry) || pte_not_present(entry) || (writeaccess && !pte_write(entry))) Index: include/asm-sh/pgalloc.h =================================================================== RCS file: /cvsroot/linuxsh/linux/include/asm-sh/pgalloc.h,v retrieving revision 1.5 diff -u -3 -p -r1.5 pgalloc.h --- include/asm-sh/pgalloc.h 22 Mar 2002 10:52:09 -0000 1.5 +++ include/asm-sh/pgalloc.h 22 Mar 2002 12:49:44 -0000 @@ -64,7 +64,7 @@ static inline struct page *pte_alloc_one do { pte = alloc_pages(GFP_KERNEL, 0); if (pte) - clear_page(pte); + clear_page(page_address(pte)); else { current->state = TASK_UNINTERRUPTIBLE; schedule_timeout(HZ); Index: include/asm-sh/pgtable.h =================================================================== RCS file: /cvsroot/linuxsh/linux/include/asm-sh/pgtable.h,v retrieving revision 1.6 diff -u -3 -p -r1.6 pgtable.h --- include/asm-sh/pgtable.h 22 Mar 2002 03:58:40 -0000 1.6 +++ include/asm-sh/pgtable.h 22 Mar 2002 12:49:44 -0000 @@ -288,13 +288,10 @@ static inline pte_t pte_modify(pte_t pte /* Find an entry in the third-level page table.. */ #define __pte_offset(address) \ ((address >> PAGE_SHIFT) & (PTRS_PER_PTE - 1)) -#define pte_offset(dir, address) \ - ((pte_t *)pmd_page(*(dir)) + __pte_offset(address)) #define pte_offset_kernel(dir, address) \ ((pte_t *) pmd_page_kernel(*(dir)) + __pte_offset(address)) -#define pte_offset_map(dir, address) \ - ((pte_t *)page_address(pmd_page(*(dir))) + __pte_offset(address)) -#define pte_offset_map_nested(dir, address) pte_offset_map(dir, address) +#define pte_offset_map(dir, address) pte_offset_kernel(dir, address) +#define pte_offset_map_nested(dir, address) pte_offset_kernel(dir, address) #define pte_unmap(pte) do { } while (0) #define pte_unmap_nested(pte) do { } while (0) @@ -304,7 +301,7 @@ extern void update_mmu_cache(struct vm_a /* Encode and de-code a swap entry */ /* * NOTE: We should set ZEROs at the position of _PAGE_PRESENT - * and _PAGE_PROTONOE bits + * and _PAGE_PROTNONE bits */ #define SWP_TYPE(x) ((x).val & 0xff) #define SWP_OFFSET(x) ((x).val >> 10) Index: include/asm-sh/system.h =================================================================== RCS file: /cvsroot/linuxsh/linux/include/asm-sh/system.h,v retrieving revision 1.2 diff -u -3 -p -r1.2 system.h --- include/asm-sh/system.h 22 Mar 2002 03:58:40 -0000 1.2 +++ include/asm-sh/system.h 22 Mar 2002 12:49:44 -0000 @@ -20,48 +20,48 @@ typedef struct { #error no SMP SuperH #else #define prepare_to_switch() do { } while(0) -#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; \ - register unsigned long *__ts5 __asm__ ("r5") = (unsigned long *)next; \ - register unsigned long *__ts6 __asm__ ("r6") = &next->thread.sp; \ - register unsigned long __ts7 __asm__ ("r7") = next->thread.pc; \ - __asm__ __volatile__ (".balign 4\n\t" \ - "stc.l gbr, @-r15\n\t" \ - "sts.l pr, @-r15\n\t" \ - "mov.l r8, @-r15\n\t" \ - "mov.l r9, @-r15\n\t" \ - "mov.l r10, @-r15\n\t" \ - "mov.l r11, @-r15\n\t" \ - "mov.l r12, @-r15\n\t" \ - "mov.l r13, @-r15\n\t" \ - "mov.l r14, @-r15\n\t" \ - "mov.l r15, @r1 ! save SP\n\t" \ +#define switch_to(prev, next) do { \ + register unsigned long __dummy; \ + 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; \ + register unsigned long *__ts5 __asm__ ("r5") = (unsigned long *)next; \ + register unsigned long *__ts6 __asm__ ("r6") = &next->thread.sp; \ + register unsigned long __ts7 __asm__ ("r7") = next->thread.pc; \ + __asm__ __volatile__ (".balign 4\n\t" \ + "stc.l gbr, @-r15\n\t" \ + "sts.l pr, @-r15\n\t" \ + "mov.l r8, @-r15\n\t" \ + "mov.l r9, @-r15\n\t" \ + "mov.l r10, @-r15\n\t" \ + "mov.l r11, @-r15\n\t" \ + "mov.l r12, @-r15\n\t" \ + "mov.l r13, @-r15\n\t" \ + "mov.l r14, @-r15\n\t" \ + "mov.l r15, @r1 ! save SP\n\t" \ "mov.l @r6, r15 ! change to new stack\n\t" \ - "mova 1f, %0\n\t" \ - "mov.l %0, @r2 ! save PC\n\t" \ - "mov.l 2f, %0\n\t" \ + "mova 1f, %0\n\t" \ + "mov.l %0, @r2 ! save PC\n\t" \ + "mov.l 2f, %0\n\t" \ "jmp @%0 ! call __switch_to\n\t" \ - " lds r7, pr ! with return to new PC\n\t" \ - ".balign 4\n" \ - "2:\n\t" \ - ".long " "__switch_to\n" \ - "1:\n\t" \ - "mov.l @r15+, r14\n\t" \ - "mov.l @r15+, r13\n\t" \ - "mov.l @r15+, r12\n\t" \ - "mov.l @r15+, r11\n\t" \ - "mov.l @r15+, r10\n\t" \ - "mov.l @r15+, r9\n\t" \ - "mov.l @r15+, r8\n\t" \ - "lds.l @r15+, pr\n\t" \ - "ldc.l @r15+, gbr\n\t" \ - : /* No output */ \ - : "z" (prev), \ - "r" (__ts1), "r" (__ts2), \ - "r" (__ts4), "r" (__ts5), "r" (__ts6), "r" (__ts7) \ - : "r3", "t"); \ + " lds r7, pr ! with return to new PC\n\t" \ + ".balign 4\n" \ + "2:\n\t" \ + ".long __switch_to\n" \ + "1:\n\t" \ + "mov.l @r15+, r14\n\t" \ + "mov.l @r15+, r13\n\t" \ + "mov.l @r15+, r12\n\t" \ + "mov.l @r15+, r11\n\t" \ + "mov.l @r15+, r10\n\t" \ + "mov.l @r15+, r9\n\t" \ + "mov.l @r15+, r8\n\t" \ + "lds.l @r15+, pr\n\t" \ + "ldc.l @r15+, gbr\n\t" \ + : "=z" (__dummy) \ + : "r" (__ts1), "r" (__ts2), "r" (__ts4), \ + "r" (__ts5), "r" (__ts6), "r" (__ts7) \ + : "r3", "t"); \ } while (0) #endif Index: include/asm-sh/thread_info.h =================================================================== RCS file: /cvsroot/linuxsh/linux/include/asm-sh/thread_info.h,v retrieving revision 1.2 diff -u -3 -p -r1.2 thread_info.h --- include/asm-sh/thread_info.h 19 Mar 2002 23:48:06 -0000 1.2 +++ include/asm-sh/thread_info.h 22 Mar 2002 12:49:44 -0000 @@ -27,9 +27,9 @@ struct thread_info { struct task_struct *task; /* main task structure */ struct exec_domain *exec_domain; /* execution domain */ __u32 flags; /* low level flags */ - __s32 preempt_count; /* 0 => preemptable, <0 => BUG */ + __u16 cpu; + __s16 preempt_count; /* 0 => preemptable, <0 => BUG */ - __u32 cpu; __u8 supervisor_stack[0]; }; @@ -52,6 +52,7 @@ struct thread_info { task: &tsk, \ exec_domain: &default_exec_domain, \ flags: 0, \ + cpu: 0, \ preempt_count: 0, \ } |