diff options
author | Paul Mackerras <paulus@samba.org> | 2008-05-16 09:13:42 -0400 |
---|---|---|
committer | Paul Mackerras <paulus@samba.org> | 2008-05-16 09:13:42 -0400 |
commit | fcff474ea5cb17ff015aa40e92ed86fede41f1e2 (patch) | |
tree | a99c0e14daaf31cb078812fb2fbc6abadfcd738f /arch | |
parent | 541b2755c2ef7dd2242ac606c115daa11e43ef69 (diff) | |
parent | f26a3988917913b3d11b2bd741601a2c64ab9204 (diff) |
Merge branch 'linux-2.6' into powerpc-next
Diffstat (limited to 'arch')
109 files changed, 834 insertions, 622 deletions
diff --git a/arch/arm/mach-at91/at91sam9261_devices.c b/arch/arm/mach-at91/at91sam9261_devices.c index 728bb8f39441..0babb645b83c 100644 --- a/arch/arm/mach-at91/at91sam9261_devices.c +++ b/arch/arm/mach-at91/at91sam9261_devices.c | |||
@@ -544,10 +544,10 @@ void __init at91_add_device_lcdc(struct atmel_lcdfb_info *data) | |||
544 | struct resource *fb_res = &lcdc_resources[2]; | 544 | struct resource *fb_res = &lcdc_resources[2]; |
545 | size_t fb_len = fb_res->end - fb_res->start + 1; | 545 | size_t fb_len = fb_res->end - fb_res->start + 1; |
546 | 546 | ||
547 | fb = ioremap_writecombine(fb_res->start, fb_len); | 547 | fb = ioremap(fb_res->start, fb_len); |
548 | if (fb) { | 548 | if (fb) { |
549 | memset(fb, 0, fb_len); | 549 | memset(fb, 0, fb_len); |
550 | iounmap(fb, fb_len); | 550 | iounmap(fb); |
551 | } | 551 | } |
552 | } | 552 | } |
553 | lcdc_data = *data; | 553 | lcdc_data = *data; |
diff --git a/arch/arm/mach-at91/at91sam9rl_devices.c b/arch/arm/mach-at91/at91sam9rl_devices.c index 054689804e77..450db304936f 100644 --- a/arch/arm/mach-at91/at91sam9rl_devices.c +++ b/arch/arm/mach-at91/at91sam9rl_devices.c | |||
@@ -332,13 +332,6 @@ static struct resource lcdc_resources[] = { | |||
332 | .end = AT91SAM9RL_ID_LCDC, | 332 | .end = AT91SAM9RL_ID_LCDC, |
333 | .flags = IORESOURCE_IRQ, | 333 | .flags = IORESOURCE_IRQ, |
334 | }, | 334 | }, |
335 | #if defined(CONFIG_FB_INTSRAM) | ||
336 | [2] = { | ||
337 | .start = AT91SAM9RL_SRAM_BASE, | ||
338 | .end = AT91SAM9RL_SRAM_BASE + AT91SAM9RL_SRAM_SIZE - 1, | ||
339 | .flags = IORESOURCE_MEM, | ||
340 | }, | ||
341 | #endif | ||
342 | }; | 335 | }; |
343 | 336 | ||
344 | static struct platform_device at91_lcdc_device = { | 337 | static struct platform_device at91_lcdc_device = { |
@@ -381,20 +374,6 @@ void __init at91_add_device_lcdc(struct atmel_lcdfb_info *data) | |||
381 | at91_set_B_periph(AT91_PIN_PC24, 0); /* LCDD22 */ | 374 | at91_set_B_periph(AT91_PIN_PC24, 0); /* LCDD22 */ |
382 | at91_set_B_periph(AT91_PIN_PC25, 0); /* LCDD23 */ | 375 | at91_set_B_periph(AT91_PIN_PC25, 0); /* LCDD23 */ |
383 | 376 | ||
384 | #ifdef CONFIG_FB_INTSRAM | ||
385 | { | ||
386 | void __iomem *fb; | ||
387 | struct resource *fb_res = &lcdc_resources[2]; | ||
388 | size_t fb_len = fb_res->end - fb_res->start + 1; | ||
389 | |||
390 | fb = ioremap_writecombine(fb_res->start, fb_len); | ||
391 | if (fb) { | ||
392 | memset(fb, 0, fb_len); | ||
393 | iounmap(fb, fb_len); | ||
394 | } | ||
395 | } | ||
396 | #endif | ||
397 | |||
398 | lcdc_data = *data; | 377 | lcdc_data = *data; |
399 | platform_device_register(&at91_lcdc_device); | 378 | platform_device_register(&at91_lcdc_device); |
400 | } | 379 | } |
diff --git a/arch/ia64/Kconfig b/arch/ia64/Kconfig index 0df5f6f75edf..16be41446b5b 100644 --- a/arch/ia64/Kconfig +++ b/arch/ia64/Kconfig | |||
@@ -135,6 +135,7 @@ config IA64_GENERIC | |||
135 | HP-zx1/sx1000 For HP systems | 135 | HP-zx1/sx1000 For HP systems |
136 | HP-zx1/sx1000+swiotlb For HP systems with (broken) DMA-constrained devices. | 136 | HP-zx1/sx1000+swiotlb For HP systems with (broken) DMA-constrained devices. |
137 | SGI-SN2 For SGI Altix systems | 137 | SGI-SN2 For SGI Altix systems |
138 | SGI-UV For SGI UV systems | ||
138 | Ski-simulator For the HP simulator <http://www.hpl.hp.com/research/linux/ski/> | 139 | Ski-simulator For the HP simulator <http://www.hpl.hp.com/research/linux/ski/> |
139 | 140 | ||
140 | If you don't know what to do, choose "generic". | 141 | If you don't know what to do, choose "generic". |
@@ -170,6 +171,18 @@ config IA64_SGI_SN2 | |||
170 | to select this option. If in doubt, select ia64 generic support | 171 | to select this option. If in doubt, select ia64 generic support |
171 | instead. | 172 | instead. |
172 | 173 | ||
174 | config IA64_SGI_UV` | ||
175 | bool "SGI-UV`" | ||
176 | select NUMA | ||
177 | select ACPI_NUMA | ||
178 | select SWIOTLB | ||
179 | help | ||
180 | Selecting this option will optimize the kernel for use on UV based | ||
181 | systems, but the resulting kernel binary will not run on other | ||
182 | types of ia64 systems. If you have an SGI UV system, it's safe | ||
183 | to select this option. If in doubt, select ia64 generic support | ||
184 | instead. | ||
185 | |||
173 | config IA64_HP_SIM | 186 | config IA64_HP_SIM |
174 | bool "Ski-simulator" | 187 | bool "Ski-simulator" |
175 | select SWIOTLB | 188 | select SWIOTLB |
diff --git a/arch/ia64/Makefile b/arch/ia64/Makefile index ec4cca477f49..88f1a55c6c94 100644 --- a/arch/ia64/Makefile +++ b/arch/ia64/Makefile | |||
@@ -63,7 +63,7 @@ drivers-$(CONFIG_PCI) += arch/ia64/pci/ | |||
63 | drivers-$(CONFIG_IA64_HP_SIM) += arch/ia64/hp/sim/ | 63 | drivers-$(CONFIG_IA64_HP_SIM) += arch/ia64/hp/sim/ |
64 | drivers-$(CONFIG_IA64_HP_ZX1) += arch/ia64/hp/common/ arch/ia64/hp/zx1/ | 64 | drivers-$(CONFIG_IA64_HP_ZX1) += arch/ia64/hp/common/ arch/ia64/hp/zx1/ |
65 | drivers-$(CONFIG_IA64_HP_ZX1_SWIOTLB) += arch/ia64/hp/common/ arch/ia64/hp/zx1/ | 65 | drivers-$(CONFIG_IA64_HP_ZX1_SWIOTLB) += arch/ia64/hp/common/ arch/ia64/hp/zx1/ |
66 | drivers-$(CONFIG_IA64_GENERIC) += arch/ia64/hp/common/ arch/ia64/hp/zx1/ arch/ia64/hp/sim/ arch/ia64/sn/ | 66 | drivers-$(CONFIG_IA64_GENERIC) += arch/ia64/hp/common/ arch/ia64/hp/zx1/ arch/ia64/hp/sim/ arch/ia64/sn/ arch/ia64/uv/ |
67 | drivers-$(CONFIG_OPROFILE) += arch/ia64/oprofile/ | 67 | drivers-$(CONFIG_OPROFILE) += arch/ia64/oprofile/ |
68 | 68 | ||
69 | boot := arch/ia64/hp/sim/boot | 69 | boot := arch/ia64/hp/sim/boot |
diff --git a/arch/ia64/ia32/ia32_support.c b/arch/ia64/ia32/ia32_support.c index 896b1ebbfb26..a6965ddafc46 100644 --- a/arch/ia64/ia32/ia32_support.c +++ b/arch/ia64/ia32/ia32_support.c | |||
@@ -15,7 +15,6 @@ | |||
15 | #include <linux/kernel.h> | 15 | #include <linux/kernel.h> |
16 | #include <linux/init.h> | 16 | #include <linux/init.h> |
17 | #include <linux/mm.h> | 17 | #include <linux/mm.h> |
18 | #include <linux/personality.h> | ||
19 | #include <linux/sched.h> | 18 | #include <linux/sched.h> |
20 | 19 | ||
21 | #include <asm/intrinsics.h> | 20 | #include <asm/intrinsics.h> |
@@ -29,7 +28,6 @@ | |||
29 | 28 | ||
30 | extern int die_if_kernel (char *str, struct pt_regs *regs, long err); | 29 | extern int die_if_kernel (char *str, struct pt_regs *regs, long err); |
31 | 30 | ||
32 | struct exec_domain ia32_exec_domain; | ||
33 | struct page *ia32_shared_page[NR_CPUS]; | 31 | struct page *ia32_shared_page[NR_CPUS]; |
34 | unsigned long *ia32_boot_gdt; | 32 | unsigned long *ia32_boot_gdt; |
35 | unsigned long *cpu_gdt_table[NR_CPUS]; | 33 | unsigned long *cpu_gdt_table[NR_CPUS]; |
@@ -240,14 +238,6 @@ ia32_cpu_init (void) | |||
240 | static int __init | 238 | static int __init |
241 | ia32_init (void) | 239 | ia32_init (void) |
242 | { | 240 | { |
243 | ia32_exec_domain.name = "Linux/x86"; | ||
244 | ia32_exec_domain.handler = NULL; | ||
245 | ia32_exec_domain.pers_low = PER_LINUX32; | ||
246 | ia32_exec_domain.pers_high = PER_LINUX32; | ||
247 | ia32_exec_domain.signal_map = default_exec_domain.signal_map; | ||
248 | ia32_exec_domain.signal_invmap = default_exec_domain.signal_invmap; | ||
249 | register_exec_domain(&ia32_exec_domain); | ||
250 | |||
251 | #if PAGE_SHIFT > IA32_PAGE_SHIFT | 241 | #if PAGE_SHIFT > IA32_PAGE_SHIFT |
252 | { | 242 | { |
253 | extern struct kmem_cache *ia64_partial_page_cachep; | 243 | extern struct kmem_cache *ia64_partial_page_cachep; |
diff --git a/arch/ia64/kernel/acpi.c b/arch/ia64/kernel/acpi.c index 19709a079635..853d1f11be00 100644 --- a/arch/ia64/kernel/acpi.c +++ b/arch/ia64/kernel/acpi.c | |||
@@ -117,7 +117,10 @@ acpi_get_sysname(void) | |||
117 | if (!strcmp(hdr->oem_id, "HP")) { | 117 | if (!strcmp(hdr->oem_id, "HP")) { |
118 | return "hpzx1"; | 118 | return "hpzx1"; |
119 | } else if (!strcmp(hdr->oem_id, "SGI")) { | 119 | } else if (!strcmp(hdr->oem_id, "SGI")) { |
120 | return "sn2"; | 120 | if (!strcmp(hdr->oem_table_id + 4, "UV")) |
121 | return "uv"; | ||
122 | else | ||
123 | return "sn2"; | ||
121 | } | 124 | } |
122 | 125 | ||
123 | return "dig"; | 126 | return "dig"; |
@@ -130,6 +133,8 @@ acpi_get_sysname(void) | |||
130 | return "hpzx1_swiotlb"; | 133 | return "hpzx1_swiotlb"; |
131 | # elif defined (CONFIG_IA64_SGI_SN2) | 134 | # elif defined (CONFIG_IA64_SGI_SN2) |
132 | return "sn2"; | 135 | return "sn2"; |
136 | # elif defined (CONFIG_IA64_SGI_UV) | ||
137 | return "uv"; | ||
133 | # elif defined (CONFIG_IA64_DIG) | 138 | # elif defined (CONFIG_IA64_DIG) |
134 | return "dig"; | 139 | return "dig"; |
135 | # else | 140 | # else |
@@ -622,6 +627,9 @@ void acpi_unregister_gsi(u32 gsi) | |||
622 | if (acpi_irq_model == ACPI_IRQ_MODEL_PLATFORM) | 627 | if (acpi_irq_model == ACPI_IRQ_MODEL_PLATFORM) |
623 | return; | 628 | return; |
624 | 629 | ||
630 | if (has_8259 && gsi < 16) | ||
631 | return; | ||
632 | |||
625 | iosapic_unregister_intr(gsi); | 633 | iosapic_unregister_intr(gsi); |
626 | } | 634 | } |
627 | 635 | ||
diff --git a/arch/ia64/kernel/entry.S b/arch/ia64/kernel/entry.S index e49ad8c5dc69..ca2bb95726de 100644 --- a/arch/ia64/kernel/entry.S +++ b/arch/ia64/kernel/entry.S | |||
@@ -1156,6 +1156,9 @@ skip_rbs_switch: | |||
1156 | * r31 = current->thread_info->flags | 1156 | * r31 = current->thread_info->flags |
1157 | * On exit: | 1157 | * On exit: |
1158 | * p6 = TRUE if work-pending-check needs to be redone | 1158 | * p6 = TRUE if work-pending-check needs to be redone |
1159 | * | ||
1160 | * Interrupts are disabled on entry, reenabled depend on work, and | ||
1161 | * disabled on exit. | ||
1159 | */ | 1162 | */ |
1160 | .work_pending_syscall: | 1163 | .work_pending_syscall: |
1161 | add r2=-8,r2 | 1164 | add r2=-8,r2 |
@@ -1164,16 +1167,16 @@ skip_rbs_switch: | |||
1164 | st8 [r2]=r8 | 1167 | st8 [r2]=r8 |
1165 | st8 [r3]=r10 | 1168 | st8 [r3]=r10 |
1166 | .work_pending: | 1169 | .work_pending: |
1167 | tbit.z p6,p0=r31,TIF_NEED_RESCHED // current_thread_info()->need_resched==0? | 1170 | tbit.z p6,p0=r31,TIF_NEED_RESCHED // is resched not needed? |
1168 | (p6) br.cond.sptk.few .notify | 1171 | (p6) br.cond.sptk.few .notify |
1169 | #ifdef CONFIG_PREEMPT | 1172 | #ifdef CONFIG_PREEMPT |
1170 | (pKStk) dep r21=-1,r0,PREEMPT_ACTIVE_BIT,1 | 1173 | (pKStk) dep r21=-1,r0,PREEMPT_ACTIVE_BIT,1 |
1171 | ;; | 1174 | ;; |
1172 | (pKStk) st4 [r20]=r21 | 1175 | (pKStk) st4 [r20]=r21 |
1173 | ssm psr.i // enable interrupts | ||
1174 | #endif | 1176 | #endif |
1177 | ssm psr.i // enable interrupts | ||
1175 | br.call.spnt.many rp=schedule | 1178 | br.call.spnt.many rp=schedule |
1176 | .ret9: cmp.eq p6,p0=r0,r0 // p6 <- 1 | 1179 | .ret9: cmp.eq p6,p0=r0,r0 // p6 <- 1 (re-check) |
1177 | rsm psr.i // disable interrupts | 1180 | rsm psr.i // disable interrupts |
1178 | ;; | 1181 | ;; |
1179 | #ifdef CONFIG_PREEMPT | 1182 | #ifdef CONFIG_PREEMPT |
@@ -1182,13 +1185,13 @@ skip_rbs_switch: | |||
1182 | (pKStk) st4 [r20]=r0 // preempt_count() <- 0 | 1185 | (pKStk) st4 [r20]=r0 // preempt_count() <- 0 |
1183 | #endif | 1186 | #endif |
1184 | (pLvSys)br.cond.sptk.few .work_pending_syscall_end | 1187 | (pLvSys)br.cond.sptk.few .work_pending_syscall_end |
1185 | br.cond.sptk.many .work_processed_kernel // re-check | 1188 | br.cond.sptk.many .work_processed_kernel |
1186 | 1189 | ||
1187 | .notify: | 1190 | .notify: |
1188 | (pUStk) br.call.spnt.many rp=notify_resume_user | 1191 | (pUStk) br.call.spnt.many rp=notify_resume_user |
1189 | .ret10: cmp.ne p6,p0=r0,r0 // p6 <- 0 | 1192 | .ret10: cmp.ne p6,p0=r0,r0 // p6 <- 0 (don't re-check) |
1190 | (pLvSys)br.cond.sptk.few .work_pending_syscall_end | 1193 | (pLvSys)br.cond.sptk.few .work_pending_syscall_end |
1191 | br.cond.sptk.many .work_processed_kernel // don't re-check | 1194 | br.cond.sptk.many .work_processed_kernel |
1192 | 1195 | ||
1193 | .work_pending_syscall_end: | 1196 | .work_pending_syscall_end: |
1194 | adds r2=PT(R8)+16,r12 | 1197 | adds r2=PT(R8)+16,r12 |
@@ -1196,7 +1199,7 @@ skip_rbs_switch: | |||
1196 | ;; | 1199 | ;; |
1197 | ld8 r8=[r2] | 1200 | ld8 r8=[r2] |
1198 | ld8 r10=[r3] | 1201 | ld8 r10=[r3] |
1199 | br.cond.sptk.many .work_processed_syscall // re-check | 1202 | br.cond.sptk.many .work_processed_syscall |
1200 | 1203 | ||
1201 | END(ia64_leave_kernel) | 1204 | END(ia64_leave_kernel) |
1202 | 1205 | ||
@@ -1234,9 +1237,12 @@ GLOBAL_ENTRY(ia64_invoke_schedule_tail) | |||
1234 | END(ia64_invoke_schedule_tail) | 1237 | END(ia64_invoke_schedule_tail) |
1235 | 1238 | ||
1236 | /* | 1239 | /* |
1237 | * Setup stack and call do_notify_resume_user(). Note that pSys and pNonSys need to | 1240 | * Setup stack and call do_notify_resume_user(), keeping interrupts |
1238 | * be set up by the caller. We declare 8 input registers so the system call | 1241 | * disabled. |
1239 | * args get preserved, in case we need to restart a system call. | 1242 | * |
1243 | * Note that pSys and pNonSys need to be set up by the caller. | ||
1244 | * We declare 8 input registers so the system call args get preserved, | ||
1245 | * in case we need to restart a system call. | ||
1240 | */ | 1246 | */ |
1241 | ENTRY(notify_resume_user) | 1247 | ENTRY(notify_resume_user) |
1242 | .prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(8) | 1248 | .prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(8) |
diff --git a/arch/ia64/kernel/palinfo.c b/arch/ia64/kernel/palinfo.c index 4547a2092af9..9dc00f7fe10e 100644 --- a/arch/ia64/kernel/palinfo.c +++ b/arch/ia64/kernel/palinfo.c | |||
@@ -900,12 +900,6 @@ static void | |||
900 | palinfo_smp_call(void *info) | 900 | palinfo_smp_call(void *info) |
901 | { | 901 | { |
902 | palinfo_smp_data_t *data = (palinfo_smp_data_t *)info; | 902 | palinfo_smp_data_t *data = (palinfo_smp_data_t *)info; |
903 | if (data == NULL) { | ||
904 | printk(KERN_ERR "palinfo: data pointer is NULL\n"); | ||
905 | data->ret = 0; /* no output */ | ||
906 | return; | ||
907 | } | ||
908 | /* does this actual call */ | ||
909 | data->ret = (*data->func)(data->page); | 903 | data->ret = (*data->func)(data->page); |
910 | } | 904 | } |
911 | 905 | ||
diff --git a/arch/ia64/kernel/perfmon.c b/arch/ia64/kernel/perfmon.c index c1ad27de2dd2..71d05133f556 100644 --- a/arch/ia64/kernel/perfmon.c +++ b/arch/ia64/kernel/perfmon.c | |||
@@ -5013,12 +5013,13 @@ pfm_context_force_terminate(pfm_context_t *ctx, struct pt_regs *regs) | |||
5013 | } | 5013 | } |
5014 | 5014 | ||
5015 | static int pfm_ovfl_notify_user(pfm_context_t *ctx, unsigned long ovfl_pmds); | 5015 | static int pfm_ovfl_notify_user(pfm_context_t *ctx, unsigned long ovfl_pmds); |
5016 | |||
5016 | /* | 5017 | /* |
5017 | * pfm_handle_work() can be called with interrupts enabled | 5018 | * pfm_handle_work() can be called with interrupts enabled |
5018 | * (TIF_NEED_RESCHED) or disabled. The down_interruptible | 5019 | * (TIF_NEED_RESCHED) or disabled. The down_interruptible |
5019 | * call may sleep, therefore we must re-enable interrupts | 5020 | * call may sleep, therefore we must re-enable interrupts |
5020 | * to avoid deadlocks. It is safe to do so because this function | 5021 | * to avoid deadlocks. It is safe to do so because this function |
5021 | * is called ONLY when returning to user level (PUStk=1), in which case | 5022 | * is called ONLY when returning to user level (pUStk=1), in which case |
5022 | * there is no risk of kernel stack overflow due to deep | 5023 | * there is no risk of kernel stack overflow due to deep |
5023 | * interrupt nesting. | 5024 | * interrupt nesting. |
5024 | */ | 5025 | */ |
@@ -5034,7 +5035,8 @@ pfm_handle_work(void) | |||
5034 | 5035 | ||
5035 | ctx = PFM_GET_CTX(current); | 5036 | ctx = PFM_GET_CTX(current); |
5036 | if (ctx == NULL) { | 5037 | if (ctx == NULL) { |
5037 | printk(KERN_ERR "perfmon: [%d] has no PFM context\n", task_pid_nr(current)); | 5038 | printk(KERN_ERR "perfmon: [%d] has no PFM context\n", |
5039 | task_pid_nr(current)); | ||
5038 | return; | 5040 | return; |
5039 | } | 5041 | } |
5040 | 5042 | ||
@@ -5058,11 +5060,12 @@ pfm_handle_work(void) | |||
5058 | /* | 5060 | /* |
5059 | * must be done before we check for simple-reset mode | 5061 | * must be done before we check for simple-reset mode |
5060 | */ | 5062 | */ |
5061 | if (ctx->ctx_fl_going_zombie || ctx->ctx_state == PFM_CTX_ZOMBIE) goto do_zombie; | 5063 | if (ctx->ctx_fl_going_zombie || ctx->ctx_state == PFM_CTX_ZOMBIE) |
5062 | 5064 | goto do_zombie; | |
5063 | 5065 | ||
5064 | //if (CTX_OVFL_NOBLOCK(ctx)) goto skip_blocking; | 5066 | //if (CTX_OVFL_NOBLOCK(ctx)) goto skip_blocking; |
5065 | if (reason == PFM_TRAP_REASON_RESET) goto skip_blocking; | 5067 | if (reason == PFM_TRAP_REASON_RESET) |
5068 | goto skip_blocking; | ||
5066 | 5069 | ||
5067 | /* | 5070 | /* |
5068 | * restore interrupt mask to what it was on entry. | 5071 | * restore interrupt mask to what it was on entry. |
@@ -5110,7 +5113,8 @@ do_zombie: | |||
5110 | /* | 5113 | /* |
5111 | * in case of interruption of down() we don't restart anything | 5114 | * in case of interruption of down() we don't restart anything |
5112 | */ | 5115 | */ |
5113 | if (ret < 0) goto nothing_to_do; | 5116 | if (ret < 0) |
5117 | goto nothing_to_do; | ||
5114 | 5118 | ||
5115 | skip_blocking: | 5119 | skip_blocking: |
5116 | pfm_resume_after_ovfl(ctx, ovfl_regs, regs); | 5120 | pfm_resume_after_ovfl(ctx, ovfl_regs, regs); |
diff --git a/arch/ia64/kernel/process.c b/arch/ia64/kernel/process.c index 58dcfac5ea88..a3a34b4eb038 100644 --- a/arch/ia64/kernel/process.c +++ b/arch/ia64/kernel/process.c | |||
@@ -167,11 +167,18 @@ void tsk_clear_notify_resume(struct task_struct *tsk) | |||
167 | clear_ti_thread_flag(task_thread_info(tsk), TIF_NOTIFY_RESUME); | 167 | clear_ti_thread_flag(task_thread_info(tsk), TIF_NOTIFY_RESUME); |
168 | } | 168 | } |
169 | 169 | ||
170 | /* | ||
171 | * do_notify_resume_user(): | ||
172 | * Called from notify_resume_user at entry.S, with interrupts disabled. | ||
173 | */ | ||
170 | void | 174 | void |
171 | do_notify_resume_user (sigset_t *unused, struct sigscratch *scr, long in_syscall) | 175 | do_notify_resume_user(sigset_t *unused, struct sigscratch *scr, long in_syscall) |
172 | { | 176 | { |
173 | if (fsys_mode(current, &scr->pt)) { | 177 | if (fsys_mode(current, &scr->pt)) { |
174 | /* defer signal-handling etc. until we return to privilege-level 0. */ | 178 | /* |
179 | * defer signal-handling etc. until we return to | ||
180 | * privilege-level 0. | ||
181 | */ | ||
175 | if (!ia64_psr(&scr->pt)->lp) | 182 | if (!ia64_psr(&scr->pt)->lp) |
176 | ia64_psr(&scr->pt)->lp = 1; | 183 | ia64_psr(&scr->pt)->lp = 1; |
177 | return; | 184 | return; |
@@ -179,16 +186,26 @@ do_notify_resume_user (sigset_t *unused, struct sigscratch *scr, long in_syscall | |||
179 | 186 | ||
180 | #ifdef CONFIG_PERFMON | 187 | #ifdef CONFIG_PERFMON |
181 | if (current->thread.pfm_needs_checking) | 188 | if (current->thread.pfm_needs_checking) |
189 | /* | ||
190 | * Note: pfm_handle_work() allow us to call it with interrupts | ||
191 | * disabled, and may enable interrupts within the function. | ||
192 | */ | ||
182 | pfm_handle_work(); | 193 | pfm_handle_work(); |
183 | #endif | 194 | #endif |
184 | 195 | ||
185 | /* deal with pending signal delivery */ | 196 | /* deal with pending signal delivery */ |
186 | if (test_thread_flag(TIF_SIGPENDING)) | 197 | if (test_thread_flag(TIF_SIGPENDING)) { |
198 | local_irq_enable(); /* force interrupt enable */ | ||
187 | ia64_do_signal(scr, in_syscall); | 199 | ia64_do_signal(scr, in_syscall); |
200 | } | ||
188 | 201 | ||
189 | /* copy user rbs to kernel rbs */ | 202 | /* copy user rbs to kernel rbs */ |
190 | if (unlikely(test_thread_flag(TIF_RESTORE_RSE))) | 203 | if (unlikely(test_thread_flag(TIF_RESTORE_RSE))) { |
204 | local_irq_enable(); /* force interrupt enable */ | ||
191 | ia64_sync_krbs(); | 205 | ia64_sync_krbs(); |
206 | } | ||
207 | |||
208 | local_irq_disable(); /* force interrupt disable */ | ||
192 | } | 209 | } |
193 | 210 | ||
194 | static int pal_halt = 1; | 211 | static int pal_halt = 1; |
diff --git a/arch/ia64/kernel/sal.c b/arch/ia64/kernel/sal.c index a3022dc48ef8..7e0259709c04 100644 --- a/arch/ia64/kernel/sal.c +++ b/arch/ia64/kernel/sal.c | |||
@@ -229,6 +229,14 @@ static void __init sal_desc_ap_wakeup(void *p) { } | |||
229 | */ | 229 | */ |
230 | static int sal_cache_flush_drops_interrupts; | 230 | static int sal_cache_flush_drops_interrupts; |
231 | 231 | ||
232 | static int __init | ||
233 | force_pal_cache_flush(char *str) | ||
234 | { | ||
235 | sal_cache_flush_drops_interrupts = 1; | ||
236 | return 0; | ||
237 | } | ||
238 | early_param("force_pal_cache_flush", force_pal_cache_flush); | ||
239 | |||
232 | void __init | 240 | void __init |
233 | check_sal_cache_flush (void) | 241 | check_sal_cache_flush (void) |
234 | { | 242 | { |
@@ -237,6 +245,9 @@ check_sal_cache_flush (void) | |||
237 | u64 vector, cache_type = 3; | 245 | u64 vector, cache_type = 3; |
238 | struct ia64_sal_retval isrv; | 246 | struct ia64_sal_retval isrv; |
239 | 247 | ||
248 | if (sal_cache_flush_drops_interrupts) | ||
249 | return; | ||
250 | |||
240 | cpu = get_cpu(); | 251 | cpu = get_cpu(); |
241 | local_irq_save(flags); | 252 | local_irq_save(flags); |
242 | 253 | ||
diff --git a/arch/ia64/kernel/setup.c b/arch/ia64/kernel/setup.c index 5015ca1275ca..e9596cd0cdab 100644 --- a/arch/ia64/kernel/setup.c +++ b/arch/ia64/kernel/setup.c | |||
@@ -239,6 +239,25 @@ __initcall(register_memory); | |||
239 | 239 | ||
240 | 240 | ||
241 | #ifdef CONFIG_KEXEC | 241 | #ifdef CONFIG_KEXEC |
242 | |||
243 | /* | ||
244 | * This function checks if the reserved crashkernel is allowed on the specific | ||
245 | * IA64 machine flavour. Machines without an IO TLB use swiotlb and require | ||
246 | * some memory below 4 GB (i.e. in 32 bit area), see the implementation of | ||
247 | * lib/swiotlb.c. The hpzx1 architecture has an IO TLB but cannot use that | ||
248 | * in kdump case. See the comment in sba_init() in sba_iommu.c. | ||
249 | * | ||
250 | * So, the only machvec that really supports loading the kdump kernel | ||
251 | * over 4 GB is "sn2". | ||
252 | */ | ||
253 | static int __init check_crashkernel_memory(unsigned long pbase, size_t size) | ||
254 | { | ||
255 | if (ia64_platform_is("sn2") || ia64_platform_is("uv")) | ||
256 | return 1; | ||
257 | else | ||
258 | return pbase < (1UL << 32); | ||
259 | } | ||
260 | |||
242 | static void __init setup_crashkernel(unsigned long total, int *n) | 261 | static void __init setup_crashkernel(unsigned long total, int *n) |
243 | { | 262 | { |
244 | unsigned long long base = 0, size = 0; | 263 | unsigned long long base = 0, size = 0; |
@@ -252,6 +271,16 @@ static void __init setup_crashkernel(unsigned long total, int *n) | |||
252 | base = kdump_find_rsvd_region(size, | 271 | base = kdump_find_rsvd_region(size, |
253 | rsvd_region, *n); | 272 | rsvd_region, *n); |
254 | } | 273 | } |
274 | |||
275 | if (!check_crashkernel_memory(base, size)) { | ||
276 | pr_warning("crashkernel: There would be kdump memory " | ||
277 | "at %ld GB but this is unusable because it " | ||
278 | "must\nbe below 4 GB. Change the memory " | ||
279 | "configuration of the machine.\n", | ||
280 | (unsigned long)(base >> 30)); | ||
281 | return; | ||
282 | } | ||
283 | |||
255 | if (base != ~0UL) { | 284 | if (base != ~0UL) { |
256 | printk(KERN_INFO "Reserving %ldMB of memory at %ldMB " | 285 | printk(KERN_INFO "Reserving %ldMB of memory at %ldMB " |
257 | "for crashkernel (System RAM: %ldMB)\n", | 286 | "for crashkernel (System RAM: %ldMB)\n", |
diff --git a/arch/ia64/mm/init.c b/arch/ia64/mm/init.c index fc6c6636ffda..200100ea7610 100644 --- a/arch/ia64/mm/init.c +++ b/arch/ia64/mm/init.c | |||
@@ -719,3 +719,28 @@ out: | |||
719 | EXPORT_SYMBOL_GPL(remove_memory); | 719 | EXPORT_SYMBOL_GPL(remove_memory); |
720 | #endif /* CONFIG_MEMORY_HOTREMOVE */ | 720 | #endif /* CONFIG_MEMORY_HOTREMOVE */ |
721 | #endif | 721 | #endif |
722 | |||
723 | /* | ||
724 | * Even when CONFIG_IA32_SUPPORT is not enabled it is | ||
725 | * useful to have the Linux/x86 domain registered to | ||
726 | * avoid an attempted module load when emulators call | ||
727 | * personality(PER_LINUX32). This saves several milliseconds | ||
728 | * on each such call. | ||
729 | */ | ||
730 | static struct exec_domain ia32_exec_domain; | ||
731 | |||
732 | static int __init | ||
733 | per_linux32_init(void) | ||
734 | { | ||
735 | ia32_exec_domain.name = "Linux/x86"; | ||
736 | ia32_exec_domain.handler = NULL; | ||
737 | ia32_exec_domain.pers_low = PER_LINUX32; | ||
738 | ia32_exec_domain.pers_high = PER_LINUX32; | ||
739 | ia32_exec_domain.signal_map = default_exec_domain.signal_map; | ||
740 | ia32_exec_domain.signal_invmap = default_exec_domain.signal_invmap; | ||
741 | register_exec_domain(&ia32_exec_domain); | ||
742 | |||
743 | return 0; | ||
744 | } | ||
745 | |||
746 | __initcall(per_linux32_init); | ||
diff --git a/arch/ia64/uv/Makefile b/arch/ia64/uv/Makefile new file mode 100644 index 000000000000..aa9f91947c49 --- /dev/null +++ b/arch/ia64/uv/Makefile | |||
@@ -0,0 +1,12 @@ | |||
1 | # arch/ia64/uv/Makefile | ||
2 | # | ||
3 | # This file is subject to the terms and conditions of the GNU General Public | ||
4 | # License. See the file "COPYING" in the main directory of this archive | ||
5 | # for more details. | ||
6 | # | ||
7 | # Copyright (C) 2008 Silicon Graphics, Inc. All Rights Reserved. | ||
8 | # | ||
9 | # Makefile for the sn uv subplatform | ||
10 | # | ||
11 | |||
12 | obj-y += kernel/ | ||
diff --git a/arch/ia64/uv/kernel/Makefile b/arch/ia64/uv/kernel/Makefile new file mode 100644 index 000000000000..8d92b4684d8e --- /dev/null +++ b/arch/ia64/uv/kernel/Makefile | |||
@@ -0,0 +1,13 @@ | |||
1 | # arch/ia64/uv/kernel/Makefile | ||
2 | # | ||
3 | # This file is subject to the terms and conditions of the GNU General Public | ||
4 | # License. See the file "COPYING" in the main directory of this archive | ||
5 | # for more details. | ||
6 | # | ||
7 | # Copyright (C) 2008 Silicon Graphics, Inc. All Rights Reserved. | ||
8 | # | ||
9 | |||
10 | EXTRA_CFLAGS += -Iarch/ia64/sn/include | ||
11 | |||
12 | obj-y += setup.o | ||
13 | obj-$(CONFIG_IA64_GENERIC) += machvec.o | ||
diff --git a/arch/ia64/uv/kernel/machvec.c b/arch/ia64/uv/kernel/machvec.c new file mode 100644 index 000000000000..50737a9dca74 --- /dev/null +++ b/arch/ia64/uv/kernel/machvec.c | |||
@@ -0,0 +1,11 @@ | |||
1 | /* | ||
2 | * This file is subject to the terms and conditions of the GNU General Public | ||
3 | * License. See the file "COPYING" in the main directory of this archive | ||
4 | * for more details. | ||
5 | * | ||
6 | * Copyright (c) 2008 Silicon Graphics, Inc. All Rights Reserved. | ||
7 | */ | ||
8 | |||
9 | #define MACHVEC_PLATFORM_NAME uv | ||
10 | #define MACHVEC_PLATFORM_HEADER <asm/machvec_uv.h> | ||
11 | #include <asm/machvec_init.h> | ||
diff --git a/arch/ia64/uv/kernel/setup.c b/arch/ia64/uv/kernel/setup.c new file mode 100644 index 000000000000..9aa743203c3c --- /dev/null +++ b/arch/ia64/uv/kernel/setup.c | |||
@@ -0,0 +1,98 @@ | |||
1 | /* | ||
2 | * This file is subject to the terms and conditions of the GNU General Public | ||
3 | * License. See the file "COPYING" in the main directory of this archive | ||
4 | * for more details. | ||
5 | * | ||
6 | * SGI UV Core Functions | ||
7 | * | ||
8 | * Copyright (C) 2008 Silicon Graphics, Inc. All rights reserved. | ||
9 | */ | ||
10 | |||
11 | #include <linux/module.h> | ||
12 | #include <linux/percpu.h> | ||
13 | #include <asm/sn/simulator.h> | ||
14 | #include <asm/uv/uv_mmrs.h> | ||
15 | #include <asm/uv/uv_hub.h> | ||
16 | |||
17 | DEFINE_PER_CPU(struct uv_hub_info_s, __uv_hub_info); | ||
18 | EXPORT_PER_CPU_SYMBOL_GPL(__uv_hub_info); | ||
19 | |||
20 | |||
21 | struct redir_addr { | ||
22 | unsigned long redirect; | ||
23 | unsigned long alias; | ||
24 | }; | ||
25 | |||
26 | #define DEST_SHIFT UVH_RH_GAM_ALIAS210_REDIRECT_CONFIG_0_MMR_DEST_BASE_SHFT | ||
27 | |||
28 | static __initdata struct redir_addr redir_addrs[] = { | ||
29 | {UVH_RH_GAM_ALIAS210_REDIRECT_CONFIG_0_MMR, UVH_SI_ALIAS0_OVERLAY_CONFIG}, | ||
30 | {UVH_RH_GAM_ALIAS210_REDIRECT_CONFIG_1_MMR, UVH_SI_ALIAS1_OVERLAY_CONFIG}, | ||
31 | {UVH_RH_GAM_ALIAS210_REDIRECT_CONFIG_2_MMR, UVH_SI_ALIAS2_OVERLAY_CONFIG}, | ||
32 | }; | ||
33 | |||
34 | static __init void get_lowmem_redirect(unsigned long *base, unsigned long *size) | ||
35 | { | ||
36 | union uvh_si_alias0_overlay_config_u alias; | ||
37 | union uvh_rh_gam_alias210_redirect_config_2_mmr_u redirect; | ||
38 | int i; | ||
39 | |||
40 | for (i = 0; i < ARRAY_SIZE(redir_addrs); i++) { | ||
41 | alias.v = uv_read_local_mmr(redir_addrs[i].alias); | ||
42 | if (alias.s.base == 0) { | ||
43 | *size = (1UL << alias.s.m_alias); | ||
44 | redirect.v = uv_read_local_mmr(redir_addrs[i].redirect); | ||
45 | *base = (unsigned long)redirect.s.dest_base << DEST_SHIFT; | ||
46 | return; | ||
47 | } | ||
48 | } | ||
49 | BUG(); | ||
50 | } | ||
51 | |||
52 | void __init uv_setup(char **cmdline_p) | ||
53 | { | ||
54 | union uvh_si_addr_map_config_u m_n_config; | ||
55 | union uvh_node_id_u node_id; | ||
56 | unsigned long gnode_upper; | ||
57 | int nid, cpu, m_val, n_val; | ||
58 | unsigned long mmr_base, lowmem_redir_base, lowmem_redir_size; | ||
59 | |||
60 | if (IS_MEDUSA()) { | ||
61 | lowmem_redir_base = 0; | ||
62 | lowmem_redir_size = 0; | ||
63 | node_id.v = 0; | ||
64 | m_n_config.s.m_skt = 37; | ||
65 | m_n_config.s.n_skt = 0; | ||
66 | mmr_base = 0; | ||
67 | } else { | ||
68 | get_lowmem_redirect(&lowmem_redir_base, &lowmem_redir_size); | ||
69 | node_id.v = uv_read_local_mmr(UVH_NODE_ID); | ||
70 | m_n_config.v = uv_read_local_mmr(UVH_SI_ADDR_MAP_CONFIG); | ||
71 | mmr_base = | ||
72 | uv_read_local_mmr(UVH_RH_GAM_MMR_OVERLAY_CONFIG_MMR) & | ||
73 | ~UV_MMR_ENABLE; | ||
74 | } | ||
75 | |||
76 | m_val = m_n_config.s.m_skt; | ||
77 | n_val = m_n_config.s.n_skt; | ||
78 | printk(KERN_DEBUG "UV: global MMR base 0x%lx\n", mmr_base); | ||
79 | |||
80 | gnode_upper = (((unsigned long)node_id.s.node_id) & | ||
81 | ~((1 << n_val) - 1)) << m_val; | ||
82 | |||
83 | for_each_present_cpu(cpu) { | ||
84 | nid = cpu_to_node(cpu); | ||
85 | uv_cpu_hub_info(cpu)->lowmem_remap_base = lowmem_redir_base; | ||
86 | uv_cpu_hub_info(cpu)->lowmem_remap_top = | ||
87 | lowmem_redir_base + lowmem_redir_size; | ||
88 | uv_cpu_hub_info(cpu)->m_val = m_val; | ||
89 | uv_cpu_hub_info(cpu)->n_val = m_val; | ||
90 | uv_cpu_hub_info(cpu)->pnode_mask = (1 << n_val) -1; | ||
91 | uv_cpu_hub_info(cpu)->gpa_mask = (1 << (m_val + n_val)) - 1; | ||
92 | uv_cpu_hub_info(cpu)->gnode_upper = gnode_upper; | ||
93 | uv_cpu_hub_info(cpu)->global_mmr_base = mmr_base; | ||
94 | uv_cpu_hub_info(cpu)->coherency_domain_number = 0;/* ZZZ */ | ||
95 | printk(KERN_DEBUG "UV cpu %d, nid %d\n", cpu, nid); | ||
96 | } | ||
97 | } | ||
98 | |||
diff --git a/arch/m68knommu/Kconfig b/arch/m68knommu/Kconfig index 07eb4c4bab82..8e8441587c22 100644 --- a/arch/m68knommu/Kconfig +++ b/arch/m68knommu/Kconfig | |||
@@ -671,6 +671,9 @@ config ROMKERNEL | |||
671 | 671 | ||
672 | endchoice | 672 | endchoice |
673 | 673 | ||
674 | if COLDFIRE | ||
675 | source "kernel/Kconfig.preempt" | ||
676 | endif | ||
674 | source "mm/Kconfig" | 677 | source "mm/Kconfig" |
675 | 678 | ||
676 | endmenu | 679 | endmenu |
diff --git a/arch/m68knommu/kernel/vmlinux.lds.S b/arch/m68knommu/kernel/vmlinux.lds.S index 5592e0bf951f..93e69236ed6f 100644 --- a/arch/m68knommu/kernel/vmlinux.lds.S +++ b/arch/m68knommu/kernel/vmlinux.lds.S | |||
@@ -114,6 +114,16 @@ SECTIONS { | |||
114 | *(__kcrctab_gpl) | 114 | *(__kcrctab_gpl) |
115 | __stop___kcrctab_gpl = .; | 115 | __stop___kcrctab_gpl = .; |
116 | 116 | ||
117 | /* Kernel symbol table: Normal unused symbols */ | ||
118 | __start___kcrctab_unused = .; | ||
119 | *(__kcrctab_unused) | ||
120 | __stop___kcrctab_unused = .; | ||
121 | |||
122 | /* Kernel symbol table: GPL-only unused symbols */ | ||
123 | __start___kcrctab_unused_gpl = .; | ||
124 | *(__kcrctab_unused_gpl) | ||
125 | __stop___kcrctab_unused_gpl = .; | ||
126 | |||
117 | /* Kernel symbol table: GPL-future symbols */ | 127 | /* Kernel symbol table: GPL-future symbols */ |
118 | __start___kcrctab_gpl_future = .; | 128 | __start___kcrctab_gpl_future = .; |
119 | *(__kcrctab_gpl_future) | 129 | *(__kcrctab_gpl_future) |
diff --git a/arch/mn10300/boot/install.sh b/arch/mn10300/boot/install.sh index 072951c83976..abba30971191 100644 --- a/arch/mn10300/boot/install.sh +++ b/arch/mn10300/boot/install.sh | |||
@@ -26,42 +26,42 @@ rm -fr $4/../usr/include/linux $4/../usr/include/asm | |||
26 | install -c -m 0755 $2 $4/vmlinuz | 26 | install -c -m 0755 $2 $4/vmlinuz |
27 | install -c -m 0755 $5 $4/boot.rom | 27 | install -c -m 0755 $5 $4/boot.rom |
28 | install -c -m 0755 -d $4/../usr/include/linux | 28 | install -c -m 0755 -d $4/../usr/include/linux |
29 | cd $TOPDIR/include/linux | 29 | cd ${srctree}/include/linux |
30 | for i in `find . -maxdepth 1 -name '*.h' -print`; do | 30 | for i in `find . -maxdepth 1 -name '*.h' -print`; do |
31 | install -c -m 0644 $i $4/../usr/include/linux | 31 | install -c -m 0644 $i $4/../usr/include/linux |
32 | done | 32 | done |
33 | install -c -m 0755 -d $4/../usr/include/linux/byteorder | 33 | install -c -m 0755 -d $4/../usr/include/linux/byteorder |
34 | cd $TOPDIR/include/linux/byteorder | 34 | cd ${srctree}/include/linux/byteorder |
35 | for i in `find . -name '*.h' -print`; do | 35 | for i in `find . -name '*.h' -print`; do |
36 | install -c -m 0644 $i $4/../usr/include/linux/byteorder | 36 | install -c -m 0644 $i $4/../usr/include/linux/byteorder |
37 | done | 37 | done |
38 | install -c -m 0755 -d $4/../usr/include/linux/lockd | 38 | install -c -m 0755 -d $4/../usr/include/linux/lockd |
39 | cd $TOPDIR/include/linux/lockd | 39 | cd ${srctree}/include/linux/lockd |
40 | for i in `find . -name '*.h' -print`; do | 40 | for i in `find . -name '*.h' -print`; do |
41 | install -c -m 0644 $i $4/../usr/include/linux/lockd | 41 | install -c -m 0644 $i $4/../usr/include/linux/lockd |
42 | done | 42 | done |
43 | install -c -m 0755 -d $4/../usr/include/linux/netfilter_ipv4 | 43 | install -c -m 0755 -d $4/../usr/include/linux/netfilter_ipv4 |
44 | cd $TOPDIR/include/linux/netfilter_ipv4 | 44 | cd ${srctree}/include/linux/netfilter_ipv4 |
45 | for i in `find . -name '*.h' -print`; do | 45 | for i in `find . -name '*.h' -print`; do |
46 | install -c -m 0644 $i $4/../usr/include/linux/netfilter_ipv4 | 46 | install -c -m 0644 $i $4/../usr/include/linux/netfilter_ipv4 |
47 | done | 47 | done |
48 | install -c -m 0755 -d $4/../usr/include/linux/nfsd | 48 | install -c -m 0755 -d $4/../usr/include/linux/nfsd |
49 | cd $TOPDIR/include/linux/nfsd | 49 | cd ${srctree}/include/linux/nfsd |
50 | for i in `find . -name '*.h' -print`; do | 50 | for i in `find . -name '*.h' -print`; do |
51 | install -c -m 0644 $i $4/../usr/include/linux/nfsd/$i | 51 | install -c -m 0644 $i $4/../usr/include/linux/nfsd/$i |
52 | done | 52 | done |
53 | install -c -m 0755 -d $4/../usr/include/linux/raid | 53 | install -c -m 0755 -d $4/../usr/include/linux/raid |
54 | cd $TOPDIR/include/linux/raid | 54 | cd ${srctree}/include/linux/raid |
55 | for i in `find . -name '*.h' -print`; do | 55 | for i in `find . -name '*.h' -print`; do |
56 | install -c -m 0644 $i $4/../usr/include/linux/raid | 56 | install -c -m 0644 $i $4/../usr/include/linux/raid |
57 | done | 57 | done |
58 | install -c -m 0755 -d $4/../usr/include/linux/sunrpc | 58 | install -c -m 0755 -d $4/../usr/include/linux/sunrpc |
59 | cd $TOPDIR/include/linux/sunrpc | 59 | cd ${srctree}/include/linux/sunrpc |
60 | for i in `find . -name '*.h' -print`; do | 60 | for i in `find . -name '*.h' -print`; do |
61 | install -c -m 0644 $i $4/../usr/include/linux/sunrpc | 61 | install -c -m 0644 $i $4/../usr/include/linux/sunrpc |
62 | done | 62 | done |
63 | install -c -m 0755 -d $4/../usr/include/asm | 63 | install -c -m 0755 -d $4/../usr/include/asm |
64 | cd $TOPDIR/include/asm | 64 | cd ${srctree}/include/asm |
65 | for i in `find . -name '*.h' -print`; do | 65 | for i in `find . -name '*.h' -print`; do |
66 | install -c -m 0644 $i $4/../usr/include/asm | 66 | install -c -m 0644 $i $4/../usr/include/asm |
67 | done | 67 | done |
diff --git a/arch/parisc/hpux/gate.S b/arch/parisc/hpux/gate.S index 38a1c1b8d4e8..f0b18ce89842 100644 --- a/arch/parisc/hpux/gate.S +++ b/arch/parisc/hpux/gate.S | |||
@@ -13,9 +13,10 @@ | |||
13 | #include <asm/unistd.h> | 13 | #include <asm/unistd.h> |
14 | #include <asm/errno.h> | 14 | #include <asm/errno.h> |
15 | #include <linux/linkage.h> | 15 | #include <linux/linkage.h> |
16 | #include <linux/init.h> | ||
16 | 17 | ||
17 | .level LEVEL | 18 | .level LEVEL |
18 | .text | 19 | __HEAD |
19 | 20 | ||
20 | .import hpux_call_table | 21 | .import hpux_call_table |
21 | .import hpux_syscall_exit,code | 22 | .import hpux_syscall_exit,code |
diff --git a/arch/parisc/hpux/wrappers.S b/arch/parisc/hpux/wrappers.S index 58c53c879c02..ccd3a50c0995 100644 --- a/arch/parisc/hpux/wrappers.S +++ b/arch/parisc/hpux/wrappers.S | |||
@@ -28,9 +28,10 @@ | |||
28 | #include <asm/assembly.h> | 28 | #include <asm/assembly.h> |
29 | #include <asm/signal.h> | 29 | #include <asm/signal.h> |
30 | #include <linux/linkage.h> | 30 | #include <linux/linkage.h> |
31 | #include <linux/init.h> | ||
31 | 32 | ||
32 | .level LEVEL | 33 | .level LEVEL |
33 | .text | 34 | __HEAD |
34 | 35 | ||
35 | /* These should probably go in a header file somewhere. | 36 | /* These should probably go in a header file somewhere. |
36 | * They are duplicated in kernel/wrappers.S | 37 | * They are duplicated in kernel/wrappers.S |
diff --git a/arch/parisc/kernel/Makefile b/arch/parisc/kernel/Makefile index 1f6585a56f97..016d3fc4111c 100644 --- a/arch/parisc/kernel/Makefile +++ b/arch/parisc/kernel/Makefile | |||
@@ -4,9 +4,6 @@ | |||
4 | 4 | ||
5 | extra-y := init_task.o head.o vmlinux.lds | 5 | extra-y := init_task.o head.o vmlinux.lds |
6 | 6 | ||
7 | AFLAGS_entry.o := -traditional | ||
8 | AFLAGS_pacache.o := -traditional | ||
9 | |||
10 | obj-y := cache.o pacache.o setup.o traps.o time.o irq.o \ | 7 | obj-y := cache.o pacache.o setup.o traps.o time.o irq.o \ |
11 | pa7300lc.o syscall.o entry.o sys_parisc.o firmware.o \ | 8 | pa7300lc.o syscall.o entry.o sys_parisc.o firmware.o \ |
12 | ptrace.o hardware.o inventory.o drivers.o \ | 9 | ptrace.o hardware.o inventory.o drivers.o \ |
diff --git a/arch/parisc/kernel/entry.S b/arch/parisc/kernel/entry.S index 111d47284eac..5d0837458c19 100644 --- a/arch/parisc/kernel/entry.S +++ b/arch/parisc/kernel/entry.S | |||
@@ -38,18 +38,11 @@ | |||
38 | #include <asm/thread_info.h> | 38 | #include <asm/thread_info.h> |
39 | 39 | ||
40 | #include <linux/linkage.h> | 40 | #include <linux/linkage.h> |
41 | #include <linux/init.h> | ||
41 | 42 | ||
42 | #ifdef CONFIG_64BIT | 43 | #ifdef CONFIG_64BIT |
43 | #define CMPIB cmpib,* | ||
44 | #define CMPB cmpb,* | ||
45 | #define COND(x) *x | ||
46 | |||
47 | .level 2.0w | 44 | .level 2.0w |
48 | #else | 45 | #else |
49 | #define CMPIB cmpib, | ||
50 | #define CMPB cmpb, | ||
51 | #define COND(x) x | ||
52 | |||
53 | .level 2.0 | 46 | .level 2.0 |
54 | #endif | 47 | #endif |
55 | 48 | ||
@@ -629,7 +622,7 @@ | |||
629 | * the static part of the kernel address space. | 622 | * the static part of the kernel address space. |
630 | */ | 623 | */ |
631 | 624 | ||
632 | .text | 625 | __HEAD |
633 | 626 | ||
634 | .align PAGE_SIZE | 627 | .align PAGE_SIZE |
635 | 628 | ||
@@ -957,9 +950,9 @@ intr_check_sig: | |||
957 | * Only do signals if we are returning to user space | 950 | * Only do signals if we are returning to user space |
958 | */ | 951 | */ |
959 | LDREG PT_IASQ0(%r16), %r20 | 952 | LDREG PT_IASQ0(%r16), %r20 |
960 | CMPIB=,n 0,%r20,intr_restore /* backward */ | 953 | cmpib,COND(=),n 0,%r20,intr_restore /* backward */ |
961 | LDREG PT_IASQ1(%r16), %r20 | 954 | LDREG PT_IASQ1(%r16), %r20 |
962 | CMPIB=,n 0,%r20,intr_restore /* backward */ | 955 | cmpib,COND(=),n 0,%r20,intr_restore /* backward */ |
963 | 956 | ||
964 | copy %r0, %r25 /* long in_syscall = 0 */ | 957 | copy %r0, %r25 /* long in_syscall = 0 */ |
965 | #ifdef CONFIG_64BIT | 958 | #ifdef CONFIG_64BIT |
@@ -1013,10 +1006,10 @@ intr_do_resched: | |||
1013 | * we jump back to intr_restore. | 1006 | * we jump back to intr_restore. |
1014 | */ | 1007 | */ |
1015 | LDREG PT_IASQ0(%r16), %r20 | 1008 | LDREG PT_IASQ0(%r16), %r20 |
1016 | CMPIB= 0, %r20, intr_do_preempt | 1009 | cmpib,COND(=) 0, %r20, intr_do_preempt |
1017 | nop | 1010 | nop |
1018 | LDREG PT_IASQ1(%r16), %r20 | 1011 | LDREG PT_IASQ1(%r16), %r20 |
1019 | CMPIB= 0, %r20, intr_do_preempt | 1012 | cmpib,COND(=) 0, %r20, intr_do_preempt |
1020 | nop | 1013 | nop |
1021 | 1014 | ||
1022 | #ifdef CONFIG_64BIT | 1015 | #ifdef CONFIG_64BIT |
@@ -1045,7 +1038,7 @@ intr_do_preempt: | |||
1045 | /* current_thread_info()->preempt_count */ | 1038 | /* current_thread_info()->preempt_count */ |
1046 | mfctl %cr30, %r1 | 1039 | mfctl %cr30, %r1 |
1047 | LDREG TI_PRE_COUNT(%r1), %r19 | 1040 | LDREG TI_PRE_COUNT(%r1), %r19 |
1048 | CMPIB<> 0, %r19, intr_restore /* if preempt_count > 0 */ | 1041 | cmpib,COND(<>) 0, %r19, intr_restore /* if preempt_count > 0 */ |
1049 | nop /* prev insn branched backwards */ | 1042 | nop /* prev insn branched backwards */ |
1050 | 1043 | ||
1051 | /* check if we interrupted a critical path */ | 1044 | /* check if we interrupted a critical path */ |
@@ -1064,7 +1057,7 @@ intr_do_preempt: | |||
1064 | */ | 1057 | */ |
1065 | 1058 | ||
1066 | intr_extint: | 1059 | intr_extint: |
1067 | CMPIB=,n 0,%r16,1f | 1060 | cmpib,COND(=),n 0,%r16,1f |
1068 | 1061 | ||
1069 | get_stack_use_cr30 | 1062 | get_stack_use_cr30 |
1070 | b,n 2f | 1063 | b,n 2f |
@@ -1099,7 +1092,7 @@ ENDPROC(syscall_exit_rfi) | |||
1099 | 1092 | ||
1100 | ENTRY(intr_save) /* for os_hpmc */ | 1093 | ENTRY(intr_save) /* for os_hpmc */ |
1101 | mfsp %sr7,%r16 | 1094 | mfsp %sr7,%r16 |
1102 | CMPIB=,n 0,%r16,1f | 1095 | cmpib,COND(=),n 0,%r16,1f |
1103 | get_stack_use_cr30 | 1096 | get_stack_use_cr30 |
1104 | b 2f | 1097 | b 2f |
1105 | copy %r8,%r26 | 1098 | copy %r8,%r26 |
@@ -1121,7 +1114,7 @@ ENTRY(intr_save) /* for os_hpmc */ | |||
1121 | * adjust isr/ior below. | 1114 | * adjust isr/ior below. |
1122 | */ | 1115 | */ |
1123 | 1116 | ||
1124 | CMPIB=,n 6,%r26,skip_save_ior | 1117 | cmpib,COND(=),n 6,%r26,skip_save_ior |
1125 | 1118 | ||
1126 | 1119 | ||
1127 | mfctl %cr20, %r16 /* isr */ | 1120 | mfctl %cr20, %r16 /* isr */ |
@@ -1450,11 +1443,11 @@ nadtlb_emulate: | |||
1450 | bb,>=,n %r9,26,nadtlb_nullify /* m bit not set, just nullify */ | 1443 | bb,>=,n %r9,26,nadtlb_nullify /* m bit not set, just nullify */ |
1451 | BL get_register,%r25 | 1444 | BL get_register,%r25 |
1452 | extrw,u %r9,15,5,%r8 /* Get index register # */ | 1445 | extrw,u %r9,15,5,%r8 /* Get index register # */ |
1453 | CMPIB=,n -1,%r1,nadtlb_fault /* have to use slow path */ | 1446 | cmpib,COND(=),n -1,%r1,nadtlb_fault /* have to use slow path */ |
1454 | copy %r1,%r24 | 1447 | copy %r1,%r24 |
1455 | BL get_register,%r25 | 1448 | BL get_register,%r25 |
1456 | extrw,u %r9,10,5,%r8 /* Get base register # */ | 1449 | extrw,u %r9,10,5,%r8 /* Get base register # */ |
1457 | CMPIB=,n -1,%r1,nadtlb_fault /* have to use slow path */ | 1450 | cmpib,COND(=),n -1,%r1,nadtlb_fault /* have to use slow path */ |
1458 | BL set_register,%r25 | 1451 | BL set_register,%r25 |
1459 | add,l %r1,%r24,%r1 /* doesn't affect c/b bits */ | 1452 | add,l %r1,%r24,%r1 /* doesn't affect c/b bits */ |
1460 | 1453 | ||
@@ -1486,7 +1479,7 @@ nadtlb_probe_check: | |||
1486 | cmpb,<>,n %r16,%r17,nadtlb_fault /* Must be probe,[rw]*/ | 1479 | cmpb,<>,n %r16,%r17,nadtlb_fault /* Must be probe,[rw]*/ |
1487 | BL get_register,%r25 /* Find the target register */ | 1480 | BL get_register,%r25 /* Find the target register */ |
1488 | extrw,u %r9,31,5,%r8 /* Get target register */ | 1481 | extrw,u %r9,31,5,%r8 /* Get target register */ |
1489 | CMPIB=,n -1,%r1,nadtlb_fault /* have to use slow path */ | 1482 | cmpib,COND(=),n -1,%r1,nadtlb_fault /* have to use slow path */ |
1490 | BL set_register,%r25 | 1483 | BL set_register,%r25 |
1491 | copy %r0,%r1 /* Write zero to target register */ | 1484 | copy %r0,%r1 /* Write zero to target register */ |
1492 | b nadtlb_nullify /* Nullify return insn */ | 1485 | b nadtlb_nullify /* Nullify return insn */ |
@@ -1570,12 +1563,12 @@ dbit_trap_20w: | |||
1570 | L3_ptep ptp,pte,t0,va,dbit_fault | 1563 | L3_ptep ptp,pte,t0,va,dbit_fault |
1571 | 1564 | ||
1572 | #ifdef CONFIG_SMP | 1565 | #ifdef CONFIG_SMP |
1573 | CMPIB=,n 0,spc,dbit_nolock_20w | 1566 | cmpib,COND(=),n 0,spc,dbit_nolock_20w |
1574 | load32 PA(pa_dbit_lock),t0 | 1567 | load32 PA(pa_dbit_lock),t0 |
1575 | 1568 | ||
1576 | dbit_spin_20w: | 1569 | dbit_spin_20w: |
1577 | LDCW 0(t0),t1 | 1570 | LDCW 0(t0),t1 |
1578 | cmpib,= 0,t1,dbit_spin_20w | 1571 | cmpib,COND(=) 0,t1,dbit_spin_20w |
1579 | nop | 1572 | nop |
1580 | 1573 | ||
1581 | dbit_nolock_20w: | 1574 | dbit_nolock_20w: |
@@ -1586,7 +1579,7 @@ dbit_nolock_20w: | |||
1586 | 1579 | ||
1587 | idtlbt pte,prot | 1580 | idtlbt pte,prot |
1588 | #ifdef CONFIG_SMP | 1581 | #ifdef CONFIG_SMP |
1589 | CMPIB=,n 0,spc,dbit_nounlock_20w | 1582 | cmpib,COND(=),n 0,spc,dbit_nounlock_20w |
1590 | ldi 1,t1 | 1583 | ldi 1,t1 |
1591 | stw t1,0(t0) | 1584 | stw t1,0(t0) |
1592 | 1585 | ||
@@ -1606,7 +1599,7 @@ dbit_trap_11: | |||
1606 | L2_ptep ptp,pte,t0,va,dbit_fault | 1599 | L2_ptep ptp,pte,t0,va,dbit_fault |
1607 | 1600 | ||
1608 | #ifdef CONFIG_SMP | 1601 | #ifdef CONFIG_SMP |
1609 | CMPIB=,n 0,spc,dbit_nolock_11 | 1602 | cmpib,COND(=),n 0,spc,dbit_nolock_11 |
1610 | load32 PA(pa_dbit_lock),t0 | 1603 | load32 PA(pa_dbit_lock),t0 |
1611 | 1604 | ||
1612 | dbit_spin_11: | 1605 | dbit_spin_11: |
@@ -1628,7 +1621,7 @@ dbit_nolock_11: | |||
1628 | 1621 | ||
1629 | mtsp t1, %sr1 /* Restore sr1 */ | 1622 | mtsp t1, %sr1 /* Restore sr1 */ |
1630 | #ifdef CONFIG_SMP | 1623 | #ifdef CONFIG_SMP |
1631 | CMPIB=,n 0,spc,dbit_nounlock_11 | 1624 | cmpib,COND(=),n 0,spc,dbit_nounlock_11 |
1632 | ldi 1,t1 | 1625 | ldi 1,t1 |
1633 | stw t1,0(t0) | 1626 | stw t1,0(t0) |
1634 | 1627 | ||
@@ -1646,7 +1639,7 @@ dbit_trap_20: | |||
1646 | L2_ptep ptp,pte,t0,va,dbit_fault | 1639 | L2_ptep ptp,pte,t0,va,dbit_fault |
1647 | 1640 | ||
1648 | #ifdef CONFIG_SMP | 1641 | #ifdef CONFIG_SMP |
1649 | CMPIB=,n 0,spc,dbit_nolock_20 | 1642 | cmpib,COND(=),n 0,spc,dbit_nolock_20 |
1650 | load32 PA(pa_dbit_lock),t0 | 1643 | load32 PA(pa_dbit_lock),t0 |
1651 | 1644 | ||
1652 | dbit_spin_20: | 1645 | dbit_spin_20: |
@@ -1665,7 +1658,7 @@ dbit_nolock_20: | |||
1665 | idtlbt pte,prot | 1658 | idtlbt pte,prot |
1666 | 1659 | ||
1667 | #ifdef CONFIG_SMP | 1660 | #ifdef CONFIG_SMP |
1668 | CMPIB=,n 0,spc,dbit_nounlock_20 | 1661 | cmpib,COND(=),n 0,spc,dbit_nounlock_20 |
1669 | ldi 1,t1 | 1662 | ldi 1,t1 |
1670 | stw t1,0(t0) | 1663 | stw t1,0(t0) |
1671 | 1664 | ||
@@ -1994,7 +1987,7 @@ ENTRY(syscall_exit) | |||
1994 | 1987 | ||
1995 | /* We can't use "CMPIB<> PER_HPUX" since "im5" field is sign extended */ | 1988 | /* We can't use "CMPIB<> PER_HPUX" since "im5" field is sign extended */ |
1996 | ldo -PER_HPUX(%r19), %r19 | 1989 | ldo -PER_HPUX(%r19), %r19 |
1997 | CMPIB<>,n 0,%r19,1f | 1990 | cmpib,COND(<>),n 0,%r19,1f |
1998 | 1991 | ||
1999 | /* Save other hpux returns if personality is PER_HPUX */ | 1992 | /* Save other hpux returns if personality is PER_HPUX */ |
2000 | STREG %r22,TASK_PT_GR22(%r1) | 1993 | STREG %r22,TASK_PT_GR22(%r1) |
diff --git a/arch/parisc/kernel/head.S b/arch/parisc/kernel/head.S index ec2482dc1beb..5680a2c3b13d 100644 --- a/arch/parisc/kernel/head.S +++ b/arch/parisc/kernel/head.S | |||
@@ -32,7 +32,7 @@ ENTRY(boot_args) | |||
32 | .word 0 /* arg3 */ | 32 | .word 0 /* arg3 */ |
33 | END(boot_args) | 33 | END(boot_args) |
34 | 34 | ||
35 | .section .text.head | 35 | __HEAD |
36 | .align 4 | 36 | .align 4 |
37 | .import init_thread_union,data | 37 | .import init_thread_union,data |
38 | .import fault_vector_20,code /* IVA parisc 2.0 32 bit */ | 38 | .import fault_vector_20,code /* IVA parisc 2.0 32 bit */ |
diff --git a/arch/parisc/kernel/hpmc.S b/arch/parisc/kernel/hpmc.S index 2cbf13b3ef11..068322eb8c9b 100644 --- a/arch/parisc/kernel/hpmc.S +++ b/arch/parisc/kernel/hpmc.S | |||
@@ -47,6 +47,7 @@ | |||
47 | #include <asm/pdc.h> | 47 | #include <asm/pdc.h> |
48 | 48 | ||
49 | #include <linux/linkage.h> | 49 | #include <linux/linkage.h> |
50 | #include <linux/init.h> | ||
50 | 51 | ||
51 | /* | 52 | /* |
52 | * stack for os_hpmc, the HPMC handler. | 53 | * stack for os_hpmc, the HPMC handler. |
@@ -76,7 +77,7 @@ ENTRY(hpmc_pim_data) | |||
76 | .block HPMC_PIM_DATA_SIZE | 77 | .block HPMC_PIM_DATA_SIZE |
77 | END(hpmc_pim_data) | 78 | END(hpmc_pim_data) |
78 | 79 | ||
79 | .text | 80 | __HEAD |
80 | 81 | ||
81 | .import intr_save, code | 82 | .import intr_save, code |
82 | ENTRY(os_hpmc) | 83 | ENTRY(os_hpmc) |
diff --git a/arch/parisc/kernel/inventory.c b/arch/parisc/kernel/inventory.c index 4845a6444633..bd1f7f1ff74e 100644 --- a/arch/parisc/kernel/inventory.c +++ b/arch/parisc/kernel/inventory.c | |||
@@ -499,7 +499,7 @@ add_system_map_addresses(struct parisc_device *dev, int num_addrs, | |||
499 | dev->addr = kmalloc(num_addrs * sizeof(unsigned long), GFP_KERNEL); | 499 | dev->addr = kmalloc(num_addrs * sizeof(unsigned long), GFP_KERNEL); |
500 | if(!dev->addr) { | 500 | if(!dev->addr) { |
501 | printk(KERN_ERR "%s %s(): memory allocation failure\n", | 501 | printk(KERN_ERR "%s %s(): memory allocation failure\n", |
502 | __FILE__, __FUNCTION__); | 502 | __FILE__, __func__); |
503 | return; | 503 | return; |
504 | } | 504 | } |
505 | 505 | ||
diff --git a/arch/parisc/kernel/pacache.S b/arch/parisc/kernel/pacache.S index 5901092e0196..e3246a5ca74f 100644 --- a/arch/parisc/kernel/pacache.S +++ b/arch/parisc/kernel/pacache.S | |||
@@ -37,8 +37,9 @@ | |||
37 | #include <asm/pgtable.h> | 37 | #include <asm/pgtable.h> |
38 | #include <asm/cache.h> | 38 | #include <asm/cache.h> |
39 | #include <linux/linkage.h> | 39 | #include <linux/linkage.h> |
40 | #include <linux/init.h> | ||
40 | 41 | ||
41 | .text | 42 | __HEAD |
42 | .align 128 | 43 | .align 128 |
43 | 44 | ||
44 | ENTRY(flush_tlb_all_local) | 45 | ENTRY(flush_tlb_all_local) |
@@ -85,7 +86,7 @@ ENTRY(flush_tlb_all_local) | |||
85 | LDREG ITLB_OFF_COUNT(%r1), %arg2 | 86 | LDREG ITLB_OFF_COUNT(%r1), %arg2 |
86 | LDREG ITLB_LOOP(%r1), %arg3 | 87 | LDREG ITLB_LOOP(%r1), %arg3 |
87 | 88 | ||
88 | ADDIB= -1, %arg3, fitoneloop /* Preadjust and test */ | 89 | addib,COND(=) -1, %arg3, fitoneloop /* Preadjust and test */ |
89 | movb,<,n %arg3, %r31, fitdone /* If loop < 0, skip */ | 90 | movb,<,n %arg3, %r31, fitdone /* If loop < 0, skip */ |
90 | copy %arg0, %r28 /* Init base addr */ | 91 | copy %arg0, %r28 /* Init base addr */ |
91 | 92 | ||
@@ -95,14 +96,14 @@ fitmanyloop: /* Loop if LOOP >= 2 */ | |||
95 | copy %arg2, %r29 /* Init middle loop count */ | 96 | copy %arg2, %r29 /* Init middle loop count */ |
96 | 97 | ||
97 | fitmanymiddle: /* Loop if LOOP >= 2 */ | 98 | fitmanymiddle: /* Loop if LOOP >= 2 */ |
98 | ADDIB> -1, %r31, fitmanymiddle /* Adjusted inner loop decr */ | 99 | addib,COND(>) -1, %r31, fitmanymiddle /* Adjusted inner loop decr */ |
99 | pitlbe 0(%sr1, %r28) | 100 | pitlbe 0(%sr1, %r28) |
100 | pitlbe,m %arg1(%sr1, %r28) /* Last pitlbe and addr adjust */ | 101 | pitlbe,m %arg1(%sr1, %r28) /* Last pitlbe and addr adjust */ |
101 | ADDIB> -1, %r29, fitmanymiddle /* Middle loop decr */ | 102 | addib,COND(>) -1, %r29, fitmanymiddle /* Middle loop decr */ |
102 | copy %arg3, %r31 /* Re-init inner loop count */ | 103 | copy %arg3, %r31 /* Re-init inner loop count */ |
103 | 104 | ||
104 | movb,tr %arg0, %r28, fitmanyloop /* Re-init base addr */ | 105 | movb,tr %arg0, %r28, fitmanyloop /* Re-init base addr */ |
105 | ADDIB<=,n -1, %r22, fitdone /* Outer loop count decr */ | 106 | addib,COND(<=),n -1, %r22, fitdone /* Outer loop count decr */ |
106 | 107 | ||
107 | fitoneloop: /* Loop if LOOP = 1 */ | 108 | fitoneloop: /* Loop if LOOP = 1 */ |
108 | mtsp %r20, %sr1 | 109 | mtsp %r20, %sr1 |
@@ -110,10 +111,10 @@ fitoneloop: /* Loop if LOOP = 1 */ | |||
110 | copy %arg2, %r29 /* init middle loop count */ | 111 | copy %arg2, %r29 /* init middle loop count */ |
111 | 112 | ||
112 | fitonemiddle: /* Loop if LOOP = 1 */ | 113 | fitonemiddle: /* Loop if LOOP = 1 */ |
113 | ADDIB> -1, %r29, fitonemiddle /* Middle loop count decr */ | 114 | addib,COND(>) -1, %r29, fitonemiddle /* Middle loop count decr */ |
114 | pitlbe,m %arg1(%sr1, %r28) /* pitlbe for one loop */ | 115 | pitlbe,m %arg1(%sr1, %r28) /* pitlbe for one loop */ |
115 | 116 | ||
116 | ADDIB> -1, %r22, fitoneloop /* Outer loop count decr */ | 117 | addib,COND(>) -1, %r22, fitoneloop /* Outer loop count decr */ |
117 | add %r21, %r20, %r20 /* increment space */ | 118 | add %r21, %r20, %r20 /* increment space */ |
118 | 119 | ||
119 | fitdone: | 120 | fitdone: |
@@ -128,7 +129,7 @@ fitdone: | |||
128 | LDREG DTLB_OFF_COUNT(%r1), %arg2 | 129 | LDREG DTLB_OFF_COUNT(%r1), %arg2 |
129 | LDREG DTLB_LOOP(%r1), %arg3 | 130 | LDREG DTLB_LOOP(%r1), %arg3 |
130 | 131 | ||
131 | ADDIB= -1, %arg3, fdtoneloop /* Preadjust and test */ | 132 | addib,COND(=) -1, %arg3, fdtoneloop /* Preadjust and test */ |
132 | movb,<,n %arg3, %r31, fdtdone /* If loop < 0, skip */ | 133 | movb,<,n %arg3, %r31, fdtdone /* If loop < 0, skip */ |
133 | copy %arg0, %r28 /* Init base addr */ | 134 | copy %arg0, %r28 /* Init base addr */ |
134 | 135 | ||
@@ -138,14 +139,14 @@ fdtmanyloop: /* Loop if LOOP >= 2 */ | |||
138 | copy %arg2, %r29 /* Init middle loop count */ | 139 | copy %arg2, %r29 /* Init middle loop count */ |
139 | 140 | ||
140 | fdtmanymiddle: /* Loop if LOOP >= 2 */ | 141 | fdtmanymiddle: /* Loop if LOOP >= 2 */ |
141 | ADDIB> -1, %r31, fdtmanymiddle /* Adjusted inner loop decr */ | 142 | addib,COND(>) -1, %r31, fdtmanymiddle /* Adjusted inner loop decr */ |
142 | pdtlbe 0(%sr1, %r28) | 143 | pdtlbe 0(%sr1, %r28) |
143 | pdtlbe,m %arg1(%sr1, %r28) /* Last pdtlbe and addr adjust */ | 144 | pdtlbe,m %arg1(%sr1, %r28) /* Last pdtlbe and addr adjust */ |
144 | ADDIB> -1, %r29, fdtmanymiddle /* Middle loop decr */ | 145 | addib,COND(>) -1, %r29, fdtmanymiddle /* Middle loop decr */ |
145 | copy %arg3, %r31 /* Re-init inner loop count */ | 146 | copy %arg3, %r31 /* Re-init inner loop count */ |
146 | 147 | ||
147 | movb,tr %arg0, %r28, fdtmanyloop /* Re-init base addr */ | 148 | movb,tr %arg0, %r28, fdtmanyloop /* Re-init base addr */ |
148 | ADDIB<=,n -1, %r22,fdtdone /* Outer loop count decr */ | 149 | addib,COND(<=),n -1, %r22,fdtdone /* Outer loop count decr */ |
149 | 150 | ||
150 | fdtoneloop: /* Loop if LOOP = 1 */ | 151 | fdtoneloop: /* Loop if LOOP = 1 */ |
151 | mtsp %r20, %sr1 | 152 | mtsp %r20, %sr1 |
@@ -153,10 +154,10 @@ fdtoneloop: /* Loop if LOOP = 1 */ | |||
153 | copy %arg2, %r29 /* init middle loop count */ | 154 | copy %arg2, %r29 /* init middle loop count */ |
154 | 155 | ||
155 | fdtonemiddle: /* Loop if LOOP = 1 */ | 156 | fdtonemiddle: /* Loop if LOOP = 1 */ |
156 | ADDIB> -1, %r29, fdtonemiddle /* Middle loop count decr */ | 157 | addib,COND(>) -1, %r29, fdtonemiddle /* Middle loop count decr */ |
157 | pdtlbe,m %arg1(%sr1, %r28) /* pdtlbe for one loop */ | 158 | pdtlbe,m %arg1(%sr1, %r28) /* pdtlbe for one loop */ |
158 | 159 | ||
159 | ADDIB> -1, %r22, fdtoneloop /* Outer loop count decr */ | 160 | addib,COND(>) -1, %r22, fdtoneloop /* Outer loop count decr */ |
160 | add %r21, %r20, %r20 /* increment space */ | 161 | add %r21, %r20, %r20 /* increment space */ |
161 | 162 | ||
162 | 163 | ||
@@ -209,18 +210,18 @@ ENTRY(flush_instruction_cache_local) | |||
209 | LDREG ICACHE_COUNT(%r1), %arg2 | 210 | LDREG ICACHE_COUNT(%r1), %arg2 |
210 | LDREG ICACHE_LOOP(%r1), %arg3 | 211 | LDREG ICACHE_LOOP(%r1), %arg3 |
211 | rsm PSW_SM_I, %r22 /* No mmgt ops during loop*/ | 212 | rsm PSW_SM_I, %r22 /* No mmgt ops during loop*/ |
212 | ADDIB= -1, %arg3, fioneloop /* Preadjust and test */ | 213 | addib,COND(=) -1, %arg3, fioneloop /* Preadjust and test */ |
213 | movb,<,n %arg3, %r31, fisync /* If loop < 0, do sync */ | 214 | movb,<,n %arg3, %r31, fisync /* If loop < 0, do sync */ |
214 | 215 | ||
215 | fimanyloop: /* Loop if LOOP >= 2 */ | 216 | fimanyloop: /* Loop if LOOP >= 2 */ |
216 | ADDIB> -1, %r31, fimanyloop /* Adjusted inner loop decr */ | 217 | addib,COND(>) -1, %r31, fimanyloop /* Adjusted inner loop decr */ |
217 | fice %r0(%sr1, %arg0) | 218 | fice %r0(%sr1, %arg0) |
218 | fice,m %arg1(%sr1, %arg0) /* Last fice and addr adjust */ | 219 | fice,m %arg1(%sr1, %arg0) /* Last fice and addr adjust */ |
219 | movb,tr %arg3, %r31, fimanyloop /* Re-init inner loop count */ | 220 | movb,tr %arg3, %r31, fimanyloop /* Re-init inner loop count */ |
220 | ADDIB<=,n -1, %arg2, fisync /* Outer loop decr */ | 221 | addib,COND(<=),n -1, %arg2, fisync /* Outer loop decr */ |
221 | 222 | ||
222 | fioneloop: /* Loop if LOOP = 1 */ | 223 | fioneloop: /* Loop if LOOP = 1 */ |
223 | ADDIB> -1, %arg2, fioneloop /* Outer loop count decr */ | 224 | addib,COND(>) -1, %arg2, fioneloop /* Outer loop count decr */ |
224 | fice,m %arg1(%sr1, %arg0) /* Fice for one loop */ | 225 | fice,m %arg1(%sr1, %arg0) /* Fice for one loop */ |
225 | 226 | ||
226 | fisync: | 227 | fisync: |
@@ -250,18 +251,18 @@ ENTRY(flush_data_cache_local) | |||
250 | LDREG DCACHE_COUNT(%r1), %arg2 | 251 | LDREG DCACHE_COUNT(%r1), %arg2 |
251 | LDREG DCACHE_LOOP(%r1), %arg3 | 252 | LDREG DCACHE_LOOP(%r1), %arg3 |
252 | rsm PSW_SM_I, %r22 | 253 | rsm PSW_SM_I, %r22 |
253 | ADDIB= -1, %arg3, fdoneloop /* Preadjust and test */ | 254 | addib,COND(=) -1, %arg3, fdoneloop /* Preadjust and test */ |
254 | movb,<,n %arg3, %r31, fdsync /* If loop < 0, do sync */ | 255 | movb,<,n %arg3, %r31, fdsync /* If loop < 0, do sync */ |
255 | 256 | ||
256 | fdmanyloop: /* Loop if LOOP >= 2 */ | 257 | fdmanyloop: /* Loop if LOOP >= 2 */ |
257 | ADDIB> -1, %r31, fdmanyloop /* Adjusted inner loop decr */ | 258 | addib,COND(>) -1, %r31, fdmanyloop /* Adjusted inner loop decr */ |
258 | fdce %r0(%sr1, %arg0) | 259 | fdce %r0(%sr1, %arg0) |
259 | fdce,m %arg1(%sr1, %arg0) /* Last fdce and addr adjust */ | 260 | fdce,m %arg1(%sr1, %arg0) /* Last fdce and addr adjust */ |
260 | movb,tr %arg3, %r31, fdmanyloop /* Re-init inner loop count */ | 261 | movb,tr %arg3, %r31, fdmanyloop /* Re-init inner loop count */ |
261 | ADDIB<=,n -1, %arg2, fdsync /* Outer loop decr */ | 262 | addib,COND(<=),n -1, %arg2, fdsync /* Outer loop decr */ |
262 | 263 | ||
263 | fdoneloop: /* Loop if LOOP = 1 */ | 264 | fdoneloop: /* Loop if LOOP = 1 */ |
264 | ADDIB> -1, %arg2, fdoneloop /* Outer loop count decr */ | 265 | addib,COND(>) -1, %arg2, fdoneloop /* Outer loop count decr */ |
265 | fdce,m %arg1(%sr1, %arg0) /* Fdce for one loop */ | 266 | fdce,m %arg1(%sr1, %arg0) /* Fdce for one loop */ |
266 | 267 | ||
267 | fdsync: | 268 | fdsync: |
@@ -342,7 +343,7 @@ ENTRY(copy_user_page_asm) | |||
342 | * non-taken backward branch. Note that .+4 is a backwards branch. | 343 | * non-taken backward branch. Note that .+4 is a backwards branch. |
343 | * The ldd should only get executed if the branch is taken. | 344 | * The ldd should only get executed if the branch is taken. |
344 | */ | 345 | */ |
345 | ADDIB>,n -1, %r1, 1b /* bundle 10 */ | 346 | addib,COND(>),n -1, %r1, 1b /* bundle 10 */ |
346 | ldd 0(%r25), %r19 /* start next loads */ | 347 | ldd 0(%r25), %r19 /* start next loads */ |
347 | 348 | ||
348 | #else | 349 | #else |
@@ -391,7 +392,7 @@ ENTRY(copy_user_page_asm) | |||
391 | stw %r21, 56(%r26) | 392 | stw %r21, 56(%r26) |
392 | stw %r22, 60(%r26) | 393 | stw %r22, 60(%r26) |
393 | ldo 64(%r26), %r26 | 394 | ldo 64(%r26), %r26 |
394 | ADDIB>,n -1, %r1, 1b | 395 | addib,COND(>),n -1, %r1, 1b |
395 | ldw 0(%r25), %r19 | 396 | ldw 0(%r25), %r19 |
396 | #endif | 397 | #endif |
397 | bv %r0(%r2) | 398 | bv %r0(%r2) |
@@ -515,7 +516,7 @@ ENTRY(copy_user_page_asm) | |||
515 | stw %r21, 56(%r28) | 516 | stw %r21, 56(%r28) |
516 | stw %r22, 60(%r28) | 517 | stw %r22, 60(%r28) |
517 | ldo 64(%r28), %r28 | 518 | ldo 64(%r28), %r28 |
518 | ADDIB> -1, %r1,1b | 519 | addib,COND(>) -1, %r1,1b |
519 | ldo 64(%r29), %r29 | 520 | ldo 64(%r29), %r29 |
520 | 521 | ||
521 | bv %r0(%r2) | 522 | bv %r0(%r2) |
@@ -574,7 +575,7 @@ ENTRY(__clear_user_page_asm) | |||
574 | std %r0, 104(%r28) | 575 | std %r0, 104(%r28) |
575 | std %r0, 112(%r28) | 576 | std %r0, 112(%r28) |
576 | std %r0, 120(%r28) | 577 | std %r0, 120(%r28) |
577 | ADDIB> -1, %r1, 1b | 578 | addib,COND(>) -1, %r1, 1b |
578 | ldo 128(%r28), %r28 | 579 | ldo 128(%r28), %r28 |
579 | 580 | ||
580 | #else /* ! CONFIG_64BIT */ | 581 | #else /* ! CONFIG_64BIT */ |
@@ -597,7 +598,7 @@ ENTRY(__clear_user_page_asm) | |||
597 | stw %r0, 52(%r28) | 598 | stw %r0, 52(%r28) |
598 | stw %r0, 56(%r28) | 599 | stw %r0, 56(%r28) |
599 | stw %r0, 60(%r28) | 600 | stw %r0, 60(%r28) |
600 | ADDIB> -1, %r1, 1b | 601 | addib,COND(>) -1, %r1, 1b |
601 | ldo 64(%r28), %r28 | 602 | ldo 64(%r28), %r28 |
602 | #endif /* CONFIG_64BIT */ | 603 | #endif /* CONFIG_64BIT */ |
603 | 604 | ||
@@ -640,7 +641,7 @@ ENTRY(flush_kernel_dcache_page_asm) | |||
640 | fdc,m %r23(%r26) | 641 | fdc,m %r23(%r26) |
641 | fdc,m %r23(%r26) | 642 | fdc,m %r23(%r26) |
642 | fdc,m %r23(%r26) | 643 | fdc,m %r23(%r26) |
643 | CMPB<< %r26, %r25,1b | 644 | cmpb,COND(<<) %r26, %r25,1b |
644 | fdc,m %r23(%r26) | 645 | fdc,m %r23(%r26) |
645 | 646 | ||
646 | sync | 647 | sync |
@@ -683,7 +684,7 @@ ENTRY(flush_user_dcache_page) | |||
683 | fdc,m %r23(%sr3, %r26) | 684 | fdc,m %r23(%sr3, %r26) |
684 | fdc,m %r23(%sr3, %r26) | 685 | fdc,m %r23(%sr3, %r26) |
685 | fdc,m %r23(%sr3, %r26) | 686 | fdc,m %r23(%sr3, %r26) |
686 | CMPB<< %r26, %r25,1b | 687 | cmpb,COND(<<) %r26, %r25,1b |
687 | fdc,m %r23(%sr3, %r26) | 688 | fdc,m %r23(%sr3, %r26) |
688 | 689 | ||
689 | sync | 690 | sync |
@@ -726,7 +727,7 @@ ENTRY(flush_user_icache_page) | |||
726 | fic,m %r23(%sr3, %r26) | 727 | fic,m %r23(%sr3, %r26) |
727 | fic,m %r23(%sr3, %r26) | 728 | fic,m %r23(%sr3, %r26) |
728 | fic,m %r23(%sr3, %r26) | 729 | fic,m %r23(%sr3, %r26) |
729 | CMPB<< %r26, %r25,1b | 730 | cmpb,COND(<<) %r26, %r25,1b |
730 | fic,m %r23(%sr3, %r26) | 731 | fic,m %r23(%sr3, %r26) |
731 | 732 | ||
732 | sync | 733 | sync |
@@ -769,7 +770,7 @@ ENTRY(purge_kernel_dcache_page) | |||
769 | pdc,m %r23(%r26) | 770 | pdc,m %r23(%r26) |
770 | pdc,m %r23(%r26) | 771 | pdc,m %r23(%r26) |
771 | pdc,m %r23(%r26) | 772 | pdc,m %r23(%r26) |
772 | CMPB<< %r26, %r25, 1b | 773 | cmpb,COND(<<) %r26, %r25, 1b |
773 | pdc,m %r23(%r26) | 774 | pdc,m %r23(%r26) |
774 | 775 | ||
775 | sync | 776 | sync |
@@ -833,7 +834,7 @@ ENTRY(flush_alias_page) | |||
833 | fdc,m %r23(%r28) | 834 | fdc,m %r23(%r28) |
834 | fdc,m %r23(%r28) | 835 | fdc,m %r23(%r28) |
835 | fdc,m %r23(%r28) | 836 | fdc,m %r23(%r28) |
836 | CMPB<< %r28, %r29, 1b | 837 | cmpb,COND(<<) %r28, %r29, 1b |
837 | fdc,m %r23(%r28) | 838 | fdc,m %r23(%r28) |
838 | 839 | ||
839 | sync | 840 | sync |
@@ -856,7 +857,7 @@ flush_user_dcache_range_asm: | |||
856 | ldo -1(%r23), %r21 | 857 | ldo -1(%r23), %r21 |
857 | ANDCM %r26, %r21, %r26 | 858 | ANDCM %r26, %r21, %r26 |
858 | 859 | ||
859 | 1: CMPB<<,n %r26, %r25, 1b | 860 | 1: cmpb,COND(<<),n %r26, %r25, 1b |
860 | fdc,m %r23(%sr3, %r26) | 861 | fdc,m %r23(%sr3, %r26) |
861 | 862 | ||
862 | sync | 863 | sync |
@@ -877,7 +878,7 @@ ENTRY(flush_kernel_dcache_range_asm) | |||
877 | ldo -1(%r23), %r21 | 878 | ldo -1(%r23), %r21 |
878 | ANDCM %r26, %r21, %r26 | 879 | ANDCM %r26, %r21, %r26 |
879 | 880 | ||
880 | 1: CMPB<<,n %r26, %r25,1b | 881 | 1: cmpb,COND(<<),n %r26, %r25,1b |
881 | fdc,m %r23(%r26) | 882 | fdc,m %r23(%r26) |
882 | 883 | ||
883 | sync | 884 | sync |
@@ -899,7 +900,7 @@ ENTRY(flush_user_icache_range_asm) | |||
899 | ldo -1(%r23), %r21 | 900 | ldo -1(%r23), %r21 |
900 | ANDCM %r26, %r21, %r26 | 901 | ANDCM %r26, %r21, %r26 |
901 | 902 | ||
902 | 1: CMPB<<,n %r26, %r25,1b | 903 | 1: cmpb,COND(<<),n %r26, %r25,1b |
903 | fic,m %r23(%sr3, %r26) | 904 | fic,m %r23(%sr3, %r26) |
904 | 905 | ||
905 | sync | 906 | sync |
@@ -942,7 +943,7 @@ ENTRY(flush_kernel_icache_page) | |||
942 | fic,m %r23(%sr4, %r26) | 943 | fic,m %r23(%sr4, %r26) |
943 | fic,m %r23(%sr4, %r26) | 944 | fic,m %r23(%sr4, %r26) |
944 | fic,m %r23(%sr4, %r26) | 945 | fic,m %r23(%sr4, %r26) |
945 | CMPB<< %r26, %r25, 1b | 946 | cmpb,COND(<<) %r26, %r25, 1b |
946 | fic,m %r23(%sr4, %r26) | 947 | fic,m %r23(%sr4, %r26) |
947 | 948 | ||
948 | sync | 949 | sync |
@@ -963,7 +964,7 @@ ENTRY(flush_kernel_icache_range_asm) | |||
963 | ldo -1(%r23), %r21 | 964 | ldo -1(%r23), %r21 |
964 | ANDCM %r26, %r21, %r26 | 965 | ANDCM %r26, %r21, %r26 |
965 | 966 | ||
966 | 1: CMPB<<,n %r26, %r25, 1b | 967 | 1: cmpb,COND(<<),n %r26, %r25, 1b |
967 | fic,m %r23(%sr4, %r26) | 968 | fic,m %r23(%sr4, %r26) |
968 | 969 | ||
969 | sync | 970 | sync |
diff --git a/arch/parisc/kernel/perf_asm.S b/arch/parisc/kernel/perf_asm.S index 43874ca3ed67..d411dfb5b6d1 100644 --- a/arch/parisc/kernel/perf_asm.S +++ b/arch/parisc/kernel/perf_asm.S | |||
@@ -20,6 +20,8 @@ | |||
20 | */ | 20 | */ |
21 | 21 | ||
22 | #include <asm/assembly.h> | 22 | #include <asm/assembly.h> |
23 | |||
24 | #include <linux/init.h> | ||
23 | #include <linux/linkage.h> | 25 | #include <linux/linkage.h> |
24 | 26 | ||
25 | #ifdef CONFIG_64BIT | 27 | #ifdef CONFIG_64BIT |
@@ -41,7 +43,7 @@ | |||
41 | ; The coprocessor only needs to be enabled when | 43 | ; The coprocessor only needs to be enabled when |
42 | ; starting/stopping the coprocessor with the pmenb/pmdis. | 44 | ; starting/stopping the coprocessor with the pmenb/pmdis. |
43 | ; | 45 | ; |
44 | .text | 46 | __HEAD |
45 | 47 | ||
46 | ENTRY(perf_intrigue_enable_perf_counters) | 48 | ENTRY(perf_intrigue_enable_perf_counters) |
47 | .proc | 49 | .proc |
diff --git a/arch/parisc/kernel/real2.S b/arch/parisc/kernel/real2.S index 7a92695d95a6..47fbdae6efd5 100644 --- a/arch/parisc/kernel/real2.S +++ b/arch/parisc/kernel/real2.S | |||
@@ -12,6 +12,7 @@ | |||
12 | #include <asm/assembly.h> | 12 | #include <asm/assembly.h> |
13 | 13 | ||
14 | #include <linux/linkage.h> | 14 | #include <linux/linkage.h> |
15 | #include <linux/init.h> | ||
15 | 16 | ||
16 | .section .bss | 17 | .section .bss |
17 | .export real_stack | 18 | .export real_stack |
@@ -39,7 +40,7 @@ save_cr_end: | |||
39 | /************************ 32-bit real-mode calls ***********************/ | 40 | /************************ 32-bit real-mode calls ***********************/ |
40 | /* This can be called in both narrow and wide kernels */ | 41 | /* This can be called in both narrow and wide kernels */ |
41 | 42 | ||
42 | .text | 43 | __HEAD |
43 | 44 | ||
44 | /* unsigned long real32_call_asm(unsigned int *sp, | 45 | /* unsigned long real32_call_asm(unsigned int *sp, |
45 | * unsigned int *arg0p, | 46 | * unsigned int *arg0p, |
@@ -113,7 +114,7 @@ ENDPROC(real32_call_asm) | |||
113 | # define PUSH_CR(r, where) mfctl r, %r1 ! STREG,ma %r1, REG_SZ(where) | 114 | # define PUSH_CR(r, where) mfctl r, %r1 ! STREG,ma %r1, REG_SZ(where) |
114 | # define POP_CR(r, where) LDREG,mb -REG_SZ(where), %r1 ! mtctl %r1, r | 115 | # define POP_CR(r, where) LDREG,mb -REG_SZ(where), %r1 ! mtctl %r1, r |
115 | 116 | ||
116 | .text | 117 | __HEAD |
117 | save_control_regs: | 118 | save_control_regs: |
118 | load32 PA(save_cr_space), %r28 | 119 | load32 PA(save_cr_space), %r28 |
119 | PUSH_CR(%cr24, %r28) | 120 | PUSH_CR(%cr24, %r28) |
@@ -145,7 +146,7 @@ restore_control_regs: | |||
145 | /* rfi_virt2real() and rfi_real2virt() could perhaps be adapted for | 146 | /* rfi_virt2real() and rfi_real2virt() could perhaps be adapted for |
146 | * more general-purpose use by the several places which need RFIs | 147 | * more general-purpose use by the several places which need RFIs |
147 | */ | 148 | */ |
148 | .text | 149 | __HEAD |
149 | .align 128 | 150 | .align 128 |
150 | rfi_virt2real: | 151 | rfi_virt2real: |
151 | /* switch to real mode... */ | 152 | /* switch to real mode... */ |
@@ -180,7 +181,7 @@ rfi_v2r_1: | |||
180 | bv 0(%r2) | 181 | bv 0(%r2) |
181 | nop | 182 | nop |
182 | 183 | ||
183 | .text | 184 | __HEAD |
184 | .align 128 | 185 | .align 128 |
185 | rfi_real2virt: | 186 | rfi_real2virt: |
186 | rsm PSW_SM_I,%r0 | 187 | rsm PSW_SM_I,%r0 |
@@ -218,7 +219,7 @@ rfi_r2v_1: | |||
218 | 219 | ||
219 | /************************ 64-bit real-mode calls ***********************/ | 220 | /************************ 64-bit real-mode calls ***********************/ |
220 | /* This is only usable in wide kernels right now and will probably stay so */ | 221 | /* This is only usable in wide kernels right now and will probably stay so */ |
221 | .text | 222 | __HEAD |
222 | /* unsigned long real64_call_asm(unsigned long *sp, | 223 | /* unsigned long real64_call_asm(unsigned long *sp, |
223 | * unsigned long *arg0p, | 224 | * unsigned long *arg0p, |
224 | * unsigned long fn) | 225 | * unsigned long fn) |
@@ -276,7 +277,7 @@ ENDPROC(real64_call_asm) | |||
276 | 277 | ||
277 | #endif | 278 | #endif |
278 | 279 | ||
279 | .text | 280 | __HEAD |
280 | /* http://lists.parisc-linux.org/hypermail/parisc-linux/10916.html | 281 | /* http://lists.parisc-linux.org/hypermail/parisc-linux/10916.html |
281 | ** GCC 3.3 and later has a new function in libgcc.a for | 282 | ** GCC 3.3 and later has a new function in libgcc.a for |
282 | ** comparing function pointers. | 283 | ** comparing function pointers. |
diff --git a/arch/parisc/kernel/syscall.S b/arch/parisc/kernel/syscall.S index 69b6eebc466e..ae509d8cd03f 100644 --- a/arch/parisc/kernel/syscall.S +++ b/arch/parisc/kernel/syscall.S | |||
@@ -17,6 +17,7 @@ | |||
17 | #include <asm/processor.h> | 17 | #include <asm/processor.h> |
18 | 18 | ||
19 | #include <linux/linkage.h> | 19 | #include <linux/linkage.h> |
20 | #include <linux/init.h> | ||
20 | 21 | ||
21 | /* We fill the empty parts of the gateway page with | 22 | /* We fill the empty parts of the gateway page with |
22 | * something that will kill the kernel or a | 23 | * something that will kill the kernel or a |
@@ -26,7 +27,7 @@ | |||
26 | 27 | ||
27 | .level LEVEL | 28 | .level LEVEL |
28 | 29 | ||
29 | .text | 30 | __HEAD |
30 | 31 | ||
31 | .import syscall_exit,code | 32 | .import syscall_exit,code |
32 | .import syscall_exit_rfi,code | 33 | .import syscall_exit_rfi,code |
@@ -636,7 +637,7 @@ END(sys_call_table64) | |||
636 | All light-weight-syscall atomic operations | 637 | All light-weight-syscall atomic operations |
637 | will use this set of locks | 638 | will use this set of locks |
638 | */ | 639 | */ |
639 | .section .data | 640 | .section .data, "aw" |
640 | .align PAGE_SIZE | 641 | .align PAGE_SIZE |
641 | ENTRY(lws_lock_start) | 642 | ENTRY(lws_lock_start) |
642 | /* lws locks */ | 643 | /* lws locks */ |
diff --git a/arch/parisc/kernel/traps.c b/arch/parisc/kernel/traps.c index 9dc6dc42f9cf..675f1d098f05 100644 --- a/arch/parisc/kernel/traps.c +++ b/arch/parisc/kernel/traps.c | |||
@@ -275,7 +275,7 @@ KERN_CRIT " || ||\n"); | |||
275 | 275 | ||
276 | /* Wot's wrong wif bein' racy? */ | 276 | /* Wot's wrong wif bein' racy? */ |
277 | if (current->thread.flags & PARISC_KERNEL_DEATH) { | 277 | if (current->thread.flags & PARISC_KERNEL_DEATH) { |
278 | printk(KERN_CRIT "%s() recursion detected.\n", __FUNCTION__); | 278 | printk(KERN_CRIT "%s() recursion detected.\n", __func__); |
279 | local_irq_enable(); | 279 | local_irq_enable(); |
280 | while (1); | 280 | while (1); |
281 | } | 281 | } |
diff --git a/arch/parisc/kernel/unaligned.c b/arch/parisc/kernel/unaligned.c index aebf3c168871..e6f4b7a4b7e3 100644 --- a/arch/parisc/kernel/unaligned.c +++ b/arch/parisc/kernel/unaligned.c | |||
@@ -30,7 +30,7 @@ | |||
30 | /* #define DEBUG_UNALIGNED 1 */ | 30 | /* #define DEBUG_UNALIGNED 1 */ |
31 | 31 | ||
32 | #ifdef DEBUG_UNALIGNED | 32 | #ifdef DEBUG_UNALIGNED |
33 | #define DPRINTF(fmt, args...) do { printk(KERN_DEBUG "%s:%d:%s ", __FILE__, __LINE__, __FUNCTION__ ); printk(KERN_DEBUG fmt, ##args ); } while (0) | 33 | #define DPRINTF(fmt, args...) do { printk(KERN_DEBUG "%s:%d:%s ", __FILE__, __LINE__, __func__ ); printk(KERN_DEBUG fmt, ##args ); } while (0) |
34 | #else | 34 | #else |
35 | #define DPRINTF(fmt, args...) | 35 | #define DPRINTF(fmt, args...) |
36 | #endif | 36 | #endif |
@@ -460,7 +460,8 @@ void handle_unaligned(struct pt_regs *regs) | |||
460 | goto force_sigbus; | 460 | goto force_sigbus; |
461 | } | 461 | } |
462 | 462 | ||
463 | if (unaligned_count > 5 && jiffies - last_time > 5*HZ) { | 463 | if (unaligned_count > 5 && |
464 | time_after(jiffies, last_time + 5 * HZ)) { | ||
464 | unaligned_count = 0; | 465 | unaligned_count = 0; |
465 | last_time = jiffies; | 466 | last_time = jiffies; |
466 | } | 467 | } |
diff --git a/arch/parisc/lib/fixup.S b/arch/parisc/lib/fixup.S index d172d4245cdc..4821ad6d5269 100644 --- a/arch/parisc/lib/fixup.S +++ b/arch/parisc/lib/fixup.S | |||
@@ -23,6 +23,7 @@ | |||
23 | #include <asm/assembly.h> | 23 | #include <asm/assembly.h> |
24 | #include <asm/errno.h> | 24 | #include <asm/errno.h> |
25 | #include <linux/linkage.h> | 25 | #include <linux/linkage.h> |
26 | #include <linux/init.h> | ||
26 | 27 | ||
27 | #ifdef CONFIG_SMP | 28 | #ifdef CONFIG_SMP |
28 | .macro get_fault_ip t1 t2 | 29 | .macro get_fault_ip t1 t2 |
@@ -55,7 +56,7 @@ | |||
55 | 56 | ||
56 | .level LEVEL | 57 | .level LEVEL |
57 | 58 | ||
58 | .text | 59 | __HEAD |
59 | .section .fixup, "ax" | 60 | .section .fixup, "ax" |
60 | 61 | ||
61 | /* get_user() fixups, store -EFAULT in r8, and 0 in r9 */ | 62 | /* get_user() fixups, store -EFAULT in r8, and 0 in r9 */ |
diff --git a/arch/parisc/lib/lusercopy.S b/arch/parisc/lib/lusercopy.S index 1bd23ccec17b..b0d885350846 100644 --- a/arch/parisc/lib/lusercopy.S +++ b/arch/parisc/lib/lusercopy.S | |||
@@ -33,11 +33,12 @@ | |||
33 | */ | 33 | */ |
34 | 34 | ||
35 | 35 | ||
36 | .text | ||
37 | |||
38 | #include <asm/assembly.h> | 36 | #include <asm/assembly.h> |
39 | #include <asm/errno.h> | 37 | #include <asm/errno.h> |
40 | #include <linux/linkage.h> | 38 | #include <linux/linkage.h> |
39 | #include <linux/init.h> | ||
40 | |||
41 | __HEAD | ||
41 | 42 | ||
42 | /* | 43 | /* |
43 | * get_sr gets the appropriate space value into | 44 | * get_sr gets the appropriate space value into |
diff --git a/arch/parisc/lib/memcpy.c b/arch/parisc/lib/memcpy.c index d22042d33100..2d68431fc22e 100644 --- a/arch/parisc/lib/memcpy.c +++ b/arch/parisc/lib/memcpy.c | |||
@@ -91,7 +91,7 @@ DECLARE_PER_CPU(struct exception_data, exception_data); | |||
91 | #define THRESHOLD 16 | 91 | #define THRESHOLD 16 |
92 | 92 | ||
93 | #ifdef DEBUG_MEMCPY | 93 | #ifdef DEBUG_MEMCPY |
94 | #define DPRINTF(fmt, args...) do { printk(KERN_DEBUG "%s:%d:%s ", __FILE__, __LINE__, __FUNCTION__ ); printk(KERN_DEBUG fmt, ##args ); } while (0) | 94 | #define DPRINTF(fmt, args...) do { printk(KERN_DEBUG "%s:%d:%s ", __FILE__, __LINE__, __func__ ); printk(KERN_DEBUG fmt, ##args ); } while (0) |
95 | #else | 95 | #else |
96 | #define DPRINTF(fmt, args...) | 96 | #define DPRINTF(fmt, args...) |
97 | #endif | 97 | #endif |
diff --git a/arch/parisc/mm/init.c b/arch/parisc/mm/init.c index 1f012843150f..78fe252b92c3 100644 --- a/arch/parisc/mm/init.c +++ b/arch/parisc/mm/init.c | |||
@@ -555,8 +555,6 @@ void show_mem(void) | |||
555 | 555 | ||
556 | printk(KERN_INFO "Mem-info:\n"); | 556 | printk(KERN_INFO "Mem-info:\n"); |
557 | show_free_areas(); | 557 | show_free_areas(); |
558 | printk(KERN_INFO "Free swap: %6ldkB\n", | ||
559 | nr_swap_pages<<(PAGE_SHIFT-10)); | ||
560 | #ifndef CONFIG_DISCONTIGMEM | 558 | #ifndef CONFIG_DISCONTIGMEM |
561 | i = max_mapnr; | 559 | i = max_mapnr; |
562 | while (i-- > 0) { | 560 | while (i-- > 0) { |
@@ -606,7 +604,7 @@ void show_mem(void) | |||
606 | int i, j; | 604 | int i, j; |
607 | 605 | ||
608 | for (i = 0; i < npmem_ranges; i++) { | 606 | for (i = 0; i < npmem_ranges; i++) { |
609 | zl = node_zonelist(i); | 607 | zl = node_zonelist(i, 0); |
610 | for (j = 0; j < MAX_NR_ZONES; j++) { | 608 | for (j = 0; j < MAX_NR_ZONES; j++) { |
611 | struct zoneref *z; | 609 | struct zoneref *z; |
612 | struct zone *zone; | 610 | struct zone *zone; |
diff --git a/arch/powerpc/mm/hash_utils_64.c b/arch/powerpc/mm/hash_utils_64.c index 05f955f8df35..bf5b6d7ed30f 100644 --- a/arch/powerpc/mm/hash_utils_64.c +++ b/arch/powerpc/mm/hash_utils_64.c | |||
@@ -94,6 +94,9 @@ unsigned long htab_hash_mask; | |||
94 | int mmu_linear_psize = MMU_PAGE_4K; | 94 | int mmu_linear_psize = MMU_PAGE_4K; |
95 | int mmu_virtual_psize = MMU_PAGE_4K; | 95 | int mmu_virtual_psize = MMU_PAGE_4K; |
96 | int mmu_vmalloc_psize = MMU_PAGE_4K; | 96 | int mmu_vmalloc_psize = MMU_PAGE_4K; |
97 | #ifdef CONFIG_SPARSEMEM_VMEMMAP | ||
98 | int mmu_vmemmap_psize = MMU_PAGE_4K; | ||
99 | #endif | ||
97 | int mmu_io_psize = MMU_PAGE_4K; | 100 | int mmu_io_psize = MMU_PAGE_4K; |
98 | int mmu_kernel_ssize = MMU_SEGSIZE_256M; | 101 | int mmu_kernel_ssize = MMU_SEGSIZE_256M; |
99 | int mmu_highuser_ssize = MMU_SEGSIZE_256M; | 102 | int mmu_highuser_ssize = MMU_SEGSIZE_256M; |
@@ -387,11 +390,32 @@ static void __init htab_init_page_sizes(void) | |||
387 | } | 390 | } |
388 | #endif /* CONFIG_PPC_64K_PAGES */ | 391 | #endif /* CONFIG_PPC_64K_PAGES */ |
389 | 392 | ||
393 | #ifdef CONFIG_SPARSEMEM_VMEMMAP | ||
394 | /* We try to use 16M pages for vmemmap if that is supported | ||
395 | * and we have at least 1G of RAM at boot | ||
396 | */ | ||
397 | if (mmu_psize_defs[MMU_PAGE_16M].shift && | ||
398 | lmb_phys_mem_size() >= 0x40000000) | ||
399 | mmu_vmemmap_psize = MMU_PAGE_16M; | ||
400 | else if (mmu_psize_defs[MMU_PAGE_64K].shift) | ||
401 | mmu_vmemmap_psize = MMU_PAGE_64K; | ||
402 | else | ||
403 | mmu_vmemmap_psize = MMU_PAGE_4K; | ||
404 | #endif /* CONFIG_SPARSEMEM_VMEMMAP */ | ||
405 | |||
390 | printk(KERN_DEBUG "Page orders: linear mapping = %d, " | 406 | printk(KERN_DEBUG "Page orders: linear mapping = %d, " |
391 | "virtual = %d, io = %d\n", | 407 | "virtual = %d, io = %d" |
408 | #ifdef CONFIG_SPARSEMEM_VMEMMAP | ||
409 | ", vmemmap = %d" | ||
410 | #endif | ||
411 | "\n", | ||
392 | mmu_psize_defs[mmu_linear_psize].shift, | 412 | mmu_psize_defs[mmu_linear_psize].shift, |
393 | mmu_psize_defs[mmu_virtual_psize].shift, | 413 | mmu_psize_defs[mmu_virtual_psize].shift, |
394 | mmu_psize_defs[mmu_io_psize].shift); | 414 | mmu_psize_defs[mmu_io_psize].shift |
415 | #ifdef CONFIG_SPARSEMEM_VMEMMAP | ||
416 | ,mmu_psize_defs[mmu_vmemmap_psize].shift | ||
417 | #endif | ||
418 | ); | ||
395 | 419 | ||
396 | #ifdef CONFIG_HUGETLB_PAGE | 420 | #ifdef CONFIG_HUGETLB_PAGE |
397 | /* Init large page size. Currently, we pick 16M or 1M depending | 421 | /* Init large page size. Currently, we pick 16M or 1M depending |
diff --git a/arch/powerpc/mm/init_64.c b/arch/powerpc/mm/init_64.c index 1e52e97d7409..6ef63caca682 100644 --- a/arch/powerpc/mm/init_64.c +++ b/arch/powerpc/mm/init_64.c | |||
@@ -19,6 +19,8 @@ | |||
19 | * | 19 | * |
20 | */ | 20 | */ |
21 | 21 | ||
22 | #undef DEBUG | ||
23 | |||
22 | #include <linux/signal.h> | 24 | #include <linux/signal.h> |
23 | #include <linux/sched.h> | 25 | #include <linux/sched.h> |
24 | #include <linux/kernel.h> | 26 | #include <linux/kernel.h> |
@@ -208,12 +210,12 @@ static int __meminit vmemmap_populated(unsigned long start, int page_size) | |||
208 | } | 210 | } |
209 | 211 | ||
210 | int __meminit vmemmap_populate(struct page *start_page, | 212 | int __meminit vmemmap_populate(struct page *start_page, |
211 | unsigned long nr_pages, int node) | 213 | unsigned long nr_pages, int node) |
212 | { | 214 | { |
213 | unsigned long mode_rw; | 215 | unsigned long mode_rw; |
214 | unsigned long start = (unsigned long)start_page; | 216 | unsigned long start = (unsigned long)start_page; |
215 | unsigned long end = (unsigned long)(start_page + nr_pages); | 217 | unsigned long end = (unsigned long)(start_page + nr_pages); |
216 | unsigned long page_size = 1 << mmu_psize_defs[mmu_linear_psize].shift; | 218 | unsigned long page_size = 1 << mmu_psize_defs[mmu_vmemmap_psize].shift; |
217 | 219 | ||
218 | mode_rw = _PAGE_ACCESSED | _PAGE_DIRTY | _PAGE_COHERENT | PP_RWXX; | 220 | mode_rw = _PAGE_ACCESSED | _PAGE_DIRTY | _PAGE_COHERENT | PP_RWXX; |
219 | 221 | ||
@@ -235,11 +237,11 @@ int __meminit vmemmap_populate(struct page *start_page, | |||
235 | start, p, __pa(p)); | 237 | start, p, __pa(p)); |
236 | 238 | ||
237 | mapped = htab_bolt_mapping(start, start + page_size, | 239 | mapped = htab_bolt_mapping(start, start + page_size, |
238 | __pa(p), mode_rw, mmu_linear_psize, | 240 | __pa(p), mode_rw, mmu_vmemmap_psize, |
239 | mmu_kernel_ssize); | 241 | mmu_kernel_ssize); |
240 | BUG_ON(mapped < 0); | 242 | BUG_ON(mapped < 0); |
241 | } | 243 | } |
242 | 244 | ||
243 | return 0; | 245 | return 0; |
244 | } | 246 | } |
245 | #endif | 247 | #endif /* CONFIG_SPARSEMEM_VMEMMAP */ |
diff --git a/arch/powerpc/mm/slb.c b/arch/powerpc/mm/slb.c index cf8705e32d60..89497fb04280 100644 --- a/arch/powerpc/mm/slb.c +++ b/arch/powerpc/mm/slb.c | |||
@@ -28,7 +28,7 @@ | |||
28 | #include <asm/udbg.h> | 28 | #include <asm/udbg.h> |
29 | 29 | ||
30 | #ifdef DEBUG | 30 | #ifdef DEBUG |
31 | #define DBG(fmt...) udbg_printf(fmt) | 31 | #define DBG(fmt...) printk(fmt) |
32 | #else | 32 | #else |
33 | #define DBG pr_debug | 33 | #define DBG pr_debug |
34 | #endif | 34 | #endif |
@@ -263,13 +263,19 @@ void slb_initialize(void) | |||
263 | extern unsigned int *slb_miss_kernel_load_linear; | 263 | extern unsigned int *slb_miss_kernel_load_linear; |
264 | extern unsigned int *slb_miss_kernel_load_io; | 264 | extern unsigned int *slb_miss_kernel_load_io; |
265 | extern unsigned int *slb_compare_rr_to_size; | 265 | extern unsigned int *slb_compare_rr_to_size; |
266 | #ifdef CONFIG_SPARSEMEM_VMEMMAP | ||
267 | extern unsigned int *slb_miss_kernel_load_vmemmap; | ||
268 | unsigned long vmemmap_llp; | ||
269 | #endif | ||
266 | 270 | ||
267 | /* Prepare our SLB miss handler based on our page size */ | 271 | /* Prepare our SLB miss handler based on our page size */ |
268 | linear_llp = mmu_psize_defs[mmu_linear_psize].sllp; | 272 | linear_llp = mmu_psize_defs[mmu_linear_psize].sllp; |
269 | io_llp = mmu_psize_defs[mmu_io_psize].sllp; | 273 | io_llp = mmu_psize_defs[mmu_io_psize].sllp; |
270 | vmalloc_llp = mmu_psize_defs[mmu_vmalloc_psize].sllp; | 274 | vmalloc_llp = mmu_psize_defs[mmu_vmalloc_psize].sllp; |
271 | get_paca()->vmalloc_sllp = SLB_VSID_KERNEL | vmalloc_llp; | 275 | get_paca()->vmalloc_sllp = SLB_VSID_KERNEL | vmalloc_llp; |
272 | 276 | #ifdef CONFIG_SPARSEMEM_VMEMMAP | |
277 | vmemmap_llp = mmu_psize_defs[mmu_vmemmap_psize].sllp; | ||
278 | #endif | ||
273 | if (!slb_encoding_inited) { | 279 | if (!slb_encoding_inited) { |
274 | slb_encoding_inited = 1; | 280 | slb_encoding_inited = 1; |
275 | patch_slb_encoding(slb_miss_kernel_load_linear, | 281 | patch_slb_encoding(slb_miss_kernel_load_linear, |
@@ -281,6 +287,12 @@ void slb_initialize(void) | |||
281 | 287 | ||
282 | DBG("SLB: linear LLP = %04lx\n", linear_llp); | 288 | DBG("SLB: linear LLP = %04lx\n", linear_llp); |
283 | DBG("SLB: io LLP = %04lx\n", io_llp); | 289 | DBG("SLB: io LLP = %04lx\n", io_llp); |
290 | |||
291 | #ifdef CONFIG_SPARSEMEM_VMEMMAP | ||
292 | patch_slb_encoding(slb_miss_kernel_load_vmemmap, | ||
293 | SLB_VSID_KERNEL | vmemmap_llp); | ||
294 | DBG("SLB: vmemmap LLP = %04lx\n", vmemmap_llp); | ||
295 | #endif | ||
284 | } | 296 | } |
285 | 297 | ||
286 | get_paca()->stab_rr = SLB_NUM_BOLTED; | 298 | get_paca()->stab_rr = SLB_NUM_BOLTED; |
diff --git a/arch/powerpc/mm/slb_low.S b/arch/powerpc/mm/slb_low.S index 657f6b37e9df..bc44dc4b5c67 100644 --- a/arch/powerpc/mm/slb_low.S +++ b/arch/powerpc/mm/slb_low.S | |||
@@ -47,8 +47,7 @@ _GLOBAL(slb_allocate_realmode) | |||
47 | * it to VSID 0, which is reserved as a bad VSID - one which | 47 | * it to VSID 0, which is reserved as a bad VSID - one which |
48 | * will never have any pages in it. */ | 48 | * will never have any pages in it. */ |
49 | 49 | ||
50 | /* Check if hitting the linear mapping of the vmalloc/ioremap | 50 | /* Check if hitting the linear mapping or some other kernel space |
51 | * kernel space | ||
52 | */ | 51 | */ |
53 | bne cr7,1f | 52 | bne cr7,1f |
54 | 53 | ||
@@ -62,7 +61,18 @@ BEGIN_FTR_SECTION | |||
62 | END_FTR_SECTION_IFCLR(CPU_FTR_1T_SEGMENT) | 61 | END_FTR_SECTION_IFCLR(CPU_FTR_1T_SEGMENT) |
63 | b slb_finish_load_1T | 62 | b slb_finish_load_1T |
64 | 63 | ||
65 | 1: /* vmalloc/ioremap mapping encoding bits, the "li" instructions below | 64 | 1: |
65 | #ifdef CONFIG_SPARSEMEM_VMEMMAP | ||
66 | /* Check virtual memmap region. To be patches at kernel boot */ | ||
67 | cmpldi cr0,r9,0xf | ||
68 | bne 1f | ||
69 | _GLOBAL(slb_miss_kernel_load_vmemmap) | ||
70 | li r11,0 | ||
71 | b 6f | ||
72 | 1: | ||
73 | #endif /* CONFIG_SPARSEMEM_VMEMMAP */ | ||
74 | |||
75 | /* vmalloc/ioremap mapping encoding bits, the "li" instructions below | ||
66 | * will be patched by the kernel at boot | 76 | * will be patched by the kernel at boot |
67 | */ | 77 | */ |
68 | BEGIN_FTR_SECTION | 78 | BEGIN_FTR_SECTION |
diff --git a/arch/powerpc/platforms/cell/io-workarounds.c b/arch/powerpc/platforms/cell/io-workarounds.c index 3b84e8be314c..b5f84e8f0899 100644 --- a/arch/powerpc/platforms/cell/io-workarounds.c +++ b/arch/powerpc/platforms/cell/io-workarounds.c | |||
@@ -118,7 +118,7 @@ static void iowa_##name at \ | |||
118 | #undef DEF_PCI_AC_RET | 118 | #undef DEF_PCI_AC_RET |
119 | #undef DEF_PCI_AC_NORET | 119 | #undef DEF_PCI_AC_NORET |
120 | 120 | ||
121 | static struct ppc_pci_io __initdata iowa_pci_io = { | 121 | static const struct ppc_pci_io __devinitconst iowa_pci_io = { |
122 | 122 | ||
123 | #define DEF_PCI_AC_RET(name, ret, at, al, space, aa) .name = iowa_##name, | 123 | #define DEF_PCI_AC_RET(name, ret, at, al, space, aa) .name = iowa_##name, |
124 | #define DEF_PCI_AC_NORET(name, at, al, space, aa) .name = iowa_##name, | 124 | #define DEF_PCI_AC_NORET(name, at, al, space, aa) .name = iowa_##name, |
@@ -146,7 +146,7 @@ static void __iomem *iowa_ioremap(unsigned long addr, unsigned long size, | |||
146 | } | 146 | } |
147 | 147 | ||
148 | /* Regist new bus to support workaround */ | 148 | /* Regist new bus to support workaround */ |
149 | void __init iowa_register_bus(struct pci_controller *phb, | 149 | void __devinit iowa_register_bus(struct pci_controller *phb, |
150 | struct ppc_pci_io *ops, | 150 | struct ppc_pci_io *ops, |
151 | int (*initfunc)(struct iowa_bus *, void *), void *data) | 151 | int (*initfunc)(struct iowa_bus *, void *), void *data) |
152 | { | 152 | { |
@@ -173,7 +173,7 @@ void __init iowa_register_bus(struct pci_controller *phb, | |||
173 | } | 173 | } |
174 | 174 | ||
175 | /* enable IO workaround */ | 175 | /* enable IO workaround */ |
176 | void __init io_workaround_init(void) | 176 | void __devinit io_workaround_init(void) |
177 | { | 177 | { |
178 | static int io_workaround_inited; | 178 | static int io_workaround_inited; |
179 | 179 | ||
diff --git a/arch/powerpc/platforms/cell/io-workarounds.h b/arch/powerpc/platforms/cell/io-workarounds.h index 79d8ed3d510f..6efc7782ebf2 100644 --- a/arch/powerpc/platforms/cell/io-workarounds.h +++ b/arch/powerpc/platforms/cell/io-workarounds.h | |||
@@ -31,9 +31,9 @@ struct iowa_bus { | |||
31 | void *private; | 31 | void *private; |
32 | }; | 32 | }; |
33 | 33 | ||
34 | void __init io_workaround_init(void); | 34 | void __devinit io_workaround_init(void); |
35 | void __init iowa_register_bus(struct pci_controller *, struct ppc_pci_io *, | 35 | void __devinit iowa_register_bus(struct pci_controller *, struct ppc_pci_io *, |
36 | int (*)(struct iowa_bus *, void *), void *); | 36 | int (*)(struct iowa_bus *, void *), void *); |
37 | struct iowa_bus *iowa_mem_find_bus(const PCI_IO_ADDR); | 37 | struct iowa_bus *iowa_mem_find_bus(const PCI_IO_ADDR); |
38 | struct iowa_bus *iowa_pio_find_bus(unsigned long); | 38 | struct iowa_bus *iowa_pio_find_bus(unsigned long); |
39 | 39 | ||
diff --git a/arch/powerpc/platforms/cell/spufs/file.c b/arch/powerpc/platforms/cell/spufs/file.c index 80911a373400..c81341ff75b5 100644 --- a/arch/powerpc/platforms/cell/spufs/file.c +++ b/arch/powerpc/platforms/cell/spufs/file.c | |||
@@ -32,6 +32,7 @@ | |||
32 | #include <linux/marker.h> | 32 | #include <linux/marker.h> |
33 | 33 | ||
34 | #include <asm/io.h> | 34 | #include <asm/io.h> |
35 | #include <asm/time.h> | ||
35 | #include <asm/spu.h> | 36 | #include <asm/spu.h> |
36 | #include <asm/spu_info.h> | 37 | #include <asm/spu_info.h> |
37 | #include <asm/uaccess.h> | 38 | #include <asm/uaccess.h> |
diff --git a/arch/powerpc/platforms/cell/spufs/sched.c b/arch/powerpc/platforms/cell/spufs/sched.c index 2e411f23462b..745dd51ec37f 100644 --- a/arch/powerpc/platforms/cell/spufs/sched.c +++ b/arch/powerpc/platforms/cell/spufs/sched.c | |||
@@ -659,7 +659,7 @@ static struct spu *find_victim(struct spu_context *ctx) | |||
659 | 659 | ||
660 | victim->stats.invol_ctx_switch++; | 660 | victim->stats.invol_ctx_switch++; |
661 | spu->stats.invol_ctx_switch++; | 661 | spu->stats.invol_ctx_switch++; |
662 | if (test_bit(SPU_SCHED_SPU_RUN, &ctx->sched_flags)) | 662 | if (test_bit(SPU_SCHED_SPU_RUN, &victim->sched_flags)) |
663 | spu_add_to_rq(victim); | 663 | spu_add_to_rq(victim); |
664 | 664 | ||
665 | mutex_unlock(&victim->state_mutex); | 665 | mutex_unlock(&victim->state_mutex); |
diff --git a/arch/s390/kernel/debug.c b/arch/s390/kernel/debug.c index dff0568e67ec..c93d1296cc0a 100644 --- a/arch/s390/kernel/debug.c +++ b/arch/s390/kernel/debug.c | |||
@@ -71,7 +71,7 @@ static ssize_t debug_input(struct file *file, const char __user *user_buf, | |||
71 | size_t user_len, loff_t * offset); | 71 | size_t user_len, loff_t * offset); |
72 | static int debug_open(struct inode *inode, struct file *file); | 72 | static int debug_open(struct inode *inode, struct file *file); |
73 | static int debug_close(struct inode *inode, struct file *file); | 73 | static int debug_close(struct inode *inode, struct file *file); |
74 | static debug_info_t* debug_info_create(char *name, int pages_per_area, | 74 | static debug_info_t *debug_info_create(const char *name, int pages_per_area, |
75 | int nr_areas, int buf_size, mode_t mode); | 75 | int nr_areas, int buf_size, mode_t mode); |
76 | static void debug_info_get(debug_info_t *); | 76 | static void debug_info_get(debug_info_t *); |
77 | static void debug_info_put(debug_info_t *); | 77 | static void debug_info_put(debug_info_t *); |
@@ -234,8 +234,8 @@ fail_malloc_areas: | |||
234 | */ | 234 | */ |
235 | 235 | ||
236 | static debug_info_t* | 236 | static debug_info_t* |
237 | debug_info_alloc(char *name, int pages_per_area, int nr_areas, int buf_size, | 237 | debug_info_alloc(const char *name, int pages_per_area, int nr_areas, |
238 | int level, int mode) | 238 | int buf_size, int level, int mode) |
239 | { | 239 | { |
240 | debug_info_t* rc; | 240 | debug_info_t* rc; |
241 | 241 | ||
@@ -326,8 +326,8 @@ debug_info_free(debug_info_t* db_info){ | |||
326 | */ | 326 | */ |
327 | 327 | ||
328 | static debug_info_t* | 328 | static debug_info_t* |
329 | debug_info_create(char *name, int pages_per_area, int nr_areas, int buf_size, | 329 | debug_info_create(const char *name, int pages_per_area, int nr_areas, |
330 | mode_t mode) | 330 | int buf_size, mode_t mode) |
331 | { | 331 | { |
332 | debug_info_t* rc; | 332 | debug_info_t* rc; |
333 | 333 | ||
@@ -684,9 +684,9 @@ debug_close(struct inode *inode, struct file *file) | |||
684 | * - Returns handle for debug area | 684 | * - Returns handle for debug area |
685 | */ | 685 | */ |
686 | 686 | ||
687 | debug_info_t *debug_register_mode(char *name, int pages_per_area, int nr_areas, | 687 | debug_info_t *debug_register_mode(const char *name, int pages_per_area, |
688 | int buf_size, mode_t mode, uid_t uid, | 688 | int nr_areas, int buf_size, mode_t mode, |
689 | gid_t gid) | 689 | uid_t uid, gid_t gid) |
690 | { | 690 | { |
691 | debug_info_t *rc = NULL; | 691 | debug_info_t *rc = NULL; |
692 | 692 | ||
@@ -722,8 +722,8 @@ EXPORT_SYMBOL(debug_register_mode); | |||
722 | * - returns handle for debug area | 722 | * - returns handle for debug area |
723 | */ | 723 | */ |
724 | 724 | ||
725 | debug_info_t *debug_register(char *name, int pages_per_area, int nr_areas, | 725 | debug_info_t *debug_register(const char *name, int pages_per_area, |
726 | int buf_size) | 726 | int nr_areas, int buf_size) |
727 | { | 727 | { |
728 | return debug_register_mode(name, pages_per_area, nr_areas, buf_size, | 728 | return debug_register_mode(name, pages_per_area, nr_areas, buf_size, |
729 | S_IRUSR | S_IWUSR, 0, 0); | 729 | S_IRUSR | S_IWUSR, 0, 0); |
diff --git a/arch/s390/kernel/irq.c b/arch/s390/kernel/irq.c index c59a86dca584..e7c5bfb7c755 100644 --- a/arch/s390/kernel/irq.c +++ b/arch/s390/kernel/irq.c | |||
@@ -25,6 +25,7 @@ int show_interrupts(struct seq_file *p, void *v) | |||
25 | static const char *intrclass_names[] = { "EXT", "I/O", }; | 25 | static const char *intrclass_names[] = { "EXT", "I/O", }; |
26 | int i = *(loff_t *) v, j; | 26 | int i = *(loff_t *) v, j; |
27 | 27 | ||
28 | get_online_cpus(); | ||
28 | if (i == 0) { | 29 | if (i == 0) { |
29 | seq_puts(p, " "); | 30 | seq_puts(p, " "); |
30 | for_each_online_cpu(j) | 31 | for_each_online_cpu(j) |
@@ -43,7 +44,7 @@ int show_interrupts(struct seq_file *p, void *v) | |||
43 | seq_putc(p, '\n'); | 44 | seq_putc(p, '\n'); |
44 | 45 | ||
45 | } | 46 | } |
46 | 47 | put_online_cpus(); | |
47 | return 0; | 48 | return 0; |
48 | } | 49 | } |
49 | 50 | ||
diff --git a/arch/s390/kernel/smp.c b/arch/s390/kernel/smp.c index 0aeb290060d9..1f4228948dc4 100644 --- a/arch/s390/kernel/smp.c +++ b/arch/s390/kernel/smp.c | |||
@@ -139,7 +139,6 @@ static void __smp_call_function_map(void (*func) (void *info), void *info, | |||
139 | if (wait) | 139 | if (wait) |
140 | data.finished = CPU_MASK_NONE; | 140 | data.finished = CPU_MASK_NONE; |
141 | 141 | ||
142 | spin_lock(&call_lock); | ||
143 | call_data = &data; | 142 | call_data = &data; |
144 | 143 | ||
145 | for_each_cpu_mask(cpu, map) | 144 | for_each_cpu_mask(cpu, map) |
@@ -151,7 +150,6 @@ static void __smp_call_function_map(void (*func) (void *info), void *info, | |||
151 | if (wait) | 150 | if (wait) |
152 | while (!cpus_equal(map, data.finished)) | 151 | while (!cpus_equal(map, data.finished)) |
153 | cpu_relax(); | 152 | cpu_relax(); |
154 | spin_unlock(&call_lock); | ||
155 | out: | 153 | out: |
156 | if (local) { | 154 | if (local) { |
157 | local_irq_disable(); | 155 | local_irq_disable(); |
@@ -177,11 +175,11 @@ int smp_call_function(void (*func) (void *info), void *info, int nonatomic, | |||
177 | { | 175 | { |
178 | cpumask_t map; | 176 | cpumask_t map; |
179 | 177 | ||
180 | preempt_disable(); | 178 | spin_lock(&call_lock); |
181 | map = cpu_online_map; | 179 | map = cpu_online_map; |
182 | cpu_clear(smp_processor_id(), map); | 180 | cpu_clear(smp_processor_id(), map); |
183 | __smp_call_function_map(func, info, nonatomic, wait, map); | 181 | __smp_call_function_map(func, info, nonatomic, wait, map); |
184 | preempt_enable(); | 182 | spin_unlock(&call_lock); |
185 | return 0; | 183 | return 0; |
186 | } | 184 | } |
187 | EXPORT_SYMBOL(smp_call_function); | 185 | EXPORT_SYMBOL(smp_call_function); |
@@ -202,10 +200,10 @@ EXPORT_SYMBOL(smp_call_function); | |||
202 | int smp_call_function_single(int cpu, void (*func) (void *info), void *info, | 200 | int smp_call_function_single(int cpu, void (*func) (void *info), void *info, |
203 | int nonatomic, int wait) | 201 | int nonatomic, int wait) |
204 | { | 202 | { |
205 | preempt_disable(); | 203 | spin_lock(&call_lock); |
206 | __smp_call_function_map(func, info, nonatomic, wait, | 204 | __smp_call_function_map(func, info, nonatomic, wait, |
207 | cpumask_of_cpu(cpu)); | 205 | cpumask_of_cpu(cpu)); |
208 | preempt_enable(); | 206 | spin_unlock(&call_lock); |
209 | return 0; | 207 | return 0; |
210 | } | 208 | } |
211 | EXPORT_SYMBOL(smp_call_function_single); | 209 | EXPORT_SYMBOL(smp_call_function_single); |
@@ -228,10 +226,10 @@ EXPORT_SYMBOL(smp_call_function_single); | |||
228 | int smp_call_function_mask(cpumask_t mask, void (*func)(void *), void *info, | 226 | int smp_call_function_mask(cpumask_t mask, void (*func)(void *), void *info, |
229 | int wait) | 227 | int wait) |
230 | { | 228 | { |
231 | preempt_disable(); | 229 | spin_lock(&call_lock); |
232 | cpu_clear(smp_processor_id(), mask); | 230 | cpu_clear(smp_processor_id(), mask); |
233 | __smp_call_function_map(func, info, 0, wait, mask); | 231 | __smp_call_function_map(func, info, 0, wait, mask); |
234 | preempt_enable(); | 232 | spin_unlock(&call_lock); |
235 | return 0; | 233 | return 0; |
236 | } | 234 | } |
237 | EXPORT_SYMBOL(smp_call_function_mask); | 235 | EXPORT_SYMBOL(smp_call_function_mask); |
@@ -592,7 +590,9 @@ int __cpuinit start_secondary(void *cpuvoid) | |||
592 | pfault_init(); | 590 | pfault_init(); |
593 | 591 | ||
594 | /* Mark this cpu as online */ | 592 | /* Mark this cpu as online */ |
593 | spin_lock(&call_lock); | ||
595 | cpu_set(smp_processor_id(), cpu_online_map); | 594 | cpu_set(smp_processor_id(), cpu_online_map); |
595 | spin_unlock(&call_lock); | ||
596 | /* Switch on interrupts */ | 596 | /* Switch on interrupts */ |
597 | local_irq_enable(); | 597 | local_irq_enable(); |
598 | /* Print info about this processor */ | 598 | /* Print info about this processor */ |
diff --git a/arch/s390/mm/vmem.c b/arch/s390/mm/vmem.c index beccacf907f3..ea2804808f39 100644 --- a/arch/s390/mm/vmem.c +++ b/arch/s390/mm/vmem.c | |||
@@ -27,19 +27,12 @@ struct memory_segment { | |||
27 | 27 | ||
28 | static LIST_HEAD(mem_segs); | 28 | static LIST_HEAD(mem_segs); |
29 | 29 | ||
30 | static void __ref *vmem_alloc_pages(unsigned int order) | 30 | static pud_t *vmem_pud_alloc(void) |
31 | { | ||
32 | if (slab_is_available()) | ||
33 | return (void *)__get_free_pages(GFP_KERNEL, order); | ||
34 | return alloc_bootmem_pages((1 << order) * PAGE_SIZE); | ||
35 | } | ||
36 | |||
37 | static inline pud_t *vmem_pud_alloc(void) | ||
38 | { | 31 | { |
39 | pud_t *pud = NULL; | 32 | pud_t *pud = NULL; |
40 | 33 | ||
41 | #ifdef CONFIG_64BIT | 34 | #ifdef CONFIG_64BIT |
42 | pud = vmem_alloc_pages(2); | 35 | pud = vmemmap_alloc_block(PAGE_SIZE * 4, 0); |
43 | if (!pud) | 36 | if (!pud) |
44 | return NULL; | 37 | return NULL; |
45 | clear_table((unsigned long *) pud, _REGION3_ENTRY_EMPTY, PAGE_SIZE * 4); | 38 | clear_table((unsigned long *) pud, _REGION3_ENTRY_EMPTY, PAGE_SIZE * 4); |
@@ -47,12 +40,12 @@ static inline pud_t *vmem_pud_alloc(void) | |||
47 | return pud; | 40 | return pud; |
48 | } | 41 | } |
49 | 42 | ||
50 | static inline pmd_t *vmem_pmd_alloc(void) | 43 | static pmd_t *vmem_pmd_alloc(void) |
51 | { | 44 | { |
52 | pmd_t *pmd = NULL; | 45 | pmd_t *pmd = NULL; |
53 | 46 | ||
54 | #ifdef CONFIG_64BIT | 47 | #ifdef CONFIG_64BIT |
55 | pmd = vmem_alloc_pages(2); | 48 | pmd = vmemmap_alloc_block(PAGE_SIZE * 4, 0); |
56 | if (!pmd) | 49 | if (!pmd) |
57 | return NULL; | 50 | return NULL; |
58 | clear_table((unsigned long *) pmd, _SEGMENT_ENTRY_EMPTY, PAGE_SIZE * 4); | 51 | clear_table((unsigned long *) pmd, _SEGMENT_ENTRY_EMPTY, PAGE_SIZE * 4); |
@@ -60,7 +53,7 @@ static inline pmd_t *vmem_pmd_alloc(void) | |||
60 | return pmd; | 53 | return pmd; |
61 | } | 54 | } |
62 | 55 | ||
63 | static pte_t __init_refok *vmem_pte_alloc(void) | 56 | static pte_t __ref *vmem_pte_alloc(void) |
64 | { | 57 | { |
65 | pte_t *pte; | 58 | pte_t *pte; |
66 | 59 | ||
@@ -214,7 +207,7 @@ int __meminit vmemmap_populate(struct page *start, unsigned long nr, int node) | |||
214 | if (pte_none(*pt_dir)) { | 207 | if (pte_none(*pt_dir)) { |
215 | unsigned long new_page; | 208 | unsigned long new_page; |
216 | 209 | ||
217 | new_page =__pa(vmem_alloc_pages(0)); | 210 | new_page =__pa(vmemmap_alloc_block(PAGE_SIZE, 0)); |
218 | if (!new_page) | 211 | if (!new_page) |
219 | goto out; | 212 | goto out; |
220 | pte = pfn_pte(new_page >> PAGE_SHIFT, PAGE_KERNEL); | 213 | pte = pfn_pte(new_page >> PAGE_SHIFT, PAGE_KERNEL); |
diff --git a/arch/sh/kernel/kgdb_stub.c b/arch/sh/kernel/kgdb_stub.c index d453c3a1c79f..832641bbd47d 100644 --- a/arch/sh/kernel/kgdb_stub.c +++ b/arch/sh/kernel/kgdb_stub.c | |||
@@ -330,14 +330,6 @@ static char *ebin_to_mem(const char *buf, char *mem, int count) | |||
330 | return mem; | 330 | return mem; |
331 | } | 331 | } |
332 | 332 | ||
333 | /* Pack a hex byte */ | ||
334 | static char *pack_hex_byte(char *pkt, int byte) | ||
335 | { | ||
336 | *pkt++ = hexchars[(byte >> 4) & 0xf]; | ||
337 | *pkt++ = hexchars[(byte & 0xf)]; | ||
338 | return pkt; | ||
339 | } | ||
340 | |||
341 | /* Scan for the start char '$', read the packet and check the checksum */ | 333 | /* Scan for the start char '$', read the packet and check the checksum */ |
342 | static void get_packet(char *buffer, int buflen) | 334 | static void get_packet(char *buffer, int buflen) |
343 | { | 335 | { |
diff --git a/arch/sparc/kernel/sys_sparc.c b/arch/sparc/kernel/sys_sparc.c index e995491c4436..3c6b49a53ae8 100644 --- a/arch/sparc/kernel/sys_sparc.c +++ b/arch/sparc/kernel/sys_sparc.c | |||
@@ -219,7 +219,7 @@ out: | |||
219 | return err; | 219 | return err; |
220 | } | 220 | } |
221 | 221 | ||
222 | int sparc_mmap_check(unsigned long addr, unsigned long len, unsigned long flags) | 222 | int sparc_mmap_check(unsigned long addr, unsigned long len) |
223 | { | 223 | { |
224 | if (ARCH_SUN4C_SUN4 && | 224 | if (ARCH_SUN4C_SUN4 && |
225 | (len > 0x20000000 || | 225 | (len > 0x20000000 || |
@@ -295,52 +295,14 @@ asmlinkage unsigned long sparc_mremap(unsigned long addr, | |||
295 | unsigned long old_len, unsigned long new_len, | 295 | unsigned long old_len, unsigned long new_len, |
296 | unsigned long flags, unsigned long new_addr) | 296 | unsigned long flags, unsigned long new_addr) |
297 | { | 297 | { |
298 | struct vm_area_struct *vma; | ||
299 | unsigned long ret = -EINVAL; | 298 | unsigned long ret = -EINVAL; |
300 | if (ARCH_SUN4C_SUN4) { | 299 | |
301 | if (old_len > 0x20000000 || new_len > 0x20000000) | 300 | if (unlikely(sparc_mmap_check(addr, old_len))) |
302 | goto out; | 301 | goto out; |
303 | if (addr < 0xe0000000 && addr + old_len > 0x20000000) | 302 | if (unlikely(sparc_mmap_check(new_addr, new_len))) |
304 | goto out; | ||
305 | } | ||
306 | if (old_len > TASK_SIZE - PAGE_SIZE || | ||
307 | new_len > TASK_SIZE - PAGE_SIZE) | ||
308 | goto out; | 303 | goto out; |
309 | down_write(¤t->mm->mmap_sem); | 304 | down_write(¤t->mm->mmap_sem); |
310 | if (flags & MREMAP_FIXED) { | ||
311 | if (ARCH_SUN4C_SUN4 && | ||
312 | new_addr < 0xe0000000 && | ||
313 | new_addr + new_len > 0x20000000) | ||
314 | goto out_sem; | ||
315 | if (new_addr + new_len > TASK_SIZE - PAGE_SIZE) | ||
316 | goto out_sem; | ||
317 | } else if ((ARCH_SUN4C_SUN4 && addr < 0xe0000000 && | ||
318 | addr + new_len > 0x20000000) || | ||
319 | addr + new_len > TASK_SIZE - PAGE_SIZE) { | ||
320 | unsigned long map_flags = 0; | ||
321 | struct file *file = NULL; | ||
322 | |||
323 | ret = -ENOMEM; | ||
324 | if (!(flags & MREMAP_MAYMOVE)) | ||
325 | goto out_sem; | ||
326 | |||
327 | vma = find_vma(current->mm, addr); | ||
328 | if (vma) { | ||
329 | if (vma->vm_flags & VM_SHARED) | ||
330 | map_flags |= MAP_SHARED; | ||
331 | file = vma->vm_file; | ||
332 | } | ||
333 | |||
334 | new_addr = get_unmapped_area(file, addr, new_len, | ||
335 | vma ? vma->vm_pgoff : 0, | ||
336 | map_flags); | ||
337 | ret = new_addr; | ||
338 | if (new_addr & ~PAGE_MASK) | ||
339 | goto out_sem; | ||
340 | flags |= MREMAP_FIXED; | ||
341 | } | ||
342 | ret = do_mremap(addr, old_len, new_len, flags, new_addr); | 305 | ret = do_mremap(addr, old_len, new_len, flags, new_addr); |
343 | out_sem: | ||
344 | up_write(¤t->mm->mmap_sem); | 306 | up_write(¤t->mm->mmap_sem); |
345 | out: | 307 | out: |
346 | return ret; | 308 | return ret; |
diff --git a/arch/sparc64/kernel/rtrap.S b/arch/sparc64/kernel/rtrap.S index b9b785fd8b46..16689b2930db 100644 --- a/arch/sparc64/kernel/rtrap.S +++ b/arch/sparc64/kernel/rtrap.S | |||
@@ -46,7 +46,7 @@ __handle_user_windows: | |||
46 | wrpr %g0, RTRAP_PSTATE_IRQOFF, %pstate | 46 | wrpr %g0, RTRAP_PSTATE_IRQOFF, %pstate |
47 | ldx [%g6 + TI_FLAGS], %l0 | 47 | ldx [%g6 + TI_FLAGS], %l0 |
48 | 48 | ||
49 | 1: andcc %l0, (_TIF_SIGPENDING | _TIF_RESTORE_SIGMASK), %g0 | 49 | 1: andcc %l0, _TIF_SIGPENDING, %g0 |
50 | be,pt %xcc, __handle_user_windows_continue | 50 | be,pt %xcc, __handle_user_windows_continue |
51 | nop | 51 | nop |
52 | mov %l5, %o1 | 52 | mov %l5, %o1 |
@@ -86,7 +86,7 @@ __handle_perfctrs: | |||
86 | wrpr %g0, RTRAP_PSTATE, %pstate | 86 | wrpr %g0, RTRAP_PSTATE, %pstate |
87 | wrpr %g0, RTRAP_PSTATE_IRQOFF, %pstate | 87 | wrpr %g0, RTRAP_PSTATE_IRQOFF, %pstate |
88 | ldx [%g6 + TI_FLAGS], %l0 | 88 | ldx [%g6 + TI_FLAGS], %l0 |
89 | 1: andcc %l0, (_TIF_SIGPENDING | _TIF_RESTORE_SIGMASK), %g0 | 89 | 1: andcc %l0, _TIF_SIGPENDING, %g0 |
90 | 90 | ||
91 | be,pt %xcc, __handle_perfctrs_continue | 91 | be,pt %xcc, __handle_perfctrs_continue |
92 | sethi %hi(TSTATE_PEF), %o0 | 92 | sethi %hi(TSTATE_PEF), %o0 |
@@ -195,7 +195,7 @@ __handle_preemption_continue: | |||
195 | andcc %l1, %o0, %g0 | 195 | andcc %l1, %o0, %g0 |
196 | andcc %l0, _TIF_NEED_RESCHED, %g0 | 196 | andcc %l0, _TIF_NEED_RESCHED, %g0 |
197 | bne,pn %xcc, __handle_preemption | 197 | bne,pn %xcc, __handle_preemption |
198 | andcc %l0, (_TIF_SIGPENDING | _TIF_RESTORE_SIGMASK), %g0 | 198 | andcc %l0, _TIF_SIGPENDING, %g0 |
199 | bne,pn %xcc, __handle_signal | 199 | bne,pn %xcc, __handle_signal |
200 | __handle_signal_continue: | 200 | __handle_signal_continue: |
201 | ldub [%g6 + TI_WSAVED], %o2 | 201 | ldub [%g6 + TI_WSAVED], %o2 |
diff --git a/arch/sparc64/kernel/signal.c b/arch/sparc64/kernel/signal.c index 2378482c2aab..6e4dc67d16af 100644 --- a/arch/sparc64/kernel/signal.c +++ b/arch/sparc64/kernel/signal.c | |||
@@ -247,7 +247,9 @@ static long _sigpause_common(old_sigset_t set) | |||
247 | 247 | ||
248 | current->state = TASK_INTERRUPTIBLE; | 248 | current->state = TASK_INTERRUPTIBLE; |
249 | schedule(); | 249 | schedule(); |
250 | set_thread_flag(TIF_RESTORE_SIGMASK); | 250 | |
251 | set_restore_sigmask(); | ||
252 | |||
251 | return -ERESTARTNOHAND; | 253 | return -ERESTARTNOHAND; |
252 | } | 254 | } |
253 | 255 | ||
@@ -537,7 +539,7 @@ static void do_signal(struct pt_regs *regs, unsigned long orig_i0) | |||
537 | } else | 539 | } else |
538 | restart_syscall = 0; | 540 | restart_syscall = 0; |
539 | 541 | ||
540 | if (test_thread_flag(TIF_RESTORE_SIGMASK)) | 542 | if (current_thread_info()->status & TS_RESTORE_SIGMASK) |
541 | oldset = ¤t->saved_sigmask; | 543 | oldset = ¤t->saved_sigmask; |
542 | else | 544 | else |
543 | oldset = ¤t->blocked; | 545 | oldset = ¤t->blocked; |
@@ -566,13 +568,12 @@ static void do_signal(struct pt_regs *regs, unsigned long orig_i0) | |||
566 | syscall_restart(orig_i0, regs, &ka.sa); | 568 | syscall_restart(orig_i0, regs, &ka.sa); |
567 | handle_signal(signr, &ka, &info, oldset, regs); | 569 | handle_signal(signr, &ka, &info, oldset, regs); |
568 | 570 | ||
569 | /* a signal was successfully delivered; the saved | 571 | /* A signal was successfully delivered; the saved |
570 | * sigmask will have been stored in the signal frame, | 572 | * sigmask will have been stored in the signal frame, |
571 | * and will be restored by sigreturn, so we can simply | 573 | * and will be restored by sigreturn, so we can simply |
572 | * clear the TIF_RESTORE_SIGMASK flag. | 574 | * clear the TS_RESTORE_SIGMASK flag. |
573 | */ | 575 | */ |
574 | if (test_thread_flag(TIF_RESTORE_SIGMASK)) | 576 | current_thread_info()->status &= ~TS_RESTORE_SIGMASK; |
575 | clear_thread_flag(TIF_RESTORE_SIGMASK); | ||
576 | return; | 577 | return; |
577 | } | 578 | } |
578 | if (restart_syscall && | 579 | if (restart_syscall && |
@@ -591,17 +592,17 @@ static void do_signal(struct pt_regs *regs, unsigned long orig_i0) | |||
591 | regs->tnpc -= 4; | 592 | regs->tnpc -= 4; |
592 | } | 593 | } |
593 | 594 | ||
594 | /* if there's no signal to deliver, we just put the saved sigmask | 595 | /* If there's no signal to deliver, we just put the saved sigmask |
595 | * back | 596 | * back |
596 | */ | 597 | */ |
597 | if (test_thread_flag(TIF_RESTORE_SIGMASK)) { | 598 | if (current_thread_info()->status & TS_RESTORE_SIGMASK) { |
598 | clear_thread_flag(TIF_RESTORE_SIGMASK); | 599 | current_thread_info()->status &= ~TS_RESTORE_SIGMASK; |
599 | sigprocmask(SIG_SETMASK, ¤t->saved_sigmask, NULL); | 600 | sigprocmask(SIG_SETMASK, ¤t->saved_sigmask, NULL); |
600 | } | 601 | } |
601 | } | 602 | } |
602 | 603 | ||
603 | void do_notify_resume(struct pt_regs *regs, unsigned long orig_i0, unsigned long thread_info_flags) | 604 | void do_notify_resume(struct pt_regs *regs, unsigned long orig_i0, unsigned long thread_info_flags) |
604 | { | 605 | { |
605 | if (thread_info_flags & (_TIF_SIGPENDING | _TIF_RESTORE_SIGMASK)) | 606 | if (thread_info_flags & _TIF_SIGPENDING) |
606 | do_signal(regs, orig_i0); | 607 | do_signal(regs, orig_i0); |
607 | } | 608 | } |
diff --git a/arch/sparc64/kernel/signal32.c b/arch/sparc64/kernel/signal32.c index 3f19e9af3d1b..97cdd1bf4a10 100644 --- a/arch/sparc64/kernel/signal32.c +++ b/arch/sparc64/kernel/signal32.c | |||
@@ -788,13 +788,12 @@ void do_signal32(sigset_t *oldset, struct pt_regs * regs, | |||
788 | syscall_restart32(orig_i0, regs, &ka.sa); | 788 | syscall_restart32(orig_i0, regs, &ka.sa); |
789 | handle_signal32(signr, &ka, &info, oldset, regs); | 789 | handle_signal32(signr, &ka, &info, oldset, regs); |
790 | 790 | ||
791 | /* a signal was successfully delivered; the saved | 791 | /* A signal was successfully delivered; the saved |
792 | * sigmask will have been stored in the signal frame, | 792 | * sigmask will have been stored in the signal frame, |
793 | * and will be restored by sigreturn, so we can simply | 793 | * and will be restored by sigreturn, so we can simply |
794 | * clear the TIF_RESTORE_SIGMASK flag. | 794 | * clear the TS_RESTORE_SIGMASK flag. |
795 | */ | 795 | */ |
796 | if (test_thread_flag(TIF_RESTORE_SIGMASK)) | 796 | current_thread_info()->status &= ~TS_RESTORE_SIGMASK; |
797 | clear_thread_flag(TIF_RESTORE_SIGMASK); | ||
798 | return; | 797 | return; |
799 | } | 798 | } |
800 | if (restart_syscall && | 799 | if (restart_syscall && |
@@ -813,11 +812,11 @@ void do_signal32(sigset_t *oldset, struct pt_regs * regs, | |||
813 | regs->tnpc -= 4; | 812 | regs->tnpc -= 4; |
814 | } | 813 | } |
815 | 814 | ||
816 | /* if there's no signal to deliver, we just put the saved sigmask | 815 | /* If there's no signal to deliver, we just put the saved sigmask |
817 | * back | 816 | * back |
818 | */ | 817 | */ |
819 | if (test_thread_flag(TIF_RESTORE_SIGMASK)) { | 818 | if (current_thread_info()->status & TS_RESTORE_SIGMASK) { |
820 | clear_thread_flag(TIF_RESTORE_SIGMASK); | 819 | current_thread_info()->status &= ~TS_RESTORE_SIGMASK; |
821 | sigprocmask(SIG_SETMASK, ¤t->saved_sigmask, NULL); | 820 | sigprocmask(SIG_SETMASK, ¤t->saved_sigmask, NULL); |
822 | } | 821 | } |
823 | } | 822 | } |
diff --git a/arch/sparc64/kernel/sys_sparc.c b/arch/sparc64/kernel/sys_sparc.c index 0dbc941f130e..ac1bff58c1ac 100644 --- a/arch/sparc64/kernel/sys_sparc.c +++ b/arch/sparc64/kernel/sys_sparc.c | |||
@@ -542,8 +542,7 @@ asmlinkage long sparc64_personality(unsigned long personality) | |||
542 | return ret; | 542 | return ret; |
543 | } | 543 | } |
544 | 544 | ||
545 | int sparc64_mmap_check(unsigned long addr, unsigned long len, | 545 | int sparc64_mmap_check(unsigned long addr, unsigned long len) |
546 | unsigned long flags) | ||
547 | { | 546 | { |
548 | if (test_thread_flag(TIF_32BIT)) { | 547 | if (test_thread_flag(TIF_32BIT)) { |
549 | if (len >= STACK_TOP32) | 548 | if (len >= STACK_TOP32) |
@@ -609,46 +608,19 @@ asmlinkage unsigned long sys64_mremap(unsigned long addr, | |||
609 | unsigned long old_len, unsigned long new_len, | 608 | unsigned long old_len, unsigned long new_len, |
610 | unsigned long flags, unsigned long new_addr) | 609 | unsigned long flags, unsigned long new_addr) |
611 | { | 610 | { |
612 | struct vm_area_struct *vma; | ||
613 | unsigned long ret = -EINVAL; | 611 | unsigned long ret = -EINVAL; |
614 | 612 | ||
615 | if (test_thread_flag(TIF_32BIT)) | 613 | if (test_thread_flag(TIF_32BIT)) |
616 | goto out; | 614 | goto out; |
617 | if (unlikely(new_len >= VA_EXCLUDE_START)) | 615 | if (unlikely(new_len >= VA_EXCLUDE_START)) |
618 | goto out; | 616 | goto out; |
619 | if (unlikely(invalid_64bit_range(addr, old_len))) | 617 | if (unlikely(sparc64_mmap_check(addr, old_len))) |
618 | goto out; | ||
619 | if (unlikely(sparc64_mmap_check(new_addr, new_len))) | ||
620 | goto out; | 620 | goto out; |
621 | 621 | ||
622 | down_write(¤t->mm->mmap_sem); | 622 | down_write(¤t->mm->mmap_sem); |
623 | if (flags & MREMAP_FIXED) { | ||
624 | if (invalid_64bit_range(new_addr, new_len)) | ||
625 | goto out_sem; | ||
626 | } else if (invalid_64bit_range(addr, new_len)) { | ||
627 | unsigned long map_flags = 0; | ||
628 | struct file *file = NULL; | ||
629 | |||
630 | ret = -ENOMEM; | ||
631 | if (!(flags & MREMAP_MAYMOVE)) | ||
632 | goto out_sem; | ||
633 | |||
634 | vma = find_vma(current->mm, addr); | ||
635 | if (vma) { | ||
636 | if (vma->vm_flags & VM_SHARED) | ||
637 | map_flags |= MAP_SHARED; | ||
638 | file = vma->vm_file; | ||
639 | } | ||
640 | |||
641 | /* MREMAP_FIXED checked above. */ | ||
642 | new_addr = get_unmapped_area(file, addr, new_len, | ||
643 | vma ? vma->vm_pgoff : 0, | ||
644 | map_flags); | ||
645 | ret = new_addr; | ||
646 | if (new_addr & ~PAGE_MASK) | ||
647 | goto out_sem; | ||
648 | flags |= MREMAP_FIXED; | ||
649 | } | ||
650 | ret = do_mremap(addr, old_len, new_len, flags, new_addr); | 623 | ret = do_mremap(addr, old_len, new_len, flags, new_addr); |
651 | out_sem: | ||
652 | up_write(¤t->mm->mmap_sem); | 624 | up_write(¤t->mm->mmap_sem); |
653 | out: | 625 | out: |
654 | return ret; | 626 | return ret; |
diff --git a/arch/sparc64/kernel/sys_sparc32.c b/arch/sparc64/kernel/sys_sparc32.c index 1aa4288125f2..ba5bd626b39e 100644 --- a/arch/sparc64/kernel/sys_sparc32.c +++ b/arch/sparc64/kernel/sys_sparc32.c | |||
@@ -867,44 +867,15 @@ asmlinkage unsigned long sys32_mremap(unsigned long addr, | |||
867 | unsigned long old_len, unsigned long new_len, | 867 | unsigned long old_len, unsigned long new_len, |
868 | unsigned long flags, u32 __new_addr) | 868 | unsigned long flags, u32 __new_addr) |
869 | { | 869 | { |
870 | struct vm_area_struct *vma; | ||
871 | unsigned long ret = -EINVAL; | 870 | unsigned long ret = -EINVAL; |
872 | unsigned long new_addr = __new_addr; | 871 | unsigned long new_addr = __new_addr; |
873 | 872 | ||
874 | if (old_len > STACK_TOP32 || new_len > STACK_TOP32) | 873 | if (unlikely(sparc64_mmap_check(addr, old_len))) |
875 | goto out; | 874 | goto out; |
876 | if (addr > STACK_TOP32 - old_len) | 875 | if (unlikely(sparc64_mmap_check(new_addr, new_len))) |
877 | goto out; | 876 | goto out; |
878 | down_write(¤t->mm->mmap_sem); | 877 | down_write(¤t->mm->mmap_sem); |
879 | if (flags & MREMAP_FIXED) { | ||
880 | if (new_addr > STACK_TOP32 - new_len) | ||
881 | goto out_sem; | ||
882 | } else if (addr > STACK_TOP32 - new_len) { | ||
883 | unsigned long map_flags = 0; | ||
884 | struct file *file = NULL; | ||
885 | |||
886 | ret = -ENOMEM; | ||
887 | if (!(flags & MREMAP_MAYMOVE)) | ||
888 | goto out_sem; | ||
889 | |||
890 | vma = find_vma(current->mm, addr); | ||
891 | if (vma) { | ||
892 | if (vma->vm_flags & VM_SHARED) | ||
893 | map_flags |= MAP_SHARED; | ||
894 | file = vma->vm_file; | ||
895 | } | ||
896 | |||
897 | /* MREMAP_FIXED checked above. */ | ||
898 | new_addr = get_unmapped_area(file, addr, new_len, | ||
899 | vma ? vma->vm_pgoff : 0, | ||
900 | map_flags); | ||
901 | ret = new_addr; | ||
902 | if (new_addr & ~PAGE_MASK) | ||
903 | goto out_sem; | ||
904 | flags |= MREMAP_FIXED; | ||
905 | } | ||
906 | ret = do_mremap(addr, old_len, new_len, flags, new_addr); | 878 | ret = do_mremap(addr, old_len, new_len, flags, new_addr); |
907 | out_sem: | ||
908 | up_write(¤t->mm->mmap_sem); | 879 | up_write(¤t->mm->mmap_sem); |
909 | out: | 880 | out: |
910 | return ret; | 881 | return ret; |
diff --git a/arch/um/Kconfig.char b/arch/um/Kconfig.char index 3a4b396d7979..1b238ebae6b3 100644 --- a/arch/um/Kconfig.char +++ b/arch/um/Kconfig.char | |||
@@ -145,14 +145,14 @@ config LEGACY_PTYS | |||
145 | systems, it is safe to say N. | 145 | systems, it is safe to say N. |
146 | 146 | ||
147 | config RAW_DRIVER | 147 | config RAW_DRIVER |
148 | tristate "RAW driver (/dev/raw/rawN) (OBSOLETE)" | 148 | tristate "RAW driver (/dev/raw/rawN)" |
149 | depends on BLOCK | ||
149 | help | 150 | help |
150 | The raw driver permits block devices to be bound to /dev/raw/rawN. | 151 | The raw driver permits block devices to be bound to /dev/raw/rawN. |
151 | Once bound, I/O against /dev/raw/rawN uses efficient zero-copy I/O. | 152 | Once bound, I/O against /dev/raw/rawN uses efficient zero-copy I/O. |
152 | See the raw(8) manpage for more details. | 153 | See the raw(8) manpage for more details. |
153 | 154 | ||
154 | The raw driver is deprecated and will be removed soon. | 155 | Applications should preferably open the device (eg /dev/hda1) |
155 | Applications should simply open the device (eg /dev/hda1) | ||
156 | with the O_DIRECT flag. | 156 | with the O_DIRECT flag. |
157 | 157 | ||
158 | config MAX_RAW_DEVS | 158 | config MAX_RAW_DEVS |
diff --git a/arch/um/drivers/chan_user.c b/arch/um/drivers/chan_user.c index 025764089ac8..cfeb3f4a44af 100644 --- a/arch/um/drivers/chan_user.c +++ b/arch/um/drivers/chan_user.c | |||
@@ -11,6 +11,7 @@ | |||
11 | #include <termios.h> | 11 | #include <termios.h> |
12 | #include <sys/ioctl.h> | 12 | #include <sys/ioctl.h> |
13 | #include "chan_user.h" | 13 | #include "chan_user.h" |
14 | #include "kern_constants.h" | ||
14 | #include "os.h" | 15 | #include "os.h" |
15 | #include "um_malloc.h" | 16 | #include "um_malloc.h" |
16 | #include "user.h" | 17 | #include "user.h" |
diff --git a/arch/um/drivers/cow_sys.h b/arch/um/drivers/cow_sys.h index ca8c9e11a39b..f5701fd2ef90 100644 --- a/arch/um/drivers/cow_sys.h +++ b/arch/um/drivers/cow_sys.h | |||
@@ -8,7 +8,7 @@ | |||
8 | 8 | ||
9 | static inline void *cow_malloc(int size) | 9 | static inline void *cow_malloc(int size) |
10 | { | 10 | { |
11 | return kmalloc(size, UM_GFP_KERNEL); | 11 | return uml_kmalloc(size, UM_GFP_KERNEL); |
12 | } | 12 | } |
13 | 13 | ||
14 | static inline void cow_free(void *ptr) | 14 | static inline void cow_free(void *ptr) |
diff --git a/arch/um/drivers/daemon_user.c b/arch/um/drivers/daemon_user.c index f23c109a055c..f8e85e0bdace 100644 --- a/arch/um/drivers/daemon_user.c +++ b/arch/um/drivers/daemon_user.c | |||
@@ -34,7 +34,7 @@ static struct sockaddr_un *new_addr(void *name, int len) | |||
34 | { | 34 | { |
35 | struct sockaddr_un *sun; | 35 | struct sockaddr_un *sun; |
36 | 36 | ||
37 | sun = kmalloc(sizeof(struct sockaddr_un), UM_GFP_KERNEL); | 37 | sun = uml_kmalloc(sizeof(struct sockaddr_un), UM_GFP_KERNEL); |
38 | if (sun == NULL) { | 38 | if (sun == NULL) { |
39 | printk(UM_KERN_ERR "new_addr: allocation of sockaddr_un " | 39 | printk(UM_KERN_ERR "new_addr: allocation of sockaddr_un " |
40 | "failed\n"); | 40 | "failed\n"); |
@@ -83,7 +83,7 @@ static int connect_to_switch(struct daemon_data *pri) | |||
83 | goto out_close; | 83 | goto out_close; |
84 | } | 84 | } |
85 | 85 | ||
86 | sun = kmalloc(sizeof(struct sockaddr_un), UM_GFP_KERNEL); | 86 | sun = uml_kmalloc(sizeof(struct sockaddr_un), UM_GFP_KERNEL); |
87 | if (sun == NULL) { | 87 | if (sun == NULL) { |
88 | printk(UM_KERN_ERR "new_addr: allocation of sockaddr_un " | 88 | printk(UM_KERN_ERR "new_addr: allocation of sockaddr_un " |
89 | "failed\n"); | 89 | "failed\n"); |
diff --git a/arch/um/drivers/fd.c b/arch/um/drivers/fd.c index 0a2bb5b64b82..f5a981a16240 100644 --- a/arch/um/drivers/fd.c +++ b/arch/um/drivers/fd.c | |||
@@ -40,7 +40,7 @@ static void *fd_init(char *str, int device, const struct chan_opts *opts) | |||
40 | return NULL; | 40 | return NULL; |
41 | } | 41 | } |
42 | 42 | ||
43 | data = kmalloc(sizeof(*data), UM_GFP_KERNEL); | 43 | data = uml_kmalloc(sizeof(*data), UM_GFP_KERNEL); |
44 | if (data == NULL) | 44 | if (data == NULL) |
45 | return NULL; | 45 | return NULL; |
46 | 46 | ||
diff --git a/arch/um/drivers/hostaudio_kern.c b/arch/um/drivers/hostaudio_kern.c index ff1b22b69e9c..368219cc2366 100644 --- a/arch/um/drivers/hostaudio_kern.c +++ b/arch/um/drivers/hostaudio_kern.c | |||
@@ -154,7 +154,7 @@ static int hostaudio_ioctl(struct inode *inode, struct file *file, | |||
154 | case SNDCTL_DSP_SUBDIVIDE: | 154 | case SNDCTL_DSP_SUBDIVIDE: |
155 | case SNDCTL_DSP_SETFRAGMENT: | 155 | case SNDCTL_DSP_SETFRAGMENT: |
156 | if (get_user(data, (int __user *) arg)) | 156 | if (get_user(data, (int __user *) arg)) |
157 | return EFAULT; | 157 | return -EFAULT; |
158 | break; | 158 | break; |
159 | default: | 159 | default: |
160 | break; | 160 | break; |
diff --git a/arch/um/drivers/mcast_user.c b/arch/um/drivers/mcast_user.c index 5f647d7a7292..ee19e91568a2 100644 --- a/arch/um/drivers/mcast_user.c +++ b/arch/um/drivers/mcast_user.c | |||
@@ -15,6 +15,7 @@ | |||
15 | #include <unistd.h> | 15 | #include <unistd.h> |
16 | #include <errno.h> | 16 | #include <errno.h> |
17 | #include <netinet/in.h> | 17 | #include <netinet/in.h> |
18 | #include "kern_constants.h" | ||
18 | #include "mcast.h" | 19 | #include "mcast.h" |
19 | #include "net_user.h" | 20 | #include "net_user.h" |
20 | #include "um_malloc.h" | 21 | #include "um_malloc.h" |
@@ -24,7 +25,7 @@ static struct sockaddr_in *new_addr(char *addr, unsigned short port) | |||
24 | { | 25 | { |
25 | struct sockaddr_in *sin; | 26 | struct sockaddr_in *sin; |
26 | 27 | ||
27 | sin = kmalloc(sizeof(struct sockaddr_in), UM_GFP_KERNEL); | 28 | sin = uml_kmalloc(sizeof(struct sockaddr_in), UM_GFP_KERNEL); |
28 | if (sin == NULL) { | 29 | if (sin == NULL) { |
29 | printk(UM_KERN_ERR "new_addr: allocation of sockaddr_in " | 30 | printk(UM_KERN_ERR "new_addr: allocation of sockaddr_in " |
30 | "failed\n"); | 31 | "failed\n"); |
diff --git a/arch/um/drivers/net_user.c b/arch/um/drivers/net_user.c index abf2653f5517..9415dd9e63ef 100644 --- a/arch/um/drivers/net_user.c +++ b/arch/um/drivers/net_user.c | |||
@@ -222,7 +222,7 @@ static void change(char *dev, char *what, unsigned char *addr, | |||
222 | netmask[2], netmask[3]); | 222 | netmask[2], netmask[3]); |
223 | 223 | ||
224 | output_len = UM_KERN_PAGE_SIZE; | 224 | output_len = UM_KERN_PAGE_SIZE; |
225 | output = kmalloc(output_len, UM_GFP_KERNEL); | 225 | output = uml_kmalloc(output_len, UM_GFP_KERNEL); |
226 | if (output == NULL) | 226 | if (output == NULL) |
227 | printk(UM_KERN_ERR "change : failed to allocate output " | 227 | printk(UM_KERN_ERR "change : failed to allocate output " |
228 | "buffer\n"); | 228 | "buffer\n"); |
diff --git a/arch/um/drivers/port_user.c b/arch/um/drivers/port_user.c index d269ca387f10..b49bf56a56aa 100644 --- a/arch/um/drivers/port_user.c +++ b/arch/um/drivers/port_user.c | |||
@@ -47,7 +47,7 @@ static void *port_init(char *str, int device, const struct chan_opts *opts) | |||
47 | if (kern_data == NULL) | 47 | if (kern_data == NULL) |
48 | return NULL; | 48 | return NULL; |
49 | 49 | ||
50 | data = kmalloc(sizeof(*data), UM_GFP_KERNEL); | 50 | data = uml_kmalloc(sizeof(*data), UM_GFP_KERNEL); |
51 | if (data == NULL) | 51 | if (data == NULL) |
52 | goto err; | 52 | goto err; |
53 | 53 | ||
diff --git a/arch/um/drivers/pty.c b/arch/um/drivers/pty.c index 49c79dda6046..1113911dcb2b 100644 --- a/arch/um/drivers/pty.c +++ b/arch/um/drivers/pty.c | |||
@@ -29,7 +29,7 @@ static void *pty_chan_init(char *str, int device, const struct chan_opts *opts) | |||
29 | { | 29 | { |
30 | struct pty_chan *data; | 30 | struct pty_chan *data; |
31 | 31 | ||
32 | data = kmalloc(sizeof(*data), UM_GFP_KERNEL); | 32 | data = uml_kmalloc(sizeof(*data), UM_GFP_KERNEL); |
33 | if (data == NULL) | 33 | if (data == NULL) |
34 | return NULL; | 34 | return NULL; |
35 | 35 | ||
diff --git a/arch/um/drivers/random.c b/arch/um/drivers/random.c index 71f0959c1535..4949044773ba 100644 --- a/arch/um/drivers/random.c +++ b/arch/um/drivers/random.c | |||
@@ -1,4 +1,5 @@ | |||
1 | /* Copyright (C) 2005 Jeff Dike <jdike@addtoit.com> */ | 1 | /* Copyright (C) 2005 - 2008 Jeff Dike <jdike@{linux.intel,addtoit}.com> */ |
2 | |||
2 | /* Much of this ripped from drivers/char/hw_random.c, see there for other | 3 | /* Much of this ripped from drivers/char/hw_random.c, see there for other |
3 | * copyright. | 4 | * copyright. |
4 | * | 5 | * |
@@ -8,16 +9,18 @@ | |||
8 | #include <linux/sched.h> | 9 | #include <linux/sched.h> |
9 | #include <linux/module.h> | 10 | #include <linux/module.h> |
10 | #include <linux/fs.h> | 11 | #include <linux/fs.h> |
12 | #include <linux/interrupt.h> | ||
11 | #include <linux/miscdevice.h> | 13 | #include <linux/miscdevice.h> |
12 | #include <linux/delay.h> | 14 | #include <linux/delay.h> |
13 | #include <asm/uaccess.h> | 15 | #include <asm/uaccess.h> |
16 | #include "irq_kern.h" | ||
14 | #include "os.h" | 17 | #include "os.h" |
15 | 18 | ||
16 | /* | 19 | /* |
17 | * core module and version information | 20 | * core module and version information |
18 | */ | 21 | */ |
19 | #define RNG_VERSION "1.0.0" | 22 | #define RNG_VERSION "1.0.0" |
20 | #define RNG_MODULE_NAME "random" | 23 | #define RNG_MODULE_NAME "hw_random" |
21 | 24 | ||
22 | #define RNG_MISCDEV_MINOR 183 /* official */ | 25 | #define RNG_MISCDEV_MINOR 183 /* official */ |
23 | 26 | ||
@@ -26,47 +29,67 @@ | |||
26 | * protects against a module being loaded twice at the same time. | 29 | * protects against a module being loaded twice at the same time. |
27 | */ | 30 | */ |
28 | static int random_fd = -1; | 31 | static int random_fd = -1; |
32 | static DECLARE_WAIT_QUEUE_HEAD(host_read_wait); | ||
29 | 33 | ||
30 | static int rng_dev_open (struct inode *inode, struct file *filp) | 34 | static int rng_dev_open (struct inode *inode, struct file *filp) |
31 | { | 35 | { |
32 | /* enforce read-only access to this chrdev */ | 36 | /* enforce read-only access to this chrdev */ |
33 | if ((filp->f_mode & FMODE_READ) == 0) | 37 | if ((filp->f_mode & FMODE_READ) == 0) |
34 | return -EINVAL; | 38 | return -EINVAL; |
35 | if (filp->f_mode & FMODE_WRITE) | 39 | if ((filp->f_mode & FMODE_WRITE) != 0) |
36 | return -EINVAL; | 40 | return -EINVAL; |
37 | 41 | ||
38 | return 0; | 42 | return 0; |
39 | } | 43 | } |
40 | 44 | ||
45 | static atomic_t host_sleep_count = ATOMIC_INIT(0); | ||
46 | |||
41 | static ssize_t rng_dev_read (struct file *filp, char __user *buf, size_t size, | 47 | static ssize_t rng_dev_read (struct file *filp, char __user *buf, size_t size, |
42 | loff_t * offp) | 48 | loff_t *offp) |
43 | { | 49 | { |
44 | u32 data; | 50 | u32 data; |
45 | int n, ret = 0, have_data; | 51 | int n, ret = 0, have_data; |
46 | 52 | ||
47 | while(size){ | 53 | while (size) { |
48 | n = os_read_file(random_fd, &data, sizeof(data)); | 54 | n = os_read_file(random_fd, &data, sizeof(data)); |
49 | if(n > 0){ | 55 | if (n > 0) { |
50 | have_data = n; | 56 | have_data = n; |
51 | while (have_data && size) { | 57 | while (have_data && size) { |
52 | if (put_user((u8)data, buf++)) { | 58 | if (put_user((u8) data, buf++)) { |
53 | ret = ret ? : -EFAULT; | 59 | ret = ret ? : -EFAULT; |
54 | break; | 60 | break; |
55 | } | 61 | } |
56 | size--; | 62 | size--; |
57 | ret++; | 63 | ret++; |
58 | have_data--; | 64 | have_data--; |
59 | data>>=8; | 65 | data >>= 8; |
60 | } | 66 | } |
61 | } | 67 | } |
62 | else if(n == -EAGAIN){ | 68 | else if (n == -EAGAIN) { |
63 | if (filp->f_flags & O_NONBLOCK) | 69 | DECLARE_WAITQUEUE(wait, current); |
64 | return ret ? : -EAGAIN; | 70 | |
65 | 71 | if (filp->f_flags & O_NONBLOCK) | |
66 | if(need_resched()) | 72 | return ret ? : -EAGAIN; |
67 | schedule_timeout_interruptible(1); | 73 | |
68 | } | 74 | atomic_inc(&host_sleep_count); |
69 | else return n; | 75 | reactivate_fd(random_fd, RANDOM_IRQ); |
76 | add_sigio_fd(random_fd); | ||
77 | |||
78 | add_wait_queue(&host_read_wait, &wait); | ||
79 | set_task_state(current, TASK_INTERRUPTIBLE); | ||
80 | |||
81 | schedule(); | ||
82 | set_task_state(current, TASK_RUNNING); | ||
83 | remove_wait_queue(&host_read_wait, &wait); | ||
84 | |||
85 | if (atomic_dec_and_test(&host_sleep_count)) { | ||
86 | ignore_sigio_fd(random_fd); | ||
87 | deactivate_fd(random_fd, RANDOM_IRQ); | ||
88 | } | ||
89 | } | ||
90 | else | ||
91 | return n; | ||
92 | |||
70 | if (signal_pending (current)) | 93 | if (signal_pending (current)) |
71 | return ret ? : -ERESTARTSYS; | 94 | return ret ? : -ERESTARTSYS; |
72 | } | 95 | } |
@@ -86,6 +109,13 @@ static struct miscdevice rng_miscdev = { | |||
86 | &rng_chrdev_ops, | 109 | &rng_chrdev_ops, |
87 | }; | 110 | }; |
88 | 111 | ||
112 | static irqreturn_t random_interrupt(int irq, void *data) | ||
113 | { | ||
114 | wake_up(&host_read_wait); | ||
115 | |||
116 | return IRQ_HANDLED; | ||
117 | } | ||
118 | |||
89 | /* | 119 | /* |
90 | * rng_init - initialize RNG module | 120 | * rng_init - initialize RNG module |
91 | */ | 121 | */ |
@@ -93,28 +123,33 @@ static int __init rng_init (void) | |||
93 | { | 123 | { |
94 | int err; | 124 | int err; |
95 | 125 | ||
96 | err = os_open_file("/dev/random", of_read(OPENFLAGS()), 0); | 126 | err = os_open_file("/dev/random", of_read(OPENFLAGS()), 0); |
97 | if(err < 0) | 127 | if (err < 0) |
98 | goto out; | 128 | goto out; |
99 | 129 | ||
100 | random_fd = err; | 130 | random_fd = err; |
101 | 131 | ||
102 | err = os_set_fd_block(random_fd, 0); | 132 | err = um_request_irq(RANDOM_IRQ, random_fd, IRQ_READ, random_interrupt, |
103 | if(err) | 133 | IRQF_DISABLED | IRQF_SAMPLE_RANDOM, "random", |
134 | NULL); | ||
135 | if (err) | ||
104 | goto err_out_cleanup_hw; | 136 | goto err_out_cleanup_hw; |
105 | 137 | ||
138 | sigio_broken(random_fd, 1); | ||
139 | |||
106 | err = misc_register (&rng_miscdev); | 140 | err = misc_register (&rng_miscdev); |
107 | if (err) { | 141 | if (err) { |
108 | printk (KERN_ERR RNG_MODULE_NAME ": misc device register failed\n"); | 142 | printk (KERN_ERR RNG_MODULE_NAME ": misc device register " |
143 | "failed\n"); | ||
109 | goto err_out_cleanup_hw; | 144 | goto err_out_cleanup_hw; |
110 | } | 145 | } |
146 | out: | ||
147 | return err; | ||
111 | 148 | ||
112 | out: | 149 | err_out_cleanup_hw: |
113 | return err; | 150 | os_close_file(random_fd); |
114 | 151 | random_fd = -1; | |
115 | err_out_cleanup_hw: | 152 | goto out; |
116 | random_fd = -1; | ||
117 | goto out; | ||
118 | } | 153 | } |
119 | 154 | ||
120 | /* | 155 | /* |
@@ -122,6 +157,7 @@ static int __init rng_init (void) | |||
122 | */ | 157 | */ |
123 | static void __exit rng_cleanup (void) | 158 | static void __exit rng_cleanup (void) |
124 | { | 159 | { |
160 | os_close_file(random_fd); | ||
125 | misc_deregister (&rng_miscdev); | 161 | misc_deregister (&rng_miscdev); |
126 | } | 162 | } |
127 | 163 | ||
diff --git a/arch/um/drivers/slip_user.c b/arch/um/drivers/slip_user.c index 8b80505a3fb0..a1c2d2c98a94 100644 --- a/arch/um/drivers/slip_user.c +++ b/arch/um/drivers/slip_user.c | |||
@@ -96,7 +96,7 @@ static int slip_tramp(char **argv, int fd) | |||
96 | pid = err; | 96 | pid = err; |
97 | 97 | ||
98 | output_len = UM_KERN_PAGE_SIZE; | 98 | output_len = UM_KERN_PAGE_SIZE; |
99 | output = kmalloc(output_len, UM_GFP_KERNEL); | 99 | output = uml_kmalloc(output_len, UM_GFP_KERNEL); |
100 | if (output == NULL) { | 100 | if (output == NULL) { |
101 | printk(UM_KERN_ERR "slip_tramp : failed to allocate output " | 101 | printk(UM_KERN_ERR "slip_tramp : failed to allocate output " |
102 | "buffer\n"); | 102 | "buffer\n"); |
diff --git a/arch/um/drivers/tty.c b/arch/um/drivers/tty.c index c930fedc5172..495858a090e4 100644 --- a/arch/um/drivers/tty.c +++ b/arch/um/drivers/tty.c | |||
@@ -29,7 +29,7 @@ static void *tty_chan_init(char *str, int device, const struct chan_opts *opts) | |||
29 | } | 29 | } |
30 | str++; | 30 | str++; |
31 | 31 | ||
32 | data = kmalloc(sizeof(*data), UM_GFP_KERNEL); | 32 | data = uml_kmalloc(sizeof(*data), UM_GFP_KERNEL); |
33 | if (data == NULL) | 33 | if (data == NULL) |
34 | return NULL; | 34 | return NULL; |
35 | *data = ((struct tty_chan) { .dev = str, | 35 | *data = ((struct tty_chan) { .dev = str, |
diff --git a/arch/um/drivers/ubd_kern.c b/arch/um/drivers/ubd_kern.c index 5e45e39a8a8d..44ad1607be2d 100644 --- a/arch/um/drivers/ubd_kern.c +++ b/arch/um/drivers/ubd_kern.c | |||
@@ -1178,8 +1178,8 @@ static void cowify_bitmap(__u64 io_offset, int length, unsigned long *cow_mask, | |||
1178 | * by one word. Thanks to Lynn Kerby for the fix and James McMechan | 1178 | * by one word. Thanks to Lynn Kerby for the fix and James McMechan |
1179 | * for the original diagnosis. | 1179 | * for the original diagnosis. |
1180 | */ | 1180 | */ |
1181 | if(*cow_offset == ((bitmap_len + sizeof(unsigned long) - 1) / | 1181 | if (*cow_offset == (DIV_ROUND_UP(bitmap_len, |
1182 | sizeof(unsigned long) - 1)) | 1182 | sizeof(unsigned long)) - 1)) |
1183 | (*cow_offset)--; | 1183 | (*cow_offset)--; |
1184 | 1184 | ||
1185 | bitmap_words[0] = bitmap[*cow_offset]; | 1185 | bitmap_words[0] = bitmap[*cow_offset]; |
diff --git a/arch/um/drivers/xterm.c b/arch/um/drivers/xterm.c index 8a1c18a9b240..da2caa5a21ef 100644 --- a/arch/um/drivers/xterm.c +++ b/arch/um/drivers/xterm.c | |||
@@ -30,7 +30,7 @@ static void *xterm_init(char *str, int device, const struct chan_opts *opts) | |||
30 | { | 30 | { |
31 | struct xterm_chan *data; | 31 | struct xterm_chan *data; |
32 | 32 | ||
33 | data = kmalloc(sizeof(*data), UM_GFP_KERNEL); | 33 | data = uml_kmalloc(sizeof(*data), UM_GFP_KERNEL); |
34 | if (data == NULL) | 34 | if (data == NULL) |
35 | return NULL; | 35 | return NULL; |
36 | *data = ((struct xterm_chan) { .pid = -1, | 36 | *data = ((struct xterm_chan) { .pid = -1, |
diff --git a/arch/um/include/as-layout.h b/arch/um/include/as-layout.h index cac542d8ff70..58e852dfb0ce 100644 --- a/arch/um/include/as-layout.h +++ b/arch/um/include/as-layout.h | |||
@@ -23,16 +23,16 @@ | |||
23 | */ | 23 | */ |
24 | 24 | ||
25 | #ifdef __ASSEMBLY__ | 25 | #ifdef __ASSEMBLY__ |
26 | #define _AC(X, Y) (Y) | 26 | #define _UML_AC(X, Y) (Y) |
27 | #else | 27 | #else |
28 | #define __AC(X, Y) (X (Y)) | 28 | #define __UML_AC(X, Y) (X(Y)) |
29 | #define _AC(X, Y) __AC(X, Y) | 29 | #define _UML_AC(X, Y) __UML_AC(X, Y) |
30 | #endif | 30 | #endif |
31 | 31 | ||
32 | #define STUB_START _AC(, 0x100000) | 32 | #define STUB_START _UML_AC(, 0x100000) |
33 | #define STUB_CODE _AC((unsigned long), STUB_START) | 33 | #define STUB_CODE _UML_AC((unsigned long), STUB_START) |
34 | #define STUB_DATA _AC((unsigned long), STUB_CODE + UM_KERN_PAGE_SIZE) | 34 | #define STUB_DATA _UML_AC((unsigned long), STUB_CODE + UM_KERN_PAGE_SIZE) |
35 | #define STUB_END _AC((unsigned long), STUB_DATA + UM_KERN_PAGE_SIZE) | 35 | #define STUB_END _UML_AC((unsigned long), STUB_DATA + UM_KERN_PAGE_SIZE) |
36 | 36 | ||
37 | #ifndef __ASSEMBLY__ | 37 | #ifndef __ASSEMBLY__ |
38 | 38 | ||
diff --git a/arch/um/include/line.h b/arch/um/include/line.h index 979b73e6352d..311a0d3d93af 100644 --- a/arch/um/include/line.h +++ b/arch/um/include/line.h | |||
@@ -58,11 +58,11 @@ struct line { | |||
58 | }; | 58 | }; |
59 | 59 | ||
60 | #define LINE_INIT(str, d) \ | 60 | #define LINE_INIT(str, d) \ |
61 | { .count_lock = SPIN_LOCK_UNLOCKED, \ | 61 | { .count_lock = __SPIN_LOCK_UNLOCKED((str).count_lock), \ |
62 | .init_str = str, \ | 62 | .init_str = str, \ |
63 | .init_pri = INIT_STATIC, \ | 63 | .init_pri = INIT_STATIC, \ |
64 | .valid = 1, \ | 64 | .valid = 1, \ |
65 | .lock = SPIN_LOCK_UNLOCKED, \ | 65 | .lock = __SPIN_LOCK_UNLOCKED((str).lock), \ |
66 | .driver = d } | 66 | .driver = d } |
67 | 67 | ||
68 | extern void line_close(struct tty_struct *tty, struct file * filp); | 68 | extern void line_close(struct tty_struct *tty, struct file * filp); |
diff --git a/arch/um/include/os.h b/arch/um/include/os.h index 32c799e3a495..e2716ac8889a 100644 --- a/arch/um/include/os.h +++ b/arch/um/include/os.h | |||
@@ -290,6 +290,7 @@ extern void os_set_ioignore(void); | |||
290 | extern int add_sigio_fd(int fd); | 290 | extern int add_sigio_fd(int fd); |
291 | extern int ignore_sigio_fd(int fd); | 291 | extern int ignore_sigio_fd(int fd); |
292 | extern void maybe_sigio_broken(int fd, int read); | 292 | extern void maybe_sigio_broken(int fd, int read); |
293 | extern void sigio_broken(int fd, int read); | ||
293 | 294 | ||
294 | /* sys-x86_64/prctl.c */ | 295 | /* sys-x86_64/prctl.c */ |
295 | extern int os_arch_prctl(int pid, int code, unsigned long *addr); | 296 | extern int os_arch_prctl(int pid, int code, unsigned long *addr); |
diff --git a/arch/um/include/process.h b/arch/um/include/process.h index 5af9157ff54f..bb873a51262e 100644 --- a/arch/um/include/process.h +++ b/arch/um/include/process.h | |||
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | * Copyright (C) 2000, 2001, 2002 Jeff Dike (jdike@karaya.com) | 2 | * Copyright (C) 2000 - 2008 Jeff Dike (jdike@{addtoit,linux.intel}.com) |
3 | * Licensed under the GPL | 3 | * Licensed under the GPL |
4 | */ | 4 | */ |
5 | 5 | ||
@@ -8,18 +8,10 @@ | |||
8 | 8 | ||
9 | #include <signal.h> | 9 | #include <signal.h> |
10 | 10 | ||
11 | extern void sig_handler(int sig, struct sigcontext sc); | 11 | /* Copied from linux/compiler-gcc.h since we can't include it directly */ |
12 | extern void alarm_handler(int sig, struct sigcontext sc); | 12 | #define barrier() __asm__ __volatile__("": : :"memory") |
13 | 13 | ||
14 | #endif | 14 | extern void sig_handler(int sig, struct sigcontext *sc); |
15 | extern void alarm_handler(int sig, struct sigcontext *sc); | ||
15 | 16 | ||
16 | /* | 17 | #endif |
17 | * Overrides for Emacs so that we follow Linus's tabbing style. | ||
18 | * Emacs will notice this stuff at the end of the file and automatically | ||
19 | * adjust the settings for this buffer only. This must remain at the end | ||
20 | * of the file. | ||
21 | * --------------------------------------------------------------------------- | ||
22 | * Local variables: | ||
23 | * c-file-style: "linux" | ||
24 | * End: | ||
25 | */ | ||
diff --git a/arch/um/include/skas_ptrace.h b/arch/um/include/skas_ptrace.h index cd2327d09c8d..3d31bbacd016 100644 --- a/arch/um/include/skas_ptrace.h +++ b/arch/um/include/skas_ptrace.h | |||
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | * Copyright (C) 2000, 2001, 2002 Jeff Dike (jdike@karaya.com) | 2 | * Copyright (C) 2000 - 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com) |
3 | * Licensed under the GPL | 3 | * Licensed under the GPL |
4 | */ | 4 | */ |
5 | 5 | ||
@@ -12,14 +12,3 @@ | |||
12 | #include "sysdep/skas_ptrace.h" | 12 | #include "sysdep/skas_ptrace.h" |
13 | 13 | ||
14 | #endif | 14 | #endif |
15 | |||
16 | /* | ||
17 | * Overrides for Emacs so that we follow Linus's tabbing style. | ||
18 | * Emacs will notice this stuff at the end of the file and automatically | ||
19 | * adjust the settings for this buffer only. This must remain at the end | ||
20 | * of the file. | ||
21 | * --------------------------------------------------------------------------- | ||
22 | * Local variables: | ||
23 | * c-file-style: "linux" | ||
24 | * End: | ||
25 | */ | ||
diff --git a/arch/um/include/sysdep-i386/ptrace_user.h b/arch/um/include/sysdep-i386/ptrace_user.h index 75650723c38f..ef56247e4143 100644 --- a/arch/um/include/sysdep-i386/ptrace_user.h +++ b/arch/um/include/sysdep-i386/ptrace_user.h | |||
@@ -41,38 +41,10 @@ | |||
41 | #define PT_SP_OFFSET PT_OFFSET(UESP) | 41 | #define PT_SP_OFFSET PT_OFFSET(UESP) |
42 | #define PT_SP(regs) ((regs)[UESP]) | 42 | #define PT_SP(regs) ((regs)[UESP]) |
43 | 43 | ||
44 | #define FP_SIZE ((HOST_XFP_SIZE > HOST_FP_SIZE) ? HOST_XFP_SIZE : HOST_FP_SIZE) | 44 | #define FP_SIZE ((HOST_FPX_SIZE > HOST_FP_SIZE) ? HOST_FPX_SIZE : HOST_FP_SIZE) |
45 | 45 | ||
46 | #ifndef FRAME_SIZE | 46 | #ifndef FRAME_SIZE |
47 | #define FRAME_SIZE (17) | 47 | #define FRAME_SIZE (17) |
48 | #endif | 48 | #endif |
49 | #define FRAME_SIZE_OFFSET (FRAME_SIZE * sizeof(unsigned long)) | ||
50 | |||
51 | #define FP_FRAME_SIZE (27) | ||
52 | #define FPX_FRAME_SIZE (128) | ||
53 | |||
54 | #ifdef PTRACE_GETREGS | ||
55 | #define UM_HAVE_GETREGS | ||
56 | #endif | ||
57 | |||
58 | #ifdef PTRACE_SETREGS | ||
59 | #define UM_HAVE_SETREGS | ||
60 | #endif | ||
61 | |||
62 | #ifdef PTRACE_GETFPREGS | ||
63 | #define UM_HAVE_GETFPREGS | ||
64 | #endif | ||
65 | |||
66 | #ifdef PTRACE_SETFPREGS | ||
67 | #define UM_HAVE_SETFPREGS | ||
68 | #endif | ||
69 | |||
70 | #ifdef PTRACE_GETFPXREGS | ||
71 | #define UM_HAVE_GETFPXREGS | ||
72 | #endif | ||
73 | |||
74 | #ifdef PTRACE_SETFPXREGS | ||
75 | #define UM_HAVE_SETFPXREGS | ||
76 | #endif | ||
77 | 49 | ||
78 | #endif | 50 | #endif |
diff --git a/arch/um/include/sysdep-i386/sigcontext.h b/arch/um/include/sysdep-i386/sigcontext.h index 67e77122aa45..f583c87111a0 100644 --- a/arch/um/include/sysdep-i386/sigcontext.h +++ b/arch/um/include/sysdep-i386/sigcontext.h | |||
@@ -10,7 +10,7 @@ | |||
10 | 10 | ||
11 | #define IP_RESTART_SYSCALL(ip) ((ip) -= 2) | 11 | #define IP_RESTART_SYSCALL(ip) ((ip) -= 2) |
12 | 12 | ||
13 | #define GET_FAULTINFO_FROM_SC(fi,sc) \ | 13 | #define GET_FAULTINFO_FROM_SC(fi, sc) \ |
14 | { \ | 14 | { \ |
15 | (fi).cr2 = SC_CR2(sc); \ | 15 | (fi).cr2 = SC_CR2(sc); \ |
16 | (fi).error_code = SC_ERR(sc); \ | 16 | (fi).error_code = SC_ERR(sc); \ |
diff --git a/arch/um/include/sysdep-x86_64/ptrace_user.h b/arch/um/include/sysdep-x86_64/ptrace_user.h index 45c0bd881cb3..4dbccdb58f48 100644 --- a/arch/um/include/sysdep-x86_64/ptrace_user.h +++ b/arch/um/include/sysdep-x86_64/ptrace_user.h | |||
@@ -48,7 +48,8 @@ | |||
48 | #define PT_ORIG_RAX_OFFSET (ORIG_RAX) | 48 | #define PT_ORIG_RAX_OFFSET (ORIG_RAX) |
49 | #define PT_ORIG_RAX(regs) ((regs)[PT_INDEX(ORIG_RAX)]) | 49 | #define PT_ORIG_RAX(regs) ((regs)[PT_INDEX(ORIG_RAX)]) |
50 | 50 | ||
51 | /* x86_64 FC3 doesn't define this in /usr/include/linux/ptrace.h even though | 51 | /* |
52 | * x86_64 FC3 doesn't define this in /usr/include/linux/ptrace.h even though | ||
52 | * it's defined in the kernel's include/linux/ptrace.h. Additionally, use the | 53 | * it's defined in the kernel's include/linux/ptrace.h. Additionally, use the |
53 | * 2.4 name and value for 2.4 host compatibility. | 54 | * 2.4 name and value for 2.4 host compatibility. |
54 | */ | 55 | */ |
@@ -56,7 +57,8 @@ | |||
56 | #define PTRACE_OLDSETOPTIONS 21 | 57 | #define PTRACE_OLDSETOPTIONS 21 |
57 | #endif | 58 | #endif |
58 | 59 | ||
59 | /* These are before the system call, so the system call number is RAX | 60 | /* |
61 | * These are before the system call, so the system call number is RAX | ||
60 | * rather than ORIG_RAX, and arg4 is R10 rather than RCX | 62 | * rather than ORIG_RAX, and arg4 is R10 rather than RCX |
61 | */ | 63 | */ |
62 | #define REGS_SYSCALL_NR PT_INDEX(RAX) | 64 | #define REGS_SYSCALL_NR PT_INDEX(RAX) |
@@ -73,14 +75,3 @@ | |||
73 | #define FP_SIZE (HOST_FP_SIZE) | 75 | #define FP_SIZE (HOST_FP_SIZE) |
74 | 76 | ||
75 | #endif | 77 | #endif |
76 | |||
77 | /* | ||
78 | * Overrides for Emacs so that we follow Linus's tabbing style. | ||
79 | * Emacs will notice this stuff at the end of the file and automatically | ||
80 | * adjust the settings for this buffer only. This must remain at the end | ||
81 | * of the file. | ||
82 | * --------------------------------------------------------------------------- | ||
83 | * Local variables: | ||
84 | * c-file-style: "linux" | ||
85 | * End: | ||
86 | */ | ||
diff --git a/arch/um/include/um_malloc.h b/arch/um/include/um_malloc.h index 0ad17cb83d96..c554d706d106 100644 --- a/arch/um/include/um_malloc.h +++ b/arch/um/include/um_malloc.h | |||
@@ -8,15 +8,12 @@ | |||
8 | 8 | ||
9 | #include "kern_constants.h" | 9 | #include "kern_constants.h" |
10 | 10 | ||
11 | extern void *__kmalloc(int size, int flags); | 11 | extern void *uml_kmalloc(int size, int flags); |
12 | static inline void *kmalloc(int size, int flags) | ||
13 | { | ||
14 | return __kmalloc(size, flags); | ||
15 | } | ||
16 | |||
17 | extern void kfree(const void *ptr); | 12 | extern void kfree(const void *ptr); |
18 | 13 | ||
19 | extern void *vmalloc(unsigned long size); | 14 | extern void *vmalloc(unsigned long size); |
20 | extern void vfree(void *ptr); | 15 | extern void vfree(void *ptr); |
21 | 16 | ||
22 | #endif /* __UM_MALLOC_H__ */ | 17 | #endif /* __UM_MALLOC_H__ */ |
18 | |||
19 | |||
diff --git a/arch/um/kernel/dyn.lds.S b/arch/um/kernel/dyn.lds.S index 26090b7f323e..9975e1ab44fb 100644 --- a/arch/um/kernel/dyn.lds.S +++ b/arch/um/kernel/dyn.lds.S | |||
@@ -1,4 +1,5 @@ | |||
1 | #include <asm-generic/vmlinux.lds.h> | 1 | #include <asm-generic/vmlinux.lds.h> |
2 | #include <asm/page.h> | ||
2 | 3 | ||
3 | OUTPUT_FORMAT(ELF_FORMAT) | 4 | OUTPUT_FORMAT(ELF_FORMAT) |
4 | OUTPUT_ARCH(ELF_ARCH) | 5 | OUTPUT_ARCH(ELF_ARCH) |
@@ -21,7 +22,7 @@ SECTIONS | |||
21 | _einittext = .; | 22 | _einittext = .; |
22 | } | 23 | } |
23 | 24 | ||
24 | . = ALIGN(4096); | 25 | . = ALIGN(PAGE_SIZE); |
25 | 26 | ||
26 | /* Read-only sections, merged into text segment: */ | 27 | /* Read-only sections, merged into text segment: */ |
27 | .hash : { *(.hash) } | 28 | .hash : { *(.hash) } |
@@ -68,9 +69,9 @@ SECTIONS | |||
68 | /* .gnu.warning sections are handled specially by elf32.em. */ | 69 | /* .gnu.warning sections are handled specially by elf32.em. */ |
69 | *(.gnu.warning) | 70 | *(.gnu.warning) |
70 | 71 | ||
71 | . = ALIGN(4096); | 72 | . = ALIGN(PAGE_SIZE); |
72 | } =0x90909090 | 73 | } =0x90909090 |
73 | . = ALIGN(4096); | 74 | . = ALIGN(PAGE_SIZE); |
74 | .syscall_stub : { | 75 | .syscall_stub : { |
75 | __syscall_stub_start = .; | 76 | __syscall_stub_start = .; |
76 | *(.__syscall_stub*) | 77 | *(.__syscall_stub*) |
diff --git a/arch/um/kernel/mem.c b/arch/um/kernel/mem.c index 2eea1ff235e6..b0ee64622ff7 100644 --- a/arch/um/kernel/mem.c +++ b/arch/um/kernel/mem.c | |||
@@ -375,3 +375,8 @@ pmd_t *pmd_alloc_one(struct mm_struct *mm, unsigned long address) | |||
375 | return pmd; | 375 | return pmd; |
376 | } | 376 | } |
377 | #endif | 377 | #endif |
378 | |||
379 | void *uml_kmalloc(int size, int flags) | ||
380 | { | ||
381 | return kmalloc(size, flags); | ||
382 | } | ||
diff --git a/arch/um/kernel/time.c b/arch/um/kernel/time.c index 0d0cea2ac98d..c3e2f369c33c 100644 --- a/arch/um/kernel/time.c +++ b/arch/um/kernel/time.c | |||
@@ -75,7 +75,7 @@ static irqreturn_t um_timer(int irq, void *dev) | |||
75 | 75 | ||
76 | static cycle_t itimer_read(void) | 76 | static cycle_t itimer_read(void) |
77 | { | 77 | { |
78 | return os_nsecs(); | 78 | return os_nsecs() / 1000; |
79 | } | 79 | } |
80 | 80 | ||
81 | static struct clocksource itimer_clocksource = { | 81 | static struct clocksource itimer_clocksource = { |
@@ -83,7 +83,7 @@ static struct clocksource itimer_clocksource = { | |||
83 | .rating = 300, | 83 | .rating = 300, |
84 | .read = itimer_read, | 84 | .read = itimer_read, |
85 | .mask = CLOCKSOURCE_MASK(64), | 85 | .mask = CLOCKSOURCE_MASK(64), |
86 | .mult = 1, | 86 | .mult = 1000, |
87 | .shift = 0, | 87 | .shift = 0, |
88 | .flags = CLOCK_SOURCE_IS_CONTINUOUS, | 88 | .flags = CLOCK_SOURCE_IS_CONTINUOUS, |
89 | }; | 89 | }; |
diff --git a/arch/um/kernel/um_arch.c b/arch/um/kernel/um_arch.c index 56deed623446..9db85b2ce698 100644 --- a/arch/um/kernel/um_arch.c +++ b/arch/um/kernel/um_arch.c | |||
@@ -150,7 +150,7 @@ __uml_setup("root=", uml_root_setup, | |||
150 | static int __init no_skas_debug_setup(char *line, int *add) | 150 | static int __init no_skas_debug_setup(char *line, int *add) |
151 | { | 151 | { |
152 | printf("'debug' is not necessary to gdb UML in skas mode - run \n"); | 152 | printf("'debug' is not necessary to gdb UML in skas mode - run \n"); |
153 | printf("'gdb linux'"); | 153 | printf("'gdb linux'\n"); |
154 | 154 | ||
155 | return 0; | 155 | return 0; |
156 | } | 156 | } |
@@ -258,6 +258,7 @@ int __init linux_main(int argc, char **argv) | |||
258 | { | 258 | { |
259 | unsigned long avail, diff; | 259 | unsigned long avail, diff; |
260 | unsigned long virtmem_size, max_physmem; | 260 | unsigned long virtmem_size, max_physmem; |
261 | unsigned long stack; | ||
261 | unsigned int i; | 262 | unsigned int i; |
262 | int add; | 263 | int add; |
263 | char * mode; | 264 | char * mode; |
@@ -348,7 +349,9 @@ int __init linux_main(int argc, char **argv) | |||
348 | } | 349 | } |
349 | 350 | ||
350 | virtmem_size = physmem_size; | 351 | virtmem_size = physmem_size; |
351 | avail = TASK_SIZE - start_vm; | 352 | stack = (unsigned long) argv; |
353 | stack &= ~(1024 * 1024 - 1); | ||
354 | avail = stack - start_vm; | ||
352 | if (physmem_size > avail) | 355 | if (physmem_size > avail) |
353 | virtmem_size = avail; | 356 | virtmem_size = avail; |
354 | end_vm = start_vm + virtmem_size; | 357 | end_vm = start_vm + virtmem_size; |
diff --git a/arch/um/kernel/uml.lds.S b/arch/um/kernel/uml.lds.S index 5828c1d54505..11b835248b86 100644 --- a/arch/um/kernel/uml.lds.S +++ b/arch/um/kernel/uml.lds.S | |||
@@ -1,4 +1,5 @@ | |||
1 | #include <asm-generic/vmlinux.lds.h> | 1 | #include <asm-generic/vmlinux.lds.h> |
2 | #include <asm/page.h> | ||
2 | 3 | ||
3 | OUTPUT_FORMAT(ELF_FORMAT) | 4 | OUTPUT_FORMAT(ELF_FORMAT) |
4 | OUTPUT_ARCH(ELF_ARCH) | 5 | OUTPUT_ARCH(ELF_ARCH) |
@@ -26,7 +27,7 @@ SECTIONS | |||
26 | INIT_TEXT | 27 | INIT_TEXT |
27 | _einittext = .; | 28 | _einittext = .; |
28 | } | 29 | } |
29 | . = ALIGN(4096); | 30 | . = ALIGN(PAGE_SIZE); |
30 | 31 | ||
31 | .text : | 32 | .text : |
32 | { | 33 | { |
@@ -39,7 +40,7 @@ SECTIONS | |||
39 | *(.gnu.linkonce.t*) | 40 | *(.gnu.linkonce.t*) |
40 | } | 41 | } |
41 | 42 | ||
42 | . = ALIGN(4096); | 43 | . = ALIGN(PAGE_SIZE); |
43 | .syscall_stub : { | 44 | .syscall_stub : { |
44 | __syscall_stub_start = .; | 45 | __syscall_stub_start = .; |
45 | *(.__syscall_stub*) | 46 | *(.__syscall_stub*) |
@@ -79,7 +80,7 @@ SECTIONS | |||
79 | .sdata : { *(.sdata) } | 80 | .sdata : { *(.sdata) } |
80 | _edata = .; | 81 | _edata = .; |
81 | PROVIDE (edata = .); | 82 | PROVIDE (edata = .); |
82 | . = ALIGN(0x1000); | 83 | . = ALIGN(PAGE_SIZE); |
83 | .sbss : | 84 | .sbss : |
84 | { | 85 | { |
85 | __bss_start = .; | 86 | __bss_start = .; |
diff --git a/arch/um/os-Linux/drivers/ethertap_user.c b/arch/um/os-Linux/drivers/ethertap_user.c index 6fb0b174f538..cc72cb2c1af6 100644 --- a/arch/um/os-Linux/drivers/ethertap_user.c +++ b/arch/um/os-Linux/drivers/ethertap_user.c | |||
@@ -52,7 +52,7 @@ static void etap_change(int op, unsigned char *addr, unsigned char *netmask, | |||
52 | return; | 52 | return; |
53 | } | 53 | } |
54 | 54 | ||
55 | output = kmalloc(UM_KERN_PAGE_SIZE, UM_GFP_KERNEL); | 55 | output = uml_kmalloc(UM_KERN_PAGE_SIZE, UM_GFP_KERNEL); |
56 | if (output == NULL) | 56 | if (output == NULL) |
57 | printk(UM_KERN_ERR "etap_change : Failed to allocate output " | 57 | printk(UM_KERN_ERR "etap_change : Failed to allocate output " |
58 | "buffer\n"); | 58 | "buffer\n"); |
@@ -165,7 +165,7 @@ static int etap_open(void *data) | |||
165 | err = etap_tramp(pri->dev_name, pri->gate_addr, control_fds[0], | 165 | err = etap_tramp(pri->dev_name, pri->gate_addr, control_fds[0], |
166 | control_fds[1], data_fds[0], data_fds[1]); | 166 | control_fds[1], data_fds[0], data_fds[1]); |
167 | output_len = UM_KERN_PAGE_SIZE; | 167 | output_len = UM_KERN_PAGE_SIZE; |
168 | output = kmalloc(output_len, UM_GFP_KERNEL); | 168 | output = uml_kmalloc(output_len, UM_GFP_KERNEL); |
169 | read_output(control_fds[0], output, output_len); | 169 | read_output(control_fds[0], output, output_len); |
170 | 170 | ||
171 | if (output == NULL) | 171 | if (output == NULL) |
diff --git a/arch/um/os-Linux/helper.c b/arch/um/os-Linux/helper.c index f25c29a12d00..74ca7aabf4e1 100644 --- a/arch/um/os-Linux/helper.c +++ b/arch/um/os-Linux/helper.c | |||
@@ -71,8 +71,8 @@ int run_helper(void (*pre_exec)(void *), void *pre_data, char **argv) | |||
71 | data.pre_data = pre_data; | 71 | data.pre_data = pre_data; |
72 | data.argv = argv; | 72 | data.argv = argv; |
73 | data.fd = fds[1]; | 73 | data.fd = fds[1]; |
74 | data.buf = __cant_sleep() ? kmalloc(PATH_MAX, UM_GFP_ATOMIC) : | 74 | data.buf = __cant_sleep() ? uml_kmalloc(PATH_MAX, UM_GFP_ATOMIC) : |
75 | kmalloc(PATH_MAX, UM_GFP_KERNEL); | 75 | uml_kmalloc(PATH_MAX, UM_GFP_KERNEL); |
76 | pid = clone(helper_child, (void *) sp, CLONE_VM, &data); | 76 | pid = clone(helper_child, (void *) sp, CLONE_VM, &data); |
77 | if (pid < 0) { | 77 | if (pid < 0) { |
78 | ret = -errno; | 78 | ret = -errno; |
diff --git a/arch/um/os-Linux/main.c b/arch/um/os-Linux/main.c index abb9b0ffd960..eee69b9f52c9 100644 --- a/arch/um/os-Linux/main.c +++ b/arch/um/os-Linux/main.c | |||
@@ -199,7 +199,7 @@ void *__wrap_malloc(int size) | |||
199 | return __real_malloc(size); | 199 | return __real_malloc(size); |
200 | else if (size <= UM_KERN_PAGE_SIZE) | 200 | else if (size <= UM_KERN_PAGE_SIZE) |
201 | /* finding contiguous pages can be hard*/ | 201 | /* finding contiguous pages can be hard*/ |
202 | ret = kmalloc(size, UM_GFP_KERNEL); | 202 | ret = uml_kmalloc(size, UM_GFP_KERNEL); |
203 | else ret = vmalloc(size); | 203 | else ret = vmalloc(size); |
204 | 204 | ||
205 | /* | 205 | /* |
diff --git a/arch/um/os-Linux/sigio.c b/arch/um/os-Linux/sigio.c index abf47a7c4abd..eb8f2e4be192 100644 --- a/arch/um/os-Linux/sigio.c +++ b/arch/um/os-Linux/sigio.c | |||
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | * Copyright (C) 2002 - 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com) | 2 | * Copyright (C) 2002 - 2008 Jeff Dike (jdike@{addtoit,linux.intel}.com) |
3 | * Licensed under the GPL | 3 | * Licensed under the GPL |
4 | */ | 4 | */ |
5 | 5 | ||
@@ -15,6 +15,7 @@ | |||
15 | #include "kern_util.h" | 15 | #include "kern_util.h" |
16 | #include "init.h" | 16 | #include "init.h" |
17 | #include "os.h" | 17 | #include "os.h" |
18 | #include "process.h" | ||
18 | #include "sigio.h" | 19 | #include "sigio.h" |
19 | #include "um_malloc.h" | 20 | #include "um_malloc.h" |
20 | #include "user.h" | 21 | #include "user.h" |
@@ -109,7 +110,7 @@ static int need_poll(struct pollfds *polls, int n) | |||
109 | if (n <= polls->size) | 110 | if (n <= polls->size) |
110 | return 0; | 111 | return 0; |
111 | 112 | ||
112 | new = kmalloc(n * sizeof(struct pollfd), UM_GFP_ATOMIC); | 113 | new = uml_kmalloc(n * sizeof(struct pollfd), UM_GFP_ATOMIC); |
113 | if (new == NULL) { | 114 | if (new == NULL) { |
114 | printk(UM_KERN_ERR "need_poll : failed to allocate new " | 115 | printk(UM_KERN_ERR "need_poll : failed to allocate new " |
115 | "pollfds\n"); | 116 | "pollfds\n"); |
@@ -243,7 +244,7 @@ static struct pollfd *setup_initial_poll(int fd) | |||
243 | { | 244 | { |
244 | struct pollfd *p; | 245 | struct pollfd *p; |
245 | 246 | ||
246 | p = kmalloc(sizeof(struct pollfd), UM_GFP_KERNEL); | 247 | p = uml_kmalloc(sizeof(struct pollfd), UM_GFP_KERNEL); |
247 | if (p == NULL) { | 248 | if (p == NULL) { |
248 | printk(UM_KERN_ERR "setup_initial_poll : failed to allocate " | 249 | printk(UM_KERN_ERR "setup_initial_poll : failed to allocate " |
249 | "poll\n"); | 250 | "poll\n"); |
@@ -338,20 +339,10 @@ out_close1: | |||
338 | close(l_write_sigio_fds[1]); | 339 | close(l_write_sigio_fds[1]); |
339 | } | 340 | } |
340 | 341 | ||
341 | /* Changed during early boot */ | 342 | void sigio_broken(int fd, int read) |
342 | static int pty_output_sigio = 0; | ||
343 | static int pty_close_sigio = 0; | ||
344 | |||
345 | void maybe_sigio_broken(int fd, int read) | ||
346 | { | 343 | { |
347 | int err; | 344 | int err; |
348 | 345 | ||
349 | if (!isatty(fd)) | ||
350 | return; | ||
351 | |||
352 | if ((read || pty_output_sigio) && (!read || pty_close_sigio)) | ||
353 | return; | ||
354 | |||
355 | write_sigio_workaround(); | 346 | write_sigio_workaround(); |
356 | 347 | ||
357 | sigio_lock(); | 348 | sigio_lock(); |
@@ -370,6 +361,21 @@ out: | |||
370 | sigio_unlock(); | 361 | sigio_unlock(); |
371 | } | 362 | } |
372 | 363 | ||
364 | /* Changed during early boot */ | ||
365 | static int pty_output_sigio; | ||
366 | static int pty_close_sigio; | ||
367 | |||
368 | void maybe_sigio_broken(int fd, int read) | ||
369 | { | ||
370 | if (!isatty(fd)) | ||
371 | return; | ||
372 | |||
373 | if ((read || pty_output_sigio) && (!read || pty_close_sigio)) | ||
374 | return; | ||
375 | |||
376 | sigio_broken(fd, read); | ||
377 | } | ||
378 | |||
373 | static void sigio_cleanup(void) | 379 | static void sigio_cleanup(void) |
374 | { | 380 | { |
375 | if (write_sigio_pid == -1) | 381 | if (write_sigio_pid == -1) |
@@ -383,7 +389,7 @@ static void sigio_cleanup(void) | |||
383 | __uml_exitcall(sigio_cleanup); | 389 | __uml_exitcall(sigio_cleanup); |
384 | 390 | ||
385 | /* Used as a flag during SIGIO testing early in boot */ | 391 | /* Used as a flag during SIGIO testing early in boot */ |
386 | static volatile int got_sigio = 0; | 392 | static int got_sigio; |
387 | 393 | ||
388 | static void __init handler(int sig) | 394 | static void __init handler(int sig) |
389 | { | 395 | { |
@@ -498,7 +504,8 @@ static void tty_output(int master, int slave) | |||
498 | if (errno != EAGAIN) | 504 | if (errno != EAGAIN) |
499 | printk(UM_KERN_ERR "tty_output : write failed, errno = %d\n", | 505 | printk(UM_KERN_ERR "tty_output : write failed, errno = %d\n", |
500 | errno); | 506 | errno); |
501 | while (((n = read(slave, buf, sizeof(buf))) > 0) && !got_sigio) | 507 | while (((n = read(slave, buf, sizeof(buf))) > 0) && |
508 | !({ barrier(); got_sigio; })) | ||
502 | ; | 509 | ; |
503 | 510 | ||
504 | if (got_sigio) { | 511 | if (got_sigio) { |
diff --git a/arch/um/os-Linux/signal.c b/arch/um/os-Linux/signal.c index 3f1694b134cb..5aade6027e40 100644 --- a/arch/um/os-Linux/signal.c +++ b/arch/um/os-Linux/signal.c | |||
@@ -12,6 +12,7 @@ | |||
12 | #include "as-layout.h" | 12 | #include "as-layout.h" |
13 | #include "kern_util.h" | 13 | #include "kern_util.h" |
14 | #include "os.h" | 14 | #include "os.h" |
15 | #include "process.h" | ||
15 | #include "sysdep/barrier.h" | 16 | #include "sysdep/barrier.h" |
16 | #include "sysdep/sigcontext.h" | 17 | #include "sysdep/sigcontext.h" |
17 | #include "user.h" | 18 | #include "user.h" |
diff --git a/arch/um/os-Linux/skas/process.c b/arch/um/os-Linux/skas/process.c index 1e8cba6550a9..6be028ca1817 100644 --- a/arch/um/os-Linux/skas/process.c +++ b/arch/um/os-Linux/skas/process.c | |||
@@ -442,7 +442,7 @@ void userspace(struct uml_pt_regs *regs) | |||
442 | unblock_signals(); | 442 | unblock_signals(); |
443 | break; | 443 | break; |
444 | default: | 444 | default: |
445 | printk(UM_KERN_ERR "userspace - child stopped " | 445 | printk(UM_KERN_ERR "userspace - child stopped " |
446 | "with signal %d\n", sig); | 446 | "with signal %d\n", sig); |
447 | fatal_sigsegv(); | 447 | fatal_sigsegv(); |
448 | } | 448 | } |
diff --git a/arch/um/os-Linux/start_up.c b/arch/um/os-Linux/start_up.c index 997d01944f91..b4b36e0f2e89 100644 --- a/arch/um/os-Linux/start_up.c +++ b/arch/um/os-Linux/start_up.c | |||
@@ -23,6 +23,7 @@ | |||
23 | #include "mem_user.h" | 23 | #include "mem_user.h" |
24 | #include "ptrace_user.h" | 24 | #include "ptrace_user.h" |
25 | #include "registers.h" | 25 | #include "registers.h" |
26 | #include "skas.h" | ||
26 | #include "skas_ptrace.h" | 27 | #include "skas_ptrace.h" |
27 | 28 | ||
28 | static void ptrace_child(void) | 29 | static void ptrace_child(void) |
@@ -140,14 +141,27 @@ static int stop_ptraced_child(int pid, int exitcode, int mustexit) | |||
140 | } | 141 | } |
141 | 142 | ||
142 | /* Changed only during early boot */ | 143 | /* Changed only during early boot */ |
143 | int ptrace_faultinfo = 1; | 144 | int ptrace_faultinfo; |
144 | int ptrace_ldt = 1; | 145 | static int disable_ptrace_faultinfo; |
145 | int proc_mm = 1; | 146 | |
146 | int skas_needs_stub = 0; | 147 | int ptrace_ldt; |
148 | static int disable_ptrace_ldt; | ||
149 | |||
150 | int proc_mm; | ||
151 | static int disable_proc_mm; | ||
152 | |||
153 | int have_switch_mm; | ||
154 | static int disable_switch_mm; | ||
155 | |||
156 | int skas_needs_stub; | ||
147 | 157 | ||
148 | static int __init skas0_cmd_param(char *str, int* add) | 158 | static int __init skas0_cmd_param(char *str, int* add) |
149 | { | 159 | { |
150 | ptrace_faultinfo = proc_mm = 0; | 160 | disable_ptrace_faultinfo = 1; |
161 | disable_ptrace_ldt = 1; | ||
162 | disable_proc_mm = 1; | ||
163 | disable_switch_mm = 1; | ||
164 | |||
151 | return 0; | 165 | return 0; |
152 | } | 166 | } |
153 | 167 | ||
@@ -157,15 +171,12 @@ static int __init mode_skas0_cmd_param(char *str, int* add) | |||
157 | __attribute__((alias("skas0_cmd_param"))); | 171 | __attribute__((alias("skas0_cmd_param"))); |
158 | 172 | ||
159 | __uml_setup("skas0", skas0_cmd_param, | 173 | __uml_setup("skas0", skas0_cmd_param, |
160 | "skas0\n" | 174 | "skas0\n" |
161 | " Disables SKAS3 usage, so that SKAS0 is used, unless \n" | 175 | " Disables SKAS3 and SKAS4 usage, so that SKAS0 is used\n\n"); |
162 | " you specify mode=tt.\n\n"); | ||
163 | 176 | ||
164 | __uml_setup("mode=skas0", mode_skas0_cmd_param, | 177 | __uml_setup("mode=skas0", mode_skas0_cmd_param, |
165 | "mode=skas0\n" | 178 | "mode=skas0\n" |
166 | " Disables SKAS3 usage, so that SKAS0 is used, unless you \n" | 179 | " Disables SKAS3 and SKAS4 usage, so that SKAS0 is used.\n\n"); |
167 | " specify mode=tt. Note that this was recently added - on \n" | ||
168 | " older kernels you must use simply \"skas0\".\n\n"); | ||
169 | 180 | ||
170 | /* Changed only during early boot */ | 181 | /* Changed only during early boot */ |
171 | static int force_sysemu_disabled = 0; | 182 | static int force_sysemu_disabled = 0; |
@@ -360,7 +371,7 @@ void __init os_early_checks(void) | |||
360 | 371 | ||
361 | static int __init noprocmm_cmd_param(char *str, int* add) | 372 | static int __init noprocmm_cmd_param(char *str, int* add) |
362 | { | 373 | { |
363 | proc_mm = 0; | 374 | disable_proc_mm = 1; |
364 | return 0; | 375 | return 0; |
365 | } | 376 | } |
366 | 377 | ||
@@ -372,7 +383,7 @@ __uml_setup("noprocmm", noprocmm_cmd_param, | |||
372 | 383 | ||
373 | static int __init noptracefaultinfo_cmd_param(char *str, int* add) | 384 | static int __init noptracefaultinfo_cmd_param(char *str, int* add) |
374 | { | 385 | { |
375 | ptrace_faultinfo = 0; | 386 | disable_ptrace_faultinfo = 1; |
376 | return 0; | 387 | return 0; |
377 | } | 388 | } |
378 | 389 | ||
@@ -384,7 +395,7 @@ __uml_setup("noptracefaultinfo", noptracefaultinfo_cmd_param, | |||
384 | 395 | ||
385 | static int __init noptraceldt_cmd_param(char *str, int* add) | 396 | static int __init noptraceldt_cmd_param(char *str, int* add) |
386 | { | 397 | { |
387 | ptrace_ldt = 0; | 398 | disable_ptrace_ldt = 1; |
388 | return 0; | 399 | return 0; |
389 | } | 400 | } |
390 | 401 | ||
@@ -404,17 +415,15 @@ static inline void check_skas3_ptrace_faultinfo(void) | |||
404 | 415 | ||
405 | n = ptrace(PTRACE_FAULTINFO, pid, 0, &fi); | 416 | n = ptrace(PTRACE_FAULTINFO, pid, 0, &fi); |
406 | if (n < 0) { | 417 | if (n < 0) { |
407 | ptrace_faultinfo = 0; | ||
408 | if (errno == EIO) | 418 | if (errno == EIO) |
409 | non_fatal("not found\n"); | 419 | non_fatal("not found\n"); |
410 | else | 420 | else |
411 | perror("not found"); | 421 | perror("not found"); |
412 | } | 422 | } else if (disable_ptrace_faultinfo) |
423 | non_fatal("found but disabled on command line\n"); | ||
413 | else { | 424 | else { |
414 | if (!ptrace_faultinfo) | 425 | ptrace_faultinfo = 1; |
415 | non_fatal("found but disabled on command line\n"); | 426 | non_fatal("found\n"); |
416 | else | ||
417 | non_fatal("found\n"); | ||
418 | } | 427 | } |
419 | 428 | ||
420 | stop_ptraced_child(pid, 1, 1); | 429 | stop_ptraced_child(pid, 1, 1); |
@@ -437,38 +446,30 @@ static inline void check_skas3_ptrace_ldt(void) | |||
437 | if (n < 0) { | 446 | if (n < 0) { |
438 | if (errno == EIO) | 447 | if (errno == EIO) |
439 | non_fatal("not found\n"); | 448 | non_fatal("not found\n"); |
440 | else { | 449 | else |
441 | perror("not found"); | 450 | perror("not found"); |
442 | } | 451 | } else if (disable_ptrace_ldt) |
443 | ptrace_ldt = 0; | 452 | non_fatal("found, but use is disabled\n"); |
444 | } | ||
445 | else { | 453 | else { |
446 | if (ptrace_ldt) | 454 | ptrace_ldt = 1; |
447 | non_fatal("found\n"); | 455 | non_fatal("found\n"); |
448 | else | ||
449 | non_fatal("found, but use is disabled\n"); | ||
450 | } | 456 | } |
451 | 457 | ||
452 | stop_ptraced_child(pid, 1, 1); | 458 | stop_ptraced_child(pid, 1, 1); |
453 | #else | ||
454 | /* PTRACE_LDT might be disabled via cmdline option. | ||
455 | * We want to override this, else we might use the stub | ||
456 | * without real need | ||
457 | */ | ||
458 | ptrace_ldt = 1; | ||
459 | #endif | 459 | #endif |
460 | } | 460 | } |
461 | 461 | ||
462 | static inline void check_skas3_proc_mm(void) | 462 | static inline void check_skas3_proc_mm(void) |
463 | { | 463 | { |
464 | non_fatal(" - /proc/mm..."); | 464 | non_fatal(" - /proc/mm..."); |
465 | if (access("/proc/mm", W_OK) < 0) { | 465 | if (access("/proc/mm", W_OK) < 0) |
466 | proc_mm = 0; | ||
467 | perror("not found"); | 466 | perror("not found"); |
468 | } | 467 | else if (disable_proc_mm) |
469 | else if (!proc_mm) | ||
470 | non_fatal("found but disabled on command line\n"); | 468 | non_fatal("found but disabled on command line\n"); |
471 | else non_fatal("found\n"); | 469 | else { |
470 | proc_mm = 1; | ||
471 | non_fatal("found\n"); | ||
472 | } | ||
472 | } | 473 | } |
473 | 474 | ||
474 | void can_do_skas(void) | 475 | void can_do_skas(void) |
diff --git a/arch/um/os-Linux/sys-i386/registers.c b/arch/um/os-Linux/sys-i386/registers.c index b613473b3ec1..c6183e7aec3d 100644 --- a/arch/um/os-Linux/sys-i386/registers.c +++ b/arch/um/os-Linux/sys-i386/registers.c | |||
@@ -5,6 +5,7 @@ | |||
5 | */ | 5 | */ |
6 | 6 | ||
7 | #include <errno.h> | 7 | #include <errno.h> |
8 | #include <asm/user.h> | ||
8 | #include "kern_constants.h" | 9 | #include "kern_constants.h" |
9 | #include "longjmp.h" | 10 | #include "longjmp.h" |
10 | #include "user.h" | 11 | #include "user.h" |
@@ -74,10 +75,10 @@ int put_fp_registers(int pid, unsigned long *regs) | |||
74 | 75 | ||
75 | void arch_init_registers(int pid) | 76 | void arch_init_registers(int pid) |
76 | { | 77 | { |
77 | unsigned long fpx_regs[HOST_XFP_SIZE]; | 78 | struct user_fxsr_struct fpx_regs; |
78 | int err; | 79 | int err; |
79 | 80 | ||
80 | err = ptrace(PTRACE_GETFPXREGS, pid, 0, fpx_regs); | 81 | err = ptrace(PTRACE_GETFPXREGS, pid, 0, &fpx_regs); |
81 | if (!err) | 82 | if (!err) |
82 | return; | 83 | return; |
83 | 84 | ||
diff --git a/arch/um/os-Linux/time.c b/arch/um/os-Linux/time.c index e49280599465..bee98f466d66 100644 --- a/arch/um/os-Linux/time.c +++ b/arch/um/os-Linux/time.c | |||
@@ -9,7 +9,9 @@ | |||
9 | #include <time.h> | 9 | #include <time.h> |
10 | #include <sys/time.h> | 10 | #include <sys/time.h> |
11 | #include "kern_constants.h" | 11 | #include "kern_constants.h" |
12 | #include "kern_util.h" | ||
12 | #include "os.h" | 13 | #include "os.h" |
14 | #include "process.h" | ||
13 | #include "user.h" | 15 | #include "user.h" |
14 | 16 | ||
15 | int set_interval(void) | 17 | int set_interval(void) |
@@ -58,12 +60,17 @@ static inline long long timeval_to_ns(const struct timeval *tv) | |||
58 | long long disable_timer(void) | 60 | long long disable_timer(void) |
59 | { | 61 | { |
60 | struct itimerval time = ((struct itimerval) { { 0, 0 }, { 0, 0 } }); | 62 | struct itimerval time = ((struct itimerval) { { 0, 0 }, { 0, 0 } }); |
63 | int remain, max = UM_NSEC_PER_SEC / UM_HZ; | ||
61 | 64 | ||
62 | if (setitimer(ITIMER_VIRTUAL, &time, &time) < 0) | 65 | if (setitimer(ITIMER_VIRTUAL, &time, &time) < 0) |
63 | printk(UM_KERN_ERR "disable_timer - setitimer failed, " | 66 | printk(UM_KERN_ERR "disable_timer - setitimer failed, " |
64 | "errno = %d\n", errno); | 67 | "errno = %d\n", errno); |
65 | 68 | ||
66 | return timeval_to_ns(&time.it_value); | 69 | remain = timeval_to_ns(&time.it_value); |
70 | if (remain > max) | ||
71 | remain = max; | ||
72 | |||
73 | return remain; | ||
67 | } | 74 | } |
68 | 75 | ||
69 | long long os_nsecs(void) | 76 | long long os_nsecs(void) |
@@ -79,7 +86,44 @@ static int after_sleep_interval(struct timespec *ts) | |||
79 | { | 86 | { |
80 | return 0; | 87 | return 0; |
81 | } | 88 | } |
89 | |||
90 | static void deliver_alarm(void) | ||
91 | { | ||
92 | alarm_handler(SIGVTALRM, NULL); | ||
93 | } | ||
94 | |||
95 | static unsigned long long sleep_time(unsigned long long nsecs) | ||
96 | { | ||
97 | return nsecs; | ||
98 | } | ||
99 | |||
82 | #else | 100 | #else |
101 | unsigned long long last_tick; | ||
102 | unsigned long long skew; | ||
103 | |||
104 | static void deliver_alarm(void) | ||
105 | { | ||
106 | unsigned long long this_tick = os_nsecs(); | ||
107 | int one_tick = UM_NSEC_PER_SEC / UM_HZ; | ||
108 | |||
109 | if (last_tick == 0) | ||
110 | last_tick = this_tick - one_tick; | ||
111 | |||
112 | skew += this_tick - last_tick; | ||
113 | |||
114 | while (skew >= one_tick) { | ||
115 | alarm_handler(SIGVTALRM, NULL); | ||
116 | skew -= one_tick; | ||
117 | } | ||
118 | |||
119 | last_tick = this_tick; | ||
120 | } | ||
121 | |||
122 | static unsigned long long sleep_time(unsigned long long nsecs) | ||
123 | { | ||
124 | return nsecs > skew ? nsecs - skew : 0; | ||
125 | } | ||
126 | |||
83 | static inline long long timespec_to_us(const struct timespec *ts) | 127 | static inline long long timespec_to_us(const struct timespec *ts) |
84 | { | 128 | { |
85 | return ((long long) ts->tv_sec * UM_USEC_PER_SEC) + | 129 | return ((long long) ts->tv_sec * UM_USEC_PER_SEC) + |
@@ -102,6 +146,8 @@ static int after_sleep_interval(struct timespec *ts) | |||
102 | */ | 146 | */ |
103 | if (start_usecs > usec) | 147 | if (start_usecs > usec) |
104 | start_usecs = usec; | 148 | start_usecs = usec; |
149 | |||
150 | start_usecs -= skew / UM_NSEC_PER_USEC; | ||
105 | tv = ((struct timeval) { .tv_sec = start_usecs / UM_USEC_PER_SEC, | 151 | tv = ((struct timeval) { .tv_sec = start_usecs / UM_USEC_PER_SEC, |
106 | .tv_usec = start_usecs % UM_USEC_PER_SEC }); | 152 | .tv_usec = start_usecs % UM_USEC_PER_SEC }); |
107 | interval = ((struct itimerval) { { 0, usec }, tv }); | 153 | interval = ((struct itimerval) { { 0, usec }, tv }); |
@@ -113,8 +159,6 @@ static int after_sleep_interval(struct timespec *ts) | |||
113 | } | 159 | } |
114 | #endif | 160 | #endif |
115 | 161 | ||
116 | extern void alarm_handler(int sig, struct sigcontext *sc); | ||
117 | |||
118 | void idle_sleep(unsigned long long nsecs) | 162 | void idle_sleep(unsigned long long nsecs) |
119 | { | 163 | { |
120 | struct timespec ts; | 164 | struct timespec ts; |
@@ -126,10 +170,12 @@ void idle_sleep(unsigned long long nsecs) | |||
126 | */ | 170 | */ |
127 | if (nsecs == 0) | 171 | if (nsecs == 0) |
128 | nsecs = UM_NSEC_PER_SEC / UM_HZ; | 172 | nsecs = UM_NSEC_PER_SEC / UM_HZ; |
173 | |||
174 | nsecs = sleep_time(nsecs); | ||
129 | ts = ((struct timespec) { .tv_sec = nsecs / UM_NSEC_PER_SEC, | 175 | ts = ((struct timespec) { .tv_sec = nsecs / UM_NSEC_PER_SEC, |
130 | .tv_nsec = nsecs % UM_NSEC_PER_SEC }); | 176 | .tv_nsec = nsecs % UM_NSEC_PER_SEC }); |
131 | 177 | ||
132 | if (nanosleep(&ts, &ts) == 0) | 178 | if (nanosleep(&ts, &ts) == 0) |
133 | alarm_handler(SIGVTALRM, NULL); | 179 | deliver_alarm(); |
134 | after_sleep_interval(&ts); | 180 | after_sleep_interval(&ts); |
135 | } | 181 | } |
diff --git a/arch/um/sys-i386/ptrace.c b/arch/um/sys-i386/ptrace.c index 6b4499906a6c..c9b176534d65 100644 --- a/arch/um/sys-i386/ptrace.c +++ b/arch/um/sys-i386/ptrace.c | |||
@@ -148,14 +148,13 @@ int peek_user(struct task_struct *child, long addr, long data) | |||
148 | int get_fpregs(struct user_i387_struct __user *buf, struct task_struct *child) | 148 | int get_fpregs(struct user_i387_struct __user *buf, struct task_struct *child) |
149 | { | 149 | { |
150 | int err, n, cpu = ((struct thread_info *) child->stack)->cpu; | 150 | int err, n, cpu = ((struct thread_info *) child->stack)->cpu; |
151 | long fpregs[HOST_FP_SIZE]; | 151 | struct user_i387_struct fpregs; |
152 | 152 | ||
153 | BUG_ON(sizeof(*buf) != sizeof(fpregs)); | 153 | err = save_fp_registers(userspace_pid[cpu], (unsigned long *) &fpregs); |
154 | err = save_fp_registers(userspace_pid[cpu], fpregs); | ||
155 | if (err) | 154 | if (err) |
156 | return err; | 155 | return err; |
157 | 156 | ||
158 | n = copy_to_user(buf, fpregs, sizeof(fpregs)); | 157 | n = copy_to_user(buf, &fpregs, sizeof(fpregs)); |
159 | if(n > 0) | 158 | if(n > 0) |
160 | return -EFAULT; | 159 | return -EFAULT; |
161 | 160 | ||
@@ -165,27 +164,26 @@ int get_fpregs(struct user_i387_struct __user *buf, struct task_struct *child) | |||
165 | int set_fpregs(struct user_i387_struct __user *buf, struct task_struct *child) | 164 | int set_fpregs(struct user_i387_struct __user *buf, struct task_struct *child) |
166 | { | 165 | { |
167 | int n, cpu = ((struct thread_info *) child->stack)->cpu; | 166 | int n, cpu = ((struct thread_info *) child->stack)->cpu; |
168 | long fpregs[HOST_FP_SIZE]; | 167 | struct user_i387_struct fpregs; |
169 | 168 | ||
170 | BUG_ON(sizeof(*buf) != sizeof(fpregs)); | 169 | n = copy_from_user(&fpregs, buf, sizeof(fpregs)); |
171 | n = copy_from_user(fpregs, buf, sizeof(fpregs)); | ||
172 | if (n > 0) | 170 | if (n > 0) |
173 | return -EFAULT; | 171 | return -EFAULT; |
174 | 172 | ||
175 | return restore_fp_registers(userspace_pid[cpu], fpregs); | 173 | return restore_fp_registers(userspace_pid[cpu], |
174 | (unsigned long *) &fpregs); | ||
176 | } | 175 | } |
177 | 176 | ||
178 | int get_fpxregs(struct user_fxsr_struct __user *buf, struct task_struct *child) | 177 | int get_fpxregs(struct user_fxsr_struct __user *buf, struct task_struct *child) |
179 | { | 178 | { |
180 | int err, n, cpu = ((struct thread_info *) child->stack)->cpu; | 179 | int err, n, cpu = ((struct thread_info *) child->stack)->cpu; |
181 | long fpregs[HOST_XFP_SIZE]; | 180 | struct user_fxsr_struct fpregs; |
182 | 181 | ||
183 | BUG_ON(sizeof(*buf) != sizeof(fpregs)); | 182 | err = save_fpx_registers(userspace_pid[cpu], (unsigned long *) &fpregs); |
184 | err = save_fpx_registers(userspace_pid[cpu], fpregs); | ||
185 | if (err) | 183 | if (err) |
186 | return err; | 184 | return err; |
187 | 185 | ||
188 | n = copy_to_user(buf, fpregs, sizeof(fpregs)); | 186 | n = copy_to_user(buf, &fpregs, sizeof(fpregs)); |
189 | if(n > 0) | 187 | if(n > 0) |
190 | return -EFAULT; | 188 | return -EFAULT; |
191 | 189 | ||
@@ -195,14 +193,14 @@ int get_fpxregs(struct user_fxsr_struct __user *buf, struct task_struct *child) | |||
195 | int set_fpxregs(struct user_fxsr_struct __user *buf, struct task_struct *child) | 193 | int set_fpxregs(struct user_fxsr_struct __user *buf, struct task_struct *child) |
196 | { | 194 | { |
197 | int n, cpu = ((struct thread_info *) child->stack)->cpu; | 195 | int n, cpu = ((struct thread_info *) child->stack)->cpu; |
198 | long fpregs[HOST_XFP_SIZE]; | 196 | struct user_fxsr_struct fpregs; |
199 | 197 | ||
200 | BUG_ON(sizeof(*buf) != sizeof(fpregs)); | 198 | n = copy_from_user(&fpregs, buf, sizeof(fpregs)); |
201 | n = copy_from_user(fpregs, buf, sizeof(fpregs)); | ||
202 | if (n > 0) | 199 | if (n > 0) |
203 | return -EFAULT; | 200 | return -EFAULT; |
204 | 201 | ||
205 | return restore_fpx_registers(userspace_pid[cpu], fpregs); | 202 | return restore_fpx_registers(userspace_pid[cpu], |
203 | (unsigned long *) &fpregs); | ||
206 | } | 204 | } |
207 | 205 | ||
208 | long subarch_ptrace(struct task_struct *child, long request, long addr, | 206 | long subarch_ptrace(struct task_struct *child, long request, long addr, |
diff --git a/arch/um/sys-i386/user-offsets.c b/arch/um/sys-i386/user-offsets.c index 39bd32bf84f0..5f883bfe773f 100644 --- a/arch/um/sys-i386/user-offsets.c +++ b/arch/um/sys-i386/user-offsets.c | |||
@@ -22,7 +22,7 @@ void foo(void) | |||
22 | OFFSET(HOST_SC_CR2, sigcontext, cr2); | 22 | OFFSET(HOST_SC_CR2, sigcontext, cr2); |
23 | 23 | ||
24 | DEFINE_LONGS(HOST_FP_SIZE, sizeof(struct user_fpregs_struct)); | 24 | DEFINE_LONGS(HOST_FP_SIZE, sizeof(struct user_fpregs_struct)); |
25 | DEFINE_LONGS(HOST_XFP_SIZE, sizeof(struct user_fpxregs_struct)); | 25 | DEFINE_LONGS(HOST_FPX_SIZE, sizeof(struct user_fpxregs_struct)); |
26 | 26 | ||
27 | DEFINE(HOST_IP, EIP); | 27 | DEFINE(HOST_IP, EIP); |
28 | DEFINE(HOST_SP, UESP); | 28 | DEFINE(HOST_SP, UESP); |
diff --git a/arch/um/sys-x86_64/user-offsets.c b/arch/um/sys-x86_64/user-offsets.c index 2f3443c6e859..973585414a66 100644 --- a/arch/um/sys-x86_64/user-offsets.c +++ b/arch/um/sys-x86_64/user-offsets.c | |||
@@ -24,7 +24,6 @@ void foo(void) | |||
24 | OFFSET(HOST_SC_TRAPNO, sigcontext, trapno); | 24 | OFFSET(HOST_SC_TRAPNO, sigcontext, trapno); |
25 | 25 | ||
26 | DEFINE(HOST_FP_SIZE, sizeof(struct _fpstate) / sizeof(unsigned long)); | 26 | DEFINE(HOST_FP_SIZE, sizeof(struct _fpstate) / sizeof(unsigned long)); |
27 | DEFINE(HOST_XFP_SIZE, 0); | ||
28 | DEFINE_LONGS(HOST_RBX, RBX); | 27 | DEFINE_LONGS(HOST_RBX, RBX); |
29 | DEFINE_LONGS(HOST_RCX, RCX); | 28 | DEFINE_LONGS(HOST_RCX, RCX); |
30 | DEFINE_LONGS(HOST_RDI, RDI); | 29 | DEFINE_LONGS(HOST_RDI, RDI); |
diff --git a/arch/x86/kernel/acpi/realmode/wakeup.lds.S b/arch/x86/kernel/acpi/realmode/wakeup.lds.S index 22fab6c4be15..7da00b799cda 100644 --- a/arch/x86/kernel/acpi/realmode/wakeup.lds.S +++ b/arch/x86/kernel/acpi/realmode/wakeup.lds.S | |||
@@ -12,11 +12,6 @@ ENTRY(_start) | |||
12 | 12 | ||
13 | SECTIONS | 13 | SECTIONS |
14 | { | 14 | { |
15 | . = HEADER_OFFSET; | ||
16 | .header : { | ||
17 | *(.header) | ||
18 | } | ||
19 | |||
20 | . = 0; | 15 | . = 0; |
21 | .text : { | 16 | .text : { |
22 | *(.text*) | 17 | *(.text*) |
@@ -50,6 +45,11 @@ SECTIONS | |||
50 | __bss_end = .; | 45 | __bss_end = .; |
51 | } | 46 | } |
52 | 47 | ||
48 | . = HEADER_OFFSET; | ||
49 | .header : { | ||
50 | *(.header) | ||
51 | } | ||
52 | |||
53 | . = ALIGN(16); | 53 | . = ALIGN(16); |
54 | _end = .; | 54 | _end = .; |
55 | 55 | ||
diff --git a/arch/x86/kernel/pci-dma.c b/arch/x86/kernel/pci-dma.c index 0c37f16b6950..c5ef1af8e79d 100644 --- a/arch/x86/kernel/pci-dma.c +++ b/arch/x86/kernel/pci-dma.c | |||
@@ -385,11 +385,13 @@ dma_alloc_coherent(struct device *dev, size_t size, dma_addr_t *dma_handle, | |||
385 | if (dma_alloc_from_coherent_mem(dev, size, dma_handle, &memory)) | 385 | if (dma_alloc_from_coherent_mem(dev, size, dma_handle, &memory)) |
386 | return memory; | 386 | return memory; |
387 | 387 | ||
388 | if (!dev) | 388 | if (!dev) { |
389 | dev = &fallback_dev; | 389 | dev = &fallback_dev; |
390 | gfp |= GFP_DMA; | ||
391 | } | ||
390 | dma_mask = dev->coherent_dma_mask; | 392 | dma_mask = dev->coherent_dma_mask; |
391 | if (dma_mask == 0) | 393 | if (dma_mask == 0) |
392 | dma_mask = DMA_32BIT_MASK; | 394 | dma_mask = (gfp & GFP_DMA) ? DMA_24BIT_MASK : DMA_32BIT_MASK; |
393 | 395 | ||
394 | /* Device not DMA able */ | 396 | /* Device not DMA able */ |
395 | if (dev->dma_mask == NULL) | 397 | if (dev->dma_mask == NULL) |
@@ -403,7 +405,7 @@ dma_alloc_coherent(struct device *dev, size_t size, dma_addr_t *dma_handle, | |||
403 | larger than 16MB and in this case we have a chance of | 405 | larger than 16MB and in this case we have a chance of |
404 | finding fitting memory in the next higher zone first. If | 406 | finding fitting memory in the next higher zone first. If |
405 | not retry with true GFP_DMA. -AK */ | 407 | not retry with true GFP_DMA. -AK */ |
406 | if (dma_mask <= DMA_32BIT_MASK) | 408 | if (dma_mask <= DMA_32BIT_MASK && !(gfp & GFP_DMA)) |
407 | gfp |= GFP_DMA32; | 409 | gfp |= GFP_DMA32; |
408 | #endif | 410 | #endif |
409 | 411 | ||
diff --git a/arch/x86/kernel/ptrace.c b/arch/x86/kernel/ptrace.c index fb03ef380f0e..a7835f282936 100644 --- a/arch/x86/kernel/ptrace.c +++ b/arch/x86/kernel/ptrace.c | |||
@@ -1303,6 +1303,9 @@ static const struct user_regset_view user_x86_64_view = { | |||
1303 | #define genregs32_get genregs_get | 1303 | #define genregs32_get genregs_get |
1304 | #define genregs32_set genregs_set | 1304 | #define genregs32_set genregs_set |
1305 | 1305 | ||
1306 | #define user_i387_ia32_struct user_i387_struct | ||
1307 | #define user32_fxsr_struct user_fxsr_struct | ||
1308 | |||
1306 | #endif /* CONFIG_X86_64 */ | 1309 | #endif /* CONFIG_X86_64 */ |
1307 | 1310 | ||
1308 | #if defined CONFIG_X86_32 || defined CONFIG_IA32_EMULATION | 1311 | #if defined CONFIG_X86_32 || defined CONFIG_IA32_EMULATION |
@@ -1315,13 +1318,13 @@ static const struct user_regset x86_32_regsets[] = { | |||
1315 | }, | 1318 | }, |
1316 | [REGSET_FP] = { | 1319 | [REGSET_FP] = { |
1317 | .core_note_type = NT_PRFPREG, | 1320 | .core_note_type = NT_PRFPREG, |
1318 | .n = sizeof(struct user_i387_struct) / sizeof(u32), | 1321 | .n = sizeof(struct user_i387_ia32_struct) / sizeof(u32), |
1319 | .size = sizeof(u32), .align = sizeof(u32), | 1322 | .size = sizeof(u32), .align = sizeof(u32), |
1320 | .active = fpregs_active, .get = fpregs_get, .set = fpregs_set | 1323 | .active = fpregs_active, .get = fpregs_get, .set = fpregs_set |
1321 | }, | 1324 | }, |
1322 | [REGSET_XFP] = { | 1325 | [REGSET_XFP] = { |
1323 | .core_note_type = NT_PRXFPREG, | 1326 | .core_note_type = NT_PRXFPREG, |
1324 | .n = sizeof(struct user_i387_struct) / sizeof(u32), | 1327 | .n = sizeof(struct user32_fxsr_struct) / sizeof(u32), |
1325 | .size = sizeof(u32), .align = sizeof(u32), | 1328 | .size = sizeof(u32), .align = sizeof(u32), |
1326 | .active = xfpregs_active, .get = xfpregs_get, .set = xfpregs_set | 1329 | .active = xfpregs_active, .get = xfpregs_get, .set = xfpregs_set |
1327 | }, | 1330 | }, |
diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c index c0c68c18a788..6f80b852a196 100644 --- a/arch/x86/kernel/setup.c +++ b/arch/x86/kernel/setup.c | |||
@@ -12,6 +12,7 @@ | |||
12 | #include <asm/mpspec.h> | 12 | #include <asm/mpspec.h> |
13 | #include <asm/apicdef.h> | 13 | #include <asm/apicdef.h> |
14 | 14 | ||
15 | #ifdef CONFIG_X86_LOCAL_APIC | ||
15 | unsigned int num_processors; | 16 | unsigned int num_processors; |
16 | unsigned disabled_cpus __cpuinitdata; | 17 | unsigned disabled_cpus __cpuinitdata; |
17 | /* Processor that is doing the boot up */ | 18 | /* Processor that is doing the boot up */ |
@@ -23,8 +24,9 @@ EXPORT_PER_CPU_SYMBOL(x86_cpu_to_apicid); | |||
23 | 24 | ||
24 | /* Bitmask of physically existing CPUs */ | 25 | /* Bitmask of physically existing CPUs */ |
25 | physid_mask_t phys_cpu_present_map; | 26 | physid_mask_t phys_cpu_present_map; |
27 | #endif | ||
26 | 28 | ||
27 | #if defined(CONFIG_HAVE_SETUP_PER_CPU_AREA) && defined(CONFIG_SMP) | 29 | #if defined(CONFIG_HAVE_SETUP_PER_CPU_AREA) && defined(CONFIG_X86_SMP) |
28 | /* | 30 | /* |
29 | * Copy data used in early init routines from the initial arrays to the | 31 | * Copy data used in early init routines from the initial arrays to the |
30 | * per cpu data areas. These arrays then become expendable and the | 32 | * per cpu data areas. These arrays then become expendable and the |
diff --git a/arch/x86/kernel/setup_64.c b/arch/x86/kernel/setup_64.c index f2fc8feb727d..6dff1286ad8a 100644 --- a/arch/x86/kernel/setup_64.c +++ b/arch/x86/kernel/setup_64.c | |||
@@ -951,7 +951,7 @@ static void __cpuinit init_intel(struct cpuinfo_x86 *c) | |||
951 | static void __cpuinit early_init_centaur(struct cpuinfo_x86 *c) | 951 | static void __cpuinit early_init_centaur(struct cpuinfo_x86 *c) |
952 | { | 952 | { |
953 | if (c->x86 == 0x6 && c->x86_model >= 0xf) | 953 | if (c->x86 == 0x6 && c->x86_model >= 0xf) |
954 | set_bit(X86_FEATURE_CONSTANT_TSC, &c->x86_capability); | 954 | set_cpu_cap(c, X86_FEATURE_CONSTANT_TSC); |
955 | } | 955 | } |
956 | 956 | ||
957 | static void __cpuinit init_centaur(struct cpuinfo_x86 *c) | 957 | static void __cpuinit init_centaur(struct cpuinfo_x86 *c) |
diff --git a/arch/x86/kernel/smp.c b/arch/x86/kernel/smp.c index 8f75893a6467..0cb7aadc87cd 100644 --- a/arch/x86/kernel/smp.c +++ b/arch/x86/kernel/smp.c | |||
@@ -231,7 +231,8 @@ native_smp_call_function_mask(cpumask_t mask, | |||
231 | wmb(); | 231 | wmb(); |
232 | 232 | ||
233 | /* Send a message to other CPUs */ | 233 | /* Send a message to other CPUs */ |
234 | if (cpus_equal(mask, allbutself)) | 234 | if (cpus_equal(mask, allbutself) && |
235 | cpus_equal(cpu_online_map, cpu_callout_map)) | ||
235 | send_IPI_allbutself(CALL_FUNCTION_VECTOR); | 236 | send_IPI_allbutself(CALL_FUNCTION_VECTOR); |
236 | else | 237 | else |
237 | send_IPI_mask(mask, CALL_FUNCTION_VECTOR); | 238 | send_IPI_mask(mask, CALL_FUNCTION_VECTOR); |
diff --git a/arch/x86/kernel/smpboot.c b/arch/x86/kernel/smpboot.c index 6b087ab6cd8f..38988491c622 100644 --- a/arch/x86/kernel/smpboot.c +++ b/arch/x86/kernel/smpboot.c | |||
@@ -86,6 +86,7 @@ void *x86_bios_cpu_apicid_early_ptr; | |||
86 | 86 | ||
87 | #ifdef CONFIG_X86_32 | 87 | #ifdef CONFIG_X86_32 |
88 | u8 apicid_2_node[MAX_APICID]; | 88 | u8 apicid_2_node[MAX_APICID]; |
89 | static int low_mappings; | ||
89 | #endif | 90 | #endif |
90 | 91 | ||
91 | /* State of each CPU */ | 92 | /* State of each CPU */ |
@@ -326,6 +327,12 @@ static void __cpuinit start_secondary(void *unused) | |||
326 | enable_8259A_irq(0); | 327 | enable_8259A_irq(0); |
327 | } | 328 | } |
328 | 329 | ||
330 | #ifdef CONFIG_X86_32 | ||
331 | while (low_mappings) | ||
332 | cpu_relax(); | ||
333 | __flush_tlb_all(); | ||
334 | #endif | ||
335 | |||
329 | /* This must be done before setting cpu_online_map */ | 336 | /* This must be done before setting cpu_online_map */ |
330 | set_cpu_sibling_map(raw_smp_processor_id()); | 337 | set_cpu_sibling_map(raw_smp_processor_id()); |
331 | wmb(); | 338 | wmb(); |
@@ -1040,14 +1047,20 @@ int __cpuinit native_cpu_up(unsigned int cpu) | |||
1040 | #ifdef CONFIG_X86_32 | 1047 | #ifdef CONFIG_X86_32 |
1041 | /* init low mem mapping */ | 1048 | /* init low mem mapping */ |
1042 | clone_pgd_range(swapper_pg_dir, swapper_pg_dir + KERNEL_PGD_BOUNDARY, | 1049 | clone_pgd_range(swapper_pg_dir, swapper_pg_dir + KERNEL_PGD_BOUNDARY, |
1043 | min_t(unsigned long, KERNEL_PGD_PTRS, KERNEL_PGD_BOUNDARY)); | 1050 | min_t(unsigned long, KERNEL_PGD_PTRS, KERNEL_PGD_BOUNDARY)); |
1044 | flush_tlb_all(); | 1051 | flush_tlb_all(); |
1045 | #endif | 1052 | low_mappings = 1; |
1046 | 1053 | ||
1047 | err = do_boot_cpu(apicid, cpu); | 1054 | err = do_boot_cpu(apicid, cpu); |
1048 | if (err < 0) { | 1055 | |
1056 | zap_low_mappings(); | ||
1057 | low_mappings = 0; | ||
1058 | #else | ||
1059 | err = do_boot_cpu(apicid, cpu); | ||
1060 | #endif | ||
1061 | if (err) { | ||
1049 | Dprintk("do_boot_cpu failed %d\n", err); | 1062 | Dprintk("do_boot_cpu failed %d\n", err); |
1050 | return err; | 1063 | return -EIO; |
1051 | } | 1064 | } |
1052 | 1065 | ||
1053 | /* | 1066 | /* |
@@ -1259,9 +1272,6 @@ void __init native_smp_cpus_done(unsigned int max_cpus) | |||
1259 | setup_ioapic_dest(); | 1272 | setup_ioapic_dest(); |
1260 | #endif | 1273 | #endif |
1261 | check_nmi_watchdog(); | 1274 | check_nmi_watchdog(); |
1262 | #ifdef CONFIG_X86_32 | ||
1263 | zap_low_mappings(); | ||
1264 | #endif | ||
1265 | } | 1275 | } |
1266 | 1276 | ||
1267 | #ifdef CONFIG_HOTPLUG_CPU | 1277 | #ifdef CONFIG_HOTPLUG_CPU |
diff --git a/arch/x86/kernel/x8664_ksyms_64.c b/arch/x86/kernel/x8664_ksyms_64.c index 58882f9f2637..f6c05d0410fb 100644 --- a/arch/x86/kernel/x8664_ksyms_64.c +++ b/arch/x86/kernel/x8664_ksyms_64.c | |||
@@ -2,6 +2,7 @@ | |||
2 | All C exports should go in the respective C files. */ | 2 | All C exports should go in the respective C files. */ |
3 | 3 | ||
4 | #include <linux/module.h> | 4 | #include <linux/module.h> |
5 | #include <net/checksum.h> | ||
5 | #include <linux/smp.h> | 6 | #include <linux/smp.h> |
6 | 7 | ||
7 | #include <asm/processor.h> | 8 | #include <asm/processor.h> |
@@ -29,6 +30,8 @@ EXPORT_SYMBOL(__copy_from_user_inatomic); | |||
29 | EXPORT_SYMBOL(copy_page); | 30 | EXPORT_SYMBOL(copy_page); |
30 | EXPORT_SYMBOL(clear_page); | 31 | EXPORT_SYMBOL(clear_page); |
31 | 32 | ||
33 | EXPORT_SYMBOL(csum_partial); | ||
34 | |||
32 | /* | 35 | /* |
33 | * Export string functions. We normally rely on gcc builtin for most of these, | 36 | * Export string functions. We normally rely on gcc builtin for most of these, |
34 | * but gcc sometimes decides not to inline them. | 37 | * but gcc sometimes decides not to inline them. |
diff --git a/arch/x86/lib/csum-partial_64.c b/arch/x86/lib/csum-partial_64.c index bc503f506903..bf51144d97e1 100644 --- a/arch/x86/lib/csum-partial_64.c +++ b/arch/x86/lib/csum-partial_64.c | |||
@@ -136,8 +136,6 @@ __wsum csum_partial(const void *buff, int len, __wsum sum) | |||
136 | (__force u32)sum); | 136 | (__force u32)sum); |
137 | } | 137 | } |
138 | 138 | ||
139 | EXPORT_SYMBOL(csum_partial); | ||
140 | |||
141 | /* | 139 | /* |
142 | * this routine is used for miscellaneous IP-like checksums, mainly | 140 | * this routine is used for miscellaneous IP-like checksums, mainly |
143 | * in icmp.c | 141 | * in icmp.c |
diff --git a/arch/x86/mm/init_32.c b/arch/x86/mm/init_32.c index de236e419cb5..ec30d10154b6 100644 --- a/arch/x86/mm/init_32.c +++ b/arch/x86/mm/init_32.c | |||
@@ -438,8 +438,6 @@ void zap_low_mappings(void) | |||
438 | { | 438 | { |
439 | int i; | 439 | int i; |
440 | 440 | ||
441 | save_pg_dir(); | ||
442 | |||
443 | /* | 441 | /* |
444 | * Zap initial low-memory mappings. | 442 | * Zap initial low-memory mappings. |
445 | * | 443 | * |
@@ -663,16 +661,8 @@ void __init mem_init(void) | |||
663 | test_wp_bit(); | 661 | test_wp_bit(); |
664 | 662 | ||
665 | cpa_init(); | 663 | cpa_init(); |
666 | 664 | save_pg_dir(); | |
667 | /* | ||
668 | * Subtle. SMP is doing it's boot stuff late (because it has to | ||
669 | * fork idle threads) - but it also needs low mappings for the | ||
670 | * protected-mode entry to work. We zap these entries only after | ||
671 | * the WP-bit has been tested. | ||
672 | */ | ||
673 | #ifndef CONFIG_SMP | ||
674 | zap_low_mappings(); | 665 | zap_low_mappings(); |
675 | #endif | ||
676 | } | 666 | } |
677 | 667 | ||
678 | #ifdef CONFIG_MEMORY_HOTPLUG | 668 | #ifdef CONFIG_MEMORY_HOTPLUG |
diff --git a/arch/x86/mm/pat.c b/arch/x86/mm/pat.c index 60adbe22efa0..bcb1a8e4b2db 100644 --- a/arch/x86/mm/pat.c +++ b/arch/x86/mm/pat.c | |||
@@ -555,7 +555,7 @@ int phys_mem_access_prot_allowed(struct file *file, unsigned long pfn, | |||
555 | "%s:%d /dev/mem ioremap_change_attr failed %s for %Lx-%Lx\n", | 555 | "%s:%d /dev/mem ioremap_change_attr failed %s for %Lx-%Lx\n", |
556 | current->comm, current->pid, | 556 | current->comm, current->pid, |
557 | cattr_name(flags), | 557 | cattr_name(flags), |
558 | offset, offset + size); | 558 | offset, (unsigned long long)(offset + size)); |
559 | return 0; | 559 | return 0; |
560 | } | 560 | } |
561 | 561 | ||
@@ -576,7 +576,7 @@ void map_devmem(unsigned long pfn, unsigned long size, pgprot_t vma_prot) | |||
576 | "%s:%d /dev/mem expected mapping type %s for %Lx-%Lx, got %s\n", | 576 | "%s:%d /dev/mem expected mapping type %s for %Lx-%Lx, got %s\n", |
577 | current->comm, current->pid, | 577 | current->comm, current->pid, |
578 | cattr_name(want_flags), | 578 | cattr_name(want_flags), |
579 | addr, addr + size, | 579 | addr, (unsigned long long)(addr + size), |
580 | cattr_name(flags)); | 580 | cattr_name(flags)); |
581 | } | 581 | } |
582 | } | 582 | } |
diff --git a/arch/x86/pci/i386.c b/arch/x86/pci/i386.c index 8af0f0bae2af..10fb308fded8 100644 --- a/arch/x86/pci/i386.c +++ b/arch/x86/pci/i386.c | |||
@@ -301,15 +301,13 @@ int pci_mmap_page_range(struct pci_dev *dev, struct vm_area_struct *vma, | |||
301 | prot = pgprot_val(vma->vm_page_prot); | 301 | prot = pgprot_val(vma->vm_page_prot); |
302 | if (pat_wc_enabled && write_combine) | 302 | if (pat_wc_enabled && write_combine) |
303 | prot |= _PAGE_CACHE_WC; | 303 | prot |= _PAGE_CACHE_WC; |
304 | else if (pat_wc_enabled) | 304 | else if (pat_wc_enabled || boot_cpu_data.x86 > 3) |
305 | /* | 305 | /* |
306 | * ioremap() and ioremap_nocache() defaults to UC MINUS for now. | 306 | * ioremap() and ioremap_nocache() defaults to UC MINUS for now. |
307 | * To avoid attribute conflicts, request UC MINUS here | 307 | * To avoid attribute conflicts, request UC MINUS here |
308 | * aswell. | 308 | * aswell. |
309 | */ | 309 | */ |
310 | prot |= _PAGE_CACHE_UC_MINUS; | 310 | prot |= _PAGE_CACHE_UC_MINUS; |
311 | else if (boot_cpu_data.x86 > 3) | ||
312 | prot |= _PAGE_CACHE_UC; | ||
313 | 311 | ||
314 | vma->vm_page_prot = __pgprot(prot); | 312 | vma->vm_page_prot = __pgprot(prot); |
315 | 313 | ||