diff options
author | Paul Mackerras <paulus@samba.org> | 2005-11-07 19:14:20 -0500 |
---|---|---|
committer | Paul Mackerras <paulus@samba.org> | 2005-11-07 19:14:20 -0500 |
commit | 24bfb00123e82a2e70bd115277d922438813515b (patch) | |
tree | 27328b8a5718e16d64e2d101f4b7ddcad5930aed /arch/powerpc | |
parent | c6135234550ed89a6fd0e8cb229633967e41d649 (diff) | |
parent | 3f00d3e8fb963968a922d821a9a53b503b687e81 (diff) |
Merge ../linux-2.6
Diffstat (limited to 'arch/powerpc')
-rw-r--r-- | arch/powerpc/Kconfig | 14 | ||||
-rw-r--r-- | arch/powerpc/Kconfig.debug | 10 | ||||
-rw-r--r-- | arch/powerpc/kernel/cputable.c | 10 | ||||
-rw-r--r-- | arch/powerpc/kernel/ptrace.c | 43 | ||||
-rw-r--r-- | arch/powerpc/kernel/time.c | 1 | ||||
-rw-r--r-- | arch/powerpc/mm/hash_utils_64.c | 6 | ||||
-rw-r--r-- | arch/powerpc/mm/hugetlbpage.c | 6 | ||||
-rw-r--r-- | arch/powerpc/mm/ppc_mmu_32.c | 4 | ||||
-rw-r--r-- | arch/powerpc/mm/slb_low.S | 13 | ||||
-rw-r--r-- | arch/powerpc/oprofile/Kconfig | 6 | ||||
-rw-r--r-- | arch/powerpc/platforms/pseries/reconfig.c | 6 |
11 files changed, 50 insertions, 69 deletions
diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig index ca7acb0c79f0..6ffae2d2b3fa 100644 --- a/arch/powerpc/Kconfig +++ b/arch/powerpc/Kconfig | |||
@@ -605,6 +605,7 @@ config NODES_SPAN_OTHER_NODES | |||
605 | 605 | ||
606 | config PPC_64K_PAGES | 606 | config PPC_64K_PAGES |
607 | bool "64k page size" | 607 | bool "64k page size" |
608 | depends on PPC64 | ||
608 | help | 609 | help |
609 | This option changes the kernel logical page size to 64k. On machines | 610 | This option changes the kernel logical page size to 64k. On machines |
610 | without processor support for 64k pages, the kernel will simulate | 611 | without processor support for 64k pages, the kernel will simulate |
@@ -916,8 +917,21 @@ source "arch/powerpc/platforms/iseries/Kconfig" | |||
916 | 917 | ||
917 | source "lib/Kconfig" | 918 | source "lib/Kconfig" |
918 | 919 | ||
920 | menu "Instrumentation Support" | ||
921 | depends on EXPERIMENTAL | ||
922 | |||
919 | source "arch/powerpc/oprofile/Kconfig" | 923 | source "arch/powerpc/oprofile/Kconfig" |
920 | 924 | ||
925 | config KPROBES | ||
926 | bool "Kprobes (EXPERIMENTAL)" | ||
927 | help | ||
928 | Kprobes allows you to trap at almost any kernel address and | ||
929 | execute a callback function. register_kprobe() establishes | ||
930 | a probepoint and specifies the callback. Kprobes is useful | ||
931 | for kernel debugging, non-intrusive instrumentation and testing. | ||
932 | If in doubt, say "N". | ||
933 | endmenu | ||
934 | |||
921 | source "arch/powerpc/Kconfig.debug" | 935 | source "arch/powerpc/Kconfig.debug" |
922 | 936 | ||
923 | source "security/Kconfig" | 937 | source "security/Kconfig" |
diff --git a/arch/powerpc/Kconfig.debug b/arch/powerpc/Kconfig.debug index 0baf64ec80d0..30a30bf559ea 100644 --- a/arch/powerpc/Kconfig.debug +++ b/arch/powerpc/Kconfig.debug | |||
@@ -9,16 +9,6 @@ config DEBUG_STACKOVERFLOW | |||
9 | This option will cause messages to be printed if free stack space | 9 | This option will cause messages to be printed if free stack space |
10 | drops below a certain limit. | 10 | drops below a certain limit. |
11 | 11 | ||
12 | config KPROBES | ||
13 | bool "Kprobes" | ||
14 | depends on DEBUG_KERNEL && PPC64 | ||
15 | help | ||
16 | Kprobes allows you to trap at almost any kernel address and | ||
17 | execute a callback function. register_kprobe() establishes | ||
18 | a probepoint and specifies the callback. Kprobes is useful | ||
19 | for kernel debugging, non-intrusive instrumentation and testing. | ||
20 | If in doubt, say "N". | ||
21 | |||
22 | config DEBUG_STACK_USAGE | 12 | config DEBUG_STACK_USAGE |
23 | bool "Stack utilization instrumentation" | 13 | bool "Stack utilization instrumentation" |
24 | depends on DEBUG_KERNEL && PPC64 | 14 | depends on DEBUG_KERNEL && PPC64 |
diff --git a/arch/powerpc/kernel/cputable.c b/arch/powerpc/kernel/cputable.c index 33c63bcf69f8..cc4e9eb1c13f 100644 --- a/arch/powerpc/kernel/cputable.c +++ b/arch/powerpc/kernel/cputable.c | |||
@@ -929,6 +929,16 @@ struct cpu_spec cpu_specs[] = { | |||
929 | .icache_bsize = 32, | 929 | .icache_bsize = 32, |
930 | .dcache_bsize = 32, | 930 | .dcache_bsize = 32, |
931 | }, | 931 | }, |
932 | { /* 440SPe Rev. A */ | ||
933 | .pvr_mask = 0xff000fff, | ||
934 | .pvr_value = 0x53000890, | ||
935 | .cpu_name = "440SPe Rev. A", | ||
936 | .cpu_features = CPU_FTR_SPLIT_ID_CACHE | | ||
937 | CPU_FTR_USE_TB, | ||
938 | .cpu_user_features = PPC_FEATURE_32 | PPC_FEATURE_HAS_MMU, | ||
939 | .icache_bsize = 32, | ||
940 | .dcache_bsize = 32, | ||
941 | }, | ||
932 | #endif /* CONFIG_44x */ | 942 | #endif /* CONFIG_44x */ |
933 | #ifdef CONFIG_FSL_BOOKE | 943 | #ifdef CONFIG_FSL_BOOKE |
934 | { /* e200z5 */ | 944 | { /* e200z5 */ |
diff --git a/arch/powerpc/kernel/ptrace.c b/arch/powerpc/kernel/ptrace.c index 568ea335d616..3d2abd95c7ae 100644 --- a/arch/powerpc/kernel/ptrace.c +++ b/arch/powerpc/kernel/ptrace.c | |||
@@ -248,46 +248,10 @@ void ptrace_disable(struct task_struct *child) | |||
248 | clear_single_step(child); | 248 | clear_single_step(child); |
249 | } | 249 | } |
250 | 250 | ||
251 | long sys_ptrace(long request, long pid, long addr, long data) | 251 | long arch_ptrace(struct task_struct *child, long request, long addr, long data) |
252 | { | 252 | { |
253 | struct task_struct *child; | ||
254 | int ret = -EPERM; | 253 | int ret = -EPERM; |
255 | 254 | ||
256 | lock_kernel(); | ||
257 | if (request == PTRACE_TRACEME) { | ||
258 | /* are we already being traced? */ | ||
259 | if (current->ptrace & PT_PTRACED) | ||
260 | goto out; | ||
261 | ret = security_ptrace(current->parent, current); | ||
262 | if (ret) | ||
263 | goto out; | ||
264 | /* set the ptrace bit in the process flags. */ | ||
265 | current->ptrace |= PT_PTRACED; | ||
266 | ret = 0; | ||
267 | goto out; | ||
268 | } | ||
269 | ret = -ESRCH; | ||
270 | read_lock(&tasklist_lock); | ||
271 | child = find_task_by_pid(pid); | ||
272 | if (child) | ||
273 | get_task_struct(child); | ||
274 | read_unlock(&tasklist_lock); | ||
275 | if (!child) | ||
276 | goto out; | ||
277 | |||
278 | ret = -EPERM; | ||
279 | if (pid == 1) /* you may not mess with init */ | ||
280 | goto out_tsk; | ||
281 | |||
282 | if (request == PTRACE_ATTACH) { | ||
283 | ret = ptrace_attach(child); | ||
284 | goto out_tsk; | ||
285 | } | ||
286 | |||
287 | ret = ptrace_check_attach(child, request == PTRACE_KILL); | ||
288 | if (ret < 0) | ||
289 | goto out_tsk; | ||
290 | |||
291 | switch (request) { | 255 | switch (request) { |
292 | /* when I and D space are separate, these will need to be fixed. */ | 256 | /* when I and D space are separate, these will need to be fixed. */ |
293 | case PTRACE_PEEKTEXT: /* read word at location addr. */ | 257 | case PTRACE_PEEKTEXT: /* read word at location addr. */ |
@@ -540,10 +504,7 @@ long sys_ptrace(long request, long pid, long addr, long data) | |||
540 | ret = ptrace_request(child, request, addr, data); | 504 | ret = ptrace_request(child, request, addr, data); |
541 | break; | 505 | break; |
542 | } | 506 | } |
543 | out_tsk: | 507 | |
544 | put_task_struct(child); | ||
545 | out: | ||
546 | unlock_kernel(); | ||
547 | return ret; | 508 | return ret; |
548 | } | 509 | } |
549 | 510 | ||
diff --git a/arch/powerpc/kernel/time.c b/arch/powerpc/kernel/time.c index 1c7ea5e06311..a6282b625b44 100644 --- a/arch/powerpc/kernel/time.c +++ b/arch/powerpc/kernel/time.c | |||
@@ -70,6 +70,7 @@ | |||
70 | #include <asm/iseries/it_lp_queue.h> | 70 | #include <asm/iseries/it_lp_queue.h> |
71 | #include <asm/iseries/hv_call_xm.h> | 71 | #include <asm/iseries/hv_call_xm.h> |
72 | #endif | 72 | #endif |
73 | #include <asm/smp.h> | ||
73 | 74 | ||
74 | /* keep track of when we need to update the rtc */ | 75 | /* keep track of when we need to update the rtc */ |
75 | time_t last_rtc_update; | 76 | time_t last_rtc_update; |
diff --git a/arch/powerpc/mm/hash_utils_64.c b/arch/powerpc/mm/hash_utils_64.c index 37273f518a35..3d83c3b84f0e 100644 --- a/arch/powerpc/mm/hash_utils_64.c +++ b/arch/powerpc/mm/hash_utils_64.c | |||
@@ -328,12 +328,14 @@ static void __init htab_init_page_sizes(void) | |||
328 | */ | 328 | */ |
329 | if (mmu_psize_defs[MMU_PAGE_16M].shift) | 329 | if (mmu_psize_defs[MMU_PAGE_16M].shift) |
330 | mmu_huge_psize = MMU_PAGE_16M; | 330 | mmu_huge_psize = MMU_PAGE_16M; |
331 | /* With 4k/4level pagetables, we can't (for now) cope with a | ||
332 | * huge page size < PMD_SIZE */ | ||
331 | else if (mmu_psize_defs[MMU_PAGE_1M].shift) | 333 | else if (mmu_psize_defs[MMU_PAGE_1M].shift) |
332 | mmu_huge_psize = MMU_PAGE_1M; | 334 | mmu_huge_psize = MMU_PAGE_1M; |
333 | 335 | ||
334 | /* Calculate HPAGE_SHIFT and sanity check it */ | 336 | /* Calculate HPAGE_SHIFT and sanity check it */ |
335 | if (mmu_psize_defs[mmu_huge_psize].shift > 16 && | 337 | if (mmu_psize_defs[mmu_huge_psize].shift > MIN_HUGEPTE_SHIFT && |
336 | mmu_psize_defs[mmu_huge_psize].shift < 28) | 338 | mmu_psize_defs[mmu_huge_psize].shift < SID_SHIFT) |
337 | HPAGE_SHIFT = mmu_psize_defs[mmu_huge_psize].shift; | 339 | HPAGE_SHIFT = mmu_psize_defs[mmu_huge_psize].shift; |
338 | else | 340 | else |
339 | HPAGE_SHIFT = 0; /* No huge pages dude ! */ | 341 | HPAGE_SHIFT = 0; /* No huge pages dude ! */ |
diff --git a/arch/powerpc/mm/hugetlbpage.c b/arch/powerpc/mm/hugetlbpage.c index 0073a04047e4..426c269e552e 100644 --- a/arch/powerpc/mm/hugetlbpage.c +++ b/arch/powerpc/mm/hugetlbpage.c | |||
@@ -212,6 +212,12 @@ static int prepare_high_area_for_htlb(struct mm_struct *mm, unsigned long area) | |||
212 | 212 | ||
213 | BUG_ON(area >= NUM_HIGH_AREAS); | 213 | BUG_ON(area >= NUM_HIGH_AREAS); |
214 | 214 | ||
215 | /* Hack, so that each addresses is controlled by exactly one | ||
216 | * of the high or low area bitmaps, the first high area starts | ||
217 | * at 4GB, not 0 */ | ||
218 | if (start == 0) | ||
219 | start = 0x100000000UL; | ||
220 | |||
215 | /* Check no VMAs are in the region */ | 221 | /* Check no VMAs are in the region */ |
216 | vma = find_vma(mm, start); | 222 | vma = find_vma(mm, start); |
217 | if (vma && (vma->vm_start < end)) | 223 | if (vma && (vma->vm_start < end)) |
diff --git a/arch/powerpc/mm/ppc_mmu_32.c b/arch/powerpc/mm/ppc_mmu_32.c index d137abd241ff..ed7fcfe5fd37 100644 --- a/arch/powerpc/mm/ppc_mmu_32.c +++ b/arch/powerpc/mm/ppc_mmu_32.c | |||
@@ -188,9 +188,9 @@ void hash_preload(struct mm_struct *mm, unsigned long ea, | |||
188 | 188 | ||
189 | if (Hash == 0) | 189 | if (Hash == 0) |
190 | return; | 190 | return; |
191 | pmd = pmd_offset(pgd_offset(vma->vm_mm, address), address); | 191 | pmd = pmd_offset(pgd_offset(mm, ea), ea); |
192 | if (!pmd_none(*pmd)) | 192 | if (!pmd_none(*pmd)) |
193 | add_hash_page(vma->vm_mm->context, address, pmd_val(*pmd)); | 193 | add_hash_page(mm->context, ea, pmd_val(*pmd)); |
194 | } | 194 | } |
195 | 195 | ||
196 | /* | 196 | /* |
diff --git a/arch/powerpc/mm/slb_low.S b/arch/powerpc/mm/slb_low.S index 3e18241b6f35..950ffc5848c7 100644 --- a/arch/powerpc/mm/slb_low.S +++ b/arch/powerpc/mm/slb_low.S | |||
@@ -80,12 +80,17 @@ _GLOBAL(slb_miss_kernel_load_virtual) | |||
80 | BEGIN_FTR_SECTION | 80 | BEGIN_FTR_SECTION |
81 | b 1f | 81 | b 1f |
82 | END_FTR_SECTION_IFCLR(CPU_FTR_16M_PAGE) | 82 | END_FTR_SECTION_IFCLR(CPU_FTR_16M_PAGE) |
83 | cmpldi r10,16 | ||
84 | |||
85 | lhz r9,PACALOWHTLBAREAS(r13) | ||
86 | mr r11,r10 | ||
87 | blt 5f | ||
88 | |||
83 | lhz r9,PACAHIGHHTLBAREAS(r13) | 89 | lhz r9,PACAHIGHHTLBAREAS(r13) |
84 | srdi r11,r10,(HTLB_AREA_SHIFT-SID_SHIFT) | 90 | srdi r11,r10,(HTLB_AREA_SHIFT-SID_SHIFT) |
85 | srd r9,r9,r11 | 91 | |
86 | lhz r11,PACALOWHTLBAREAS(r13) | 92 | 5: srd r9,r9,r11 |
87 | srd r11,r11,r10 | 93 | andi. r9,r9,1 |
88 | or. r9,r9,r11 | ||
89 | beq 1f | 94 | beq 1f |
90 | _GLOBAL(slb_miss_user_load_huge) | 95 | _GLOBAL(slb_miss_user_load_huge) |
91 | li r11,0 | 96 | li r11,0 |
diff --git a/arch/powerpc/oprofile/Kconfig b/arch/powerpc/oprofile/Kconfig index 19d37730b664..eb2dece76a54 100644 --- a/arch/powerpc/oprofile/Kconfig +++ b/arch/powerpc/oprofile/Kconfig | |||
@@ -1,7 +1,3 @@ | |||
1 | |||
2 | menu "Profiling support" | ||
3 | depends on EXPERIMENTAL | ||
4 | |||
5 | config PROFILING | 1 | config PROFILING |
6 | bool "Profiling support (EXPERIMENTAL)" | 2 | bool "Profiling support (EXPERIMENTAL)" |
7 | help | 3 | help |
@@ -19,5 +15,3 @@ config OPROFILE | |||
19 | 15 | ||
20 | If unsure, say N. | 16 | If unsure, say N. |
21 | 17 | ||
22 | endmenu | ||
23 | |||
diff --git a/arch/powerpc/platforms/pseries/reconfig.c b/arch/powerpc/platforms/pseries/reconfig.c index 58c61219d08e..d7d400339458 100644 --- a/arch/powerpc/platforms/pseries/reconfig.c +++ b/arch/powerpc/platforms/pseries/reconfig.c | |||
@@ -286,10 +286,8 @@ static struct property *new_property(const char *name, const int length, | |||
286 | return new; | 286 | return new; |
287 | 287 | ||
288 | cleanup: | 288 | cleanup: |
289 | if (new->name) | 289 | kfree(new->name); |
290 | kfree(new->name); | 290 | kfree(new->value); |
291 | if (new->value) | ||
292 | kfree(new->value); | ||
293 | kfree(new); | 291 | kfree(new); |
294 | return NULL; | 292 | return NULL; |
295 | } | 293 | } |