|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH for-xen-4.5 v4 05/18] x86/boot/reloc: create generic alloc and copy functions
On Fri, Oct 17, 2014 at 05:04:33PM +0100, Andrew Cooper wrote:
> On 17/10/14 15:11, Daniel Kiper wrote:
> > Create generic alloc and copy functions. We need them to
> > introduce MBD struct and multiboot2 protocol. Please
> > check later patches for more details.
>
> As I asked before, you need to make some comment about changing the
> types and introducing loads of casts. Its fine to say that the eventual
> code will use u32s everywhere, but this information must be in the
> commit message.
OK.
> > Signed-off-by: Daniel Kiper <daniel.kiper@xxxxxxxxxx>
> > ---
> > xen/arch/x86/boot/reloc.c | 52
> > ++++++++++++++++++++++++++++-----------------
> > 1 file changed, 33 insertions(+), 19 deletions(-)
> >
> > diff --git a/xen/arch/x86/boot/reloc.c b/xen/arch/x86/boot/reloc.c
> > index 4609e55..e1c83f4 100644
> > --- a/xen/arch/x86/boot/reloc.c
> > +++ b/xen/arch/x86/boot/reloc.c
> > @@ -33,9 +33,10 @@ asm (
> > typedef unsigned int u32;
> > #include "../../../include/xen/multiboot.h"
> >
> > -static void *reloc_mbi_struct(void *old, unsigned int bytes)
> > +static u32 alloc_struct(u32 bytes)
> > {
> > - void *new;
> > + u32 s;
> > +
> > asm(
> > " call 1f \n"
> > "1: pop %%edx \n"
> > @@ -43,50 +44,63 @@ static void *reloc_mbi_struct(void *old, unsigned int
> > bytes)
> > " sub %1,%0 \n"
> > " and $~15,%0 \n"
> > " mov %0,alloc-1b(%%edx) \n"
> > - " mov %0,%%edi \n"
> > - " rep movsb \n"
> > - : "=&r" (new), "+c" (bytes), "+S" (old)
> > - : : "edx", "edi");
> > - return new;
> > + : "=&r" (s) : "r" (bytes) : "edx");
> > +
> > + return s;
> > }
> >
> > -static char *reloc_mbi_string(char *old)
> > +static u32 copy_struct(u32 src, u32 bytes)
> > +{
> > + u32 dst, dst_asm;
> > +
> > + dst = alloc_struct(bytes);
> > + dst_asm = dst;
> > +
> > + asm volatile("rep movsb" : "+S" (src), "+D" (dst_asm), "+c" (bytes));
>
> All 3 registers are only used as inputs, and the modified values are not
> useful. You can drop dst_asm entirely. See the stack resync code in
> __start_xen() as an example.
"rep movsb" clobbers S, D and c. If you put them as inputs then you are
not able to tell GCC that they are clobbered. It means that GCC will assume
that e.g. D contents, which in turn is assigned to dst variable, is the same
before and after "asm volatile" which is not true. So, I do not know how
'asm volatile("rep movsb"...' in __start_xen() works and nothing has not
blown out yet... Probably it is just fortunate coincidence. In my case it
did not work (to be precise, sometime it worked). Hence, that is why I must
put all input data as input/output and define additional variable which
is used by "asm volatile" only. Maybe we should consider fixing this stuff
in __start_xen() too... Are there other places with that bad guys?
However, now I am thinking that we should add "memory" to clobbers when
"rep movsb" and similar thing are used here.
Daniel
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |