diff options
Diffstat (limited to 'arch/arm/kernel/smp.c')
-rw-r--r-- | arch/arm/kernel/smp.c | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/arch/arm/kernel/smp.c b/arch/arm/kernel/smp.c index 0978282d5fc2..12a6172263c0 100644 --- a/arch/arm/kernel/smp.c +++ b/arch/arm/kernel/smp.c | |||
@@ -42,6 +42,7 @@ | |||
42 | #include <asm/mmu_context.h> | 42 | #include <asm/mmu_context.h> |
43 | #include <asm/pgtable.h> | 43 | #include <asm/pgtable.h> |
44 | #include <asm/pgalloc.h> | 44 | #include <asm/pgalloc.h> |
45 | #include <asm/procinfo.h> | ||
45 | #include <asm/processor.h> | 46 | #include <asm/processor.h> |
46 | #include <asm/sections.h> | 47 | #include <asm/sections.h> |
47 | #include <asm/tlbflush.h> | 48 | #include <asm/tlbflush.h> |
@@ -102,6 +103,30 @@ static unsigned long get_arch_pgd(pgd_t *pgd) | |||
102 | #endif | 103 | #endif |
103 | } | 104 | } |
104 | 105 | ||
106 | #if defined(CONFIG_BIG_LITTLE) && defined(CONFIG_HARDEN_BRANCH_PREDICTOR) | ||
107 | static int secondary_biglittle_prepare(unsigned int cpu) | ||
108 | { | ||
109 | if (!cpu_vtable[cpu]) | ||
110 | cpu_vtable[cpu] = kzalloc(sizeof(*cpu_vtable[cpu]), GFP_KERNEL); | ||
111 | |||
112 | return cpu_vtable[cpu] ? 0 : -ENOMEM; | ||
113 | } | ||
114 | |||
115 | static void secondary_biglittle_init(void) | ||
116 | { | ||
117 | init_proc_vtable(lookup_processor(read_cpuid_id())->proc); | ||
118 | } | ||
119 | #else | ||
120 | static int secondary_biglittle_prepare(unsigned int cpu) | ||
121 | { | ||
122 | return 0; | ||
123 | } | ||
124 | |||
125 | static void secondary_biglittle_init(void) | ||
126 | { | ||
127 | } | ||
128 | #endif | ||
129 | |||
105 | int __cpu_up(unsigned int cpu, struct task_struct *idle) | 130 | int __cpu_up(unsigned int cpu, struct task_struct *idle) |
106 | { | 131 | { |
107 | int ret; | 132 | int ret; |
@@ -109,6 +134,10 @@ int __cpu_up(unsigned int cpu, struct task_struct *idle) | |||
109 | if (!smp_ops.smp_boot_secondary) | 134 | if (!smp_ops.smp_boot_secondary) |
110 | return -ENOSYS; | 135 | return -ENOSYS; |
111 | 136 | ||
137 | ret = secondary_biglittle_prepare(cpu); | ||
138 | if (ret) | ||
139 | return ret; | ||
140 | |||
112 | /* | 141 | /* |
113 | * We need to tell the secondary core where to find | 142 | * We need to tell the secondary core where to find |
114 | * its stack and the page tables. | 143 | * its stack and the page tables. |
@@ -359,6 +388,8 @@ asmlinkage void secondary_start_kernel(void) | |||
359 | struct mm_struct *mm = &init_mm; | 388 | struct mm_struct *mm = &init_mm; |
360 | unsigned int cpu; | 389 | unsigned int cpu; |
361 | 390 | ||
391 | secondary_biglittle_init(); | ||
392 | |||
362 | /* | 393 | /* |
363 | * The identity mapping is uncached (strongly ordered), so | 394 | * The identity mapping is uncached (strongly ordered), so |
364 | * switch away from it before attempting any exclusive accesses. | 395 | * switch away from it before attempting any exclusive accesses. |