From d0307444ed57c082fa6445f4ed5ecef57758e240 Mon Sep 17 00:00:00 2001 From: Zbigniew Bodek Date: Thu, 5 Jun 2014 21:35:10 +0000 Subject: [PATCH] Fix broken SMP startup on Armada XP after r265694 During Armada's platform_mp_start_ap(), mptramp code is being copied to the specific physical location (0xffff0000). Before r265694 the address to which the code should be copied was equal to the address of mpentry routine that followed the mptramp in locore.S. Now the mptramp end address should be exported and used as a copy limit. Reviewed by: gber --- sys/arm/mv/armadaxp/armadaxp_mp.c | 5 ++--- sys/arm/mv/armadaxp/mptramp.S | 2 ++ 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/sys/arm/mv/armadaxp/armadaxp_mp.c b/sys/arm/mv/armadaxp/armadaxp_mp.c index 004f8db8a3c5..1ede26fd7c40 100644 --- a/sys/arm/mv/armadaxp/armadaxp_mp.c +++ b/sys/arm/mv/armadaxp/armadaxp_mp.c @@ -97,8 +97,7 @@ platform_mp_init_secondary(void) } void mptramp(void); - - +void mptramp_end(void); void platform_mp_start_ap(void) @@ -116,7 +115,7 @@ platform_mp_start_ap(void) pmap_kenter_nocache(smp_boot, 0xffff0000); dst = (uint32_t *) smp_boot; - for (src = (uint32_t *)mptramp; src < (uint32_t *)mpentry; + for (src = (uint32_t *)mptramp; src < (uint32_t *)mptramp_end; src++, dst++) { *dst = *src; } diff --git a/sys/arm/mv/armadaxp/mptramp.S b/sys/arm/mv/armadaxp/mptramp.S index 4d657e41b470..768a16a6394b 100644 --- a/sys/arm/mv/armadaxp/mptramp.S +++ b/sys/arm/mv/armadaxp/mptramp.S @@ -54,3 +54,5 @@ Lpmureg: .word 0xd0022124 END(mptramp) + .global _C_LABEL(mptramp_end) +_C_LABEL(mptramp_end):