x86: Use get_desc_base()
authorAkinobu Mita <akinobu.mita@gmail.com>
Sat, 18 Jul 2009 15:08:54 +0000 (00:08 +0900)
committerIngo Molnar <mingo@elte.hu>
Sun, 19 Jul 2009 16:27:51 +0000 (18:27 +0200)
Use get_desc_base() to get the base address in desc_struct

Signed-off-by: Akinobu Mita <akinobu.mita@gmail.com>
LKML-Reference: <20090718150853.GA11294@localhost.localdomain>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
arch/x86/kernel/doublefault_32.c
arch/x86/kernel/step.c

index b4f14c6..37250fe 100644 (file)
@@ -27,9 +27,7 @@ static void doublefault_fn(void)
 
        if (ptr_ok(gdt)) {
                gdt += GDT_ENTRY_TSS << 3;
-               tss = *(u16 *)(gdt+2);
-               tss += *(u8 *)(gdt+4) << 16;
-               tss += *(u8 *)(gdt+7) << 24;
+               tss = get_desc_base((struct desc_struct *)gdt);
                printk(KERN_EMERG "double fault, tss at %08lx\n", tss);
 
                if (ptr_ok(tss)) {
index e8b9863..3149032 100644 (file)
@@ -4,6 +4,7 @@
 #include <linux/sched.h>
 #include <linux/mm.h>
 #include <linux/ptrace.h>
+#include <asm/desc.h>
 
 unsigned long convert_ip_to_linear(struct task_struct *child, struct pt_regs *regs)
 {
@@ -23,7 +24,7 @@ unsigned long convert_ip_to_linear(struct task_struct *child, struct pt_regs *re
         * and APM bios ones we just ignore here.
         */
        if ((seg & SEGMENT_TI_MASK) == SEGMENT_LDT) {
-               u32 *desc;
+               struct desc_struct *desc;
                unsigned long base;
 
                seg &= ~7UL;
@@ -33,12 +34,10 @@ unsigned long convert_ip_to_linear(struct task_struct *child, struct pt_regs *re
                        addr = -1L; /* bogus selector, access would fault */
                else {
                        desc = child->mm->context.ldt + seg;
-                       base = ((desc[0] >> 16) |
-                               ((desc[1] & 0xff) << 16) |
-                               (desc[1] & 0xff000000));
+                       base = get_desc_base(desc);
 
                        /* 16-bit code segment? */
-                       if (!((desc[1] >> 22) & 1))
+                       if (!desc->d)
                                addr &= 0xffff;
                        addr += base;
                }