Message ID | 1444114536-21999-1-git-send-email-thomas@wytron.com.tw |
---|---|
State | Accepted, archived |
Delegated to: | Thomas Chou |
Headers | show |
On Tuesday, October 06, 2015 at 08:55:36 AM, Thomas Chou wrote: > Convert copy_exception_trampoline() to use dm cpu data. > > Signed-off-by: Thomas Chou <thomas@wytron.com.tw> > --- > v2 > fix exception address references. > > arch/nios2/cpu/cpu.c | 24 ++++++++++++++++++++++++ > arch/nios2/cpu/start.S | 24 +----------------------- > 2 files changed, 25 insertions(+), 23 deletions(-) > > diff --git a/arch/nios2/cpu/cpu.c b/arch/nios2/cpu/cpu.c > index 229a07b..5403c0d 100644 > --- a/arch/nios2/cpu/cpu.c > +++ b/arch/nios2/cpu/cpu.c > @@ -44,6 +44,27 @@ void dcache_disable(void) > flush_dcache(CONFIG_SYS_DCACHE_SIZE, CONFIG_SYS_DCACHELINE_SIZE); > } > > +/* > + * COPY EXCEPTION TRAMPOLINE -- copy the tramp to the > + * exception address. Define CONFIG_ROM_STUBS to prevent > + * the copy (e.g. exception in flash or in other > + * softare/firmware component). > + */ > +#ifndef CONFIG_ROM_STUBS > +static void copy_exception_trampoline(void) > +{ > + extern int _except_start, _except_end; > + void *except_target = (void *)gd->arch.exception_addr; > + > + if (&_except_start != except_target) { > + memcpy(except_target, &_except_start, > + &_except_end - &_except_start); > + flush_cache(gd->arch.exception_addr, > + &_except_end - &_except_start); Are you absolutelly sure that those addresses are aligned ? > + } > +} > +#endif > + > int arch_cpu_init_dm(void) > { > struct udevice *dev; > @@ -56,6 +77,9 @@ int arch_cpu_init_dm(void) > return -ENODEV; > > gd->ram_size = CONFIG_SYS_SDRAM_SIZE; > +#ifndef CONFIG_ROM_STUBS > + copy_exception_trampoline(); > +#endif > > return 0; > } > diff --git a/arch/nios2/cpu/start.S b/arch/nios2/cpu/start.S > index 6c7c777..90e0310 100644 > --- a/arch/nios2/cpu/start.S > +++ b/arch/nios2/cpu/start.S > @@ -14,7 +14,7 @@ > ************************************************************************/ > > .text > - .global _start > + .global _start, _except_start, _except_end > > _start: > wrctl status, r0 /* Disable interrupts */ > @@ -89,28 +89,6 @@ _cur: movhi r5, %hi(_cur - _start) > jmp r4 > _reloc: > > - /* COPY EXCEPTION TRAMPOLINE -- copy the tramp to the > - * exception address. Define CONFIG_ROM_STUBS to prevent > - * the copy (e.g. exception in flash or in other > - * softare/firmware component). > - */ > -#if !defined(CONFIG_ROM_STUBS) > - movhi r4, %hi(_except_start) > - ori r4, r4, %lo(_except_start) > - movhi r5, %hi(_except_end) > - ori r5, r5, %lo(_except_end) > - movhi r6, %hi(CONFIG_SYS_EXCEPTION_ADDR) > - ori r6, r6, %lo(CONFIG_SYS_EXCEPTION_ADDR) > - beq r4, r6, 7f /* Skip if at proper addr */ > - > -6: ldwio r7, 0(r4) > - stwio r7, 0(r6) > - addi r4, r4, 4 > - addi r6, r6, 4 > - bne r4, r5, 6b > -7: > -#endif > - > /* STACK INIT -- zero top two words for call back chain. > */ > movhi sp, %hi(CONFIG_SYS_INIT_SP)
On Tue, Oct 6, 2015 at 2:55 PM, Thomas Chou <thomas@wytron.com.tw> wrote: > Convert copy_exception_trampoline() to use dm cpu data. > > Signed-off-by: Thomas Chou <thomas@wytron.com.tw> > --- > v2 > fix exception address references. > > arch/nios2/cpu/cpu.c | 24 ++++++++++++++++++++++++ > arch/nios2/cpu/start.S | 24 +----------------------- > 2 files changed, 25 insertions(+), 23 deletions(-) > > diff --git a/arch/nios2/cpu/cpu.c b/arch/nios2/cpu/cpu.c > index 229a07b..5403c0d 100644 > --- a/arch/nios2/cpu/cpu.c > +++ b/arch/nios2/cpu/cpu.c > @@ -44,6 +44,27 @@ void dcache_disable(void) > flush_dcache(CONFIG_SYS_DCACHE_SIZE, CONFIG_SYS_DCACHELINE_SIZE); > } > > +/* > + * COPY EXCEPTION TRAMPOLINE -- copy the tramp to the > + * exception address. Define CONFIG_ROM_STUBS to prevent > + * the copy (e.g. exception in flash or in other > + * softare/firmware component). > + */ > +#ifndef CONFIG_ROM_STUBS > +static void copy_exception_trampoline(void) > +{ > + extern int _except_start, _except_end; Can we use void* for _except_start and _except_end? > + void *except_target = (void *)gd->arch.exception_addr; > + > + if (&_except_start != except_target) { > + memcpy(except_target, &_except_start, > + &_except_end - &_except_start); > + flush_cache(gd->arch.exception_addr, > + &_except_end - &_except_start); > + } > +} > +#endif > +
Hi Ley Foon, On 10/09/2015 10:51 AM, Ley Foon Tan wrote: >> +static void copy_exception_trampoline(void) >> +{ >> + extern int _except_start, _except_end; > Can we use void* for _except_start and _except_end? Yes, we can. Actually I used void * at first draft of this patch v1. But it doesn't work. We still need to get the address with '&' operator as in v2. I think it is confusing with void *, so I use int instead. But anything will do. Best regards, Thomas
On Friday, October 09, 2015 at 10:45:56 AM, Thomas Chou wrote: > Hi Ley Foon, > > On 10/09/2015 10:51 AM, Ley Foon Tan wrote: > >> +static void copy_exception_trampoline(void) > >> +{ > >> + extern int _except_start, _except_end; > > > > Can we use void* for _except_start and _except_end? > > Yes, we can. Actually I used void * at first draft of this patch v1. But > it doesn't work. We still need to get the address with '&' operator as > in v2. I think it is confusing with void *, so I use int instead. But > anything will do. I think extern void * might work, but extern int is also OK when referencing external symbol. Best regards, Marek Vasut
On 10/06/2015 02:55 PM, Thomas Chou wrote: > Convert copy_exception_trampoline() to use dm cpu data. > > Signed-off-by: Thomas Chou <thomas@wytron.com.tw> > --- > v2 > fix exception address references. > > arch/nios2/cpu/cpu.c | 24 ++++++++++++++++++++++++ > arch/nios2/cpu/start.S | 24 +----------------------- > 2 files changed, 25 insertions(+), 23 deletions(-) > Applied to u-boot-nios. > diff --git a/arch/nios2/cpu/cpu.c b/arch/nios2/cpu/cpu.c > index 229a07b..5403c0d 100644 > --- a/arch/nios2/cpu/cpu.c > +++ b/arch/nios2/cpu/cpu.c > @@ -44,6 +44,27 @@ void dcache_disable(void) > flush_dcache(CONFIG_SYS_DCACHE_SIZE, CONFIG_SYS_DCACHELINE_SIZE); > } > > +/* > + * COPY EXCEPTION TRAMPOLINE -- copy the tramp to the > + * exception address. Define CONFIG_ROM_STUBS to prevent > + * the copy (e.g. exception in flash or in other > + * softare/firmware component). > + */ > +#ifndef CONFIG_ROM_STUBS > +static void copy_exception_trampoline(void) > +{ > + extern int _except_start, _except_end; > + void *except_target = (void *)gd->arch.exception_addr; > + > + if (&_except_start != except_target) { > + memcpy(except_target, &_except_start, > + &_except_end - &_except_start); > + flush_cache(gd->arch.exception_addr, > + &_except_end - &_except_start); > + } > +} > +#endif > + > int arch_cpu_init_dm(void) > { > struct udevice *dev; > @@ -56,6 +77,9 @@ int arch_cpu_init_dm(void) > return -ENODEV; > > gd->ram_size = CONFIG_SYS_SDRAM_SIZE; > +#ifndef CONFIG_ROM_STUBS > + copy_exception_trampoline(); > +#endif > > return 0; > } > diff --git a/arch/nios2/cpu/start.S b/arch/nios2/cpu/start.S > index 6c7c777..90e0310 100644 > --- a/arch/nios2/cpu/start.S > +++ b/arch/nios2/cpu/start.S > @@ -14,7 +14,7 @@ > ************************************************************************/ > > .text > - .global _start > + .global _start, _except_start, _except_end > > _start: > wrctl status, r0 /* Disable interrupts */ > @@ -89,28 +89,6 @@ _cur: movhi r5, %hi(_cur - _start) > jmp r4 > _reloc: > > - /* COPY EXCEPTION TRAMPOLINE -- copy the tramp to the > - * exception address. Define CONFIG_ROM_STUBS to prevent > - * the copy (e.g. exception in flash or in other > - * softare/firmware component). > - */ > -#if !defined(CONFIG_ROM_STUBS) > - movhi r4, %hi(_except_start) > - ori r4, r4, %lo(_except_start) > - movhi r5, %hi(_except_end) > - ori r5, r5, %lo(_except_end) > - movhi r6, %hi(CONFIG_SYS_EXCEPTION_ADDR) > - ori r6, r6, %lo(CONFIG_SYS_EXCEPTION_ADDR) > - beq r4, r6, 7f /* Skip if at proper addr */ > - > -6: ldwio r7, 0(r4) > - stwio r7, 0(r6) > - addi r4, r4, 4 > - addi r6, r6, 4 > - bne r4, r5, 6b > -7: > -#endif > - > /* STACK INIT -- zero top two words for call back chain. > */ > movhi sp, %hi(CONFIG_SYS_INIT_SP) >
diff --git a/arch/nios2/cpu/cpu.c b/arch/nios2/cpu/cpu.c index 229a07b..5403c0d 100644 --- a/arch/nios2/cpu/cpu.c +++ b/arch/nios2/cpu/cpu.c @@ -44,6 +44,27 @@ void dcache_disable(void) flush_dcache(CONFIG_SYS_DCACHE_SIZE, CONFIG_SYS_DCACHELINE_SIZE); } +/* + * COPY EXCEPTION TRAMPOLINE -- copy the tramp to the + * exception address. Define CONFIG_ROM_STUBS to prevent + * the copy (e.g. exception in flash or in other + * softare/firmware component). + */ +#ifndef CONFIG_ROM_STUBS +static void copy_exception_trampoline(void) +{ + extern int _except_start, _except_end; + void *except_target = (void *)gd->arch.exception_addr; + + if (&_except_start != except_target) { + memcpy(except_target, &_except_start, + &_except_end - &_except_start); + flush_cache(gd->arch.exception_addr, + &_except_end - &_except_start); + } +} +#endif + int arch_cpu_init_dm(void) { struct udevice *dev; @@ -56,6 +77,9 @@ int arch_cpu_init_dm(void) return -ENODEV; gd->ram_size = CONFIG_SYS_SDRAM_SIZE; +#ifndef CONFIG_ROM_STUBS + copy_exception_trampoline(); +#endif return 0; } diff --git a/arch/nios2/cpu/start.S b/arch/nios2/cpu/start.S index 6c7c777..90e0310 100644 --- a/arch/nios2/cpu/start.S +++ b/arch/nios2/cpu/start.S @@ -14,7 +14,7 @@ ************************************************************************/ .text - .global _start + .global _start, _except_start, _except_end _start: wrctl status, r0 /* Disable interrupts */ @@ -89,28 +89,6 @@ _cur: movhi r5, %hi(_cur - _start) jmp r4 _reloc: - /* COPY EXCEPTION TRAMPOLINE -- copy the tramp to the - * exception address. Define CONFIG_ROM_STUBS to prevent - * the copy (e.g. exception in flash or in other - * softare/firmware component). - */ -#if !defined(CONFIG_ROM_STUBS) - movhi r4, %hi(_except_start) - ori r4, r4, %lo(_except_start) - movhi r5, %hi(_except_end) - ori r5, r5, %lo(_except_end) - movhi r6, %hi(CONFIG_SYS_EXCEPTION_ADDR) - ori r6, r6, %lo(CONFIG_SYS_EXCEPTION_ADDR) - beq r4, r6, 7f /* Skip if at proper addr */ - -6: ldwio r7, 0(r4) - stwio r7, 0(r6) - addi r4, r4, 4 - addi r6, r6, 4 - bne r4, r5, 6b -7: -#endif - /* STACK INIT -- zero top two words for call back chain. */ movhi sp, %hi(CONFIG_SYS_INIT_SP)
Convert copy_exception_trampoline() to use dm cpu data. Signed-off-by: Thomas Chou <thomas@wytron.com.tw> --- v2 fix exception address references. arch/nios2/cpu/cpu.c | 24 ++++++++++++++++++++++++ arch/nios2/cpu/start.S | 24 +----------------------- 2 files changed, 25 insertions(+), 23 deletions(-)