i386 Eliminate duplicate segment macros
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 <[email protected]>
arch/i386/kernel/process.c +1 -32
@@ -881,26 +881,6 @@ asmlinkage int sys_set_thread_area(strucreturn 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(strucreturn -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 ;
arch/i386/kernel/ptrace.c +1 -31
@@ -285,41 +285,11 @@ ptrace_get_thread_area(struct task_strucstruct 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 ;
include/asm-i386/desc.h +20 -0
@@ -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(unsignedset_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))
include/asm-i386/desc.h struct desc_internal_struct { · line 69
Quoted 6 lines · Zachary Amsden
include/asm-i386/desc.h +6
-0+#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
Quoted 2 lines · Zachary Amsden
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