From: Zachary Amsden <zach@vmware.com>

Add some convenient descriptor access functions and move them all into desc.h

Signed-off-by: Zachary Amsden <zach@vmware.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
---

 arch/i386/kernel/kprobes.c |    8 ++++----
 arch/i386/mm/fault.c       |    7 ++++---
 include/asm-i386/desc.h    |   32 ++++++++++++++++++++++----------
 3 files changed, 30 insertions(+), 17 deletions(-)

diff -puN arch/i386/kernel/kprobes.c~i386--add-some-descriptor-convenience-functions arch/i386/kernel/kprobes.c
--- devel/arch/i386/kernel/kprobes.c~i386--add-some-descriptor-convenience-functions	2005-09-07 20:10:34.000000000 -0700
+++ devel-akpm/arch/i386/kernel/kprobes.c	2005-09-07 20:10:34.000000000 -0700
@@ -156,7 +156,6 @@ static int __kprobes kprobe_handler(stru
 	struct kprobe *p;
 	int ret = 0;
 	kprobe_opcode_t *addr = NULL;
-	unsigned long *lp;
 
 	/* We're in an interrupt, but this is clear and BUG()-safe. */
 	preempt_disable();
@@ -164,9 +163,10 @@ static int __kprobes kprobe_handler(stru
 	 * calculate the address by reading the base address from the LDT entry.
 	 */
 	if (segment_from_ldt(regs->xcs) && (current->mm)) {
-		lp = (unsigned long *) ((unsigned long)(segment_index(regs->xcs) * 8)
-					+ (char *) current->mm->context.ldt);
-		addr = (kprobe_opcode_t *) (get_desc_base(lp) + regs->eip -
+		struct desc_struct *desc;
+		desc = (struct desc_struct *) ((char *) current->mm->context.ldt +
+						 (segment_index(regs->xcs) * 8));
+		addr = (kprobe_opcode_t *) (get_desc_base(desc) + regs->eip -
 						sizeof(kprobe_opcode_t));
 	} else {
 		addr = (kprobe_opcode_t *)(regs->eip - sizeof(kprobe_opcode_t));
diff -puN arch/i386/mm/fault.c~i386--add-some-descriptor-convenience-functions arch/i386/mm/fault.c
--- devel/arch/i386/mm/fault.c~i386--add-some-descriptor-convenience-functions	2005-09-07 20:10:34.000000000 -0700
+++ devel-akpm/arch/i386/mm/fault.c	2005-09-07 20:10:34.000000000 -0700
@@ -75,7 +75,8 @@ static inline unsigned long get_segment_
 {
 	unsigned long eip = regs->eip;
 	unsigned seg = regs->xcs & 0xffff;
-	u32 seg_ar, seg_limit, base, *desc;
+	u32 seg_ar, seg_limit, base;
+	struct desc_struct *desc;
 
 	/* The standard kernel/user address space limit. */
 	*eip_limit = (seg & 3) ? USER_DS.seg : KERNEL_DS.seg;
@@ -108,12 +109,12 @@ static inline unsigned long get_segment_
 		desc = (void *)desc + (seg & ~7);
 	} else {
 		/* Must disable preemption while reading the GDT. */
-		desc = (u32 *)&per_cpu(cpu_gdt_table, get_cpu());
+		desc = per_cpu(cpu_gdt_table, get_cpu());
 		desc = (void *)desc + (seg & ~7);
 	}
 
 	/* Decode the code segment base from the descriptor */
-	base = get_desc_base((unsigned long *)desc);
+	base = get_desc_base(desc);
 
 	if (segment_from_ldt(seg)) {
 		up(&current->mm->context.sem);
diff -puN include/asm-i386/desc.h~i386--add-some-descriptor-convenience-functions include/asm-i386/desc.h
--- devel/include/asm-i386/desc.h~i386--add-some-descriptor-convenience-functions	2005-09-07 20:10:34.000000000 -0700
+++ devel-akpm/include/asm-i386/desc.h	2005-09-07 20:10:34.000000000 -0700
@@ -14,6 +14,28 @@
 
 #include <asm/mmu.h>
 
+#define desc_empty(desc) \
+		(!((desc)->a + (desc)->b))
+
+#define desc_equal(desc1, desc2) \
+		(((desc1)->a == (desc2)->a) && ((desc1)->b == (desc2)->b))
+
+static inline unsigned long get_desc_base(struct desc_struct *desc)
+{
+	unsigned long base;
+	base = ((desc->a >> 16)  & 0x0000ffff) |
+		((desc->b << 16) & 0x00ff0000) |
+		(desc->b & 0xff000000);
+	return base;
+}
+
+static inline unsigned long get_desc_limit(struct desc_struct *desc)
+{
+	unsigned long limit;
+	limit = (desc->a & 0x0ffff) | (desc->b & 0xf0000);
+	return limit;
+}
+
 extern struct desc_struct cpu_gdt_table[GDT_ENTRIES];
 DECLARE_PER_CPU(struct desc_struct, cpu_gdt_table[GDT_ENTRIES]);
 
@@ -111,15 +133,5 @@ static inline void load_LDT(mm_context_t
 	put_cpu();
 }
 
-static inline unsigned long get_desc_base(unsigned long *desc)
-{
-	unsigned long base;
-	base = ((desc[0] >> 16)  & 0x0000ffff) |
-		((desc[1] << 16) & 0x00ff0000) |
-		(desc[1] & 0xff000000);
-	return base;
-}
-
 #endif /* !__ASSEMBLY__ */
-
 #endif
_