diff options
Diffstat (limited to 'arch/powerpc')
| -rw-r--r-- | arch/powerpc/include/asm/setup.h | 1 | ||||
| -rw-r--r-- | arch/powerpc/kernel/exceptions-64s.S | 4 | ||||
| -rw-r--r-- | arch/powerpc/kernel/tm.S | 20 | ||||
| -rw-r--r-- | arch/powerpc/lib/checksum_64.S | 3 | ||||
| -rw-r--r-- | arch/powerpc/lib/code-patching.c | 6 | ||||
| -rw-r--r-- | arch/powerpc/mm/mem.c | 2 | ||||
| -rw-r--r-- | arch/powerpc/mm/numa.c | 7 | ||||
| -rw-r--r-- | arch/powerpc/mm/pkeys.c | 2 | ||||
| -rw-r--r-- | arch/powerpc/platforms/powernv/pci-ioda-tce.c | 2 |
9 files changed, 38 insertions, 9 deletions
diff --git a/arch/powerpc/include/asm/setup.h b/arch/powerpc/include/asm/setup.h index 1a951b00465d..1fffbba8d6a5 100644 --- a/arch/powerpc/include/asm/setup.h +++ b/arch/powerpc/include/asm/setup.h | |||
| @@ -9,6 +9,7 @@ extern void ppc_printk_progress(char *s, unsigned short hex); | |||
| 9 | 9 | ||
| 10 | extern unsigned int rtas_data; | 10 | extern unsigned int rtas_data; |
| 11 | extern unsigned long long memory_limit; | 11 | extern unsigned long long memory_limit; |
| 12 | extern bool init_mem_is_free; | ||
| 12 | extern unsigned long klimit; | 13 | extern unsigned long klimit; |
| 13 | extern void *zalloc_maybe_bootmem(size_t size, gfp_t mask); | 14 | extern void *zalloc_maybe_bootmem(size_t size, gfp_t mask); |
| 14 | 15 | ||
diff --git a/arch/powerpc/kernel/exceptions-64s.S b/arch/powerpc/kernel/exceptions-64s.S index ea04dfb8c092..2d8fc8c9da7a 100644 --- a/arch/powerpc/kernel/exceptions-64s.S +++ b/arch/powerpc/kernel/exceptions-64s.S | |||
| @@ -1314,9 +1314,7 @@ EXC_REAL_BEGIN(denorm_exception_hv, 0x1500, 0x100) | |||
| 1314 | 1314 | ||
| 1315 | #ifdef CONFIG_PPC_DENORMALISATION | 1315 | #ifdef CONFIG_PPC_DENORMALISATION |
| 1316 | mfspr r10,SPRN_HSRR1 | 1316 | mfspr r10,SPRN_HSRR1 |
| 1317 | mfspr r11,SPRN_HSRR0 /* save HSRR0 */ | ||
| 1318 | andis. r10,r10,(HSRR1_DENORM)@h /* denorm? */ | 1317 | andis. r10,r10,(HSRR1_DENORM)@h /* denorm? */ |
| 1319 | addi r11,r11,-4 /* HSRR0 is next instruction */ | ||
| 1320 | bne+ denorm_assist | 1318 | bne+ denorm_assist |
| 1321 | #endif | 1319 | #endif |
| 1322 | 1320 | ||
| @@ -1382,6 +1380,8 @@ END_FTR_SECTION_IFCLR(CPU_FTR_ARCH_207S) | |||
| 1382 | */ | 1380 | */ |
| 1383 | XVCPSGNDP32(32) | 1381 | XVCPSGNDP32(32) |
| 1384 | denorm_done: | 1382 | denorm_done: |
| 1383 | mfspr r11,SPRN_HSRR0 | ||
| 1384 | subi r11,r11,4 | ||
| 1385 | mtspr SPRN_HSRR0,r11 | 1385 | mtspr SPRN_HSRR0,r11 |
| 1386 | mtcrf 0x80,r9 | 1386 | mtcrf 0x80,r9 |
| 1387 | ld r9,PACA_EXGEN+EX_R9(r13) | 1387 | ld r9,PACA_EXGEN+EX_R9(r13) |
diff --git a/arch/powerpc/kernel/tm.S b/arch/powerpc/kernel/tm.S index 6bffbc5affe7..7716374786bd 100644 --- a/arch/powerpc/kernel/tm.S +++ b/arch/powerpc/kernel/tm.S | |||
| @@ -176,13 +176,27 @@ _GLOBAL(tm_reclaim) | |||
| 176 | std r1, PACATMSCRATCH(r13) | 176 | std r1, PACATMSCRATCH(r13) |
| 177 | ld r1, PACAR1(r13) | 177 | ld r1, PACAR1(r13) |
| 178 | 178 | ||
| 179 | /* Store the PPR in r11 and reset to decent value */ | ||
| 180 | std r11, GPR11(r1) /* Temporary stash */ | 179 | std r11, GPR11(r1) /* Temporary stash */ |
| 181 | 180 | ||
| 181 | /* | ||
| 182 | * Move the saved user r1 to the kernel stack in case PACATMSCRATCH is | ||
| 183 | * clobbered by an exception once we turn on MSR_RI below. | ||
| 184 | */ | ||
| 185 | ld r11, PACATMSCRATCH(r13) | ||
| 186 | std r11, GPR1(r1) | ||
| 187 | |||
| 188 | /* | ||
| 189 | * Store r13 away so we can free up the scratch SPR for the SLB fault | ||
| 190 | * handler (needed once we start accessing the thread_struct). | ||
| 191 | */ | ||
| 192 | GET_SCRATCH0(r11) | ||
| 193 | std r11, GPR13(r1) | ||
| 194 | |||
| 182 | /* Reset MSR RI so we can take SLB faults again */ | 195 | /* Reset MSR RI so we can take SLB faults again */ |
| 183 | li r11, MSR_RI | 196 | li r11, MSR_RI |
| 184 | mtmsrd r11, 1 | 197 | mtmsrd r11, 1 |
| 185 | 198 | ||
| 199 | /* Store the PPR in r11 and reset to decent value */ | ||
| 186 | mfspr r11, SPRN_PPR | 200 | mfspr r11, SPRN_PPR |
| 187 | HMT_MEDIUM | 201 | HMT_MEDIUM |
| 188 | 202 | ||
| @@ -207,11 +221,11 @@ _GLOBAL(tm_reclaim) | |||
| 207 | SAVE_GPR(8, r7) /* user r8 */ | 221 | SAVE_GPR(8, r7) /* user r8 */ |
| 208 | SAVE_GPR(9, r7) /* user r9 */ | 222 | SAVE_GPR(9, r7) /* user r9 */ |
| 209 | SAVE_GPR(10, r7) /* user r10 */ | 223 | SAVE_GPR(10, r7) /* user r10 */ |
| 210 | ld r3, PACATMSCRATCH(r13) /* user r1 */ | 224 | ld r3, GPR1(r1) /* user r1 */ |
| 211 | ld r4, GPR7(r1) /* user r7 */ | 225 | ld r4, GPR7(r1) /* user r7 */ |
| 212 | ld r5, GPR11(r1) /* user r11 */ | 226 | ld r5, GPR11(r1) /* user r11 */ |
| 213 | ld r6, GPR12(r1) /* user r12 */ | 227 | ld r6, GPR12(r1) /* user r12 */ |
| 214 | GET_SCRATCH0(8) /* user r13 */ | 228 | ld r8, GPR13(r1) /* user r13 */ |
| 215 | std r3, GPR1(r7) | 229 | std r3, GPR1(r7) |
| 216 | std r4, GPR7(r7) | 230 | std r4, GPR7(r7) |
| 217 | std r5, GPR11(r7) | 231 | std r5, GPR11(r7) |
diff --git a/arch/powerpc/lib/checksum_64.S b/arch/powerpc/lib/checksum_64.S index 886ed94b9c13..d05c8af4ac51 100644 --- a/arch/powerpc/lib/checksum_64.S +++ b/arch/powerpc/lib/checksum_64.S | |||
| @@ -443,6 +443,9 @@ _GLOBAL(csum_ipv6_magic) | |||
| 443 | addc r0, r8, r9 | 443 | addc r0, r8, r9 |
| 444 | ld r10, 0(r4) | 444 | ld r10, 0(r4) |
| 445 | ld r11, 8(r4) | 445 | ld r11, 8(r4) |
| 446 | #ifdef CONFIG_CPU_LITTLE_ENDIAN | ||
| 447 | rotldi r5, r5, 8 | ||
| 448 | #endif | ||
| 446 | adde r0, r0, r10 | 449 | adde r0, r0, r10 |
| 447 | add r5, r5, r7 | 450 | add r5, r5, r7 |
| 448 | adde r0, r0, r11 | 451 | adde r0, r0, r11 |
diff --git a/arch/powerpc/lib/code-patching.c b/arch/powerpc/lib/code-patching.c index 850f3b8f4da5..6ae2777c220d 100644 --- a/arch/powerpc/lib/code-patching.c +++ b/arch/powerpc/lib/code-patching.c | |||
| @@ -28,6 +28,12 @@ static int __patch_instruction(unsigned int *exec_addr, unsigned int instr, | |||
| 28 | { | 28 | { |
| 29 | int err; | 29 | int err; |
| 30 | 30 | ||
| 31 | /* Make sure we aren't patching a freed init section */ | ||
| 32 | if (init_mem_is_free && init_section_contains(exec_addr, 4)) { | ||
| 33 | pr_debug("Skipping init section patching addr: 0x%px\n", exec_addr); | ||
| 34 | return 0; | ||
| 35 | } | ||
| 36 | |||
| 31 | __put_user_size(instr, patch_addr, 4, err); | 37 | __put_user_size(instr, patch_addr, 4, err); |
| 32 | if (err) | 38 | if (err) |
| 33 | return err; | 39 | return err; |
diff --git a/arch/powerpc/mm/mem.c b/arch/powerpc/mm/mem.c index 5c8530d0c611..04ccb274a620 100644 --- a/arch/powerpc/mm/mem.c +++ b/arch/powerpc/mm/mem.c | |||
| @@ -63,6 +63,7 @@ | |||
| 63 | #endif | 63 | #endif |
| 64 | 64 | ||
| 65 | unsigned long long memory_limit; | 65 | unsigned long long memory_limit; |
| 66 | bool init_mem_is_free; | ||
| 66 | 67 | ||
| 67 | #ifdef CONFIG_HIGHMEM | 68 | #ifdef CONFIG_HIGHMEM |
| 68 | pte_t *kmap_pte; | 69 | pte_t *kmap_pte; |
| @@ -396,6 +397,7 @@ void free_initmem(void) | |||
| 396 | { | 397 | { |
| 397 | ppc_md.progress = ppc_printk_progress; | 398 | ppc_md.progress = ppc_printk_progress; |
| 398 | mark_initmem_nx(); | 399 | mark_initmem_nx(); |
| 400 | init_mem_is_free = true; | ||
| 399 | free_initmem_default(POISON_FREE_INITMEM); | 401 | free_initmem_default(POISON_FREE_INITMEM); |
| 400 | } | 402 | } |
| 401 | 403 | ||
diff --git a/arch/powerpc/mm/numa.c b/arch/powerpc/mm/numa.c index 35ac5422903a..59d07bd5374a 100644 --- a/arch/powerpc/mm/numa.c +++ b/arch/powerpc/mm/numa.c | |||
| @@ -1204,7 +1204,9 @@ int find_and_online_cpu_nid(int cpu) | |||
| 1204 | int new_nid; | 1204 | int new_nid; |
| 1205 | 1205 | ||
| 1206 | /* Use associativity from first thread for all siblings */ | 1206 | /* Use associativity from first thread for all siblings */ |
| 1207 | vphn_get_associativity(cpu, associativity); | 1207 | if (vphn_get_associativity(cpu, associativity)) |
| 1208 | return cpu_to_node(cpu); | ||
| 1209 | |||
| 1208 | new_nid = associativity_to_nid(associativity); | 1210 | new_nid = associativity_to_nid(associativity); |
| 1209 | if (new_nid < 0 || !node_possible(new_nid)) | 1211 | if (new_nid < 0 || !node_possible(new_nid)) |
| 1210 | new_nid = first_online_node; | 1212 | new_nid = first_online_node; |
| @@ -1452,7 +1454,8 @@ static struct timer_list topology_timer; | |||
| 1452 | 1454 | ||
| 1453 | static void reset_topology_timer(void) | 1455 | static void reset_topology_timer(void) |
| 1454 | { | 1456 | { |
| 1455 | mod_timer(&topology_timer, jiffies + topology_timer_secs * HZ); | 1457 | if (vphn_enabled) |
| 1458 | mod_timer(&topology_timer, jiffies + topology_timer_secs * HZ); | ||
| 1456 | } | 1459 | } |
| 1457 | 1460 | ||
| 1458 | #ifdef CONFIG_SMP | 1461 | #ifdef CONFIG_SMP |
diff --git a/arch/powerpc/mm/pkeys.c b/arch/powerpc/mm/pkeys.c index 333b1f80c435..b271b283c785 100644 --- a/arch/powerpc/mm/pkeys.c +++ b/arch/powerpc/mm/pkeys.c | |||
| @@ -45,7 +45,7 @@ static void scan_pkey_feature(void) | |||
| 45 | * Since any pkey can be used for data or execute, we will just treat | 45 | * Since any pkey can be used for data or execute, we will just treat |
| 46 | * all keys as equal and track them as one entity. | 46 | * all keys as equal and track them as one entity. |
| 47 | */ | 47 | */ |
| 48 | pkeys_total = be32_to_cpu(vals[0]); | 48 | pkeys_total = vals[0]; |
| 49 | pkeys_devtree_defined = true; | 49 | pkeys_devtree_defined = true; |
| 50 | } | 50 | } |
| 51 | 51 | ||
diff --git a/arch/powerpc/platforms/powernv/pci-ioda-tce.c b/arch/powerpc/platforms/powernv/pci-ioda-tce.c index 6c5db1acbe8d..fe9691040f54 100644 --- a/arch/powerpc/platforms/powernv/pci-ioda-tce.c +++ b/arch/powerpc/platforms/powernv/pci-ioda-tce.c | |||
| @@ -276,7 +276,7 @@ long pnv_pci_ioda2_table_alloc_pages(int nid, __u64 bus_offset, | |||
| 276 | level_shift = entries_shift + 3; | 276 | level_shift = entries_shift + 3; |
| 277 | level_shift = max_t(unsigned int, level_shift, PAGE_SHIFT); | 277 | level_shift = max_t(unsigned int, level_shift, PAGE_SHIFT); |
| 278 | 278 | ||
| 279 | if ((level_shift - 3) * levels + page_shift >= 60) | 279 | if ((level_shift - 3) * levels + page_shift >= 55) |
| 280 | return -EINVAL; | 280 | return -EINVAL; |
| 281 | 281 | ||
| 282 | /* Allocate TCE table */ | 282 | /* Allocate TCE table */ |
