diff options
Diffstat (limited to 'include')
27 files changed, 375 insertions, 224 deletions
diff --git a/include/asm-i386/processor.h b/include/asm-i386/processor.h index d830237efb4d..ec48a38e5e0f 100644 --- a/include/asm-i386/processor.h +++ b/include/asm-i386/processor.h @@ -439,9 +439,9 @@ extern void release_segments(struct mm_struct * mm); /* * Return saved PC of a blocked thread. */ -static inline unsigned long thread_saved_pc(struct thread_struct *t) +static inline unsigned long thread_saved_pc(struct task_struct *tsk) { - return ((unsigned long *)t->esp)[3]; + return ((unsigned long *)tsk->thread->esp)[3]; } unsigned long get_wchan(struct task_struct *p); diff --git a/include/asm-sparc/checksum.h b/include/asm-sparc/checksum.h index 2f92efb4440a..cfe871c624ca 100644 --- a/include/asm-sparc/checksum.h +++ b/include/asm-sparc/checksum.h @@ -1,4 +1,4 @@ -/* $Id: checksum.h,v 1.32 2001/10/30 04:32:24 davem Exp $ */ +/* $Id: checksum.h,v 1.33 2002/02/01 22:01:05 davem Exp $ */ #ifndef __SPARC_CHECKSUM_H #define __SPARC_CHECKSUM_H @@ -16,6 +16,7 @@ * RFC1071 Computing the Internet Checksum */ +#include <linux/in6.h> #include <asm/uaccess.h> #include <asm/cprefix.h> diff --git a/include/asm-sparc/siginfo.h b/include/asm-sparc/siginfo.h index 816a08a67275..629641b64750 100644 --- a/include/asm-sparc/siginfo.h +++ b/include/asm-sparc/siginfo.h @@ -1,4 +1,4 @@ -/* $Id: siginfo.h,v 1.8 2000/05/27 00:49:37 davem Exp $ +/* $Id: siginfo.h,v 1.9 2002/02/08 03:57:18 davem Exp $ * siginfo.c: */ diff --git a/include/asm-sparc/unistd.h b/include/asm-sparc/unistd.h index cbed9be281d4..5fc0f36c21be 100644 --- a/include/asm-sparc/unistd.h +++ b/include/asm-sparc/unistd.h @@ -1,4 +1,4 @@ -/* $Id: unistd.h,v 1.73 2002/01/31 03:30:13 davem Exp $ */ +/* $Id: unistd.h,v 1.74 2002/02/08 03:57:18 davem Exp $ */ #ifndef _SPARC_UNISTD_H #define _SPARC_UNISTD_H @@ -202,7 +202,7 @@ #define __NR_query_module 184 /* Linux Specific */ #define __NR_setpgid 185 /* Common */ #define __NR_fremovexattr 186 /* SunOS: pathconf */ -/* #define __NR_fpathconf 187 SunOS Specific */ +#define __NR_tkill 187 /* SunOS: fpathconf */ /* #define __NR_sysconf 188 SunOS Specific */ #define __NR_uname 189 /* Linux Specific */ #define __NR_init_module 190 /* Linux Specific */ @@ -271,7 +271,6 @@ #define __NR_fdatasync 253 #define __NR_nfsservctl 254 #define __NR_aplib 255 -#define __NR_tkill 257 #define _syscall0(type,name) \ type name(void) \ diff --git a/include/asm-sparc64/a.out.h b/include/asm-sparc64/a.out.h index 2b9ee5cddfac..02af289e3f46 100644 --- a/include/asm-sparc64/a.out.h +++ b/include/asm-sparc64/a.out.h @@ -1,4 +1,4 @@ -/* $Id: a.out.h,v 1.7 2001/04/24 01:09:12 davem Exp $ */ +/* $Id: a.out.h,v 1.8 2002/02/09 19:49:31 davem Exp $ */ #ifndef __SPARC64_A_OUT_H__ #define __SPARC64_A_OUT_H__ @@ -95,7 +95,7 @@ struct relocation_info /* used when header.a_machtype == M_SPARC */ #ifdef __KERNEL__ -#define STACK_TOP (current->thread.flags & SPARC_FLAG_32BIT ? 0xf0000000 : 0x80000000000L) +#define STACK_TOP (test_thread_flag(TIF_32BIT) ? 0xf0000000 : 0x80000000000L) #endif diff --git a/include/asm-sparc64/checksum.h b/include/asm-sparc64/checksum.h index 5fbda2574179..6128f20a8f1e 100644 --- a/include/asm-sparc64/checksum.h +++ b/include/asm-sparc64/checksum.h @@ -1,4 +1,4 @@ -/* $Id: checksum.h,v 1.17 2001/04/24 01:09:12 davem Exp $ */ +/* $Id: checksum.h,v 1.19 2002/02/09 19:49:31 davem Exp $ */ #ifndef __SPARC64_CHECKSUM_H #define __SPARC64_CHECKSUM_H @@ -16,7 +16,8 @@ * RFC1071 Computing the Internet Checksum */ -#include <asm/uaccess.h> +#include <linux/in6.h> +#include <asm/uaccess.h> /* computes the checksum of a memory block at buff, length len, * and adds in "sum" (32-bit) @@ -44,7 +45,7 @@ csum_partial_copy_nocheck (const char *src, char *dst, int len, unsigned int sum) { int ret; - unsigned char cur_ds = current->thread.current_ds.seg; + unsigned char cur_ds = get_thread_current_ds(); __asm__ __volatile__ ("wr %%g0, %0, %%asi" : : "i" (ASI_P)); ret = csum_partial_copy_sparc64(src, dst, len, sum); __asm__ __volatile__ ("wr %%g0, %0, %%asi" : : "r" (cur_ds)); diff --git a/include/asm-sparc64/current.h b/include/asm-sparc64/current.h index 80652fb3582b..7683c6bdcd10 100644 --- a/include/asm-sparc64/current.h +++ b/include/asm-sparc64/current.h @@ -1,7 +1,8 @@ #ifndef _SPARC64_CURRENT_H #define _SPARC64_CURRENT_H -/* Sparc rules... */ -register struct task_struct *current asm("g6"); +#include <asm/thread_info.h> + +#define current (current_thread_info()->task) #endif /* !(_SPARC64_CURRENT_H) */ diff --git a/include/asm-sparc64/delay.h b/include/asm-sparc64/delay.h index 61a833af213f..400c5eb3d8a3 100644 --- a/include/asm-sparc64/delay.h +++ b/include/asm-sparc64/delay.h @@ -1,4 +1,4 @@ -/* $Id: delay.h,v 1.12 2001/04/24 01:09:12 davem Exp $ +/* $Id: delay.h,v 1.13 2002/02/02 03:33:48 kanoj Exp $ * delay.h: Linux delay routines on the V9. * * Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu). @@ -9,9 +9,13 @@ #include <linux/config.h> #include <linux/param.h> + +#ifndef __ASSEMBLY__ + #ifdef CONFIG_SMP -#include <linux/sched.h> #include <asm/smp.h> +#else +extern unsigned long loops_per_jiffy; #endif extern __inline__ void __delay(unsigned long loops) @@ -49,4 +53,6 @@ extern __inline__ void __udelay(unsigned long usecs, unsigned long lps) #define udelay(usecs) __udelay((usecs),__udelay_val) +#endif /* !__ASSEMBLY__ */ + #endif /* defined(__SPARC64_DELAY_H) */ diff --git a/include/asm-sparc64/elf.h b/include/asm-sparc64/elf.h index dd584acbb34f..e6aca413a847 100644 --- a/include/asm-sparc64/elf.h +++ b/include/asm-sparc64/elf.h @@ -1,4 +1,4 @@ -/* $Id: elf.h,v 1.31 2002/01/08 16:00:20 davem Exp $ */ +/* $Id: elf.h,v 1.32 2002/02/09 19:49:31 davem Exp $ */ #ifndef __ASM_SPARC64_ELF_H #define __ASM_SPARC64_ELF_H @@ -69,16 +69,11 @@ typedef struct { #ifdef __KERNEL__ #define SET_PERSONALITY(ex, ibcs2) \ -do { unsigned char flags = current->thread.flags; \ - if ((ex).e_ident[EI_CLASS] == ELFCLASS32) \ - flags |= SPARC_FLAG_32BIT; \ +do { if ((ex).e_ident[EI_CLASS] == ELFCLASS32) \ + set_thread_flag(TIF_32BIT); \ else \ - flags &= ~SPARC_FLAG_32BIT; \ - if (flags != current->thread.flags) { \ - /* flush_thread will update pgd cache */\ - current->thread.flags = flags; \ - } \ - \ + clear_thread_flag(TIF_32BIT); \ + /* flush_thread will update pgd cache */ \ if (ibcs2) \ set_personality(PER_SVR4); \ else if (current->personality != PER_LINUX32) \ diff --git a/include/asm-sparc64/fpumacro.h b/include/asm-sparc64/fpumacro.h index 3fd5cab0cb5b..21d2740a810b 100644 --- a/include/asm-sparc64/fpumacro.h +++ b/include/asm-sparc64/fpumacro.h @@ -14,7 +14,7 @@ struct fpustate { u32 regs[64]; }; -#define FPUSTATE (struct fpustate *)(((unsigned long)current) + AOFF_task_fpregs) +#define FPUSTATE (struct fpustate *)(current_thread_info()->fpregs) extern __inline__ unsigned long fprs_read(void) { diff --git a/include/asm-sparc64/hardirq.h b/include/asm-sparc64/hardirq.h index 62bfae557ad0..d55bd01d7363 100644 --- a/include/asm-sparc64/hardirq.h +++ b/include/asm-sparc64/hardirq.h @@ -56,6 +56,8 @@ typedef struct { #define synchronize_irq() barrier() +#define release_irqlock(cpu) do { } while (0) + #else /* (CONFIG_SMP) */ static __inline__ int irqs_running(void) diff --git a/include/asm-sparc64/mmu_context.h b/include/asm-sparc64/mmu_context.h index 41e9ddf09b27..ec8de3308f19 100644 --- a/include/asm-sparc64/mmu_context.h +++ b/include/asm-sparc64/mmu_context.h @@ -1,4 +1,4 @@ -/* $Id: mmu_context.h,v 1.53 2002/01/30 01:40:00 davem Exp $ */ +/* $Id: mmu_context.h,v 1.54 2002/02/09 19:49:31 davem Exp $ */ #ifndef __SPARC64_MMU_CONTEXT_H #define __SPARC64_MMU_CONTEXT_H @@ -101,7 +101,7 @@ do { \ register unsigned long pgd_cache asm("o4"); \ paddr = __pa((__mm)->pgd); \ pgd_cache = 0UL; \ - if ((__tsk)->thread.flags & SPARC_FLAG_32BIT) \ + if ((__tsk)->thread_info->flags & _TIF_32BIT) \ pgd_cache = pgd_val((__mm)->pgd[0]) << 11UL; \ __asm__ __volatile__("wrpr %%g0, 0x494, %%pstate\n\t" \ "mov %3, %%g4\n\t" \ diff --git a/include/asm-sparc64/page.h b/include/asm-sparc64/page.h index c5de1e232dcf..c2cdb4c399e9 100644 --- a/include/asm-sparc64/page.h +++ b/include/asm-sparc64/page.h @@ -1,4 +1,4 @@ -/* $Id: page.h,v 1.38 2001/11/30 01:04:10 davem Exp $ */ +/* $Id: page.h,v 1.39 2002/02/09 19:49:31 davem Exp $ */ #ifndef _SPARC64_PAGE_H #define _SPARC64_PAGE_H @@ -95,7 +95,7 @@ typedef unsigned long iopgprot_t; #endif /* (STRICT_MM_TYPECHECKS) */ -#define TASK_UNMAPPED_BASE ((current->thread.flags & SPARC_FLAG_32BIT) ? \ +#define TASK_UNMAPPED_BASE (test_thread_flag(TIF_32BIT) ? \ (0x0000000070000000UL) : (PAGE_OFFSET)) #endif /* !(__ASSEMBLY__) */ diff --git a/include/asm-sparc64/pgalloc.h b/include/asm-sparc64/pgalloc.h index ed5d98ec9bbf..e244d899d64e 100644 --- a/include/asm-sparc64/pgalloc.h +++ b/include/asm-sparc64/pgalloc.h @@ -158,6 +158,7 @@ extern __inline__ void free_pgd_fast(pgd_t *pgd) { struct page *page = virt_to_page(pgd); + preempt_disable(); if (!page->pprev_hash) { (unsigned long *)page->next_hash = pgd_quicklist; pgd_quicklist = (unsigned long *)page; @@ -165,12 +166,14 @@ extern __inline__ void free_pgd_fast(pgd_t *pgd) (unsigned long)page->pprev_hash |= (((unsigned long)pgd & (PAGE_SIZE / 2)) ? 2 : 1); pgd_cache_size++; + preempt_enable(); } extern __inline__ pgd_t *get_pgd_fast(void) { struct page *ret; + preempt_disable(); if ((ret = (struct page *)pgd_quicklist) != NULL) { unsigned long mask = (unsigned long)ret->pprev_hash; unsigned long off = 0; @@ -186,16 +189,22 @@ extern __inline__ pgd_t *get_pgd_fast(void) pgd_quicklist = (unsigned long *)ret->next_hash; ret = (struct page *)(__page_address(ret) + off); pgd_cache_size--; + preempt_enable(); } else { - struct page *page = alloc_page(GFP_KERNEL); + struct page *page; + preempt_enable(); + page = alloc_page(GFP_KERNEL); if (page) { ret = (struct page *)page_address(page); clear_page(ret); (unsigned long)page->pprev_hash = 2; + + preempt_disable(); (unsigned long *)page->next_hash = pgd_quicklist; pgd_quicklist = (unsigned long *)page; pgd_cache_size++; + preempt_enable(); } } return (pgd_t *)ret; @@ -205,20 +214,25 @@ extern __inline__ pgd_t *get_pgd_fast(void) extern __inline__ void free_pgd_fast(pgd_t *pgd) { + preempt_disable(); *(unsigned long *)pgd = (unsigned long) pgd_quicklist; pgd_quicklist = (unsigned long *) pgd; pgtable_cache_size++; + preempt_enable(); } extern __inline__ pgd_t *get_pgd_fast(void) { unsigned long *ret; + preempt_disable(); if((ret = pgd_quicklist) != NULL) { pgd_quicklist = (unsigned long *)(*ret); ret[0] = 0; pgtable_cache_size--; + preempt_enable(); } else { + preempt_enable(); ret = (unsigned long *) __get_free_page(GFP_KERNEL); if(ret) memset(ret, 0, PAGE_SIZE); @@ -258,20 +272,27 @@ extern __inline__ pmd_t *pmd_alloc_one_fast(struct mm_struct *mm, unsigned long if (pte_quicklist[color] == NULL) color = 1; + + preempt_disable(); if((ret = (unsigned long *)pte_quicklist[color]) != NULL) { pte_quicklist[color] = (unsigned long *)(*ret); ret[0] = 0; pgtable_cache_size--; } + preempt_enable(); + return (pmd_t *)ret; } extern __inline__ void free_pmd_fast(pmd_t *pmd) { unsigned long color = DCACHE_COLOR((unsigned long)pmd); + + preempt_disable(); *(unsigned long *)pmd = (unsigned long) pte_quicklist[color]; pte_quicklist[color] = (unsigned long *) pmd; pgtable_cache_size++; + preempt_enable(); } extern __inline__ void free_pmd_slow(pmd_t *pmd) @@ -288,20 +309,25 @@ extern __inline__ pte_t *pte_alloc_one_fast(struct mm_struct *mm, unsigned long unsigned long color = VPTE_COLOR(address); unsigned long *ret; + preempt_disable(); if((ret = (unsigned long *)pte_quicklist[color]) != NULL) { pte_quicklist[color] = (unsigned long *)(*ret); ret[0] = 0; pgtable_cache_size--; } + preempt_enable(); return (pte_t *)ret; } extern __inline__ void free_pte_fast(pte_t *pte) { unsigned long color = DCACHE_COLOR((unsigned long)pte); + + preempt_disable(); *(unsigned long *)pte = (unsigned long) pte_quicklist[color]; pte_quicklist[color] = (unsigned long *) pte; pgtable_cache_size++; + preempt_enable(); } extern __inline__ void free_pte_slow(pte_t *pte) diff --git a/include/asm-sparc64/pgtable.h b/include/asm-sparc64/pgtable.h index 95060ec47b63..0df00266817b 100644 --- a/include/asm-sparc64/pgtable.h +++ b/include/asm-sparc64/pgtable.h @@ -1,4 +1,4 @@ -/* $Id: pgtable.h,v 1.155 2001/12/21 04:56:17 davem Exp $ +/* $Id: pgtable.h,v 1.156 2002/02/09 19:49:31 davem Exp $ * pgtable.h: SpitFire page table operations. * * Copyright 1996,1997 David S. Miller (davem@caip.rutgers.edu) @@ -76,7 +76,7 @@ * is different so we can optimize correctly for 32-bit tasks. */ #define REAL_PTRS_PER_PMD (1UL << PMD_BITS) -#define PTRS_PER_PMD ((const int)((current->thread.flags & SPARC_FLAG_32BIT) ? \ +#define PTRS_PER_PMD ((const int)(test_thread_flag(TIF_32BIT) ? \ (1UL << (32 - (PAGE_SHIFT-3) - PAGE_SHIFT)) : (REAL_PTRS_PER_PMD))) /* @@ -90,8 +90,8 @@ (PAGE_SHIFT-3) + PMD_BITS))) /* Kernel has a separate 44bit address space. */ -#define USER_PTRS_PER_PGD ((const int)((current->thread.flags & SPARC_FLAG_32BIT) ? \ - (1) : (PTRS_PER_PGD))) +#define USER_PTRS_PER_PGD ((const int)(test_thread_flag(TIF_32BIT)) ? \ + (1) : (PTRS_PER_PGD)) #define FIRST_USER_PGD_NR 0 #define pte_ERROR(e) __builtin_trap() diff --git a/include/asm-sparc64/processor.h b/include/asm-sparc64/processor.h index dc0e88282f50..1815502bf700 100644 --- a/include/asm-sparc64/processor.h +++ b/include/asm-sparc64/processor.h @@ -1,4 +1,4 @@ -/* $Id: processor.h,v 1.80 2001/11/17 00:10:48 davem Exp $ +/* $Id: processor.h,v 1.83 2002/02/10 06:04:33 davem Exp $ * include/asm-sparc64/processor.h * * Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu) @@ -21,6 +21,7 @@ #include <asm/signal.h> #include <asm/segment.h> #include <asm/page.h> +#include <asm/delay.h> /* Bus types */ #define EISA_bus 0 @@ -43,29 +44,13 @@ #ifndef __ASSEMBLY__ -#define NSWINS 7 - typedef struct { unsigned char seg; } mm_segment_t; /* The Sparc processor specific thread struct. */ +/* XXX This should die, everything can go into thread_info now. */ struct thread_struct { - /* D$ line 1 */ - unsigned long ksp __attribute__ ((aligned(16))); - unsigned char wstate, cwp, flags; - mm_segment_t current_ds; - unsigned char w_saved, fpdepth, fault_code, use_blkcommit; - unsigned long fault_address; - unsigned char fpsaved[7]; - unsigned char __pad2; - - /* D$ line 2, 3, 4 */ - struct pt_regs *kregs; - unsigned long *utraps; - unsigned long gsr[7]; - unsigned long xfsr[7]; - #ifdef CONFIG_DEBUG_SPINLOCK /* How many spinlocks held by this thread. * Used with spin lock debugging to catch tasks @@ -73,96 +58,29 @@ struct thread_struct { */ int smp_lock_count; unsigned int smp_lock_pc; +#else + int dummy; /* f'in gcc bug... */ #endif - - struct reg_window reg_window[NSWINS]; - unsigned long rwbuf_stkptrs[NSWINS]; - - /* Performance counter state */ - u64 *user_cntd0, *user_cntd1; - u64 kernel_cntd0, kernel_cntd1; - u64 pcr_reg; }; #endif /* !(__ASSEMBLY__) */ -#define SPARC_FLAG_UNALIGNED 0x01 /* is allowed to do unaligned accesses */ -#define SPARC_FLAG_NEWSIGNALS 0x02 /* task wants new-style signals */ -#define SPARC_FLAG_32BIT 0x04 /* task is older 32-bit binary */ -#define SPARC_FLAG_NEWCHILD 0x08 /* task is just-spawned child process */ -#define SPARC_FLAG_PERFCTR 0x10 /* task has performance counters active */ - -#define FAULT_CODE_WRITE 0x01 /* Write access, implies D-TLB */ -#define FAULT_CODE_DTLB 0x02 /* Miss happened in D-TLB */ -#define FAULT_CODE_ITLB 0x04 /* Miss happened in I-TLB */ -#define FAULT_CODE_WINFIXUP 0x08 /* Miss happened during spill/fill */ - #ifndef CONFIG_DEBUG_SPINLOCK -#define INIT_THREAD { \ -/* ksp, wstate, cwp, flags, current_ds, */ \ - 0, 0, 0, 0, KERNEL_DS, \ -/* w_saved, fpdepth, fault_code, use_blkcommit, */ \ - 0, 0, 0, 0, \ -/* fault_address, fpsaved, __pad2, kregs, */ \ - 0, { 0 }, 0, 0, \ -/* utraps, gsr, xfsr, */ \ - 0, { 0 }, { 0 }, \ -/* reg_window */ \ - { { { 0, }, { 0, } }, }, \ -/* rwbuf_stkptrs */ \ - { 0, 0, 0, 0, 0, 0, 0, }, \ -/* user_cntd0, user_cndd1, kernel_cntd0, kernel_cntd0, pcr_reg */ \ - 0, 0, 0, 0, 0, \ +#define INIT_THREAD { \ + 0, \ } #else /* CONFIG_DEBUG_SPINLOCK */ #define INIT_THREAD { \ -/* ksp, wstate, cwp, flags, current_ds, */ \ - 0, 0, 0, 0, KERNEL_DS, \ -/* w_saved, fpdepth, fault_code, use_blkcommit, */ \ - 0, 0, 0, 0, \ -/* fault_address, fpsaved, __pad2, kregs, */ \ - 0, { 0 }, 0, 0, \ -/* utraps, gsr, xfsr, smp_lock_count, smp_lock_pc, */\ - 0, { 0 }, { 0 }, 0, 0, \ -/* reg_window */ \ - { { { 0, }, { 0, } }, }, \ -/* rwbuf_stkptrs */ \ - { 0, 0, 0, 0, 0, 0, 0, }, \ -/* user_cntd0, user_cndd1, kernel_cntd0, kernel_cntd0, pcr_reg */ \ - 0, 0, 0, 0, 0, \ +/* smp_lock_count, smp_lock_pc, */ \ + 0, 0, \ } #endif /* !(CONFIG_DEBUG_SPINLOCK) */ -#ifdef __KERNEL__ -#if PAGE_SHIFT == 13 -#define THREAD_SIZE (2*PAGE_SIZE) -#define THREAD_SHIFT (PAGE_SHIFT + 1) -#else /* PAGE_SHIFT == 13 */ -#define THREAD_SIZE PAGE_SIZE -#define THREAD_SHIFT PAGE_SHIFT -#endif /* PAGE_SHIFT == 13 */ -#endif /* __KERNEL__ */ - #ifndef __ASSEMBLY__ /* Return saved PC of a blocked thread. */ -extern __inline__ unsigned long thread_saved_pc(struct thread_struct *t) -{ - unsigned long ret = 0xdeadbeefUL; - - if (t->ksp) { - unsigned long *sp; - sp = (unsigned long *)(t->ksp + STACK_BIAS); - if (((unsigned long)sp & (sizeof(long) - 1)) == 0UL && - sp[14]) { - unsigned long *fp; - fp = (unsigned long *)(sp[14] + STACK_BIAS); - if (((unsigned long)fp & (sizeof(long) - 1)) == 0UL) - ret = fp[15]; - } - } - return ret; -} +struct task_struct; +extern unsigned long thread_saved_pc(struct task_struct *); /* On Uniprocessor, even in RMO processes see TSO semantics */ #ifdef CONFIG_SMP @@ -178,13 +96,13 @@ do { \ regs->tpc = ((pc & (~3)) - 4); \ regs->tnpc = regs->tpc + 4; \ regs->y = 0; \ - current->thread.wstate = (1 << 3); \ - if (current->thread.utraps) { \ - if (*(current->thread.utraps) < 2) \ - kfree (current->thread.utraps); \ + set_thread_wstate(1 << 3); \ + if (current_thread_info()->utraps) { \ + if (*(current_thread_info()->utraps) < 2) \ + kfree(current_thread_info()->utraps); \ else \ - (*(current->thread.utraps))--; \ - current->thread.utraps = NULL; \ + (*(current_thread_info()->utraps))--; \ + current_thread_info()->utraps = NULL; \ } \ __asm__ __volatile__( \ "stx %%g0, [%0 + %2 + 0x00]\n\t" \ @@ -207,7 +125,7 @@ do { \ : \ : "r" (regs), "r" (sp - REGWIN_SZ - STACK_BIAS), \ "i" ((const unsigned long)(&((struct pt_regs *)0)->u_regs[0]))); \ -} while(0) +} while (0) #define start_thread32(regs, pc, sp) \ do { \ @@ -218,13 +136,13 @@ do { \ regs->tpc = ((pc & (~3)) - 4); \ regs->tnpc = regs->tpc + 4; \ regs->y = 0; \ - current->thread.wstate = (2 << 3); \ - if (current->thread.utraps) { \ - if (*(current->thread.utraps) < 2) \ - kfree (current->thread.utraps); \ + set_thread_wstate(2 << 3); \ + if (current_thread_info()->utraps) { \ + if (*(current_thread_info()->utraps) < 2) \ + kfree(current_thread_info()->utraps); \ else \ - (*(current->thread.utraps))--; \ - current->thread.utraps = NULL; \ + (*(current_thread_info()->utraps))--; \ + current_thread_info()->utraps = NULL; \ } \ __asm__ __volatile__( \ "stx %%g0, [%0 + %2 + 0x00]\n\t" \ @@ -247,10 +165,10 @@ do { \ : \ : "r" (regs), "r" (sp - REGWIN32_SZ), \ "i" ((const unsigned long)(&((struct pt_regs *)0)->u_regs[0]))); \ -} while(0) +} while (0) /* Free all resources held by a thread. */ -#define release_thread(tsk) do { } while(0) +#define release_thread(tsk) do { } while (0) extern pid_t kernel_thread(int (*fn)(void *), void * arg, unsigned long flags); @@ -261,19 +179,20 @@ extern pid_t kernel_thread(int (*fn)(void *), void * arg, unsigned long flags); ({ extern void scheduling_functions_start_here(void); \ extern void scheduling_functions_end_here(void); \ unsigned long pc, fp, bias = 0; \ - unsigned long task_base = (unsigned long) (__TSK); \ + unsigned long thread_info_base; \ struct reg_window *rw; \ unsigned long __ret = 0; \ int count = 0; \ if (!(__TSK) || (__TSK) == current || \ (__TSK)->state == TASK_RUNNING) \ goto __out; \ + thread_info_base = (unsigned long) ((__TSK)->thread_info); \ bias = STACK_BIAS; \ - fp = (__TSK)->thread.ksp + bias; \ + fp = (__TSK)->thread_info->ksp + bias; \ do { \ /* Bogus frame pointer? */ \ - if (fp < (task_base + sizeof(struct task_struct)) || \ - fp >= (task_base + THREAD_SIZE)) \ + if (fp < (thread_info_base + sizeof(struct thread_info)) || \ + fp >= (thread_info_base + THREAD_SIZE)) \ break; \ rw = (struct reg_window *) fp; \ pc = rw->ins[7]; \ @@ -287,26 +206,10 @@ extern pid_t kernel_thread(int (*fn)(void *), void * arg, unsigned long flags); __out: __ret; \ }) -#define KSTK_EIP(tsk) ((tsk)->thread.kregs->tpc) -#define KSTK_ESP(tsk) ((tsk)->thread.kregs->u_regs[UREG_FP]) - -#ifdef __KERNEL__ -/* Allocation and freeing of task_struct and kernel stack. */ -#if PAGE_SHIFT == 13 -#define alloc_task_struct() ((struct task_struct *)__get_free_pages(GFP_KERNEL, 1)) -#define free_task_struct(tsk) free_pages((unsigned long)(tsk),1) -#else /* PAGE_SHIFT == 13 */ -#define alloc_task_struct() ((struct task_struct *)__get_free_pages(GFP_KERNEL, 0)) -#define free_task_struct(tsk) free_pages((unsigned long)(tsk),0) -#endif /* PAGE_SHIFT == 13 */ -#define get_task_struct(tsk) atomic_inc(&virt_to_page(tsk)->count) - -#define init_task (init_task_union.task) -#define init_stack (init_task_union.stack) - -#define cpu_relax() do { } while (0) +#define KSTK_EIP(tsk) ((tsk)->thread_info->kregs->tpc) +#define KSTK_ESP(tsk) ((tsk)->thread_info->kregs->u_regs[UREG_FP]) -#endif /* __KERNEL__ */ +#define cpu_relax() udelay(1 + smp_processor_id()) #endif /* !(__ASSEMBLY__) */ diff --git a/include/asm-sparc64/ptrace.h b/include/asm-sparc64/ptrace.h index 39bb8203ab7f..e464335fcd44 100644 --- a/include/asm-sparc64/ptrace.h +++ b/include/asm-sparc64/ptrace.h @@ -1,4 +1,4 @@ -/* $Id: ptrace.h,v 1.13 1997/09/17 17:27:51 davem Exp $ */ +/* $Id: ptrace.h,v 1.14 2002/02/09 19:49:32 davem Exp $ */ #ifndef _SPARC64_PTRACE_H #define _SPARC64_PTRACE_H @@ -110,8 +110,6 @@ extern void show_regs(struct pt_regs *); #define TRACEREG32_SZ 0x50 #define STACKFRAME32_SZ 0x60 #define REGWIN32_SZ 0x40 - -#include <asm/asm_offsets.h> #endif #ifdef __KERNEL__ diff --git a/include/asm-sparc64/sfp-machine.h b/include/asm-sparc64/sfp-machine.h index 49c77bd81b36..5015bb8d6c32 100644 --- a/include/asm-sparc64/sfp-machine.h +++ b/include/asm-sparc64/sfp-machine.h @@ -74,7 +74,7 @@ /* Obtain the current rounding mode. */ #ifndef FP_ROUNDMODE -#define FP_ROUNDMODE ((current->thread.xfsr[0] >> 30) & 0x3) +#define FP_ROUNDMODE ((current_thread_info()->xfsr[0] >> 30) & 0x3) #endif /* Exception flags. */ @@ -86,6 +86,6 @@ #define FP_HANDLE_EXCEPTIONS return _fex -#define FP_INHIBIT_RESULTS ((current->thread.xfsr[0] >> 23) & _fex) +#define FP_INHIBIT_RESULTS ((current_thread_info()->xfsr[0] >> 23) & _fex) #endif diff --git a/include/asm-sparc64/smp.h b/include/asm-sparc64/smp.h index d73d3e657cf5..ae5307391893 100644 --- a/include/asm-sparc64/smp.h +++ b/include/asm-sparc64/smp.h @@ -103,7 +103,7 @@ extern __inline__ int hard_smp_processor_id(void) } } -#define smp_processor_id() (current->cpu) +#define smp_processor_id() (current_thread_info()->cpu) /* This needn't do anything as we do not sleep the cpu * inside of the idler task, so an interrupt is not needed diff --git a/include/asm-sparc64/smplock.h b/include/asm-sparc64/smplock.h index dd2cc2b54267..d9c87542f5c6 100644 --- a/include/asm-sparc64/smplock.h +++ b/include/asm-sparc64/smplock.h @@ -9,9 +9,17 @@ extern spinlock_t kernel_flag; +#ifdef CONFIG_SMP #define kernel_locked() \ (spin_is_locked(&kernel_flag) &&\ (current->lock_depth >= 0)) +#else +#ifdef CONFIG_PREEMPT +#define kernel_locked() preempt_get_count() +#else +#define kernel_locked() 1 +#endif +#endif /* * Release global kernel lock and global interrupt lock diff --git a/include/asm-sparc64/softirq.h b/include/asm-sparc64/softirq.h index e97b25e0ccbc..0239b7275cd5 100644 --- a/include/asm-sparc64/softirq.h +++ b/include/asm-sparc64/softirq.h @@ -10,14 +10,15 @@ #include <asm/hardirq.h> #include <asm/system.h> /* for membar() */ -#define local_bh_disable() (local_bh_count(smp_processor_id())++) -#define __local_bh_enable() (local_bh_count(smp_processor_id())--) +#define local_bh_disable() do { barrier(); preempt_disable(); local_bh_count(smp_processor_id())++; } while (0) +#define __local_bh_enable() do { local_bh_count(smp_processor_id())--; preempt_enable(); barrier(); } while (0) #define local_bh_enable() \ do { if (!--local_bh_count(smp_processor_id()) && \ softirq_pending(smp_processor_id())) { \ do_softirq(); \ __sti(); \ } \ + preempt_enable(); \ } while (0) #define in_softirq() (local_bh_count(smp_processor_id()) != 0) diff --git a/include/asm-sparc64/spinlock.h b/include/asm-sparc64/spinlock.h index ce905b46162c..55fef65608c3 100644 --- a/include/asm-sparc64/spinlock.h +++ b/include/asm-sparc64/spinlock.h @@ -40,7 +40,7 @@ typedef unsigned char spinlock_t; do { membar("#LoadLoad"); \ } while(*((volatile unsigned char *)lock)) -extern __inline__ void spin_lock(spinlock_t *lock) +extern __inline__ void _raw_spin_lock(spinlock_t *lock) { __asm__ __volatile__( "1: ldstub [%0], %%g7\n" @@ -57,7 +57,7 @@ extern __inline__ void spin_lock(spinlock_t *lock) : "g7", "memory"); } -extern __inline__ int spin_trylock(spinlock_t *lock) +extern __inline__ int _raw_spin_trylock(spinlock_t *lock) { unsigned int result; __asm__ __volatile__("ldstub [%1], %0\n\t" @@ -68,7 +68,7 @@ extern __inline__ int spin_trylock(spinlock_t *lock) return (result == 0); } -extern __inline__ void spin_unlock(spinlock_t *lock) +extern __inline__ void _raw_spin_unlock(spinlock_t *lock) { __asm__ __volatile__("membar #StoreStore | #LoadStore\n\t" "stb %%g0, [%0]" @@ -99,9 +99,9 @@ extern void _do_spin_lock (spinlock_t *lock, char *str); extern void _do_spin_unlock (spinlock_t *lock); extern int _spin_trylock (spinlock_t *lock); -#define spin_trylock(lp) _spin_trylock(lp) -#define spin_lock(lock) _do_spin_lock(lock, "spin_lock") -#define spin_unlock(lock) _do_spin_unlock(lock) +#define _raw_spin_trylock(lp) _spin_trylock(lp) +#define _raw_spin_lock(lock) _do_spin_lock(lock, "spin_lock") +#define _raw_spin_unlock(lock) _do_spin_unlock(lock) #endif /* CONFIG_DEBUG_SPINLOCK */ @@ -118,10 +118,10 @@ extern void __read_unlock(rwlock_t *); extern void __write_lock(rwlock_t *); extern void __write_unlock(rwlock_t *); -#define read_lock(p) __read_lock(p) -#define read_unlock(p) __read_unlock(p) -#define write_lock(p) __write_lock(p) -#define write_unlock(p) __write_unlock(p) +#define _raw_read_lock(p) __read_lock(p) +#define _raw_read_unlock(p) __read_unlock(p) +#define _raw_write_lock(p) __write_lock(p) +#define _raw_write_unlock(p) __write_unlock(p) #else /* !(CONFIG_DEBUG_SPINLOCK) */ @@ -138,28 +138,28 @@ extern void _do_read_unlock(rwlock_t *rw, char *str); extern void _do_write_lock(rwlock_t *rw, char *str); extern void _do_write_unlock(rwlock_t *rw); -#define read_lock(lock) \ +#define _raw_read_lock(lock) \ do { unsigned long flags; \ __save_and_cli(flags); \ _do_read_lock(lock, "read_lock"); \ __restore_flags(flags); \ } while(0) -#define read_unlock(lock) \ +#define _raw_read_unlock(lock) \ do { unsigned long flags; \ __save_and_cli(flags); \ _do_read_unlock(lock, "read_unlock"); \ __restore_flags(flags); \ } while(0) -#define write_lock(lock) \ +#define _raw_write_lock(lock) \ do { unsigned long flags; \ __save_and_cli(flags); \ _do_write_lock(lock, "write_lock"); \ __restore_flags(flags); \ } while(0) -#define write_unlock(lock) \ +#define _raw_write_unlock(lock) \ do { unsigned long flags; \ __save_and_cli(flags); \ _do_write_unlock(lock); \ diff --git a/include/asm-sparc64/system.h b/include/asm-sparc64/system.h index d5b497ddf5e0..58969561c107 100644 --- a/include/asm-sparc64/system.h +++ b/include/asm-sparc64/system.h @@ -1,12 +1,12 @@ -/* $Id: system.h,v 1.68 2001/11/18 00:12:56 davem Exp $ */ +/* $Id: system.h,v 1.69 2002/02/09 19:49:31 davem Exp $ */ #ifndef __SPARC64_SYSTEM_H #define __SPARC64_SYSTEM_H #include <linux/config.h> #include <asm/ptrace.h> #include <asm/processor.h> -#include <asm/asm_offsets.h> #include <asm/visasm.h> +#include <asm/thread_info.h> #ifndef __ASSEMBLY__ /* @@ -174,19 +174,19 @@ if ((PREV)->thread.smp_lock_count) { \ */ #define switch_to(prev, next, last) \ do { CHECK_LOCKS(prev); \ - if (current->thread.flags & SPARC_FLAG_PERFCTR) { \ + if (test_thread_flag(TIF_PERFCTR)) { \ unsigned long __tmp; \ read_pcr(__tmp); \ - current->thread.pcr_reg = __tmp; \ + current_thread_info()->pcr_reg = __tmp; \ read_pic(__tmp); \ - current->thread.kernel_cntd0 += (unsigned int)(__tmp); \ - current->thread.kernel_cntd1 += ((__tmp) >> 32); \ + current_thread_info()->kernel_cntd0 += (unsigned int)(__tmp); \ + current_thread_info()->kernel_cntd1 += ((__tmp) >> 32); \ } \ save_and_clear_fpu(); \ /* If you are tempted to conditionalize the following */ \ /* so that ASI is only written if it changes, think again. */ \ __asm__ __volatile__("wr %%g0, %0, %%asi" \ - : : "r" (next->thread.current_ds.seg)); \ + : : "r" (__thread_flag_byte_ptr(next->thread_info)[TI_FLAG_BYTE_CURRENT_DS])); \ __asm__ __volatile__( \ "mov %%g6, %%g5\n\t" \ "wrpr %%g0, 0x95, %%pstate\n\t" \ @@ -202,7 +202,7 @@ do { CHECK_LOCKS(prev); \ "wrpr %%g1, %%cwp\n\t" \ "ldx [%%g6 + %3], %%o6\n\t" \ "ldub [%%g6 + %2], %%o5\n\t" \ - "ldub [%%g6 + %4], %%o7\n\t" \ + "ldx [%%g6 + %4], %%o7\n\t" \ "mov %%g6, %%l2\n\t" \ "wrpr %%o5, 0x0, %%wstate\n\t" \ "ldx [%%sp + 2047 + 0x70], %%i6\n\t" \ @@ -212,21 +212,18 @@ do { CHECK_LOCKS(prev); \ "wrpr %%g0, 0x96, %%pstate\n\t" \ "andcc %%o7, %6, %%g0\n\t" \ "bne,pn %%icc, ret_from_syscall\n\t" \ - " mov %%g5, %0\n\t" \ + " ldx [%%g5 + %7], %0\n\t" \ : "=&r" (last) \ - : "r" (next), \ - "i" ((const unsigned long)(&((struct task_struct *)0)->thread.wstate)),\ - "i" ((const unsigned long)(&((struct task_struct *)0)->thread.ksp)), \ - "i" ((const unsigned long)(&((struct task_struct *)0)->thread.flags)),\ - "i" ((const unsigned long)(&((struct task_struct *)0)->thread.cwp)), \ - "i" (SPARC_FLAG_NEWCHILD) \ + : "r" (next->thread_info), \ + "i" (TI_WSTATE), "i" (TI_KSP), "i" (TI_FLAGS), "i" (TI_CWP), \ + "i" (_TIF_NEWCHILD), "i" (TI_TASK) \ : "cc", "g1", "g2", "g3", "g5", "g7", \ "l2", "l3", "l4", "l5", "l6", "l7", \ "i0", "i1", "i2", "i3", "i4", "i5", \ "o0", "o1", "o2", "o3", "o4", "o5", "o7"); \ /* If you fuck with this, update ret_from_syscall code too. */ \ - if (current->thread.flags & SPARC_FLAG_PERFCTR) { \ - write_pcr(current->thread.pcr_reg); \ + if (test_thread_flag(TIF_PERFCTR)) { \ + write_pcr(current_thread_info()->pcr_reg); \ reset_pic(); \ } \ } while(0) diff --git a/include/asm-sparc64/thread_info.h b/include/asm-sparc64/thread_info.h new file mode 100644 index 000000000000..30224a298d91 --- /dev/null +++ b/include/asm-sparc64/thread_info.h @@ -0,0 +1,214 @@ +/* $Id: thread_info.h,v 1.1 2002/02/10 00:00:58 davem Exp $ + * thread_info.h: sparc64 low-level thread information + * + * Copyright (C) 2002 David S. Miller (davem@redhat.com) + */ + +#ifndef _ASM_THREAD_INFO_H +#define _ASM_THREAD_INFO_H + +#ifdef __KERNEL__ + +#define NSWINS 7 + +#define TI_FLAG_BYTE_FAULT_CODE 0 +#define TI_FLAG_FAULT_CODE_SHIFT 56 +#define TI_FLAG_BYTE_WSTATE 1 +#define TI_FLAG_WSTATE_SHIFT 48 +#define TI_FLAG_BYTE_CWP 2 +#define TI_FLAG_CWP_SHIFT 40 +#define TI_FLAG_BYTE_CURRENT_DS 3 +#define TI_FLAG_CURRENT_DS_SHIFT 32 +#define TI_FLAG_BYTE_FPDEPTH 4 +#define TI_FLAG_FPDEPTH_SHIFT 24 +#define TI_FLAG_BYTE_WSAVED 5 +#define TI_FLAG_WSAVED_SHIFT 16 + +#ifndef __ASSEMBLY__ + +#include <asm/ptrace.h> +#include <asm/types.h> + +struct task_struct; +struct exec_domain; + +struct thread_info { + /* D$ line 1 */ + struct task_struct *task; + unsigned long flags; + __u8 cpu; + __u8 fpsaved[7]; + unsigned long ksp; + + /* D$ line 2 */ + unsigned long fault_address; + struct pt_regs *kregs; + struct exec_domain *exec_domain; + int preempt_count; + + unsigned long *utraps; + + struct reg_window reg_window[NSWINS]; + unsigned long rwbuf_stkptrs[NSWINS]; + + unsigned long gsr[7]; + unsigned long xfsr[7]; + + __u64 *user_cntd0, *user_cntd1; + __u64 kernel_cntd0, kernel_cntd1; + __u64 pcr_reg; + + __u64 cee_stuff; + + unsigned long fpregs[0] __attribute__ ((aligned(64))); +}; + +#endif /* !(__ASSEMBLY__) */ + +/* offsets into the thread_info struct for assembly code access */ +#define TI_TASK 0x00000000 +#define TI_FLAGS 0x00000008 +#define TI_FAULT_CODE (TI_FLAGS + TI_FLAG_BYTE_FAULT_CODE) +#define TI_WSTATE (TI_FLAGS + TI_FLAG_BYTE_WSTATE) +#define TI_CWP (TI_FLAGS + TI_FLAG_BYTE_CWP) +#define TI_CURRENT_DS (TI_FLAGS + TI_FLAG_BYTE_CURRENT_DS) +#define TI_FPDEPTH (TI_FLAGS + TI_FLAG_BYTE_FPDEPTH) +#define TI_WSAVED (TI_FLAGS + TI_FLAG_BYTE_WSAVED) +#define TI_CPU 0x00000010 +#define TI_FPSAVED 0x00000011 +#define TI_KSP 0x00000018 +#define TI_FAULT_ADDR 0x00000020 +#define TI_KREGS 0x00000028 +#define TI_EXEC_DOMAIN 0x00000030 +#define TI_PRE_COUNT 0x00000038 +#define TI_UTRAPS 0x00000040 +#define TI_REG_WINDOW 0x00000048 +#define TI_RWIN_SPTRS 0x000003c8 +#define TI_GSR 0x00000400 +#define TI_XFSR 0x00000438 +#define TI_USER_CNTD0 0x00000470 +#define TI_USER_CNTD1 0x00000478 +#define TI_KERN_CNTD0 0x00000480 +#define TI_KERN_CNTD1 0x00000488 +#define TI_PCR 0x00000490 +#define TI_CEE_STUFF 0x00000498 +#define TI_FPREGS 0x000004c0 + +/* We embed this in the uppermost byte of thread_info->flags */ +#define FAULT_CODE_WRITE 0x01 /* Write access, implies D-TLB */ +#define FAULT_CODE_DTLB 0x02 /* Miss happened in D-TLB */ +#define FAULT_CODE_ITLB 0x04 /* Miss happened in I-TLB */ +#define FAULT_CODE_WINFIXUP 0x08 /* Miss happened during spill/fill */ + +#if PAGE_SHIFT == 13 +#define THREAD_SIZE (2*PAGE_SIZE) +#define THREAD_SHIFT (PAGE_SHIFT + 1) +#else /* PAGE_SHIFT == 13 */ +#define THREAD_SIZE PAGE_SIZE +#define THREAD_SHIFT PAGE_SHIFT +#endif /* PAGE_SHIFT == 13 */ + +/* + * macros/functions for gaining access to the thread information structure + */ +#ifndef __ASSEMBLY__ + +#define INIT_THREAD_INFO(tsk) \ +{ \ + task: &tsk, \ + flags: ((unsigned long)ASI_P) << TI_FLAG_CURRENT_DS_SHIFT, \ + exec_domain: &default_exec_domain, \ +} + +#define init_thread_info (init_thread_union.thread_info) +#define init_stack (init_thread_union.stack) + +/* how to get the thread information struct from C */ +register struct thread_info *current_thread_info_reg asm("g6"); +#define current_thread_info() (current_thread_info_reg) + +/* thread information allocation */ +#if PAGE_SHIFT == 13 +#define alloc_thread_info() ((struct thread_info *)__get_free_pages(GFP_KERNEL, 1)) +#define free_thread_info(ti) free_pages((unsigned long)(ti),1) +#else /* PAGE_SHIFT == 13 */ +#define alloc_thread_info() ((struct thread_info *)__get_free_pages(GFP_KERNEL, 0)) +#define free_thread_info(ti) free_pages((unsigned long)(ti),0) +#endif /* PAGE_SHIFT == 13 */ + +#define __thread_flag_byte_ptr(ti) \ + ((unsigned char *)(&((ti)->flags))) +#define __cur_thread_flag_byte_ptr __thread_flag_byte_ptr(current_thread_info()) + +#define get_thread_fault_code() (__cur_thread_flag_byte_ptr[TI_FLAG_BYTE_FAULT_CODE]) +#define set_thread_fault_code(val) (__cur_thread_flag_byte_ptr[TI_FLAG_BYTE_FAULT_CODE] = (val)) +#define get_thread_wstate() (__cur_thread_flag_byte_ptr[TI_FLAG_BYTE_WSTATE]) +#define set_thread_wstate(val) (__cur_thread_flag_byte_ptr[TI_FLAG_BYTE_WSTATE] = (val)) +#define get_thread_cwp() (__cur_thread_flag_byte_ptr[TI_FLAG_BYTE_CWP]) +#define set_thread_cwp(val) (__cur_thread_flag_byte_ptr[TI_FLAG_BYTE_CWP] = (val)) +#define get_thread_current_ds() (__cur_thread_flag_byte_ptr[TI_FLAG_BYTE_CURRENT_DS]) +#define set_thread_current_ds(val) (__cur_thread_flag_byte_ptr[TI_FLAG_BYTE_CURRENT_DS] = (val)) +#define get_thread_fpdepth() (__cur_thread_flag_byte_ptr[TI_FLAG_BYTE_FPDEPTH]) +#define set_thread_fpdepth(val) (__cur_thread_flag_byte_ptr[TI_FLAG_BYTE_FPDEPTH] = (val)) +#define get_thread_wsaved() (__cur_thread_flag_byte_ptr[TI_FLAG_BYTE_WSAVED]) +#define set_thread_wsaved(val) (__cur_thread_flag_byte_ptr[TI_FLAG_BYTE_WSAVED] = (val)) + +#endif /* !(__ASSEMBLY__) */ + +/* + * Thread information flags, only 16 bits are available as we encode + * other values into the upper 6 bytes. + * + * On trap return we need to test several values: + * + * user: need_resched, notify_resume, sigpending, wsaved, perfctr + * kernel: fpdepth + * + * So to check for work in the kernel case we simply load the fpdepth + * byte out of the flags and test it. For the user case we encode the + * lower 3 bytes of flags as follows: + * ---------------------------------------- + * | wsaved | flags byte 1 | flags byte 2 | + * ---------------------------------------- + * This optimizes the user test into: + * ldx [%g6 + TI_FLAGS], REG1 + * sethi %hi(_TIF_USER_WORK_MASK), REG2 + * or REG2, %lo(_TIF_USER_WORK_MASK), REG2 + * andcc REG1, REG2, %g0 + * be,pt no_work_to_do + * nop + */ +#define TIF_SYSCALL_TRACE 0 /* syscall trace active */ +#define TIF_NOTIFY_RESUME 1 /* resumption notification requested */ +#define TIF_SIGPENDING 2 /* signal pending */ +#define TIF_NEED_RESCHED 3 /* rescheduling necessary */ +#define TIF_PERFCTR 4 /* performance counters active */ +#define TIF_UNALIGNED 5 /* allowed to do unaligned accesses */ +#define TIF_NEWSIGNALS 6 /* wants new-style signals */ +#define TIF_32BIT 7 /* 32-bit binary */ +#define TIF_NEWCHILD 8 /* just-spawned child process */ + +/* XXX Make this one FAULT_CODE_BLKCOMMIT XXX */ +#define TIF_BLKCOMMIT 9 /* use ASI_BLK_COMMIT_* in copy_user_page */ + +#define TIF_POLLING_NRFLAG 10 + +#define _TIF_SYSCALL_TRACE (1<<TIF_SYSCALL_TRACE) +#define _TIF_NOTIFY_RESUME (1<<TIF_NOTIFY_RESUME) +#define _TIF_SIGPENDING (1<<TIF_SIGPENDING) +#define _TIF_NEED_RESCHED (1<<TIF_NEED_RESCHED) +#define _TIF_PERFCTR (1<<TIF_PERFCTR) +#define _TIF_UNALIGNED (1<<TIF_UNALIGNED) +#define _TIF_NEWSIGNALS (1<<TIF_NEWSIGNALS) +#define _TIF_32BIT (1<<TIF_32BIT) +#define _TIF_NEWCHILD (1<<TIF_NEWCHILD) +#define _TIF_BLKCOMMIT (1<<TIF_BLKCOMMIT) +#define _TIF_POLLING_NRFLAG (1<<TIF_POLLING_NRFLAG) + +#define _TIF_USER_WORK_MASK ((0xff << TI_FLAG_WSAVED_SHIFT) | \ + (_TIF_NOTIFY_RESUME | _TIF_SIGPENDING | \ + _TIF_NEED_RESCHED | _TIF_PERFCTR)) + +#endif /* __KERNEL__ */ + +#endif /* _ASM_THREAD_INFO_H */ diff --git a/include/asm-sparc64/ttable.h b/include/asm-sparc64/ttable.h index 8ed23fd00ad6..0e08a2571c3b 100644 --- a/include/asm-sparc64/ttable.h +++ b/include/asm-sparc64/ttable.h @@ -1,9 +1,9 @@ -/* $Id: ttable.h,v 1.17 2001/11/28 23:32:16 davem Exp $ */ +/* $Id: ttable.h,v 1.18 2002/02/09 19:49:32 davem Exp $ */ #ifndef _SPARC64_TTABLE_H #define _SPARC64_TTABLE_H #include <linux/config.h> -#include <asm/asm_offsets.h> +#include <asm/thread_info.h> #include <asm/utrap.h> #define BOOT_KERNEL b sparc64_boot; nop; nop; nop; nop; nop; nop; nop; @@ -104,14 +104,14 @@ mov num, %g1; \ nop;nop;nop; -#define TRAP_UTRAP(handler,lvl) \ - ldx [%g6 + AOFF_task_thread + AOFF_thread_utraps], %g1; \ - sethi %hi(109f), %g7; \ - brz,pn %g1, utrap; \ - or %g7, %lo(109f), %g7; \ - ba,pt %xcc, utrap; \ -109: ldx [%g1 + handler*8], %g1; \ - ba,pt %xcc, utrap_ill; \ +#define TRAP_UTRAP(handler,lvl) \ + ldx [%g6 + TI_UTRAPS], %g1; \ + sethi %hi(109f), %g7; \ + brz,pn %g1, utrap; \ + or %g7, %lo(109f), %g7; \ + ba,pt %xcc, utrap; \ +109: ldx [%g1 + handler*8], %g1; \ + ba,pt %xcc, utrap_ill; \ mov lvl, %o1; #ifdef CONFIG_SUNOS_EMUL @@ -140,7 +140,7 @@ mov level, %o0; \ call routine; \ add %sp, STACK_BIAS + REGWIN_SZ, %o1; \ - ba,a,pt %xcc, rtrap_clr_l6; + ba,a,pt %xcc, rtrap_irq; #define TICK_SMP_IRQ \ rdpr %pil, %g2; \ @@ -150,7 +150,7 @@ 109: or %g7, %lo(109b), %g7; \ call smp_percpu_timer_interrupt; \ add %sp, STACK_BIAS + REGWIN_SZ, %o0; \ - ba,a,pt %xcc, rtrap_clr_l6; + ba,a,pt %xcc, rtrap_irq; #define TRAP_IVEC TRAP_NOSAVE(do_ivec) diff --git a/include/asm-sparc64/uaccess.h b/include/asm-sparc64/uaccess.h index a5590b897c8c..a52de7d2a22a 100644 --- a/include/asm-sparc64/uaccess.h +++ b/include/asm-sparc64/uaccess.h @@ -1,4 +1,4 @@ -/* $Id: uaccess.h,v 1.34 2001/09/27 04:36:24 kanoj Exp $ */ +/* $Id: uaccess.h,v 1.35 2002/02/09 19:49:31 davem Exp $ */ #ifndef _ASM_UACCESS_H #define _ASM_UACCESS_H @@ -36,14 +36,14 @@ #define VERIFY_READ 0 #define VERIFY_WRITE 1 -#define get_fs() (current->thread.current_ds) +#define get_fs() ((mm_segment_t) { get_thread_current_ds() }) #define get_ds() (KERNEL_DS) #define segment_eq(a,b) ((a).seg == (b).seg) #define set_fs(val) \ do { \ - current->thread.current_ds = (val); \ + set_thread_current_ds((val).seg); \ __asm__ __volatile__ ("wr %%g0, %0, %%asi" : : "r" ((val).seg)); \ } while(0) diff --git a/include/asm-sparc64/unistd.h b/include/asm-sparc64/unistd.h index 1b325812c8c7..c5a635cce3d1 100644 --- a/include/asm-sparc64/unistd.h +++ b/include/asm-sparc64/unistd.h @@ -1,4 +1,4 @@ -/* $Id: unistd.h,v 1.49 2001/10/18 08:27:05 davem Exp $ */ +/* $Id: unistd.h,v 1.50 2002/02/08 03:57:18 davem Exp $ */ #ifndef _SPARC64_UNISTD_H #define _SPARC64_UNISTD_H @@ -202,7 +202,7 @@ #define __NR_query_module 184 /* Linux Specific */ #define __NR_setpgid 185 /* Common */ /* #define __NR_pathconf 186 SunOS Specific */ -/* #define __NR_fpathconf 187 SunOS Specific */ +#define __NR_tkill 187 /* SunOS: fpathconf */ /* #define __NR_sysconf 188 SunOS Specific */ #define __NR_uname 189 /* Linux Specific */ #define __NR_init_module 190 /* Linux Specific */ @@ -273,7 +273,6 @@ #define __NR_fdatasync 253 #define __NR_nfsservctl 254 #define __NR_aplib 255 -#define __NR_tkill 256 #define _syscall0(type,name) \ type name(void) \ |
