From: Zachary Amsden Found yet another set of accessor functions for descriptors that really belongs in desc.h - move it there. Signed-off-by: Zachary Amsden Signed-off-by: Andrew Morton --- arch/i386/kernel/process.c | 31 +------------------------------ arch/i386/kernel/ptrace.c | 32 +------------------------------- include/asm-i386/desc.h | 20 ++++++++++++++++++++ 3 files changed, 22 insertions(+), 61 deletions(-) diff -puN arch/i386/kernel/process.c~i386--eliminate-yet-another-redundant-accessor arch/i386/kernel/process.c --- 25/arch/i386/kernel/process.c~i386--eliminate-yet-another-redundant-accessor Wed Aug 17 13:33:58 2005 +++ 25-akpm/arch/i386/kernel/process.c Wed Aug 17 13:33:58 2005 @@ -893,26 +893,6 @@ asmlinkage int sys_set_thread_area(struc return 0; } -/* - * Get the current Thread-Local Storage area: - */ - -#define GET_BASE(desc) ( \ - (((desc)->a >> 16) & 0x0000ffff) | \ - (((desc)->b << 16) & 0x00ff0000) | \ - ( (desc)->b & 0xff000000) ) - -#define GET_LIMIT(desc) ( \ - ((desc)->a & 0x0ffff) | \ - ((desc)->b & 0xf0000) ) - -#define GET_32BIT(desc) (((desc)->b >> 22) & 1) -#define GET_CONTENTS(desc) (((desc)->b >> 10) & 3) -#define GET_WRITABLE(desc) (((desc)->b >> 9) & 1) -#define GET_LIMIT_PAGES(desc) (((desc)->b >> 23) & 1) -#define GET_PRESENT(desc) (((desc)->b >> 15) & 1) -#define GET_USEABLE(desc) (((desc)->b >> 20) & 1) - asmlinkage int sys_get_thread_area(struct user_desc __user *u_info) { struct user_desc info; @@ -927,16 +907,7 @@ asmlinkage int sys_get_thread_area(struc memset(&info, 0, sizeof(info)); desc = current->thread.tls_array + idx - GDT_ENTRY_TLS_MIN; - - info.entry_number = idx; - info.base_addr = GET_BASE(desc); - info.limit = GET_LIMIT(desc); - info.seg_32bit = GET_32BIT(desc); - info.contents = GET_CONTENTS(desc); - info.read_exec_only = !GET_WRITABLE(desc); - info.limit_in_pages = GET_LIMIT_PAGES(desc); - info.seg_not_present = !GET_PRESENT(desc); - info.useable = GET_USEABLE(desc); + convert_desc_to_user(desc, &info, idx); if (copy_to_user(u_info, &info, sizeof(info))) return -EFAULT; diff -puN arch/i386/kernel/ptrace.c~i386--eliminate-yet-another-redundant-accessor arch/i386/kernel/ptrace.c --- 25/arch/i386/kernel/ptrace.c~i386--eliminate-yet-another-redundant-accessor Wed Aug 17 13:33:58 2005 +++ 25-akpm/arch/i386/kernel/ptrace.c Wed Aug 17 13:33:58 2005 @@ -281,41 +281,11 @@ ptrace_get_thread_area(struct task_struc struct user_desc info; struct desc_struct *desc; -/* - * Get the current Thread-Local Storage area: - */ - -#define GET_BASE(desc) ( \ - (((desc)->a >> 16) & 0x0000ffff) | \ - (((desc)->b << 16) & 0x00ff0000) | \ - ( (desc)->b & 0xff000000) ) - -#define GET_LIMIT(desc) ( \ - ((desc)->a & 0x0ffff) | \ - ((desc)->b & 0xf0000) ) - -#define GET_32BIT(desc) (((desc)->b >> 22) & 1) -#define GET_CONTENTS(desc) (((desc)->b >> 10) & 3) -#define GET_WRITABLE(desc) (((desc)->b >> 9) & 1) -#define GET_LIMIT_PAGES(desc) (((desc)->b >> 23) & 1) -#define GET_PRESENT(desc) (((desc)->b >> 15) & 1) -#define GET_USEABLE(desc) (((desc)->b >> 20) & 1) - if (idx < GDT_ENTRY_TLS_MIN || idx > GDT_ENTRY_TLS_MAX) return -EINVAL; desc = child->thread.tls_array + idx - GDT_ENTRY_TLS_MIN; - - info.entry_number = idx; - info.base_addr = GET_BASE(desc); - info.limit = GET_LIMIT(desc); - info.seg_32bit = GET_32BIT(desc); - info.contents = GET_CONTENTS(desc); - info.read_exec_only = !GET_WRITABLE(desc); - info.limit_in_pages = GET_LIMIT_PAGES(desc); - info.seg_not_present = !GET_PRESENT(desc); - info.useable = GET_USEABLE(desc); - + convert_desc_to_user(desc, &info, idx); if (copy_to_user(user_desc, &info, sizeof(info))) return -EFAULT; diff -puN include/asm-i386/desc.h~i386--eliminate-yet-another-redundant-accessor include/asm-i386/desc.h --- 25/include/asm-i386/desc.h~i386--eliminate-yet-another-redundant-accessor Wed Aug 17 13:33:58 2005 +++ 25-akpm/include/asm-i386/desc.h Wed Aug 17 13:33:58 2005 @@ -20,6 +20,13 @@ #define desc_equal(desc1, desc2) \ (((desc1)->a == (desc2)->a) && ((desc1)->b == (desc2)->b)) +#define get_desc_32bit(desc) (((desc)->b >> 22) & 1) +#define get_desc_contents(desc) (((desc)->b >> 10) & 3) +#define get_desc_writable(desc) (((desc)->b >> 9) & 1) +#define get_desc_gran(desc) (((desc)->b >> 23) & 1) +#define get_desc_present(desc) (((desc)->b >> 15) & 1) +#define get_desc_usable(desc) (((desc)->b >> 20) & 1) + static inline unsigned long get_desc_base(struct desc_struct *desc) { unsigned long base; @@ -36,6 +43,19 @@ static inline unsigned long get_desc_lim return limit; } +static inline void convert_desc_to_user(struct desc_struct *desc, struct user_desc *info, int idx) +{ + info->entry_number = idx; + info->base_addr = get_desc_base(desc); + info->limit = get_desc_limit(desc); + info->seg_32bit = get_desc_32bit(desc); + info->contents = get_desc_contents(desc); + info->read_exec_only = !get_desc_writable(desc); + info->limit_in_pages = get_desc_gran(desc); + info->seg_not_present = !get_desc_present(desc); + info->useable = get_desc_usable(desc); +} + extern struct desc_struct cpu_gdt_table[GDT_ENTRIES]; DECLARE_PER_CPU(struct desc_struct, cpu_gdt_table[GDT_ENTRIES]); _