Hi!

> > > Signed-off-by: Rafael J. Wysocki <[EMAIL PROTECTED]>
> > 
> > > diff -Nrup linux-2.6.11-bk10-a/arch/x86_64/kernel/suspend_asm.S 
> > > linux-2.6.11-bk10-b/arch/x86_64/kernel/suspend_asm.S
> > > --- linux-2.6.11-bk10-a/arch/x86_64/kernel/suspend_asm.S  2005-03-15 
> > > 09:20:53.000000000 +0100
> > > +++ linux-2.6.11-bk10-b/arch/x86_64/kernel/suspend_asm.S  2005-03-15 
> > > 15:36:29.000000000 +0100
> > > @@ -69,6 +69,14 @@ loop:
> > >   movq    pbe_next(%rdx), %rdx
> > >   jmp     loop
> > >  done:
> > > + /* Flush TLB, including "global" things (vmalloc) */
> > > + movq    %rax, %rdx;  # mmu_cr4_features(%rip)
> > 
> > I somehow don't think %rax contains mmu_cr4_features at this
> > point. Otherwise it seems to look ok.
> 
> Yes, it does, because on x86-64 the TLBs are flushed before the loop,
> right after %cr3 is loaded with init_level4_pgt.  %rax is not touched
> afterwards, so it contains the right value.  Here's the relevant code
> from suspend_asm.S (with the patch applied):

Well, it is mmu_cr4_features from "old" kernel, while you are flushing
tlb in "new" kernel. It is probably same anyway, but.... %rax is
commonly-used scratch register, and memory load is not that
expensive. Can you just load it from memory?
                                                                Pavel

> ENTRY(swsusp_arch_resume)
>       /* set up cr3 */        
>       leaq    init_level4_pgt(%rip),%rax
>       subq    $__START_KERNEL_map,%rax
>       movq    %rax,%cr3
> 
>       movq    mmu_cr4_features(%rip), %rax
>       movq    %rax, %rdx
>       andq    $~(1<<7), %rdx  # PGE
>       movq    %rdx, %cr4;  # turn off PGE
>       movq    %cr3, %rcx;  # flush TLB
>       movq    %rcx, %cr3;
>       movq    %rax, %cr4;  # turn PGE back on
> 
>       movq    pagedir_nosave(%rip), %rdx
> loop:
>       testq   %rdx, %rdx
>       jz      done
> 
>       /* get addresses from the pbe and copy the page */
>       movq    pbe_address(%rdx), %rsi
>       movq    pbe_orig_address(%rdx), %rdi
>       movq    $512, %rcx
>       rep
>       movsq
> 
>       /* progress to the next pbe */
>       movq    pbe_next(%rdx), %rdx
>       jmp     loop
> done:
>       /* Flush TLB, including "global" things (vmalloc) */
>       movq    %rax, %rdx;  # mmu_cr4_features(%rip)
>       andq    $~(1<<7), %rdx;  # PGE
>       movq    %rdx, %cr4;  # turn off PGE
>       movq    %cr3, %rcx;  # flush TLB
>       movq    %rcx, %cr3
>       movq    %rax, %cr4;  # turn PGE back on
> 
> 
> Greets,
> Rafael
> 
> 

-- 
People were complaining that M$ turns users into beta-testers...
...jr ghea gurz vagb qrirybcref, naq gurl frrz gb yvxr vg gung jnl!
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to