[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

RE: [Xen-ia64-devel]Question about priv_ptc_e



Dan,
Thanks for your sharing,
This will definitely help developers in community greatly.

I still have some questions.

>into a privileged instruction.  This meant I couldn't
>always just use a "break" instruction.
I don't understand this, is this because fc has a parameter?
But I don't think it is a big deal.

*       mov rx=ar.cflg -> mov ar.cflg=r(x+64) [**]
Did you find linux kernel use ar.cflg?

Thanks,
-Anthony 
>-----Original Message-----
>From: Magenheimer, Dan (HP Labs Fort Collins) [mailto:dan.magenheimer@xxxxxx]
>Sent: 2006年3月11日 1:35
>To: Tristan Gingold; Xu, Anthony
>Cc: xen-ia64-devel@xxxxxxxxxxxxxxxxxxx
>Subject: RE: [Xen-ia64-devel]Question about priv_ptc_e
>
>> From: Tristan Gingold [mailto:Tristan.Gingold@xxxxxxxx]
>> Sent: Friday, March 10, 2006 2:41 AM
>> To: Xu, Anthony; Magenheimer, Dan (HP Labs Fort Collins)
>> Cc: xen-ia64-devel@xxxxxxxxxxxxxxxxxxx
>> Subject: Re: [Xen-ia64-devel]Question about priv_ptc_e
>>
>> Le Vendredi 10 Mars 2006 09:27, Xu, Anthony a écrit :
>> > From: Tristan Gingold [mailto:Tristan.Gingold@xxxxxxxx]
>> >
>> > >Sent: 2006年3月10日 16:13
>> > >This is the way fc is privatized.
>> > >You need to privatize fc because its semantic is different
>> in CPL0 and CPL
>> > > != 0.  You couldn't use a break (at least during the
>> privatize area), so
>> > > Dan used a priv op with special registers.
>> > >
>> > >Maybe this area is over and this could be now cleaned.
>> >
>> > Understand, so the question changes to,
>> > Doesn't fc use register whose index is larger than 63?
>> It may, but it don't.
>> I suppose privatize checks this.  According to Dan work, the
>> answer is no.
>> Note we only speak about fc in kernel.
>
>Sorry for the delayed response...
>
>It would be OK to clean this up.  It may actually be
>causing a bug!  But I would like to preserve the code
>rather than remove it as it is possible that it may
>be used again.  It would be OK though to tie it to a
>global variable / command line option that defaults
>off.  For example:
>
> // NOTE: ptc_e with source gr > 63 is emulated as a fc r(y-64)
>-      if (src > 63) return(vcpu_fc(vcpu,vcpu_get_gr(vcpu,src - 64)));
>+      if (privified && src > 63)
>+              return(vcpu_fc(vcpu,vcpu_get_gr(vcpu,src - 64)));
>       return vcpu_ptc_e(vcpu,vcpu_get_gr(vcpu,src));
>
>There are several of these that need to be changed,
>so let's change all of them the same way at the same time.
>
>Now for the complete historical explanation:
>
>Early in the implementation of Xen/ia64, before there was
>a paravirtualized Xenlinux/ia64, I implemented a program
>to go through the load image of a Linux binary and convert
>all "privilege-sensitive" instructions into instructions
>that would trap.  Using this binary conversion, it was
>possible to run an otherwise unmodified Linux on top of
>Xen, albeit very slowly.  This made it possible to do a
>lot of Xen/ia64 development and debugging without needing
>a paravirtualized domain0.
>
>I called this tool "privify" -- which is not an English
>word.  The "-ify" suffix means "to form into" or "make
>similar to" (and according to my dictionary is derived
>from Old French "-fier"!).  So "privify" means "to make
>into privileged instructions".
>
>Because of the complex encodings of Itanium bundles, and
>because I didn't want the privify tool to deal with
>difficult cross-bundle rewriting, I needed to carefully
>choose how to transform each privilege-sensitive instruction
>into a privileged instruction.  This meant I couldn't
>always just use a "break" instruction.  Furthermore, since Xen
>was going to emulate the transformed instructions
>differently than the actual privileged instruction, I
>needed to choose privileged instructions that were never
>(or at least very rarely) used.
>
>I noted that nearly all instructions that use general
>registers are capable of accessing all 128 GR's, but
>it is rare for gr64-127 to be accessed.  And it is
>VERY rare for those registers to get accessed by a
>privileged instructions.   So the privify program
>transforms privilege-sensitive instruction into other
>highly similar privileged instructions.  In the example
>you noted:
>
>   "fc rx" is converted to "ptc r(x+64)"
>
>Other examples include:
>
>   thash rx=ry -> tak rx=r(y+64)
>   ttag rx=ry -> tpa rx=r(y+64)
>
>The complete list is in xen/arch/ia64/tools/privify/privify.h.
>(Note that the conversion of kernel register (ar.kr) reads
>pre-dates the decision to allow the kernel registers to
>be owned by the guest rather than by Xen itself.)
>
>Purists will note that this conversion is risky as it
>is POSSIBLE that Xen will confuse privified instructions
>with real privileged instructions.  For example, if
>a guest really wanted to execute a "ptc r65" instruction,
>Xen would emulate a "fc r1" instruction.  Fortunately,
>except for self-modifying code, these conflicts can be
>detected statically and privify warns when it encounters
>one of these.  In all of Linux/ia64, there was one case
>where this was a problem:  One of the mca routines had
>a huge routine that utilized the higher registers and
>used some privileged instructions.  If this routine got
>executed, privified Linux/ia64 crashed, but there was an
>easy workaround: specify "nomca" on the domain0 command
>line.  (Some of you may still have "nomca" in your
>elilo.conf files; this explains why!).
>
>Privification is not perfect but it was useful and is still
>interesting.  By converting privilege-sensitive instructions
>so that they trap and leaving all privileged instructions
>to be emulated by Xen, the number of privileged traps is
>similar to the number of traps required for an unmodified
>guest executing under VT-i.  With this it is possible to
>approximate the performance of a fully-virtualized guest.
>(Haavard Bjerke's thesis last summer provides benchmarks.)
>http://openlab-mu-internal.web.cern.ch/openlab-mu-internal/Documents/2_Tech
>nical_Documents/Master_thesis/Thesis_HarvardBjerke.pdf
>
>So this is why some privileged instruction emulation routines
>in Xen/ia64 check for a register greater than 63 and do
>something different.
>
>THE END... are you sleepy yet? :-)

_______________________________________________
Xen-ia64-devel mailing list
Xen-ia64-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-ia64-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.