Message ID | 1323679853-31751-3-git-send-email-tiejun.chen@windriver.com (mailing list archive) |
---|---|
State | Changes Requested |
Headers | show |
On Mon, 2011-12-12 at 16:50 +0800, Tiejun Chen wrote: > We need a copy mechanism to migrate exception stack. But looks copy_page() > already implement this well so we can complete copy_exc_stack() based on > that directly. I'd rather you don't hijack copy_page which is quite sensitive. The emulation isn't performance critical so a "dumber" routine would work fine. Why not use memcpy ? You can call it from assembly. Cheers, Ben. > Signed-off-by: Tiejun Chen <tiejun.chen@windriver.com> > --- > arch/powerpc/include/asm/page_32.h | 1 + > arch/powerpc/kernel/misc_32.S | 16 +++++++++++++++- > arch/powerpc/kernel/ppc_ksyms.c | 1 + > 3 files changed, 17 insertions(+), 1 deletions(-) > > diff --git a/arch/powerpc/include/asm/page_32.h b/arch/powerpc/include/asm/page_32.h > index 68d73b2..2c1fd84 100644 > --- a/arch/powerpc/include/asm/page_32.h > +++ b/arch/powerpc/include/asm/page_32.h > @@ -40,6 +40,7 @@ struct page; > extern void clear_pages(void *page, int order); > static inline void clear_page(void *page) { clear_pages(page, 0); } > extern void copy_page(void *to, void *from); > +extern void copy_exc_stack(void *to, void *from); > > #include <asm-generic/getorder.h> > > diff --git a/arch/powerpc/kernel/misc_32.S b/arch/powerpc/kernel/misc_32.S > index 998a100..aa02545 100644 > --- a/arch/powerpc/kernel/misc_32.S > +++ b/arch/powerpc/kernel/misc_32.S > @@ -527,7 +527,7 @@ _GLOBAL(clear_pages) > stw r8,12(r3); \ > stwu r9,16(r3) > > -_GLOBAL(copy_page) > +ready_copy: > addi r3,r3,-4 > addi r4,r4,-4 > > @@ -544,7 +544,21 @@ _GLOBAL(copy_page) > dcbt r5,r4 > li r11,L1_CACHE_BYTES+4 > #endif /* MAX_COPY_PREFETCH */ > + blr > + > +_GLOBAL(copy_exc_stack) > + mflr r12 > + bl ready_copy > + mtlr r12 > + li r0,INT_FRAME_SIZE/L1_CACHE_BYTES - MAX_COPY_PREFETCH > + b go_copy > + > +_GLOBAL(copy_page) > + mflr r12 > + bl ready_copy > + mtlr r12 > li r0,PAGE_SIZE/L1_CACHE_BYTES - MAX_COPY_PREFETCH > +go_copy: > crclr 4*cr0+eq > 2: > mtctr r0 > diff --git a/arch/powerpc/kernel/ppc_ksyms.c b/arch/powerpc/kernel/ppc_ksyms.c > index f5ae872..2223daf 100644 > --- a/arch/powerpc/kernel/ppc_ksyms.c > +++ b/arch/powerpc/kernel/ppc_ksyms.c > @@ -88,6 +88,7 @@ EXPORT_SYMBOL(__clear_user); > EXPORT_SYMBOL(__strncpy_from_user); > EXPORT_SYMBOL(__strnlen_user); > EXPORT_SYMBOL(copy_page); > +EXPORT_SYMBOL(copy_exc_stack); > > #if defined(CONFIG_PCI) && defined(CONFIG_PPC32) > EXPORT_SYMBOL(isa_io_base);
Benjamin Herrenschmidt wrote: > On Mon, 2011-12-12 at 16:50 +0800, Tiejun Chen wrote: >> We need a copy mechanism to migrate exception stack. But looks copy_page() >> already implement this well so we can complete copy_exc_stack() based on >> that directly. > > I'd rather you don't hijack copy_page which is quite sensitive. The > emulation isn't performance critical so a "dumber" routine would work Yes, I just think we should introduce good performance so I 'steal' the original copy_page(). > fine. > > Why not use memcpy ? You can call it from assembly. I'd like to switch to memcpy. Thanks Tiejun
diff --git a/arch/powerpc/include/asm/page_32.h b/arch/powerpc/include/asm/page_32.h index 68d73b2..2c1fd84 100644 --- a/arch/powerpc/include/asm/page_32.h +++ b/arch/powerpc/include/asm/page_32.h @@ -40,6 +40,7 @@ struct page; extern void clear_pages(void *page, int order); static inline void clear_page(void *page) { clear_pages(page, 0); } extern void copy_page(void *to, void *from); +extern void copy_exc_stack(void *to, void *from); #include <asm-generic/getorder.h> diff --git a/arch/powerpc/kernel/misc_32.S b/arch/powerpc/kernel/misc_32.S index 998a100..aa02545 100644 --- a/arch/powerpc/kernel/misc_32.S +++ b/arch/powerpc/kernel/misc_32.S @@ -527,7 +527,7 @@ _GLOBAL(clear_pages) stw r8,12(r3); \ stwu r9,16(r3) -_GLOBAL(copy_page) +ready_copy: addi r3,r3,-4 addi r4,r4,-4 @@ -544,7 +544,21 @@ _GLOBAL(copy_page) dcbt r5,r4 li r11,L1_CACHE_BYTES+4 #endif /* MAX_COPY_PREFETCH */ + blr + +_GLOBAL(copy_exc_stack) + mflr r12 + bl ready_copy + mtlr r12 + li r0,INT_FRAME_SIZE/L1_CACHE_BYTES - MAX_COPY_PREFETCH + b go_copy + +_GLOBAL(copy_page) + mflr r12 + bl ready_copy + mtlr r12 li r0,PAGE_SIZE/L1_CACHE_BYTES - MAX_COPY_PREFETCH +go_copy: crclr 4*cr0+eq 2: mtctr r0 diff --git a/arch/powerpc/kernel/ppc_ksyms.c b/arch/powerpc/kernel/ppc_ksyms.c index f5ae872..2223daf 100644 --- a/arch/powerpc/kernel/ppc_ksyms.c +++ b/arch/powerpc/kernel/ppc_ksyms.c @@ -88,6 +88,7 @@ EXPORT_SYMBOL(__clear_user); EXPORT_SYMBOL(__strncpy_from_user); EXPORT_SYMBOL(__strnlen_user); EXPORT_SYMBOL(copy_page); +EXPORT_SYMBOL(copy_exc_stack); #if defined(CONFIG_PCI) && defined(CONFIG_PPC32) EXPORT_SYMBOL(isa_io_base);
We need a copy mechanism to migrate exception stack. But looks copy_page() already implement this well so we can complete copy_exc_stack() based on that directly. Signed-off-by: Tiejun Chen <tiejun.chen@windriver.com> --- arch/powerpc/include/asm/page_32.h | 1 + arch/powerpc/kernel/misc_32.S | 16 +++++++++++++++- arch/powerpc/kernel/ppc_ksyms.c | 1 + 3 files changed, 17 insertions(+), 1 deletions(-)