Subject: Re: the bouyer-xeni386 branch
To: Manuel Bouyer <bouyer@antioche.eu.org>
From: Andrew Doran <ad@netbsd.org>
List: port-xen
Date: 01/10/2008 18:31:00
On Wed, Jan 09, 2008 at 08:34:12PM +0100, Manuel Bouyer wrote:

> I'm almost done merging xen support back in arch/i386, in the same way it
> was done for amd64 Xen supoort (there's much, much less duplicate code this
> way). There's only spl.S and vector.S remaining, which I hope to handle this
> evening, as well as reworking a bit the xen/i386 config files to match amd64
> (especially, introduce a arch/xen/include/i386 directory and move some files
> here).
> 
> 
> I'd like to merge the branch to HEAD ASAP, possibly tomorow evening.
> Once done, I'll keep the branch active to work on x86PAE suport for
> Xen. If you have a problem with the content of the branch or the merge to
> HEAD, please tell !

A few comments:

>+/*
> + * void lgdt_finish(void);
> + * Finish load a new GDT pointer (do any necessary cleanup).
> + * XXX It's somewhat questionable whether reloading all the segment registers
> + * is necessary, since the actual descriptor data is not changed except by
> + * process creation and exit, both of which clean up via task switches.  OTOH,
> + * this only happens at run time when the GDT is resized.
> + */
> +/* LINTSTUB: Func: void lgdt_finish(void) */
> +NENTRY(lgdt_finish)
> +       movl    $GSEL(GDATA_SEL, SEL_KPL),%eax
> +       movw    %ax,%ds
> +       movw    %ax,%es
> +       movw    %ax,%gs
> +       movw    %ax,%ss
> +       movl    $GSEL(GCPU_SEL, SEL_KPL),%eax
> +       movw    %ax,%fs
> +       /* Reload code selector by doing intersegment return. */
> +       popl    %eax
> +       pushl   $GSEL(GCODE_SEL, SEL_KPL)
> +       pushl   %eax
> +       lret

Following the convention this one belongs in xenfunc.S (although I realise
there is a xenfunc.c which IIRC I added).

> +#ifndef XEN
>         tf->tf_gs = GSEL(GUGS_SEL, SEL_UPL);
>         tf->tf_fs = GSEL(GUFS_SEL, SEL_UPL);
> +#else
> +       tf->tf_gs = GSEL(GUDATA_SEL, SEL_UPL);
> +       tf->tf_fs = GSEL(GUDATA_SEL, SEL_UPL);
> +#endif
 
Xen should use GUFS/GUGS_SEL too. They aren't updated in cpu_switchto()
yet - it looks like a couple of hypervisor calls would be needed.

> @@ -2117,10 +2365,13 @@
>  void
>  cpu_reset()
>  {
> +#ifdef XEN
> +       HYPERVISOR_reboot();
> +       for (;;);
> +#else /* XEN */
>         struct region_descriptor region;
>  
>         x86_disable_intr();
> -
>  #ifdef XBOX
>         if (arch_i386_is_xbox) {
>                 xbox_reboot();
> @@ -2184,6 +2435,7 @@
>  #endif
>  
>         for (;;);
> +#endif /* XEN */
>  }
 
Where entire functions are different it would be nice to put them in different
files. But, I don't mind, it can be done later.

> +#ifdef XEN
> +                       pmap_kenter_ma(eva, pa, VM_PROT_READ);
> +#else
>                         pmap_kenter_pa(eva, pa, VM_PROT_READ);
> +#endif
> 
> +#ifndef XEN
> +int gdt_size[1];       /* total number of GDT entries */
> +int gdt_count[1];      /* number of GDT entries in use */
> +int gdt_next[1];       /* next available slot for sweeping */
> +int gdt_free[1];       /* next free slot; terminated with GNULL_SEL */
> +#else
> +int gdt_size[2];       /* total number of GDT entries */
> +int gdt_count[2];      /* number of GDT entries in use */
> +int gdt_next[2];       /* next available slot for sweeping */
> +int gdt_free[2];       /* next free slot; terminated with GNULL_SEL */
> +#endif
 
Why not [2] on both? Saves a few bytes? :-)

Thanks,
Andrew