Zachary Amsden
2007-Apr-18 17:49 UTC
[PATCH 16/21] i386 Eliminate duplicate segment macros
Get rid of duplicated and ugly segment macros, replacing them with slightly less ugly versions in a more appropriate place. Signed-off-by: Zachary Amsden <zach@vmware.com> Index: linux-2.6.14-zach-work/arch/i386/kernel/process.c ==================================================================--- linux-2.6.14-zach-work.orig/arch/i386/kernel/process.c 2005-11-04 18:07:41.000000000 -0800 +++ linux-2.6.14-zach-work/arch/i386/kernel/process.c 2005-11-04 18:10:53.000000000 -0800 @@ -881,26 +881,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; @@ -913,19 +893,8 @@ asmlinkage int sys_get_thread_area(struc return -EINVAL; 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; return 0; Index: linux-2.6.14-zach-work/arch/i386/kernel/ptrace.c ==================================================================--- linux-2.6.14-zach-work.orig/arch/i386/kernel/ptrace.c 2005-11-04 12:12:35.000000000 -0800 +++ linux-2.6.14-zach-work/arch/i386/kernel/ptrace.c 2005-11-05 00:28:05.000000000 -0800 @@ -285,41 +285,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; Index: linux-2.6.14-zach-work/include/asm-i386/desc.h ==================================================================--- linux-2.6.14-zach-work.orig/include/asm-i386/desc.h 2005-11-04 18:03:21.000000000 -0800 +++ linux-2.6.14-zach-work/include/asm-i386/desc.h 2005-11-05 00:28:05.000000000 -0800 @@ -61,6 +61,13 @@ struct desc_internal_struct { unsigned char base2; } __attribute__((packed)); +#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 struct desc_internal_struct *desc_internal(struct desc_struct *d) { return (struct desc_internal_struct *)d; @@ -123,6 +130,19 @@ static inline void set_ldt_desc(unsigned set_tssldt_desc(&get_cpu_gdt_table(cpu)[GDT_ENTRY_LDT], (int)addr, ((size << 3)-1), 0x82); } +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); +} + #define LDT_entry_a(info) \ ((((info)->base_addr & 0x0000ffff) << 16) | ((info)->limit & 0x0ffff))
On Tuesday 08 November 2005 05:36, Zachary Amsden wrote:> Get rid of duplicated and ugly segment macros, replacing them > with slightly less ugly versions in a more appropriate place.Good stuff. Please submit for x86-64 too. -Andi
* Zachary Amsden <zach@vmware.com> wrote:> +#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)naming nit: shouldnt they be 'desc_32bit()/desc_writable()/...'? No need for the get_ i think. Ingo
Possibly Parallel Threads
- [PATCH 16/21] i386 Eliminate duplicate segment macros
- [PATCH 11/14] i386 / Eliminate yet another redundant accessor
- [PATCH 11/14] i386 / Eliminate yet another redundant accessor
- [PATCH 10/12] yet-another-redundant-accessor
- [PATCH 10/12] yet-another-redundant-accessor