diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2008-03-24 16:08:01 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2008-03-24 16:08:01 -0400 |
| commit | 6f58d79598c184dc4f18ceddfaa5fa7483bce0a5 (patch) | |
| tree | 2dfb9a7c1e947086c20960d4fa20458266473f0a | |
| parent | ca1a6ba57c5fca755b4ac7a13395bca2e2e371b1 (diff) | |
| parent | 6d008153234c4cccae7bb0170defeea18258db4a (diff) | |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc-2.6:
[SPARC64]: exec PT_DTRACE
[SPARC64]: Use shorter list_splice_init() for brevity.
[SPARC64]: Remove most limitations to kernel image size.
| -rw-r--r-- | arch/sparc64/kernel/ds.c | 3 | ||||
| -rw-r--r-- | arch/sparc64/kernel/head.S | 8 | ||||
| -rw-r--r-- | arch/sparc64/kernel/process.c | 3 | ||||
| -rw-r--r-- | arch/sparc64/kernel/smp.c | 17 | ||||
| -rw-r--r-- | arch/sparc64/kernel/sys_sparc32.c | 3 | ||||
| -rw-r--r-- | arch/sparc64/kernel/trampoline.S | 188 | ||||
| -rw-r--r-- | arch/sparc64/mm/init.c | 38 | ||||
| -rw-r--r-- | include/asm-sparc64/hvtramp.h | 2 | ||||
| -rw-r--r-- | include/asm-sparc64/spitfire.h | 2 |
9 files changed, 97 insertions, 167 deletions
diff --git a/arch/sparc64/kernel/ds.c b/arch/sparc64/kernel/ds.c index bd76482077be..edb74f5a1186 100644 --- a/arch/sparc64/kernel/ds.c +++ b/arch/sparc64/kernel/ds.c | |||
| @@ -972,8 +972,7 @@ static void process_ds_work(void) | |||
| 972 | LIST_HEAD(todo); | 972 | LIST_HEAD(todo); |
| 973 | 973 | ||
| 974 | spin_lock_irqsave(&ds_lock, flags); | 974 | spin_lock_irqsave(&ds_lock, flags); |
| 975 | list_splice(&ds_work_list, &todo); | 975 | list_splice_init(&ds_work_list, &todo); |
| 976 | INIT_LIST_HEAD(&ds_work_list); | ||
| 977 | spin_unlock_irqrestore(&ds_lock, flags); | 976 | spin_unlock_irqrestore(&ds_lock, flags); |
| 978 | 977 | ||
| 979 | list_for_each_entry_safe(qp, tmp, &todo, list) { | 978 | list_for_each_entry_safe(qp, tmp, &todo, list) { |
diff --git a/arch/sparc64/kernel/head.S b/arch/sparc64/kernel/head.S index 44b105c04dd3..34f8ff57c56b 100644 --- a/arch/sparc64/kernel/head.S +++ b/arch/sparc64/kernel/head.S | |||
| @@ -288,8 +288,12 @@ sun4v_chip_type: | |||
| 288 | /* Leave arg2 as-is, prom_mmu_ihandle_cache */ | 288 | /* Leave arg2 as-is, prom_mmu_ihandle_cache */ |
| 289 | mov -1, %l3 | 289 | mov -1, %l3 |
| 290 | stx %l3, [%sp + 2047 + 128 + 0x28] ! arg3: mode (-1 default) | 290 | stx %l3, [%sp + 2047 + 128 + 0x28] ! arg3: mode (-1 default) |
| 291 | sethi %hi(8 * 1024 * 1024), %l3 | 291 | /* 4MB align the kernel image size. */ |
| 292 | stx %l3, [%sp + 2047 + 128 + 0x30] ! arg4: size (8MB) | 292 | set (_end - KERNBASE), %l3 |
| 293 | set ((4 * 1024 * 1024) - 1), %l4 | ||
| 294 | add %l3, %l4, %l3 | ||
| 295 | andn %l3, %l4, %l3 | ||
| 296 | stx %l3, [%sp + 2047 + 128 + 0x30] ! arg4: roundup(ksize, 4MB) | ||
| 293 | sethi %hi(KERNBASE), %l3 | 297 | sethi %hi(KERNBASE), %l3 |
| 294 | stx %l3, [%sp + 2047 + 128 + 0x38] ! arg5: vaddr (KERNBASE) | 298 | stx %l3, [%sp + 2047 + 128 + 0x38] ! arg5: vaddr (KERNBASE) |
| 295 | stx %g0, [%sp + 2047 + 128 + 0x40] ! arg6: empty | 299 | stx %g0, [%sp + 2047 + 128 + 0x40] ! arg6: empty |
diff --git a/arch/sparc64/kernel/process.c b/arch/sparc64/kernel/process.c index e116e38b160e..acf8c5250aa9 100644 --- a/arch/sparc64/kernel/process.c +++ b/arch/sparc64/kernel/process.c | |||
| @@ -731,9 +731,6 @@ asmlinkage int sparc_execve(struct pt_regs *regs) | |||
| 731 | current_thread_info()->xfsr[0] = 0; | 731 | current_thread_info()->xfsr[0] = 0; |
| 732 | current_thread_info()->fpsaved[0] = 0; | 732 | current_thread_info()->fpsaved[0] = 0; |
| 733 | regs->tstate &= ~TSTATE_PEF; | 733 | regs->tstate &= ~TSTATE_PEF; |
| 734 | task_lock(current); | ||
| 735 | current->ptrace &= ~PT_DTRACE; | ||
| 736 | task_unlock(current); | ||
| 737 | } | 734 | } |
| 738 | out: | 735 | out: |
| 739 | return error; | 736 | return error; |
diff --git a/arch/sparc64/kernel/smp.c b/arch/sparc64/kernel/smp.c index cc454731d879..5a1126b363a4 100644 --- a/arch/sparc64/kernel/smp.c +++ b/arch/sparc64/kernel/smp.c | |||
| @@ -284,14 +284,17 @@ static void ldom_startcpu_cpuid(unsigned int cpu, unsigned long thread_reg) | |||
| 284 | { | 284 | { |
| 285 | extern unsigned long sparc64_ttable_tl0; | 285 | extern unsigned long sparc64_ttable_tl0; |
| 286 | extern unsigned long kern_locked_tte_data; | 286 | extern unsigned long kern_locked_tte_data; |
| 287 | extern int bigkernel; | ||
| 288 | struct hvtramp_descr *hdesc; | 287 | struct hvtramp_descr *hdesc; |
| 289 | unsigned long trampoline_ra; | 288 | unsigned long trampoline_ra; |
| 290 | struct trap_per_cpu *tb; | 289 | struct trap_per_cpu *tb; |
| 291 | u64 tte_vaddr, tte_data; | 290 | u64 tte_vaddr, tte_data; |
| 292 | unsigned long hv_err; | 291 | unsigned long hv_err; |
| 292 | int i; | ||
| 293 | 293 | ||
| 294 | hdesc = kzalloc(sizeof(*hdesc), GFP_KERNEL); | 294 | hdesc = kzalloc(sizeof(*hdesc) + |
| 295 | (sizeof(struct hvtramp_mapping) * | ||
| 296 | num_kernel_image_mappings - 1), | ||
| 297 | GFP_KERNEL); | ||
| 295 | if (!hdesc) { | 298 | if (!hdesc) { |
| 296 | printk(KERN_ERR "ldom_startcpu_cpuid: Cannot allocate " | 299 | printk(KERN_ERR "ldom_startcpu_cpuid: Cannot allocate " |
| 297 | "hvtramp_descr.\n"); | 300 | "hvtramp_descr.\n"); |
| @@ -299,7 +302,7 @@ static void ldom_startcpu_cpuid(unsigned int cpu, unsigned long thread_reg) | |||
| 299 | } | 302 | } |
| 300 | 303 | ||
| 301 | hdesc->cpu = cpu; | 304 | hdesc->cpu = cpu; |
| 302 | hdesc->num_mappings = (bigkernel ? 2 : 1); | 305 | hdesc->num_mappings = num_kernel_image_mappings; |
| 303 | 306 | ||
| 304 | tb = &trap_block[cpu]; | 307 | tb = &trap_block[cpu]; |
| 305 | tb->hdesc = hdesc; | 308 | tb->hdesc = hdesc; |
| @@ -312,13 +315,11 @@ static void ldom_startcpu_cpuid(unsigned int cpu, unsigned long thread_reg) | |||
| 312 | tte_vaddr = (unsigned long) KERNBASE; | 315 | tte_vaddr = (unsigned long) KERNBASE; |
| 313 | tte_data = kern_locked_tte_data; | 316 | tte_data = kern_locked_tte_data; |
| 314 | 317 | ||
| 315 | hdesc->maps[0].vaddr = tte_vaddr; | 318 | for (i = 0; i < hdesc->num_mappings; i++) { |
| 316 | hdesc->maps[0].tte = tte_data; | 319 | hdesc->maps[i].vaddr = tte_vaddr; |
| 317 | if (bigkernel) { | 320 | hdesc->maps[i].tte = tte_data; |
| 318 | tte_vaddr += 0x400000; | 321 | tte_vaddr += 0x400000; |
| 319 | tte_data += 0x400000; | 322 | tte_data += 0x400000; |
| 320 | hdesc->maps[1].vaddr = tte_vaddr; | ||
| 321 | hdesc->maps[1].tte = tte_data; | ||
| 322 | } | 323 | } |
| 323 | 324 | ||
| 324 | trampoline_ra = kimage_addr_to_ra(hv_cpu_startup); | 325 | trampoline_ra = kimage_addr_to_ra(hv_cpu_startup); |
diff --git a/arch/sparc64/kernel/sys_sparc32.c b/arch/sparc64/kernel/sys_sparc32.c index deaba2bd0535..2455fa498876 100644 --- a/arch/sparc64/kernel/sys_sparc32.c +++ b/arch/sparc64/kernel/sys_sparc32.c | |||
| @@ -678,9 +678,6 @@ asmlinkage long sparc32_execve(struct pt_regs *regs) | |||
| 678 | current_thread_info()->xfsr[0] = 0; | 678 | current_thread_info()->xfsr[0] = 0; |
| 679 | current_thread_info()->fpsaved[0] = 0; | 679 | current_thread_info()->fpsaved[0] = 0; |
| 680 | regs->tstate &= ~TSTATE_PEF; | 680 | regs->tstate &= ~TSTATE_PEF; |
| 681 | task_lock(current); | ||
| 682 | current->ptrace &= ~PT_DTRACE; | ||
| 683 | task_unlock(current); | ||
| 684 | } | 681 | } |
| 685 | out: | 682 | out: |
| 686 | return error; | 683 | return error; |
diff --git a/arch/sparc64/kernel/trampoline.S b/arch/sparc64/kernel/trampoline.S index 4ae2e525d68b..56ff55211341 100644 --- a/arch/sparc64/kernel/trampoline.S +++ b/arch/sparc64/kernel/trampoline.S | |||
| @@ -105,7 +105,7 @@ startup_continue: | |||
| 105 | wr %g2, 0, %tick_cmpr | 105 | wr %g2, 0, %tick_cmpr |
| 106 | 106 | ||
| 107 | /* Call OBP by hand to lock KERNBASE into i/d tlbs. | 107 | /* Call OBP by hand to lock KERNBASE into i/d tlbs. |
| 108 | * We lock 2 consequetive entries if we are 'bigkernel'. | 108 | * We lock 'num_kernel_image_mappings' consequetive entries. |
| 109 | */ | 109 | */ |
| 110 | sethi %hi(prom_entry_lock), %g2 | 110 | sethi %hi(prom_entry_lock), %g2 |
| 111 | 1: ldstub [%g2 + %lo(prom_entry_lock)], %g1 | 111 | 1: ldstub [%g2 + %lo(prom_entry_lock)], %g1 |
| @@ -119,6 +119,29 @@ startup_continue: | |||
| 119 | add %l2, -(192 + 128), %sp | 119 | add %l2, -(192 + 128), %sp |
| 120 | flushw | 120 | flushw |
| 121 | 121 | ||
| 122 | /* Setup the loop variables: | ||
| 123 | * %l3: VADDR base | ||
| 124 | * %l4: TTE base | ||
| 125 | * %l5: Loop iterator, iterates from 0 to 'num_kernel_image_mappings' | ||
| 126 | * %l6: Number of TTE entries to map | ||
| 127 | * %l7: Highest TTE entry number, we count down | ||
| 128 | */ | ||
| 129 | sethi %hi(KERNBASE), %l3 | ||
| 130 | sethi %hi(kern_locked_tte_data), %l4 | ||
| 131 | ldx [%l4 + %lo(kern_locked_tte_data)], %l4 | ||
| 132 | clr %l5 | ||
| 133 | sethi %hi(num_kernel_image_mappings), %l6 | ||
| 134 | lduw [%l6 + %lo(num_kernel_image_mappings)], %l6 | ||
| 135 | add %l6, 1, %l6 | ||
| 136 | |||
| 137 | mov 15, %l7 | ||
| 138 | BRANCH_IF_ANY_CHEETAH(g1,g5,2f) | ||
| 139 | |||
| 140 | mov 63, %l7 | ||
| 141 | 2: | ||
| 142 | |||
| 143 | 3: | ||
| 144 | /* Lock into I-MMU */ | ||
| 122 | sethi %hi(call_method), %g2 | 145 | sethi %hi(call_method), %g2 |
| 123 | or %g2, %lo(call_method), %g2 | 146 | or %g2, %lo(call_method), %g2 |
| 124 | stx %g2, [%sp + 2047 + 128 + 0x00] | 147 | stx %g2, [%sp + 2047 + 128 + 0x00] |
| @@ -132,63 +155,26 @@ startup_continue: | |||
| 132 | sethi %hi(prom_mmu_ihandle_cache), %g2 | 155 | sethi %hi(prom_mmu_ihandle_cache), %g2 |
| 133 | lduw [%g2 + %lo(prom_mmu_ihandle_cache)], %g2 | 156 | lduw [%g2 + %lo(prom_mmu_ihandle_cache)], %g2 |
| 134 | stx %g2, [%sp + 2047 + 128 + 0x20] | 157 | stx %g2, [%sp + 2047 + 128 + 0x20] |
| 135 | sethi %hi(KERNBASE), %g2 | ||
| 136 | stx %g2, [%sp + 2047 + 128 + 0x28] | ||
