Re: TuxOnIce on i.MX53QSB platform

Kai <[email protected]> Mon, 17 Dec 2012 10:14:10 +0800
Newsgroups gmane.linux.swsusp.devel
Message-ID <CAEhSjjurb_8d4ikM+v4tSY7TO7Q=xg_FXdS_42MUaB+v_4GKTg@mail.gmail.com>
FYI:

 diff --git a/arch/arm/kernel/cpu.c b/arch/arm/kernel/cpu.c

 --- a/arch/arm/kernel/cpu.c
 +++ b/arch/arm/kernel/cpu.c
 @@ -63,7 +63,7 @@ void notrace __swsusp_arch_restore_image(void)
     extern struct pbe *restore_pblist;
     struct pbe *pbe;

 -   cpu_switch_mm(__virt_to_phys(swapper_pg_dir), &init_mm);
 +   cpu_switch_mm((swapper_pg_dir), &init_mm);

     for (pbe = restore_pblist; pbe; pbe = pbe->next)
         copy_page(pbe->orig_address, pbe->address);

Fix the problem, it seems "__virt_to_phys" do the convert twice
according to the patched source code.

On Mon, Nov 21, 2011 at 3:19 PM, S K <[email protected]> wrote:
> Hi guys,
>
> I am trying to bring up TOI on i.MX53 platform, Linux 2.6.35 + ARM
> Cortex A8 + 1GB RAM + microSD card. And the kernel config files show
> it uses 2G/2G user/kernel memory split layout.
>
> One problem blocks me, during resume process, Kernel oops occurs
> during copy memory back, it occurs in this function:
>
> void notrace __swsusp_arch_restore_image(void)
> {
>         extern struct pbe *restore_pblist;
>         struct pbe *pbe;
>
>         cpu_switch_mm(__virt_to_phys(swapper_pg_dir), &init_mm);
>
>         for (pbe = restore_pblist; pbe; pbe = pbe->next)
>                 copy_page(pbe->orig_address, pbe->address);   // when goes here, oops occurs
> }
>
> I tried to dump the to and from parameters of copy_page function
> without doing real copy, it looks valid, something like:
>
> cp: 80004000 <-- db000000
> cp: 80005000 <-- db001000
> cp: 80006000 <-- db002000
> cp: 80007000 <-- db003000
> cp: 80039000 <-- db004000
> cp: 8003a000 <-- db005000
> cp: 8003b000 <-- db006000
> cp: 8003c000 <-- db007000
> cp: 8003d000 <-- db008000
> cp: 8003e000 <-- db009000
> cp: 8003f000 <-- db00a000
> cp: 80040000 <-- db00b000
> .....
>
> the oops message:
> Unable to handle kernel NULL pointer dereference at virtual address 000000b8
> pgd = 80004000
> [000000b8] *pgd=00000000
> Internal error: Oops: 5 [#1] PREEMPT
> last sysfs file:
> Modules linked in:
> CPU: 0    Not tainted  (2.6.35.3-g1873a99-dirty #9)
> Unable to handle kernel paging request at virtual address 00006018
> pgd = 80004000
> [00006018] *pgd=00000000
> Internal error: Oops: 805 [#2] PREEMPT
> last sysfs file:
> Modules linked in:
> CPU: 0    Not tainted  (2.6.35.3-g1873a99-dirty #9)
> Unable to handle kernel paging request at virtual address 00006018
> pgd = 80004000
> [00006018] *pgd=00000000
> Internal error: Oops: 805 [#3] PREEMPT
> last sysfs file:
> Modules linked in:
> CPU: 0    Not tainted  (2.6.35.3-g1873a99-dirty #9)
> Unable to handle kernel paging request at virtual address 00006018
> pgd = 80004000
> [00006018] *pgd=00000000
> Internal error: Oops: 805 [#4] PREEMPT
> last sysfs file:
> Modules linked in:
> CPU: 0    Not tainted  (2.6.35.3-g1873a99-dirty #9)
> Unable to handle kernel paging request at virtual address 00006018
> ... ....
>
> Except TOI for 2.6.35 patch, I also applied two other patches, one is
> from linus's mainstream kernel,
> commit f6b0fa02e8b0708d17d631afce456524eadf87ff
> The other is from
> http://permalink.gmane.org/gmane.linux.power-management.general/24579
>
>
>
> ====
> Kai