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]>
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))
* Zachary Amsden <[email protected]> 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
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