desc = (u32 *)&per_cpu(cpu_gdt_table, get_cpu()); 
desc = (u32 *)get_cpu_gdt_table(get_cpu()); 
static inline unsigned long get_segment_eip(struct pt_regs *regs,					    unsigned long *eip_limit){	unsigned long eip = regs->eip;	unsigned seg = regs->xcs & 0xffff;	u32 seg_ar, seg_limit, base, *desc;	/* The standard kernel/user address space limit. */	*eip_limit = (seg & 3) ? USER_DS.seg : KERNEL_DS.seg;	/* Unlikely, but must come before segment checks. */	if (unlikely((regs->eflags & VM_MASK) != 0))		return eip + (seg << 4);		/* By far the most common cases. */	if (likely(seg == __USER_CS || seg == __KERNEL_CS))		return eip;	/* Check the segment exists, is within the current LDT/GDT size,	   that kernel/user (ring 0..3) has the appropriate privilege,	   that it's a code segment, and get the limit. */	__asm__ ("larl %3,%0; lsll %3,%1"		 : "=&r" (seg_ar), "=r" (seg_limit) : "0" (0), "rm" (seg));	if ((~seg_ar & 0x9800) || eip > seg_limit) {		*eip_limit = 0;		return 1;	 /* So that returned eip > *eip_limit. */	}	/* Get the GDT/LDT descriptor base. 	   When you look for races in this code remember that	   LDT and other horrors are only used in user space. */	if (seg & (1<<2)) {		/* Must lock the LDT while reading it. */		down(&current->mm->context.sem);		desc = current->mm->context.ldt;		desc = (void *)desc + (seg & ~7);	} else {		/* Must disable preemption while reading the GDT. */		desc = (u32 *)&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);	if (seg & (1<<2)) { 		up(&current->mm->context.sem);	} else		put_cpu();	/* Adjust EIP and segment limit, and clamp at the kernel limit.	   It's legitimate for segments to wrap at 0xffffffff. */	seg_limit += base;	if (seg_limit < *eip_limit && seg_limit >= base)		*eip_limit = seg_limit;	return eip + base;}
4520	/local/tlutelli/issta_data/temp/c/2005_temp/2005/4520/251e6912df43df54570ed68aade703b329c6cd5b/fault.c/clean/arch/i386/mm/fault.c