lkml.org 
[lkml]   [2005]   [Aug]   [7]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
DateSun, 07 Aug 2005 04:03:43 -0700
FromZachary Amsden <>
SubjectRe: [PATCH] 5/8 Move descriptor table management into the sub-arch layer
Chris Wright wrote:

>* Zachary Amsden (zach@vmware.com) wrote:
>
>
>>This change encapsulates descriptor and task register management.
>>
>>
>
>These will need some merging together, will take a stab tomorrow.
>
>
>--- linux-2.6.12-xen0-arch.orig/include/asm-i386/desc.h
>+++ linux-2.6.12-xen0-arch/include/asm-i386/desc.h
>@@ -14,9 +14,6 @@
>
> static inline void __set_tss_desc(unsigned int cpu, unsigned int entry, void *addr)
> {
>- _set_tssldt_desc(&per_cpu(cpu_gdt_table, cpu)[entry], (int)addr,
>+ _set_tssldt_desc(&get_cpu_gdt_table(cpu)[entry], (int)addr,
>
>

What is Xen doing for the GDT on SMP? Does Xen have 16 pages of GDT per
CPU?

>+++ linux-2.6.12-xen0-arch/include/asm-i386/mach-default/mach_desc.h
>@@ -0,0 +1,57 @@
>+#ifndef __ASM_MACH_DESC_H
>+#define __ASM_MACH_DESC_H
>+
>+extern struct desc_struct cpu_gdt_table[GDT_ENTRIES];
>+DECLARE_PER_CPU(struct desc_struct, cpu_gdt_table[GDT_ENTRIES]);
>+#define get_cpu_gdt_table(_cpu) per_cpu(cpu_gdt_table, cpu)
>+
>+#define _set_tssldt_desc(n,addr,limit,type) \
>+__asm__ __volatile__ ("movw %w3,0(%2)\n\t" \
>+ "movw %%ax,2(%2)\n\t" \
>+ "rorl $16,%%eax\n\t" \
>+ "movb %%al,4(%2)\n\t" \
>+ "movb %4,5(%2)\n\t" \
>+ "movb $0,6(%2)\n\t" \
>+ "movb %%ah,7(%2)\n\t" \
>+ "rorl $16,%%eax" \
>+ : "=m"(*(n)) : "a" (addr), "r"(n), "ir"(limit), "i"(type))
>
>

This actually doesn't need to move into sub-arch. You can redefine the
call sites (set_ldt_desc / set_tss_desc) to operate on stack (implicit
register) values instead and then notify the hypervisor about GDT
updates. Course, which way is cleaner looks still TBD.

>+static inline void clear_LDT(void)
>+{
>+ int cpu = get_cpu();
>+
>+ set_ldt_desc(cpu, &default_ldt[0], 5);
>+ load_LDT_desc();
>+ put_cpu();
>+}
>+
>+/*
>+ * load one particular LDT into the current CPU
>+ */
>+static inline void load_LDT_nolock(mm_context_t *pc, int cpu)
>+{
>+ void *segments = pc->ldt;
>+ int count = pc->size;
>+
>+ if (likely(!count)) {
>+ segments = &default_ldt[0];
>+ count = 5;
>+ }
>+
>+ set_ldt_desc(cpu, segments, count);
>+ load_LDT_desc();
>+}
>+
>+#endif
>
>

These two don't actually need to move into sub-arch ; they can call
functions that have already moved.

So far looks like we are pretty much on the same page, with mostly
cosmetic differences.

Zach
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/

\
 
 \ /
  Last update: 2005-08-07 13:07    [from the cache]
©2003-2010