xen/arm: Change the variable type of cpu_logical_map to register_t
authorWei Chen <wei.chen@linaro.org>
Tue, 31 May 2016 02:54:11 +0000 (10:54 +0800)
committerStefano Stabellini <sstabellini@kernel.org>
Wed, 1 Jun 2016 10:13:37 +0000 (11:13 +0100)
The cpu_logical_map is used to store CPU hardware ID from MPIDR_EL1 or
from CPU node of DT. Currently, the cpu_logical_map is using the u32 as
its variable type. It can work properly while Xen is running on ARM32,
because the hardware ID is 32-bits. While Xen is running on ARM64, the
hardware ID expands to 64-bits and then the cpu_logical_map will overflow.

Change the variable type of cpu_logical_map to register_t will make
cpu_logical_map to store hardware IDs correctly on ARM32 and ARM64.

Signed-off-by: Wei Chen <Wei.Chen@linaro.org>
Acked-by: Julien Grall <julien.grall@arm.com>
Signed-off-by: Stefano Stabellini <sstabellini@kernel.org>
xen/arch/arm/gic-v3.c
xen/arch/arm/smpboot.c
xen/include/asm-arm/processor.h

index a0950649b2ae712416a89dad20fb8d910bfb228e..9910877d40a8cea8d023379557124d1bca6cce49 100644 (file)
@@ -674,7 +674,7 @@ static int __init gicv3_populate_rdist(void)
         } while ( !(typer & GICR_TYPER_LAST) );
     }
 
-    dprintk(XENLOG_ERR, "GICv3: CPU%d: mpidr 0x%x has no re-distributor!\n",
+    dprintk(XENLOG_ERR, "GICv3: CPU%d: mpidr 0x%"PRIregister" has no re-distributor!\n",
             smp_processor_id(), cpu_logical_map(smp_processor_id()));
 
     return -ENODEV;
index c5109bf336bc04c9244bfa58e1b0487c4f125fae..ba834068e307693c14b1665d17bf79e832f4d009 100644 (file)
@@ -40,7 +40,7 @@ cpumask_t cpu_possible_map;
 struct cpuinfo_arm cpu_data[NR_CPUS];
 
 /* CPU logical map: map xen cpuid to an MPIDR */
-u32 __cpu_logical_map[NR_CPUS] = { [0 ... NR_CPUS-1] = MPIDR_INVALID };
+register_t __cpu_logical_map[NR_CPUS] = { [0 ... NR_CPUS-1] = MPIDR_INVALID };
 
 /* Fake one node for now. See also include/asm-arm/numa.h */
 nodemask_t __read_mostly node_online_map = { { [0] = 1UL } };
@@ -100,7 +100,7 @@ static void __init dt_smp_init_cpus(void)
     struct dt_device_node *cpu;
     unsigned int i, j;
     unsigned int cpuidx = 1;
-    static u32 tmp_map[NR_CPUS] __initdata =
+    static register_t tmp_map[NR_CPUS] __initdata =
     {
         [0 ... NR_CPUS - 1] = MPIDR_INVALID
     };
@@ -120,7 +120,8 @@ static void __init dt_smp_init_cpus(void)
     {
         const __be32 *prop;
         u64 addr;
-        u32 reg_len, hwid;
+        u32 reg_len;
+        register_t hwid;
 
         if ( !dt_device_type_is_equal(cpu, "cpu") )
             continue;
@@ -160,7 +161,7 @@ static void __init dt_smp_init_cpus(void)
          */
         if ( hwid & ~MPIDR_HWID_MASK )
         {
-            printk(XENLOG_WARNING "cpu node `%s`: invalid hwid value (0x%x)\n",
+            printk(XENLOG_WARNING "cpu node `%s`: invalid hwid value (0x%"PRIregister")\n",
                    dt_node_full_name(cpu), hwid);
             continue;
         }
@@ -176,7 +177,7 @@ static void __init dt_smp_init_cpus(void)
             if ( tmp_map[j] == hwid )
             {
                 printk(XENLOG_WARNING
-                       "cpu node `%s`: duplicate /cpu reg properties %"PRIx32" in the DT\n",
+                       "cpu node `%s`: duplicate /cpu reg properties %"PRIregister" in the DT\n",
                        dt_node_full_name(cpu), hwid);
                 break;
             }
@@ -211,7 +212,7 @@ static void __init dt_smp_init_cpus(void)
 
         if ( (rc = arch_cpu_init(i, cpu)) < 0 )
         {
-            printk("cpu%d init failed (hwid %x): %d\n", i, hwid, rc);
+            printk("cpu%d init failed (hwid %"PRIregister"): %d\n", i, hwid, rc);
             tmp_map[i] = MPIDR_INVALID;
         }
         else
index 6789cd04851c72775fc3abda5c0eae30af57b41f..7de9c8e7a68f469b3273cafa96698100b06c7f9f 100644 (file)
@@ -348,7 +348,7 @@ extern void identify_cpu(struct cpuinfo_arm *);
 extern struct cpuinfo_arm cpu_data[];
 #define current_cpu_data cpu_data[smp_processor_id()]
 
-extern u32 __cpu_logical_map[];
+extern register_t __cpu_logical_map[];
 #define cpu_logical_map(cpu) __cpu_logical_map[cpu]
 
 /* HSR data abort size definition */