Re: SWSUSP Discontiguous pagedir patch

Patrick Mochel
2003-03-04T20:50:18Z

> > > --- linux-2.5.63/arch/i386/kernel/suspend.c 2003-02-20 08:25:26.000000000 +1300
> > > +++ linux-2.5.63-01/arch/i386/kernel/suspend.c 2003-02-20 08:27:36.000000000 +1300
> >
> > Thank you for putting this back in C, it's much appreciated.
>
> Actually, it can not be put back in C. Manipulating stack pointer from
> gcc inline assembly is just undefined. Its back in C so we can edit
> it, but it needs to get back to assembly before merging with Linus.

Noted. I'll convert it back.

> > This is better done as
> >
> > for (loop = 0; loop < nr_copy_pagse; loop++) {
> > memcpy((char *)pagedir_nosave[loop].orig_address,
> > (char *)pagedir_nosave[loop].address,
> > PAGE_SIZE);
> > __flush_tlb();
> > }
>
> Hehe, try it.
>
> You may not do function call at this point, because you are
> overwriting your stack. See mails with Andi Kleen. This *needs* to be
> in assembly.

memcpy() is inlined, at least on x86, and it seems to work fine for me
here. Besides, even if memcpy is not safe, you could at least copy 4 bytes
at a time. ;)

-pat