[U-Boot] [PATCH] nios2: convert copy_exception_trampoline to use dm cpu data

Convert copy_exception_trampoline() to use dm cpu data.
Signed-off-by: Thomas Chou thomas@wytron.com.tw --- 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..eb047ba 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 void *_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(-)
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)

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)
participants (3)
-
Ley Foon Tan
-
Marek Vasut
-
Thomas Chou