diff options
Diffstat (limited to 'arch/x86/kernel')
46 files changed, 578 insertions, 258 deletions
diff --git a/arch/x86/kernel/acpi/boot.c b/arch/x86/kernel/acpi/boot.c index ce664f33ea8e..406ed77216d0 100644 --- a/arch/x86/kernel/acpi/boot.c +++ b/arch/x86/kernel/acpi/boot.c | |||
@@ -593,7 +593,7 @@ void __init acpi_set_irq_model_ioapic(void) | |||
593 | #ifdef CONFIG_ACPI_HOTPLUG_CPU | 593 | #ifdef CONFIG_ACPI_HOTPLUG_CPU |
594 | #include <acpi/processor.h> | 594 | #include <acpi/processor.h> |
595 | 595 | ||
596 | static void acpi_map_cpu2node(acpi_handle handle, int cpu, int physid) | 596 | static void __cpuinitdata acpi_map_cpu2node(acpi_handle handle, int cpu, int physid) |
597 | { | 597 | { |
598 | #ifdef CONFIG_ACPI_NUMA | 598 | #ifdef CONFIG_ACPI_NUMA |
599 | int nid; | 599 | int nid; |
diff --git a/arch/x86/kernel/apic/apic_flat_64.c b/arch/x86/kernel/apic/apic_flat_64.c index 8c3cdded6f2b..359b6899a36c 100644 --- a/arch/x86/kernel/apic/apic_flat_64.c +++ b/arch/x86/kernel/apic/apic_flat_64.c | |||
@@ -180,6 +180,7 @@ static struct apic apic_flat = { | |||
180 | .name = "flat", | 180 | .name = "flat", |
181 | .probe = flat_probe, | 181 | .probe = flat_probe, |
182 | .acpi_madt_oem_check = flat_acpi_madt_oem_check, | 182 | .acpi_madt_oem_check = flat_acpi_madt_oem_check, |
183 | .apic_id_valid = default_apic_id_valid, | ||
183 | .apic_id_registered = flat_apic_id_registered, | 184 | .apic_id_registered = flat_apic_id_registered, |
184 | 185 | ||
185 | .irq_delivery_mode = dest_LowestPrio, | 186 | .irq_delivery_mode = dest_LowestPrio, |
@@ -337,6 +338,7 @@ static struct apic apic_physflat = { | |||
337 | .name = "physical flat", | 338 | .name = "physical flat", |
338 | .probe = physflat_probe, | 339 | .probe = physflat_probe, |
339 | .acpi_madt_oem_check = physflat_acpi_madt_oem_check, | 340 | .acpi_madt_oem_check = physflat_acpi_madt_oem_check, |
341 | .apic_id_valid = default_apic_id_valid, | ||
340 | .apic_id_registered = flat_apic_id_registered, | 342 | .apic_id_registered = flat_apic_id_registered, |
341 | 343 | ||
342 | .irq_delivery_mode = dest_Fixed, | 344 | .irq_delivery_mode = dest_Fixed, |
diff --git a/arch/x86/kernel/apic/apic_noop.c b/arch/x86/kernel/apic/apic_noop.c index 775b82bc655c..634ae6cdd5c9 100644 --- a/arch/x86/kernel/apic/apic_noop.c +++ b/arch/x86/kernel/apic/apic_noop.c | |||
@@ -124,6 +124,7 @@ struct apic apic_noop = { | |||
124 | .probe = noop_probe, | 124 | .probe = noop_probe, |
125 | .acpi_madt_oem_check = NULL, | 125 | .acpi_madt_oem_check = NULL, |
126 | 126 | ||
127 | .apic_id_valid = default_apic_id_valid, | ||
127 | .apic_id_registered = noop_apic_id_registered, | 128 | .apic_id_registered = noop_apic_id_registered, |
128 | 129 | ||
129 | .irq_delivery_mode = dest_LowestPrio, | 130 | .irq_delivery_mode = dest_LowestPrio, |
diff --git a/arch/x86/kernel/apic/apic_numachip.c b/arch/x86/kernel/apic/apic_numachip.c index 09d3d8c1cd99..d9ea5f331ac5 100644 --- a/arch/x86/kernel/apic/apic_numachip.c +++ b/arch/x86/kernel/apic/apic_numachip.c | |||
@@ -56,6 +56,12 @@ static unsigned int read_xapic_id(void) | |||
56 | return get_apic_id(apic_read(APIC_ID)); | 56 | return get_apic_id(apic_read(APIC_ID)); |
57 | } | 57 | } |
58 | 58 | ||
59 | static int numachip_apic_id_valid(int apicid) | ||
60 | { | ||
61 | /* Trust what bootloader passes in MADT */ | ||
62 | return 1; | ||
63 | } | ||
64 | |||
59 | static int numachip_apic_id_registered(void) | 65 | static int numachip_apic_id_registered(void) |
60 | { | 66 | { |
61 | return physid_isset(read_xapic_id(), phys_cpu_present_map); | 67 | return physid_isset(read_xapic_id(), phys_cpu_present_map); |
@@ -223,10 +229,11 @@ static int __init numachip_system_init(void) | |||
223 | } | 229 | } |
224 | early_initcall(numachip_system_init); | 230 | early_initcall(numachip_system_init); |
225 | 231 | ||
226 | static int numachip_acpi_madt_oem_check(char *oem_id, char *oem_table_id) | 232 | static int __cpuinit numachip_acpi_madt_oem_check(char *oem_id, char *oem_table_id) |
227 | { | 233 | { |
228 | if (!strncmp(oem_id, "NUMASC", 6)) { | 234 | if (!strncmp(oem_id, "NUMASC", 6)) { |
229 | numachip_system = 1; | 235 | numachip_system = 1; |
236 | setup_force_cpu_cap(X86_FEATURE_X2APIC); | ||
230 | return 1; | 237 | return 1; |
231 | } | 238 | } |
232 | 239 | ||
@@ -238,6 +245,7 @@ static struct apic apic_numachip __refconst = { | |||
238 | .name = "NumaConnect system", | 245 | .name = "NumaConnect system", |
239 | .probe = numachip_probe, | 246 | .probe = numachip_probe, |
240 | .acpi_madt_oem_check = numachip_acpi_madt_oem_check, | 247 | .acpi_madt_oem_check = numachip_acpi_madt_oem_check, |
248 | .apic_id_valid = numachip_apic_id_valid, | ||
241 | .apic_id_registered = numachip_apic_id_registered, | 249 | .apic_id_registered = numachip_apic_id_registered, |
242 | 250 | ||
243 | .irq_delivery_mode = dest_Fixed, | 251 | .irq_delivery_mode = dest_Fixed, |
diff --git a/arch/x86/kernel/apic/bigsmp_32.c b/arch/x86/kernel/apic/bigsmp_32.c index 521bead01137..0cdec7065aff 100644 --- a/arch/x86/kernel/apic/bigsmp_32.c +++ b/arch/x86/kernel/apic/bigsmp_32.c | |||
@@ -198,6 +198,7 @@ static struct apic apic_bigsmp = { | |||
198 | .name = "bigsmp", | 198 | .name = "bigsmp", |
199 | .probe = probe_bigsmp, | 199 | .probe = probe_bigsmp, |
200 | .acpi_madt_oem_check = NULL, | 200 | .acpi_madt_oem_check = NULL, |
201 | .apic_id_valid = default_apic_id_valid, | ||
201 | .apic_id_registered = bigsmp_apic_id_registered, | 202 | .apic_id_registered = bigsmp_apic_id_registered, |
202 | 203 | ||
203 | .irq_delivery_mode = dest_Fixed, | 204 | .irq_delivery_mode = dest_Fixed, |
diff --git a/arch/x86/kernel/apic/es7000_32.c b/arch/x86/kernel/apic/es7000_32.c index 5d513bc47b6b..e42d1d3b9134 100644 --- a/arch/x86/kernel/apic/es7000_32.c +++ b/arch/x86/kernel/apic/es7000_32.c | |||
@@ -625,6 +625,7 @@ static struct apic __refdata apic_es7000_cluster = { | |||
625 | .name = "es7000", | 625 | .name = "es7000", |
626 | .probe = probe_es7000, | 626 | .probe = probe_es7000, |
627 | .acpi_madt_oem_check = es7000_acpi_madt_oem_check_cluster, | 627 | .acpi_madt_oem_check = es7000_acpi_madt_oem_check_cluster, |
628 | .apic_id_valid = default_apic_id_valid, | ||
628 | .apic_id_registered = es7000_apic_id_registered, | 629 | .apic_id_registered = es7000_apic_id_registered, |
629 | 630 | ||
630 | .irq_delivery_mode = dest_LowestPrio, | 631 | .irq_delivery_mode = dest_LowestPrio, |
@@ -690,6 +691,7 @@ static struct apic __refdata apic_es7000 = { | |||
690 | .name = "es7000", | 691 | .name = "es7000", |
691 | .probe = probe_es7000, | 692 | .probe = probe_es7000, |
692 | .acpi_madt_oem_check = es7000_acpi_madt_oem_check, | 693 | .acpi_madt_oem_check = es7000_acpi_madt_oem_check, |
694 | .apic_id_valid = default_apic_id_valid, | ||
693 | .apic_id_registered = es7000_apic_id_registered, | 695 | .apic_id_registered = es7000_apic_id_registered, |
694 | 696 | ||
695 | .irq_delivery_mode = dest_Fixed, | 697 | .irq_delivery_mode = dest_Fixed, |
diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c index fb072754bc1d..6d10a66fc5a9 100644 --- a/arch/x86/kernel/apic/io_apic.c +++ b/arch/x86/kernel/apic/io_apic.c | |||
@@ -3967,18 +3967,36 @@ int mp_find_ioapic_pin(int ioapic, u32 gsi) | |||
3967 | static __init int bad_ioapic(unsigned long address) | 3967 | static __init int bad_ioapic(unsigned long address) |
3968 | { | 3968 | { |
3969 | if (nr_ioapics >= MAX_IO_APICS) { | 3969 | if (nr_ioapics >= MAX_IO_APICS) { |
3970 | printk(KERN_WARNING "WARNING: Max # of I/O APICs (%d) exceeded " | 3970 | pr_warn("WARNING: Max # of I/O APICs (%d) exceeded (found %d), skipping\n", |
3971 | "(found %d), skipping\n", MAX_IO_APICS, nr_ioapics); | 3971 | MAX_IO_APICS, nr_ioapics); |
3972 | return 1; | 3972 | return 1; |
3973 | } | 3973 | } |
3974 | if (!address) { | 3974 | if (!address) { |
3975 | printk(KERN_WARNING "WARNING: Bogus (zero) I/O APIC address" | 3975 | pr_warn("WARNING: Bogus (zero) I/O APIC address found in table, skipping!\n"); |
3976 | " found in table, skipping!\n"); | ||
3977 | return 1; | 3976 | return 1; |
3978 | } | 3977 | } |
3979 | return 0; | 3978 | return 0; |
3980 | } | 3979 | } |
3981 | 3980 | ||
3981 | static __init int bad_ioapic_register(int idx) | ||
3982 | { | ||
3983 | union IO_APIC_reg_00 reg_00; | ||
3984 | union IO_APIC_reg_01 reg_01; | ||
3985 | union IO_APIC_reg_02 reg_02; | ||
3986 | |||
3987 | reg_00.raw = io_apic_read(idx, 0); | ||
3988 | reg_01.raw = io_apic_read(idx, 1); | ||
3989 | reg_02.raw = io_apic_read(idx, 2); | ||
3990 | |||
3991 | if (reg_00.raw == -1 && reg_01.raw == -1 && reg_02.raw == -1) { | ||
3992 | pr_warn("I/O APIC 0x%x registers return all ones, skipping!\n", | ||
3993 | mpc_ioapic_addr(idx)); | ||
3994 | return 1; | ||
3995 | } | ||
3996 | |||
3997 | return 0; | ||
3998 | } | ||
3999 | |||
3982 | void __init mp_register_ioapic(int id, u32 address, u32 gsi_base) | 4000 | void __init mp_register_ioapic(int id, u32 address, u32 gsi_base) |
3983 | { | 4001 | { |
3984 | int idx = 0; | 4002 | int idx = 0; |
@@ -3995,6 +4013,12 @@ void __init mp_register_ioapic(int id, u32 address, u32 gsi_base) | |||
3995 | ioapics[idx].mp_config.apicaddr = address; | 4013 | ioapics[idx].mp_config.apicaddr = address; |
3996 | 4014 | ||
3997 | set_fixmap_nocache(FIX_IO_APIC_BASE_0 + idx, address); | 4015 | set_fixmap_nocache(FIX_IO_APIC_BASE_0 + idx, address); |
4016 | |||
4017 | if (bad_ioapic_register(idx)) { | ||
4018 | clear_fixmap(FIX_IO_APIC_BASE_0 + idx); | ||
4019 | return; | ||
4020 | } | ||
4021 | |||
3998 | ioapics[idx].mp_config.apicid = io_apic_unique_id(id); | 4022 | ioapics[idx].mp_config.apicid = io_apic_unique_id(id); |
3999 | ioapics[idx].mp_config.apicver = io_apic_get_version(idx); | 4023 | ioapics[idx].mp_config.apicver = io_apic_get_version(idx); |
4000 | 4024 | ||
@@ -4015,10 +4039,10 @@ void __init mp_register_ioapic(int id, u32 address, u32 gsi_base) | |||
4015 | if (gsi_cfg->gsi_end >= gsi_top) | 4039 | if (gsi_cfg->gsi_end >= gsi_top) |
4016 | gsi_top = gsi_cfg->gsi_end + 1; | 4040 | gsi_top = gsi_cfg->gsi_end + 1; |
4017 | 4041 | ||
4018 | printk(KERN_INFO "IOAPIC[%d]: apic_id %d, version %d, address 0x%x, " | 4042 | pr_info("IOAPIC[%d]: apic_id %d, version %d, address 0x%x, GSI %d-%d\n", |
4019 | "GSI %d-%d\n", idx, mpc_ioapic_id(idx), | 4043 | idx, mpc_ioapic_id(idx), |
4020 | mpc_ioapic_ver(idx), mpc_ioapic_addr(idx), | 4044 | mpc_ioapic_ver(idx), mpc_ioapic_addr(idx), |
4021 | gsi_cfg->gsi_base, gsi_cfg->gsi_end); | 4045 | gsi_cfg->gsi_base, gsi_cfg->gsi_end); |
4022 | 4046 | ||
4023 | nr_ioapics++; | 4047 | nr_ioapics++; |
4024 | } | 4048 | } |
diff --git a/arch/x86/kernel/apic/numaq_32.c b/arch/x86/kernel/apic/numaq_32.c index c4a61ca1349a..00d2422ca7c9 100644 --- a/arch/x86/kernel/apic/numaq_32.c +++ b/arch/x86/kernel/apic/numaq_32.c | |||
@@ -478,6 +478,7 @@ static struct apic __refdata apic_numaq = { | |||
478 | .name = "NUMAQ", | 478 | .name = "NUMAQ", |
479 | .probe = probe_numaq, | 479 | .probe = probe_numaq, |
480 | .acpi_madt_oem_check = NULL, | 480 | .acpi_madt_oem_check = NULL, |
481 | .apic_id_valid = default_apic_id_valid, | ||
481 | .apic_id_registered = numaq_apic_id_registered, | 482 | .apic_id_registered = numaq_apic_id_registered, |
482 | 483 | ||
483 | .irq_delivery_mode = dest_LowestPrio, | 484 | .irq_delivery_mode = dest_LowestPrio, |
diff --git a/arch/x86/kernel/apic/probe_32.c b/arch/x86/kernel/apic/probe_32.c index 0787bb3412f4..ff2c1b9aac4d 100644 --- a/arch/x86/kernel/apic/probe_32.c +++ b/arch/x86/kernel/apic/probe_32.c | |||
@@ -92,6 +92,7 @@ static struct apic apic_default = { | |||
92 | .name = "default", | 92 | .name = "default", |
93 | .probe = probe_default, | 93 | .probe = probe_default, |
94 | .acpi_madt_oem_check = NULL, | 94 | .acpi_madt_oem_check = NULL, |
95 | .apic_id_valid = default_apic_id_valid, | ||
95 | .apic_id_registered = default_apic_id_registered, | 96 | .apic_id_registered = default_apic_id_registered, |
96 | 97 | ||
97 | .irq_delivery_mode = dest_LowestPrio, | 98 | .irq_delivery_mode = dest_LowestPrio, |
diff --git a/arch/x86/kernel/apic/summit_32.c b/arch/x86/kernel/apic/summit_32.c index 19114423c58c..fea000b27f07 100644 --- a/arch/x86/kernel/apic/summit_32.c +++ b/arch/x86/kernel/apic/summit_32.c | |||
@@ -496,6 +496,7 @@ static struct apic apic_summit = { | |||
496 | .name = "summit", | 496 | .name = "summit", |
497 | .probe = probe_summit, | 497 | .probe = probe_summit, |
498 | .acpi_madt_oem_check = summit_acpi_madt_oem_check, | 498 | .acpi_madt_oem_check = summit_acpi_madt_oem_check, |
499 | .apic_id_valid = default_apic_id_valid, | ||
499 | .apic_id_registered = summit_apic_id_registered, | 500 | .apic_id_registered = summit_apic_id_registered, |
500 | 501 | ||
501 | .irq_delivery_mode = dest_LowestPrio, | 502 | .irq_delivery_mode = dest_LowestPrio, |
diff --git a/arch/x86/kernel/apic/x2apic_cluster.c b/arch/x86/kernel/apic/x2apic_cluster.c index 500795875827..9193713060a9 100644 --- a/arch/x86/kernel/apic/x2apic_cluster.c +++ b/arch/x86/kernel/apic/x2apic_cluster.c | |||
@@ -213,6 +213,7 @@ static struct apic apic_x2apic_cluster = { | |||
213 | .name = "cluster x2apic", | 213 | .name = "cluster x2apic", |
214 | .probe = x2apic_cluster_probe, | 214 | .probe = x2apic_cluster_probe, |
215 | .acpi_madt_oem_check = x2apic_acpi_madt_oem_check, | 215 | .acpi_madt_oem_check = x2apic_acpi_madt_oem_check, |
216 | .apic_id_valid = default_apic_id_valid, | ||
216 | .apic_id_registered = x2apic_apic_id_registered, | 217 | .apic_id_registered = x2apic_apic_id_registered, |
217 | 218 | ||
218 | .irq_delivery_mode = dest_LowestPrio, | 219 | .irq_delivery_mode = dest_LowestPrio, |
diff --git a/arch/x86/kernel/apic/x2apic_phys.c b/arch/x86/kernel/apic/x2apic_phys.c index f5373dfde21e..bcd1db6eaca9 100644 --- a/arch/x86/kernel/apic/x2apic_phys.c +++ b/arch/x86/kernel/apic/x2apic_phys.c | |||
@@ -119,6 +119,7 @@ static struct apic apic_x2apic_phys = { | |||
119 | .name = "physical x2apic", | 119 | .name = "physical x2apic", |
120 | .probe = x2apic_phys_probe, | 120 | .probe = x2apic_phys_probe, |
121 | .acpi_madt_oem_check = x2apic_acpi_madt_oem_check, | 121 | .acpi_madt_oem_check = x2apic_acpi_madt_oem_check, |
122 | .apic_id_valid = default_apic_id_valid, | ||
122 | .apic_id_registered = x2apic_apic_id_registered, | 123 | .apic_id_registered = x2apic_apic_id_registered, |
123 | 124 | ||
124 | .irq_delivery_mode = dest_Fixed, | 125 | .irq_delivery_mode = dest_Fixed, |
diff --git a/arch/x86/kernel/apic/x2apic_uv_x.c b/arch/x86/kernel/apic/x2apic_uv_x.c index 79b05b88aa19..fc4771425852 100644 --- a/arch/x86/kernel/apic/x2apic_uv_x.c +++ b/arch/x86/kernel/apic/x2apic_uv_x.c | |||
@@ -351,6 +351,7 @@ static struct apic __refdata apic_x2apic_uv_x = { | |||
351 | .name = "UV large system", | 351 | .name = "UV large system", |
352 | .probe = uv_probe, | 352 | .probe = uv_probe, |
353 | .acpi_madt_oem_check = uv_acpi_madt_oem_check, | 353 | .acpi_madt_oem_check = uv_acpi_madt_oem_check, |
354 | .apic_id_valid = default_apic_id_valid, | ||
354 | .apic_id_registered = uv_apic_id_registered, | 355 | .apic_id_registered = uv_apic_id_registered, |
355 | 356 | ||
356 | .irq_delivery_mode = dest_Fixed, | 357 | .irq_delivery_mode = dest_Fixed, |
diff --git a/arch/x86/kernel/apm_32.c b/arch/x86/kernel/apm_32.c index f76623cbe263..5d56931a15b3 100644 --- a/arch/x86/kernel/apm_32.c +++ b/arch/x86/kernel/apm_32.c | |||
@@ -1234,8 +1234,7 @@ static int suspend(int vetoable) | |||
1234 | struct apm_user *as; | 1234 | struct apm_user *as; |
1235 | 1235 | ||
1236 | dpm_suspend_start(PMSG_SUSPEND); | 1236 | dpm_suspend_start(PMSG_SUSPEND); |
1237 | 1237 | dpm_suspend_end(PMSG_SUSPEND); | |
1238 | dpm_suspend_noirq(PMSG_SUSPEND); | ||
1239 | 1238 | ||
1240 | local_irq_disable(); | 1239 | local_irq_disable(); |
1241 | syscore_suspend(); | 1240 | syscore_suspend(); |
@@ -1259,9 +1258,9 @@ static int suspend(int vetoable) | |||
1259 | syscore_resume(); | 1258 | syscore_resume(); |
1260 | local_irq_enable(); | 1259 | local_irq_enable(); |
1261 | 1260 | ||
1262 | dpm_resume_noirq(PMSG_RESUME); | 1261 | dpm_resume_start(PMSG_RESUME); |
1263 | |||
1264 | dpm_resume_end(PMSG_RESUME); | 1262 | dpm_resume_end(PMSG_RESUME); |
1263 | |||
1265 | queue_event(APM_NORMAL_RESUME, NULL); | 1264 | queue_event(APM_NORMAL_RESUME, NULL); |
1266 | spin_lock(&user_list_lock); | 1265 | spin_lock(&user_list_lock); |
1267 | for (as = user_list; as != NULL; as = as->next) { | 1266 | for (as = user_list; as != NULL; as = as->next) { |
@@ -1277,7 +1276,7 @@ static void standby(void) | |||
1277 | { | 1276 | { |
1278 | int err; | 1277 | int err; |
1279 | 1278 | ||
1280 | dpm_suspend_noirq(PMSG_SUSPEND); | 1279 | dpm_suspend_end(PMSG_SUSPEND); |
1281 | 1280 | ||
1282 | local_irq_disable(); | 1281 | local_irq_disable(); |
1283 | syscore_suspend(); | 1282 | syscore_suspend(); |
@@ -1291,7 +1290,7 @@ static void standby(void) | |||
1291 | syscore_resume(); | 1290 | syscore_resume(); |
1292 | local_irq_enable(); | 1291 | local_irq_enable(); |
1293 | 1292 | ||
1294 | dpm_resume_noirq(PMSG_RESUME); | 1293 | dpm_resume_start(PMSG_RESUME); |
1295 | } | 1294 | } |
1296 | 1295 | ||
1297 | static apm_event_t get_event(void) | 1296 | static apm_event_t get_event(void) |
diff --git a/arch/x86/kernel/cpu/Makefile b/arch/x86/kernel/cpu/Makefile index 25f24dccdcfa..6ab6aa2fdfdd 100644 --- a/arch/x86/kernel/cpu/Makefile +++ b/arch/x86/kernel/cpu/Makefile | |||
@@ -16,6 +16,7 @@ obj-y := intel_cacheinfo.o scattered.o topology.o | |||
16 | obj-y += proc.o capflags.o powerflags.o common.o | 16 | obj-y += proc.o capflags.o powerflags.o common.o |
17 | obj-y += vmware.o hypervisor.o sched.o mshyperv.o | 17 | obj-y += vmware.o hypervisor.o sched.o mshyperv.o |
18 | obj-y += rdrand.o | 18 | obj-y += rdrand.o |
19 | obj-y += match.o | ||
19 | 20 | ||
20 | obj-$(CONFIG_X86_32) += bugs.o | 21 | obj-$(CONFIG_X86_32) += bugs.o |
21 | obj-$(CONFIG_X86_64) += bugs_64.o | 22 | obj-$(CONFIG_X86_64) += bugs_64.o |
diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c index c0f7d68d318f..e49477444fff 100644 --- a/arch/x86/kernel/cpu/common.c +++ b/arch/x86/kernel/cpu/common.c | |||
@@ -18,6 +18,7 @@ | |||
18 | #include <asm/archrandom.h> | 18 | #include <asm/archrandom.h> |
19 | #include <asm/hypervisor.h> | 19 | #include <asm/hypervisor.h> |
20 | #include <asm/processor.h> | 20 | #include <asm/processor.h> |
21 | #include <asm/debugreg.h> | ||
21 | #include <asm/sections.h> | 22 | #include <asm/sections.h> |
22 | #include <linux/topology.h> | 23 | #include <linux/topology.h> |
23 | #include <linux/cpumask.h> | 24 | #include <linux/cpumask.h> |
@@ -28,6 +29,7 @@ | |||
28 | #include <asm/apic.h> | 29 | #include <asm/apic.h> |
29 | #include <asm/desc.h> | 30 | #include <asm/desc.h> |
30 | #include <asm/i387.h> | 31 | #include <asm/i387.h> |
32 | #include <asm/fpu-internal.h> | ||
31 | #include <asm/mtrr.h> | 33 | #include <asm/mtrr.h> |
32 | #include <linux/numa.h> | 34 | #include <linux/numa.h> |
33 | #include <asm/asm.h> | 35 | #include <asm/asm.h> |
@@ -933,7 +935,7 @@ static const struct msr_range msr_range_array[] __cpuinitconst = { | |||
933 | { 0xc0011000, 0xc001103b}, | 935 | { 0xc0011000, 0xc001103b}, |
934 | }; | 936 | }; |
935 | 937 | ||
936 | static void __cpuinit print_cpu_msr(void) | 938 | static void __cpuinit __print_cpu_msr(void) |
937 | { | 939 | { |
938 | unsigned index_min, index_max; | 940 | unsigned index_min, index_max; |
939 | unsigned index; | 941 | unsigned index; |
@@ -997,13 +999,13 @@ void __cpuinit print_cpu_info(struct cpuinfo_x86 *c) | |||
997 | else | 999 | else |
998 | printk(KERN_CONT "\n"); | 1000 | printk(KERN_CONT "\n"); |
999 | 1001 | ||
1000 | #ifdef CONFIG_SMP | 1002 | __print_cpu_msr(); |
1003 | } | ||
1004 | |||
1005 | void __cpuinit print_cpu_msr(struct cpuinfo_x86 *c) | ||
1006 | { | ||
1001 | if (c->cpu_index < show_msr) | 1007 | if (c->cpu_index < show_msr) |
1002 | print_cpu_msr(); | 1008 | __print_cpu_msr(); |
1003 | #else | ||
1004 | if (show_msr) | ||
1005 | print_cpu_msr(); | ||
1006 | #endif | ||
1007 | } | 1009 | } |
1008 | 1010 | ||
1009 | static __init int setup_disablecpuid(char *arg) | 1011 | static __init int setup_disablecpuid(char *arg) |
@@ -1045,7 +1047,6 @@ DEFINE_PER_CPU(char *, irq_stack_ptr) = | |||
1045 | DEFINE_PER_CPU(unsigned int, irq_count) = -1; | 1047 | DEFINE_PER_CPU(unsigned int, irq_count) = -1; |
1046 | 1048 | ||
1047 | DEFINE_PER_CPU(struct task_struct *, fpu_owner_task); | 1049 | DEFINE_PER_CPU(struct task_struct *, fpu_owner_task); |
1048 | EXPORT_PER_CPU_SYMBOL(fpu_owner_task); | ||
1049 | 1050 | ||
1050 | /* | 1051 | /* |
1051 | * Special IST stacks which the CPU switches to when it calls | 1052 | * Special IST stacks which the CPU switches to when it calls |
@@ -1115,7 +1116,6 @@ void debug_stack_reset(void) | |||
1115 | DEFINE_PER_CPU(struct task_struct *, current_task) = &init_task; | 1116 | DEFINE_PER_CPU(struct task_struct *, current_task) = &init_task; |
1116 | EXPORT_PER_CPU_SYMBOL(current_task); | 1117 | EXPORT_PER_CPU_SYMBOL(current_task); |
1117 | DEFINE_PER_CPU(struct task_struct *, fpu_owner_task); | 1118 | DEFINE_PER_CPU(struct task_struct *, fpu_owner_task); |
1118 | EXPORT_PER_CPU_SYMBOL(fpu_owner_task); | ||
1119 | 1119 | ||
1120 | #ifdef CONFIG_CC_STACKPROTECTOR | 1120 | #ifdef CONFIG_CC_STACKPROTECTOR |
1121 | DEFINE_PER_CPU_ALIGNED(struct stack_canary, stack_canary); | 1121 | DEFINE_PER_CPU_ALIGNED(struct stack_canary, stack_canary); |
diff --git a/arch/x86/kernel/cpu/match.c b/arch/x86/kernel/cpu/match.c new file mode 100644 index 000000000000..5502b289341b --- /dev/null +++ b/arch/x86/kernel/cpu/match.c | |||
@@ -0,0 +1,91 @@ | |||
1 | #include <asm/cpu_device_id.h> | ||
2 | #include <asm/processor.h> | ||
3 | #include <linux/cpu.h> | ||
4 | #include <linux/module.h> | ||
5 | #include <linux/slab.h> | ||
6 | |||
7 | /** | ||
8 | * x86_match_cpu - match current CPU again an array of x86_cpu_ids | ||
9 | * @match: Pointer to array of x86_cpu_ids. Last entry terminated with | ||
10 | * {}. | ||
11 | * | ||
12 | * Return the entry if the current CPU matches the entries in the | ||
13 | * passed x86_cpu_id match table. Otherwise NULL. The match table | ||
14 | * contains vendor (X86_VENDOR_*), family, model and feature bits or | ||
15 | * respective wildcard entries. | ||
16 | * | ||
17 | * A typical table entry would be to match a specific CPU | ||
18 | * { X86_VENDOR_INTEL, 6, 0x12 } | ||
19 | * or to match a specific CPU feature | ||
20 | * { X86_FEATURE_MATCH(X86_FEATURE_FOOBAR) } | ||
21 | * | ||
22 | * Fields can be wildcarded with %X86_VENDOR_ANY, %X86_FAMILY_ANY, | ||
23 | * %X86_MODEL_ANY, %X86_FEATURE_ANY or 0 (except for vendor) | ||
24 | * | ||
25 | * Arrays used to match for this should also be declared using | ||
26 | * MODULE_DEVICE_TABLE(x86_cpu, ...) | ||
27 | * | ||
28 | * This always matches against the boot cpu, assuming models and features are | ||
29 | * consistent over all CPUs. | ||
30 | */ | ||
31 | const struct x86_cpu_id *x86_match_cpu(const struct x86_cpu_id *match) | ||
32 | { | ||
33 | const struct x86_cpu_id *m; | ||
34 | struct cpuinfo_x86 *c = &boot_cpu_data; | ||
35 | |||
36 | for (m = match; m->vendor | m->family | m->model | m->feature; m++) { | ||
37 | if (m->vendor != X86_VENDOR_ANY && c->x86_vendor != m->vendor) | ||
38 | continue; | ||
39 | if (m->family != X86_FAMILY_ANY && c->x86 != m->family) | ||
40 | continue; | ||
41 | if (m->model != X86_MODEL_ANY && c->x86_model != m->model) | ||
42 | continue; | ||
43 | if (m->feature != X86_FEATURE_ANY && !cpu_has(c, m->feature)) | ||
44 | continue; | ||
45 | return m; | ||
46 | } | ||
47 | return NULL; | ||
48 | } | ||
49 | EXPORT_SYMBOL(x86_match_cpu); | ||
50 | |||
51 | ssize_t arch_print_cpu_modalias(struct device *dev, | ||
52 | struct device_attribute *attr, | ||
53 | char *bufptr) | ||
54 | { | ||
55 | int size = PAGE_SIZE; | ||
56 | int i, n; | ||
57 | char *buf = bufptr; | ||
58 | |||
59 | n = snprintf(buf, size, "x86cpu:vendor:%04X:family:%04X:" | ||
60 | "model:%04X:feature:", | ||
61 | boot_cpu_data.x86_vendor, | ||
62 | boot_cpu_data.x86, | ||
63 | boot_cpu_data.x86_model); | ||
64 | size -= n; | ||
65 | buf += n; | ||
66 | size -= 1; | ||
67 | for (i = 0; i < NCAPINTS*32; i++) { | ||
68 | if (boot_cpu_has(i)) { | ||
69 | n = snprintf(buf, size, ",%04X", i); | ||
70 | if (n >= size) { | ||
71 | WARN(1, "x86 features overflow page\n"); | ||
72 | break; | ||
73 | } | ||
74 | size -= n; | ||
75 | buf += n; | ||
76 | } | ||
77 | } | ||
78 | *buf++ = '\n'; | ||
79 | return buf - bufptr; | ||
80 | } | ||
81 | |||
82 | int arch_cpu_uevent(struct device *dev, struct kobj_uevent_env *env) | ||
83 | { | ||
84 | char *buf = kzalloc(PAGE_SIZE, GFP_KERNEL); | ||
85 | if (buf) { | ||
86 | arch_print_cpu_modalias(NULL, NULL, buf); | ||
87 | add_uevent_var(env, "MODALIAS=%s", buf); | ||
88 | kfree(buf); | ||
89 | } | ||
90 | return 0; | ||
91 | } | ||
diff --git a/arch/x86/kernel/cpu/mcheck/mce-severity.c b/arch/x86/kernel/cpu/mcheck/mce-severity.c index 7395d5f4272d..0c82091b1652 100644 --- a/arch/x86/kernel/cpu/mcheck/mce-severity.c +++ b/arch/x86/kernel/cpu/mcheck/mce-severity.c | |||
@@ -54,7 +54,14 @@ static struct severity { | |||
54 | #define MASK(x, y) .mask = x, .result = y | 54 | #define MASK(x, y) .mask = x, .result = y |
55 | #define MCI_UC_S (MCI_STATUS_UC|MCI_STATUS_S) | 55 | #define MCI_UC_S (MCI_STATUS_UC|MCI_STATUS_S) |
56 | #define MCI_UC_SAR (MCI_STATUS_UC|MCI_STATUS_S|MCI_STATUS_AR) | 56 | #define MCI_UC_SAR (MCI_STATUS_UC|MCI_STATUS_S|MCI_STATUS_AR) |
57 | #define MCI_ADDR (MCI_STATUS_ADDRV|MCI_STATUS_MISCV) | ||
57 | #define MCACOD 0xffff | 58 | #define MCACOD 0xffff |
59 | /* Architecturally defined codes from SDM Vol. 3B Chapter 15 */ | ||
60 | #define MCACOD_SCRUB 0x00C0 /* 0xC0-0xCF Memory Scrubbing */ | ||
61 | #define MCACOD_SCRUBMSK 0xfff0 | ||
62 | #define MCACOD_L3WB 0x017A /* L3 Explicit Writeback */ | ||
63 | #define MCACOD_DATA 0x0134 /* Data Load */ | ||
64 | #define MCACOD_INSTR 0x0150 /* Instruction Fetch */ | ||
58 | 65 | ||
59 | MCESEV( | 66 | MCESEV( |
60 | NO, "Invalid", | 67 | NO, "Invalid", |
@@ -102,11 +109,24 @@ static struct severity { | |||
102 | SER, BITCLR(MCI_STATUS_S) | 109 | SER, BITCLR(MCI_STATUS_S) |
103 | ), | 110 | ), |
104 | 111 | ||
105 | /* AR add known MCACODs here */ | ||
106 | MCESEV( | 112 | MCESEV( |
107 | PANIC, "Action required with lost events", | 113 | PANIC, "Action required with lost events", |
108 | SER, BITSET(MCI_STATUS_OVER|MCI_UC_SAR) | 114 | SER, BITSET(MCI_STATUS_OVER|MCI_UC_SAR) |
109 | ), | 115 | ), |
116 | |||
117 | /* known AR MCACODs: */ | ||
118 | #ifdef CONFIG_MEMORY_FAILURE | ||
119 | MCESEV( | ||
120 | KEEP, "HT thread notices Action required: data load error", | ||
121 | SER, MASK(MCI_STATUS_OVER|MCI_UC_SAR|MCI_ADDR|MCACOD, MCI_UC_SAR|MCI_ADDR|MCACOD_DATA), | ||
122 | MCGMASK(MCG_STATUS_EIPV, 0) | ||
123 | ), | ||
124 | MCESEV( | ||
125 | AR, "Action required: data load error", | ||
126 | SER, MASK(MCI_STATUS_OVER|MCI_UC_SAR|MCI_ADDR|MCACOD, MCI_UC_SAR|MCI_ADDR|MCACOD_DATA), | ||
127 | USER | ||
128 | ), | ||
129 | #endif | ||
110 | MCESEV( | 130 | MCESEV( |
111 | PANIC, "Action required: unknown MCACOD", | 131 | PANIC, "Action required: unknown MCACOD", |
112 | SER, MASK(MCI_STATUS_OVER|MCI_UC_SAR, MCI_UC_SAR) | 132 | SER, MASK(MCI_STATUS_OVER|MCI_UC_SAR, MCI_UC_SAR) |
@@ -115,11 +135,11 @@ static struct severity { | |||
115 | /* known AO MCACODs: */ | 135 | /* known AO MCACODs: */ |
116 | MCESEV( | 136 | MCESEV( |
117 | AO, "Action optional: memory scrubbing error", | 137 | AO, "Action optional: memory scrubbing error", |
118 | SER, MASK(MCI_STATUS_OVER|MCI_UC_SAR|0xfff0, MCI_UC_S|0x00c0) | 138 | SER, MASK(MCI_STATUS_OVER|MCI_UC_SAR|MCACOD_SCRUBMSK, MCI_UC_S|MCACOD_SCRUB) |
119 | ), | 139 | ), |
120 | MCESEV( | 140 | MCESEV( |
121 | AO, "Action optional: last level cache writeback error", | 141 | AO, "Action optional: last level cache writeback error", |
122 | SER, MASK(MCI_STATUS_OVER|MCI_UC_SAR|MCACOD, MCI_UC_S|0x017a) | 142 | SER, MASK(MCI_STATUS_OVER|MCI_UC_SAR|MCACOD, MCI_UC_S|MCACOD_L3WB) |
123 | ), | 143 | ), |
124 | MCESEV( | 144 | MCESEV( |
125 | SOME, "Action optional: unknown MCACOD", | 145 | SOME, "Action optional: unknown MCACOD", |
diff --git a/arch/x86/kernel/cpu/mcheck/mce.c b/arch/x86/kernel/cpu/mcheck/mce.c index 5a11ae2e9e91..d086a09c087d 100644 --- a/arch/x86/kernel/cpu/mcheck/mce.c +++ b/arch/x86/kernel/cpu/mcheck/mce.c | |||
@@ -191,7 +191,7 @@ static void drain_mcelog_buffer(void) | |||
191 | { | 191 | { |
192 | unsigned int next, i, prev = 0; | 192 | unsigned int next, i, prev = 0; |
193 | 193 | ||
194 | next = rcu_dereference_check_mce(mcelog.next); | 194 | next = ACCESS_ONCE(mcelog.next); |
195 | 195 | ||
196 | do { | 196 | do { |
197 | struct mce *m; | 197 | struct mce *m; |
@@ -540,6 +540,27 @@ static void mce_report_event(struct pt_regs *regs) | |||
540 | irq_work_queue(&__get_cpu_var(mce_irq_work)); | 540 | irq_work_queue(&__get_cpu_var(mce_irq_work)); |
541 | } | 541 | } |
542 | 542 | ||
543 | /* | ||
544 | * Read ADDR and MISC registers. | ||
545 | */ | ||
546 | static void mce_read_aux(struct mce *m, int i) | ||
547 | { | ||
548 | if (m->status & MCI_STATUS_MISCV) | ||
549 | m->misc = mce_rdmsrl(MSR_IA32_MCx_MISC(i)); | ||
550 | if (m->status & MCI_STATUS_ADDRV) { | ||
551 | m->addr = mce_rdmsrl(MSR_IA32_MCx_ADDR(i)); | ||
552 | |||
553 | /* | ||
554 | * Mask the reported address by the reported granularity. | ||
555 | */ | ||
556 | if (mce_ser && (m->status & MCI_STATUS_MISCV)) { | ||
557 | u8 shift = MCI_MISC_ADDR_LSB(m->misc); | ||
558 | m->addr >>= shift; | ||
559 | m->addr <<= shift; | ||
560 | } | ||
561 | } | ||
562 | } | ||
563 | |||
543 | DEFINE_PER_CPU(unsigned, mce_poll_count); | 564 | DEFINE_PER_CPU(unsigned, mce_poll_count); |
544 | 565 | ||
545 | /* | 566 | /* |
@@ -590,10 +611,7 @@ void machine_check_poll(enum mcp_flags flags, mce_banks_t *b) | |||
590 | (m.status & (mce_ser ? MCI_STATUS_S : MCI_STATUS_UC))) | 611 | (m.status & (mce_ser ? MCI_STATUS_S : MCI_STATUS_UC))) |
591 | continue; | 612 | continue; |
592 | 613 | ||
593 | if (m.status & MCI_STATUS_MISCV) | 614 | mce_read_aux(&m, i); |
594 | m.misc = mce_rdmsrl(MSR_IA32_MCx_MISC(i)); | ||
595 | if (m.status & MCI_STATUS_ADDRV) | ||
596 | m.addr = mce_rdmsrl(MSR_IA32_MCx_ADDR(i)); | ||
597 | 615 | ||
598 | if (!(flags & MCP_TIMESTAMP)) | 616 | if (!(flags & MCP_TIMESTAMP)) |
599 | m.tsc = 0; | 617 | m.tsc = 0; |
@@ -917,6 +935,49 @@ static void mce_clear_state(unsigned long *toclear) | |||
917 | } | 935 | } |
918 | 936 | ||
919 | /* | 937 | /* |
938 | * Need to save faulting physical address associated with a process | ||
939 | * in the machine check handler some place where we can grab it back | ||
940 | * later in mce_notify_process() | ||
941 | */ | ||
942 | #define MCE_INFO_MAX 16 | ||
943 | |||
944 | struct mce_info { | ||
945 | atomic_t inuse; | ||
946 | struct task_struct *t; | ||
947 | __u64 paddr; | ||
948 | } mce_info[MCE_INFO_MAX]; | ||
949 | |||
950 | static void mce_save_info(__u64 addr) | ||
951 | { | ||
952 | struct mce_info *mi; | ||
953 | |||
954 | for (mi = mce_info; mi < &mce_info[MCE_INFO_MAX]; mi++) { | ||
955 | if (atomic_cmpxchg(&mi->inuse, 0, 1) == 0) { | ||
956 | mi->t = current; | ||
957 | mi->paddr = addr; | ||
958 | return; | ||
959 | } | ||
960 | } | ||
961 | |||
962 | mce_panic("Too many concurrent recoverable errors", NULL, NULL); | ||
963 | } | ||
964 | |||
965 | static struct mce_info *mce_find_info(void) | ||
966 | { | ||
967 | struct mce_info *mi; | ||
968 | |||
969 | for (mi = mce_info; mi < &mce_info[MCE_INFO_MAX]; mi++) | ||
970 | if (atomic_read(&mi->inuse) && mi->t == current) | ||
971 | return mi; | ||
972 | return NULL; | ||
973 | } | ||
974 | |||
975 | static void mce_clear_info(struct mce_info *mi) | ||
976 | { | ||
977 | atomic_set(&mi->inuse, 0); | ||
978 | } | ||
979 | |||
980 | /* | ||
920 | * The actual machine check handler. This only handles real | 981 | * The actual machine check handler. This only handles real |
921 | * exceptions when something got corrupted coming in through int 18. | 982 | * exceptions when something got corrupted coming in through int 18. |
922 | * | 983 | * |
@@ -969,7 +1030,9 @@ void do_machine_check(struct pt_regs *regs, long error_code) | |||
969 | barrier(); | 1030 | barrier(); |
970 | 1031 | ||
971 | /* | 1032 | /* |
972 | * When no restart IP must always kill or panic. | 1033 | * When no restart IP might need to kill or panic. |
1034 | * Assume the worst for now, but if we find the | ||
1035 | * severity is MCE_AR_SEVERITY we have other options. | ||
973 | */ | 1036 | */ |
974 | if (!(m.mcgstatus & MCG_STATUS_RIPV)) | 1037 | if (!(m.mcgstatus & MCG_STATUS_RIPV)) |
975 | kill_it = 1; | 1038 | kill_it = 1; |
@@ -1023,16 +1086,7 @@ void do_machine_check(struct pt_regs *regs, long error_code) | |||
1023 | continue; | 1086 | continue; |
1024 | } | 1087 | } |
1025 | 1088 | ||
1026 | /* | 1089 | mce_read_aux(&m, i); |
1027 | * Kill on action required. | ||
1028 | */ | ||
1029 | if (severity == MCE_AR_SEVERITY) | ||
1030 | kill_it = 1; | ||
1031 | |||
1032 | if (m.status & MCI_STATUS_MISCV) | ||
1033 | m.misc = mce_rdmsrl(MSR_IA32_MCx_MISC(i)); | ||
1034 | if (m.status & MCI_STATUS_ADDRV) | ||
1035 | m.addr = mce_rdmsrl(MSR_IA32_MCx_ADDR(i)); | ||
1036 | 1090 | ||
1037 | /* | 1091 | /* |
1038 | * Action optional error. Queue address for later processing. | 1092 | * Action optional error. Queue address for later processing. |
@@ -1052,6 +1106,9 @@ void do_machine_check(struct pt_regs *regs, long error_code) | |||
1052 | } | 1106 | } |
1053 | } | 1107 | } |
1054 | 1108 | ||
1109 | /* mce_clear_state will clear *final, save locally for use later */ | ||
1110 | m = *final; | ||
1111 | |||
1055 | if (!no_way_out) | 1112 | if (!no_way_out) |
1056 | mce_clear_state(toclear); | 1113 | mce_clear_state(toclear); |
1057 | 1114 | ||
@@ -1063,27 +1120,22 @@ void do_machine_check(struct pt_regs *regs, long error_code) | |||
1063 | no_way_out = worst >= MCE_PANIC_SEVERITY; | 1120 | no_way_out = worst >= MCE_PANIC_SEVERITY; |
1064 | 1121 | ||
1065 | /* | 1122 | /* |
1066 | * If we have decided that we just CAN'T continue, and the user | 1123 | * At insane "tolerant" levels we take no action. Otherwise |
1067 | * has not set tolerant to an insane level, give up and die. | 1124 | * we only die if we have no other choice. For less serious |
1068 | * | 1125 | * issues we try to recover, or limit damage to the current |
1069 | * This is mainly used in the case when the system doesn't | 1126 | * process. |
1070 | * support MCE broadcasting or it has been disabled. | ||
1071 | */ | ||
1072 | if (no_way_out && tolerant < 3) | ||
1073 | mce_panic("Fatal machine check on current CPU", final, msg); | ||
1074 | |||
1075 | /* | ||
1076 | * If the error seems to be unrecoverable, something should be | ||
1077 | * done. Try to kill as little as possible. If we can kill just | ||
1078 | * one task, do that. If the user has set the tolerance very | ||
1079 | * high, don't try to do anything at all. | ||
1080 | */ | 1127 | */ |
1081 | 1128 | if (tolerant < 3) { | |
1082 | if (kill_it && tolerant < 3) | 1129 | if (no_way_out) |
1083 | force_sig(SIGBUS, current); | 1130 | mce_panic("Fatal machine check on current CPU", &m, msg); |
1084 | 1131 | if (worst == MCE_AR_SEVERITY) { | |
1085 | /* notify userspace ASAP */ | 1132 | /* schedule action before return to userland */ |
1086 | set_thread_flag(TIF_MCE_NOTIFY); | 1133 | mce_save_info(m.addr); |
1134 | set_thread_flag(TIF_MCE_NOTIFY); | ||
1135 | } else if (kill_it) { | ||
1136 | force_sig(SIGBUS, current); | ||
1137 | } | ||
1138 | } | ||
1087 | 1139 | ||
1088 | if (worst > 0) | 1140 | if (worst > 0) |
1089 | mce_report_event(regs); | 1141 | mce_report_event(regs); |
@@ -1094,34 +1146,57 @@ out: | |||
1094 | } | 1146 | } |
1095 | EXPORT_SYMBOL_GPL(do_machine_check); | 1147 | EXPORT_SYMBOL_GPL(do_machine_check); |
1096 | 1148 | ||
1097 | /* dummy to break dependency. actual code is in mm/memory-failure.c */ | 1149 | #ifndef CONFIG_MEMORY_FAILURE |
1098 | void __attribute__((weak)) memory_failure(unsigned long pfn, int vector) | 1150 | int memory_failure(unsigned long pfn, int vector, int flags) |
1099 | { | 1151 | { |
1100 | printk(KERN_ERR "Action optional memory failure at %lx ignored\n", pfn); | 1152 | /* mce_severity() should not hand us an ACTION_REQUIRED error */ |
1153 | BUG_ON(flags & MF_ACTION_REQUIRED); | ||
1154 | printk(KERN_ERR "Uncorrected memory error in page 0x%lx ignored\n" | ||
1155 | "Rebuild kernel with CONFIG_MEMORY_FAILURE=y for smarter handling\n", pfn); | ||
1156 | |||
1157 | return 0; | ||
1101 | } | 1158 | } |
1159 | #endif | ||
1102 | 1160 | ||
1103 | /* | 1161 | /* |
1104 | * Called after mce notification in process context. This code | 1162 | * Called in process context that interrupted by MCE and marked with |
1105 | * is allowed to sleep. Call the high level VM handler to process | 1163 | * TIF_MCE_NOTIFY, just before returning to erroneous userland. |
1106 | * any corrupted pages. | 1164 | * This code is allowed to sleep. |
1107 | * Assume that the work queue code only calls this one at a time | 1165 | * Attempt possible recovery such as calling the high level VM handler to |
1108 | * per CPU. | 1166 | * process any corrupted pages, and kill/signal current process if required. |
1109 | * Note we don't disable preemption, so this code might run on the wrong | 1167 | * Action required errors are handled here. |
1110 | * CPU. In this case the event is picked up by the scheduled work queue. | ||
1111 | * This is merely a fast path to expedite processing in some common | ||
1112 | * cases. | ||
1113 | */ | 1168 | */ |
1114 | void mce_notify_process(void) | 1169 | void mce_notify_process(void) |
1115 | { | 1170 | { |
1116 | unsigned long pfn; | 1171 | unsigned long pfn; |
1117 | mce_notify_irq(); | 1172 | struct mce_info *mi = mce_find_info(); |
1118 | while (mce_ring_get(&pfn)) | 1173 | |
1119 | memory_failure(pfn, MCE_VECTOR); | 1174 | if (!mi) |
1175 | mce_panic("Lost physical address for unconsumed uncorrectable error", NULL, NULL); | ||
1176 | pfn = mi->paddr >> PAGE_SHIFT; | ||
1177 | |||
1178 | clear_thread_flag(TIF_MCE_NOTIFY); | ||
1179 | |||
1180 | pr_err("Uncorrected hardware memory error in user-access at %llx", | ||
1181 | mi->paddr); | ||
1182 | if (memory_failure(pfn, MCE_VECTOR, MF_ACTION_REQUIRED) < 0) { | ||
1183 | pr_err("Memory error not recovered"); | ||
1184 | force_sig(SIGBUS, current); | ||
1185 | } | ||
1186 | mce_clear_info(mi); | ||
1120 | } | 1187 | } |
1121 | 1188 | ||
1189 | /* | ||
1190 | * Action optional processing happens here (picking up | ||
1191 | * from the list of faulting pages that do_machine_check() | ||
1192 | * placed into the "ring"). | ||
1193 | */ | ||
1122 | static void mce_process_work(struct work_struct *dummy) | 1194 | static void mce_process_work(struct work_struct *dummy) |
1123 | { | 1195 | { |
1124 | mce_notify_process(); | 1196 | unsigned long pfn; |
1197 | |||
1198 | while (mce_ring_get(&pfn)) | ||
1199 | memory_failure(pfn, MCE_VECTOR, 0); | ||
1125 | } | 1200 | } |
1126 | 1201 | ||
1127 | #ifdef CONFIG_X86_MCE_INTEL | 1202 | #ifdef CONFIG_X86_MCE_INTEL |
@@ -1211,8 +1286,6 @@ int mce_notify_irq(void) | |||
1211 | /* Not more than two messages every minute */ | 1286 | /* Not more than two messages every minute */ |
1212 | static DEFINE_RATELIMIT_STATE(ratelimit, 60*HZ, 2); | 1287 | static DEFINE_RATELIMIT_STATE(ratelimit, 60*HZ, 2); |
1213 | 1288 | ||
1214 | clear_thread_flag(TIF_MCE_NOTIFY); | ||
1215 | |||
1216 | if (test_and_clear_bit(0, &mce_need_notify)) { | 1289 | if (test_and_clear_bit(0, &mce_need_notify)) { |
1217 | /* wake processes polling /dev/mcelog */ | 1290 | /* wake processes polling /dev/mcelog */ |
1218 | wake_up_interruptible(&mce_chrdev_wait); | 1291 | wake_up_interruptible(&mce_chrdev_wait); |
@@ -1541,6 +1614,12 @@ static int __mce_read_apei(char __user **ubuf, size_t usize) | |||
1541 | /* Error or no more MCE record */ | 1614 | /* Error or no more MCE record */ |
1542 | if (rc <= 0) { | 1615 | if (rc <= 0) { |
1543 | mce_apei_read_done = 1; | 1616 | mce_apei_read_done = 1; |
1617 | /* | ||
1618 | * When ERST is disabled, mce_chrdev_read() should return | ||
1619 | * "no record" instead of "no device." | ||
1620 | */ | ||
1621 | if (rc == -ENODEV) | ||
1622 | return 0; | ||
1544 | return rc; | 1623 | return rc; |
1545 | } | 1624 | } |
1546 | rc = -EFAULT; | 1625 | rc = -EFAULT; |
@@ -1859,7 +1938,7 @@ static struct bus_type mce_subsys = { | |||
1859 | .dev_name = "machinecheck", | 1938 | .dev_name = "machinecheck", |
1860 | }; | 1939 | }; |
1861 | 1940 | ||
1862 | struct device *mce_device[CONFIG_NR_CPUS]; | 1941 | DEFINE_PER_CPU(struct device *, mce_device); |
1863 | 1942 | ||
1864 | __cpuinitdata | 1943 | __cpuinitdata |
1865 | void (*threshold_cpu_callback)(unsigned long action, unsigned int cpu); | 1944 | void (*threshold_cpu_callback)(unsigned long action, unsigned int cpu); |
@@ -2038,7 +2117,7 @@ static __cpuinit int mce_device_create(unsigned int cpu) | |||
2038 | goto error2; | 2117 | goto error2; |
2039 | } | 2118 | } |
2040 | cpumask_set_cpu(cpu, mce_device_initialized); | 2119 | cpumask_set_cpu(cpu, mce_device_initialized); |
2041 | mce_device[cpu] = dev; | 2120 | per_cpu(mce_device, cpu) = dev; |
2042 | 2121 | ||
2043 | return 0; | 2122 | return 0; |
2044 | error2: | 2123 | error2: |
@@ -2055,7 +2134,7 @@ error: | |||
2055 | 2134 | ||
2056 | static __cpuinit void mce_device_remove(unsigned int cpu) | 2135 | static __cpuinit void mce_device_remove(unsigned int cpu) |
2057 | { | 2136 | { |
2058 | struct device *dev = mce_device[cpu]; | 2137 | struct device *dev = per_cpu(mce_device, cpu); |
2059 | int i; | 2138 | int i; |
2060 | 2139 | ||
2061 | if (!cpumask_test_cpu(cpu, mce_device_initialized)) | 2140 | if (!cpumask_test_cpu(cpu, mce_device_initialized)) |
@@ -2069,7 +2148,7 @@ static __cpuinit void mce_device_remove(unsigned int cpu) | |||
2069 | 2148 | ||
2070 | device_unregister(dev); | 2149 | device_unregister(dev); |
2071 | cpumask_clear_cpu(cpu, mce_device_initialized); | 2150 | cpumask_clear_cpu(cpu, mce_device_initialized); |
2072 | mce_device[cpu] = NULL; | 2151 | per_cpu(mce_device, cpu) = NULL; |
2073 | } | 2152 | } |
2074 | 2153 | ||
2075 | /* Make sure there are no machine checks on offlined CPUs. */ | 2154 | /* Make sure there are no machine checks on offlined CPUs. */ |
diff --git a/arch/x86/kernel/cpu/mcheck/mce_amd.c b/arch/x86/kernel/cpu/mcheck/mce_amd.c index e4eeaaf58a47..99b57179f912 100644 --- a/arch/x86/kernel/cpu/mcheck/mce_amd.c +++ b/arch/x86/kernel/cpu/mcheck/mce_amd.c | |||
@@ -523,7 +523,7 @@ static __cpuinit int threshold_create_bank(unsigned int cpu, unsigned int bank) | |||
523 | { | 523 | { |
524 | int i, err = 0; | 524 | int i, err = 0; |
525 | struct threshold_bank *b = NULL; | 525 | struct threshold_bank *b = NULL; |
526 | struct device *dev = mce_device[cpu]; | 526 | struct device *dev = per_cpu(mce_device, cpu); |
527 | char name[32]; | 527 | char name[32]; |
528 | 528 | ||
529 | sprintf(name, "threshold_bank%i", bank); | 529 | sprintf(name, "threshold_bank%i", bank); |
@@ -587,7 +587,7 @@ static __cpuinit int threshold_create_bank(unsigned int cpu, unsigned int bank) | |||
587 | if (i == cpu) | 587 | if (i == cpu) |
588 | continue; | 588 | continue; |
589 | 589 | ||
590 | dev = mce_device[i]; | 590 | dev = per_cpu(mce_device, i); |
591 | if (dev) | 591 | if (dev) |
592 | err = sysfs_create_link(&dev->kobj,b->kobj, name); | 592 | err = sysfs_create_link(&dev->kobj,b->kobj, name); |
593 | if (err) | 593 | if (err) |
@@ -667,7 +667,8 @@ static void threshold_remove_bank(unsigned int cpu, int bank) | |||
667 | #ifdef CONFIG_SMP | 667 | #ifdef CONFIG_SMP |
668 | /* sibling symlink */ | 668 | /* sibling symlink */ |
669 | if (shared_bank[bank] && b->blocks->cpu != cpu) { | 669 | if (shared_bank[bank] && b->blocks->cpu != cpu) { |
670 | sysfs_remove_link(&mce_device[cpu]->kobj, name); | 670 | dev = per_cpu(mce_device, cpu); |
671 | sysfs_remove_link(&dev->kobj, name); | ||
671 | per_cpu(threshold_banks, cpu)[bank] = NULL; | 672 | per_cpu(threshold_banks, cpu)[bank] = NULL; |
672 | 673 | ||
673 | return; | 674 | return; |
@@ -679,7 +680,7 @@ static void threshold_remove_bank(unsigned int cpu, int bank) | |||
679 | if (i == cpu) | 680 | if (i == cpu) |
680 | continue; | 681 | continue; |
681 | 682 | ||
682 | dev = mce_device[i]; | 683 | dev = per_cpu(mce_device, i); |
683 | if (dev) | 684 | if (dev) |
684 | sysfs_remove_link(&dev->kobj, name); | 685 | sysfs_remove_link(&dev->kobj, name); |
685 | per_cpu(threshold_banks, i)[bank] = NULL; | 686 | per_cpu(threshold_banks, i)[bank] = NULL; |
diff --git a/arch/x86/kernel/cpu/perf_event.c b/arch/x86/kernel/cpu/perf_event.c index 4ef8104958ee..f02672a6617e 100644 --- a/arch/x86/kernel/cpu/perf_event.c +++ b/arch/x86/kernel/cpu/perf_event.c | |||
@@ -643,14 +643,14 @@ static bool __perf_sched_find_counter(struct perf_sched *sched) | |||
643 | /* Prefer fixed purpose counters */ | 643 | /* Prefer fixed purpose counters */ |
644 | if (x86_pmu.num_counters_fixed) { | 644 | if (x86_pmu.num_counters_fixed) { |
645 | idx = X86_PMC_IDX_FIXED; | 645 | idx = X86_PMC_IDX_FIXED; |
646 | for_each_set_bit_cont(idx, c->idxmsk, X86_PMC_IDX_MAX) { | 646 | for_each_set_bit_from(idx, c->idxmsk, X86_PMC_IDX_MAX) { |
647 | if (!__test_and_set_bit(idx, sched->state.used)) | 647 | if (!__test_and_set_bit(idx, sched->state.used)) |
648 | goto done; | 648 | goto done; |
649 | } | 649 | } |
650 | } | 650 | } |
651 | /* Grab the first unused counter starting with idx */ | 651 | /* Grab the first unused counter starting with idx */ |
652 | idx = sched->state.counter; | 652 | idx = sched->state.counter; |
653 | for_each_set_bit_cont(idx, c->idxmsk, X86_PMC_IDX_FIXED) { | 653 | for_each_set_bit_from(idx, c->idxmsk, X86_PMC_IDX_FIXED) { |
654 | if (!__test_and_set_bit(idx, sched->state.used)) | 654 | if (!__test_and_set_bit(idx, sched->state.used)) |
655 | goto done; | 655 | goto done; |
656 | } | 656 | } |
diff --git a/arch/x86/kernel/cpu/scattered.c b/arch/x86/kernel/cpu/scattered.c index c7f64e6f537a..addf9e82a7f2 100644 --- a/arch/x86/kernel/cpu/scattered.c +++ b/arch/x86/kernel/cpu/scattered.c | |||
@@ -40,6 +40,7 @@ void __cpuinit init_scattered_cpuid_features(struct cpuinfo_x86 *c) | |||
40 | { X86_FEATURE_EPB, CR_ECX, 3, 0x00000006, 0 }, | 40 | { X86_FEATURE_EPB, CR_ECX, 3, 0x00000006, 0 }, |
41 | { X86_FEATURE_XSAVEOPT, CR_EAX, 0, 0x0000000d, 1 }, | 41 | { X86_FEATURE_XSAVEOPT, CR_EAX, 0, 0x0000000d, 1 }, |
42 | { X86_FEATURE_CPB, CR_EDX, 9, 0x80000007, 0 }, | 42 | { X86_FEATURE_CPB, CR_EDX, 9, 0x80000007, 0 }, |
43 | { X86_FEATURE_HW_PSTATE, CR_EDX, 7, 0x80000007, 0 }, | ||
43 | { X86_FEATURE_NPT, CR_EDX, 0, 0x8000000a, 0 }, | 44 | { X86_FEATURE_NPT, CR_EDX, 0, 0x8000000a, 0 }, |
44 | { X86_FEATURE_LBRV, CR_EDX, 1, 0x8000000a, 0 }, | 45 | { X86_FEATURE_LBRV, CR_EDX, 1, 0x8000000a, 0 }, |
45 | { X86_FEATURE_SVML, CR_EDX, 2, 0x8000000a, 0 }, | 46 | { X86_FEATURE_SVML, CR_EDX, 2, 0x8000000a, 0 }, |
diff --git a/arch/x86/kernel/crash_dump_32.c b/arch/x86/kernel/crash_dump_32.c index 642f75a68cd5..11891ca7b716 100644 --- a/arch/x86/kernel/crash_dump_32.c +++ b/arch/x86/kernel/crash_dump_32.c | |||
@@ -62,16 +62,16 @@ ssize_t copy_oldmem_page(unsigned long pfn, char *buf, | |||
62 | 62 | ||
63 | if (!userbuf) { | 63 | if (!userbuf) { |
64 | memcpy(buf, (vaddr + offset), csize); | 64 | memcpy(buf, (vaddr + offset), csize); |
65 | kunmap_atomic(vaddr, KM_PTE0); | 65 | kunmap_atomic(vaddr); |
66 | } else { | 66 | } else { |
67 | if (!kdump_buf_page) { | 67 | if (!kdump_buf_page) { |
68 | printk(KERN_WARNING "Kdump: Kdump buffer page not" | 68 | printk(KERN_WARNING "Kdump: Kdump buffer page not" |
69 | " allocated\n"); | 69 | " allocated\n"); |
70 | kunmap_atomic(vaddr, KM_PTE0); | 70 | kunmap_atomic(vaddr); |
71 | return -EFAULT; | 71 | return -EFAULT; |
72 | } | 72 | } |
73 | copy_page(kdump_buf_page, vaddr); | 73 | copy_page(kdump_buf_page, vaddr); |
74 | kunmap_atomic(vaddr, KM_PTE0); | 74 | kunmap_atomic(vaddr); |
75 | if (copy_to_user(buf, (kdump_buf_page + offset), csize)) | 75 | if (copy_to_user(buf, (kdump_buf_page + offset), csize)) |
76 | return -EFAULT; | 76 | return -EFAULT; |
77 | } | 77 | } |
diff --git a/arch/x86/kernel/devicetree.c b/arch/x86/kernel/devicetree.c index 52821799a702..3ae2ced4a874 100644 --- a/arch/x86/kernel/devicetree.c +++ b/arch/x86/kernel/devicetree.c | |||
@@ -4,6 +4,7 @@ | |||
4 | #include <linux/bootmem.h> | 4 | #include <linux/bootmem.h> |
5 | #include <linux/export.h> | 5 | #include <linux/export.h> |
6 | #include <linux/io.h> | 6 | #include <linux/io.h> |
7 | #include <linux/irqdomain.h> | ||
7 | #include <linux/interrupt.h> | 8 | #include <linux/interrupt.h> |
8 | #include <linux/list.h> | 9 | #include <linux/list.h> |
9 | #include <linux/of.h> | 10 | #include <linux/of.h> |
@@ -17,64 +18,14 @@ | |||
17 | #include <linux/initrd.h> | 18 | #include <linux/initrd.h> |
18 | 19 | ||
19 | #include <asm/hpet.h> | 20 | #include <asm/hpet.h> |
20 | #include <asm/irq_controller.h> | ||
21 | #include <asm/apic.h> | 21 | #include <asm/apic.h> |
22 | #include <asm/pci_x86.h> | 22 | #include <asm/pci_x86.h> |
23 | 23 | ||
24 | __initdata u64 initial_dtb; | 24 | __initdata u64 initial_dtb; |
25 | char __initdata cmd_line[COMMAND_LINE_SIZE]; | 25 | char __initdata cmd_line[COMMAND_LINE_SIZE]; |
26 | static LIST_HEAD(irq_domains); | ||
27 | static DEFINE_RAW_SPINLOCK(big_irq_lock); | ||
28 | 26 | ||
29 | int __initdata of_ioapic; | 27 | int __initdata of_ioapic; |
30 | 28 | ||
31 | #ifdef CONFIG_X86_IO_APIC | ||
32 | static void add_interrupt_host(struct irq_domain *ih) | ||
33 | { | ||
34 | unsigned long flags; | ||
35 | |||
36 | raw_spin_lock_irqsave(&big_irq_lock, flags); | ||
37 | list_add(&ih->l, &irq_domains); | ||
38 | raw_spin_unlock_irqrestore(&big_irq_lock, flags); | ||
39 | } | ||
40 | #endif | ||
41 | |||
42 | static struct irq_domain *get_ih_from_node(struct device_node *controller) | ||
43 | { | ||
44 | struct irq_domain *ih, *found = NULL; | ||
45 | unsigned long flags; | ||
46 | |||
47 | raw_spin_lock_irqsave(&big_irq_lock, flags); | ||
48 | list_for_each_entry(ih, &irq_domains, l) { | ||
49 | if (ih->controller == controller) { | ||
50 | found = ih; | ||
51 | break; | ||
52 | } | ||
53 | } | ||
54 | raw_spin_unlock_irqrestore(&big_irq_lock, flags); | ||
55 | return found; | ||
56 | } | ||
57 | |||
58 | unsigned int irq_create_of_mapping(struct device_node *controller, | ||
59 | const u32 *intspec, unsigned int intsize) | ||
60 | { | ||
61 | struct irq_domain *ih; | ||
62 | u32 virq, type; | ||
63 | int ret; | ||
64 | |||
65 | ih = get_ih_from_node(controller); | ||
66 | if (!ih) | ||
67 | return 0; | ||
68 | ret = ih->xlate(ih, intspec, intsize, &virq, &type); | ||
69 | if (ret) | ||
70 | return 0; | ||
71 | if (type == IRQ_TYPE_NONE) | ||
72 | return virq; | ||
73 | irq_set_irq_type(virq, type); | ||
74 | return virq; | ||
75 | } | ||
76 | EXPORT_SYMBOL_GPL(irq_create_of_mapping); | ||
77 | |||
78 | unsigned long pci_address_to_pio(phys_addr_t address) | 29 | unsigned long pci_address_to_pio(phys_addr_t address) |
79 | { | 30 | { |
80 | /* | 31 | /* |
@@ -354,36 +305,43 @@ static struct of_ioapic_type of_ioapic_type[] = | |||
354 | }, | 305 | }, |
355 | }; | 306 | }; |
356 | 307 | ||
357 | static int ioapic_xlate(struct irq_domain *id, const u32 *intspec, u32 intsize, | 308 | static int ioapic_xlate(struct irq_domain *domain, |
358 | u32 *out_hwirq, u32 *out_type) | 309 | struct device_node *controller, |
310 | const u32 *intspec, u32 intsize, | ||
311 | irq_hw_number_t *out_hwirq, u32 *out_type) | ||
359 | { | 312 | { |
360 | struct mp_ioapic_gsi *gsi_cfg; | ||
361 | struct io_apic_irq_attr attr; | 313 | struct io_apic_irq_attr attr; |
362 | struct of_ioapic_type *it; | 314 | struct of_ioapic_type *it; |
363 | u32 line, idx, type; | 315 | u32 line, idx; |
316 | int rc; | ||
364 | 317 | ||
365 | if (intsize < 2) | 318 | if (WARN_ON(intsize < 2)) |
366 | return -EINVAL; | 319 | return -EINVAL; |
367 | 320 | ||
368 | line = *intspec; | 321 | line = intspec[0]; |
369 | idx = (u32) id->priv; | ||
370 | gsi_cfg = mp_ioapic_gsi_routing(idx); | ||
371 | *out_hwirq = line + gsi_cfg->gsi_base; | ||
372 | |||
373 | intspec++; | ||
374 | type = *intspec; | ||
375 | 322 | ||
376 | if (type >= ARRAY_SIZE(of_ioapic_type)) | 323 | if (intspec[1] >= ARRAY_SIZE(of_ioapic_type)) |
377 | return -EINVAL; | 324 | return -EINVAL; |
378 | 325 | ||
379 | it = of_ioapic_type + type; | 326 | it = &of_ioapic_type[intspec[1]]; |
380 | *out_type = it->out_type; | ||
381 | 327 | ||
328 | idx = (u32) domain->host_data; | ||
382 | set_io_apic_irq_attr(&attr, idx, line, it->trigger, it->polarity); | 329 | set_io_apic_irq_attr(&attr, idx, line, it->trigger, it->polarity); |
383 | 330 | ||
384 | return io_apic_setup_irq_pin_once(*out_hwirq, cpu_to_node(0), &attr); | 331 | rc = io_apic_setup_irq_pin_once(irq_find_mapping(domain, line), |
332 | cpu_to_node(0), &attr); | ||
333 | if (rc) | ||
334 | return rc; | ||
335 | |||
336 | *out_hwirq = line; | ||
337 | *out_type = it->out_type; | ||
338 | return 0; | ||
385 | } | 339 | } |
386 | 340 | ||
341 | const struct irq_domain_ops ioapic_irq_domain_ops = { | ||
342 | .xlate = ioapic_xlate, | ||
343 | }; | ||
344 | |||
387 | static void __init ioapic_add_ofnode(struct device_node *np) | 345 | static void __init ioapic_add_ofnode(struct device_node *np) |
388 | { | 346 | { |
389 | struct resource r; | 347 | struct resource r; |
@@ -399,13 +357,14 @@ static void __init ioapic_add_ofnode(struct device_node *np) | |||
399 | for (i = 0; i < nr_ioapics; i++) { | 357 | for (i = 0; i < nr_ioapics; i++) { |
400 | if (r.start == mpc_ioapic_addr(i)) { | 358 | if (r.start == mpc_ioapic_addr(i)) { |
401 | struct irq_domain *id; | 359 | struct irq_domain *id; |
360 | struct mp_ioapic_gsi *gsi_cfg; | ||
361 | |||
362 | gsi_cfg = mp_ioapic_gsi_routing(i); | ||
402 | 363 | ||
403 | id = kzalloc(sizeof(*id), GFP_KERNEL); | 364 | id = irq_domain_add_legacy(np, 32, gsi_cfg->gsi_base, 0, |
365 | &ioapic_irq_domain_ops, | ||
366 | (void*)i); | ||
404 | BUG_ON(!id); | 367 | BUG_ON(!id); |
405 | id->controller = np; | ||
406 | id->xlate = ioapic_xlate; | ||
407 | id->priv = (void *)i; | ||
408 | add_interrupt_host(id); | ||
409 | return; | 368 | return; |
410 | } | 369 | } |
411 | } | 370 | } |
diff --git a/arch/x86/kernel/dumpstack_32.c b/arch/x86/kernel/dumpstack_32.c index c99f9ed013d5..88ec9129271d 100644 --- a/arch/x86/kernel/dumpstack_32.c +++ b/arch/x86/kernel/dumpstack_32.c | |||
@@ -87,7 +87,7 @@ void show_registers(struct pt_regs *regs) | |||
87 | int i; | 87 | int i; |
88 | 88 | ||
89 | print_modules(); | 89 | print_modules(); |
90 | __show_regs(regs, 0); | 90 | __show_regs(regs, !user_mode_vm(regs)); |
91 | 91 | ||
92 | printk(KERN_EMERG "Process %.*s (pid: %d, ti=%p task=%p task.ti=%p)\n", | 92 | printk(KERN_EMERG "Process %.*s (pid: %d, ti=%p task=%p task.ti=%p)\n", |
93 | TASK_COMM_LEN, current->comm, task_pid_nr(current), | 93 | TASK_COMM_LEN, current->comm, task_pid_nr(current), |
diff --git a/arch/x86/kernel/entry_32.S b/arch/x86/kernel/entry_32.S index 79d97e68f042..7b784f4ef1e4 100644 --- a/arch/x86/kernel/entry_32.S +++ b/arch/x86/kernel/entry_32.S | |||
@@ -98,12 +98,6 @@ | |||
98 | #endif | 98 | #endif |
99 | .endm | 99 | .endm |
100 | 100 | ||
101 | #ifdef CONFIG_VM86 | ||
102 | #define resume_userspace_sig check_userspace | ||
103 | #else | ||
104 | #define resume_userspace_sig resume_userspace | ||
105 | #endif | ||
106 | |||
107 | /* | 101 | /* |
108 | * User gs save/restore | 102 | * User gs save/restore |
109 | * | 103 | * |
@@ -327,10 +321,19 @@ ret_from_exception: | |||
327 | preempt_stop(CLBR_ANY) | 321 | preempt_stop(CLBR_ANY) |
328 | ret_from_intr: | 322 | ret_from_intr: |
329 | GET_THREAD_INFO(%ebp) | 323 | GET_THREAD_INFO(%ebp) |
330 | check_userspace: | 324 | resume_userspace_sig: |
325 | #ifdef CONFIG_VM86 | ||
331 | movl PT_EFLAGS(%esp), %eax # mix EFLAGS and CS | 326 | movl PT_EFLAGS(%esp), %eax # mix EFLAGS and CS |
332 | movb PT_CS(%esp), %al | 327 | movb PT_CS(%esp), %al |
333 | andl $(X86_EFLAGS_VM | SEGMENT_RPL_MASK), %eax | 328 | andl $(X86_EFLAGS_VM | SEGMENT_RPL_MASK), %eax |
329 | #else | ||
330 | /* | ||
331 | * We can be coming here from a syscall done in the kernel space, | ||
332 | * e.g. a failed kernel_execve(). | ||
333 | */ | ||
334 | movl PT_CS(%esp), %eax | ||
335 | andl $SEGMENT_RPL_MASK, %eax | ||
336 | #endif | ||
334 | cmpl $USER_RPL, %eax | 337 | cmpl $USER_RPL, %eax |
335 | jb resume_kernel # not returning to v8086 or userspace | 338 | jb resume_kernel # not returning to v8086 or userspace |
336 | 339 | ||
diff --git a/arch/x86/kernel/entry_64.S b/arch/x86/kernel/entry_64.S index 1333d9851778..734ebd1d3caa 100644 --- a/arch/x86/kernel/entry_64.S +++ b/arch/x86/kernel/entry_64.S | |||
@@ -320,7 +320,7 @@ ENDPROC(native_usergs_sysret64) | |||
320 | movq %rsp, %rsi | 320 | movq %rsp, %rsi |
321 | 321 | ||
322 | leaq -RBP(%rsp),%rdi /* arg1 for handler */ | 322 | leaq -RBP(%rsp),%rdi /* arg1 for handler */ |
323 | testl $3, CS(%rdi) | 323 | testl $3, CS-RBP(%rsi) |
324 | je 1f | 324 | je 1f |
325 | SWAPGS | 325 | SWAPGS |
326 | /* | 326 | /* |
@@ -330,11 +330,10 @@ ENDPROC(native_usergs_sysret64) | |||
330 | * moving irq_enter into assembly, which would be too much work) | 330 | * moving irq_enter into assembly, which would be too much work) |
331 | */ | 331 | */ |
332 | 1: incl PER_CPU_VAR(irq_count) | 332 | 1: incl PER_CPU_VAR(irq_count) |
333 | jne 2f | 333 | cmovzq PER_CPU_VAR(irq_stack_ptr),%rsp |
334 | mov PER_CPU_VAR(irq_stack_ptr),%rsp | ||
335 | CFI_DEF_CFA_REGISTER rsi | 334 | CFI_DEF_CFA_REGISTER rsi |
336 | 335 | ||
337 | 2: /* Store previous stack value */ | 336 | /* Store previous stack value */ |
338 | pushq %rsi | 337 | pushq %rsi |
339 | CFI_ESCAPE 0x0f /* DW_CFA_def_cfa_expression */, 6, \ | 338 | CFI_ESCAPE 0x0f /* DW_CFA_def_cfa_expression */, 6, \ |
340 | 0x77 /* DW_OP_breg7 */, 0, \ | 339 | 0x77 /* DW_OP_breg7 */, 0, \ |
@@ -813,7 +812,7 @@ ret_from_intr: | |||
813 | 812 | ||
814 | /* Restore saved previous stack */ | 813 | /* Restore saved previous stack */ |
815 | popq %rsi | 814 | popq %rsi |
816 | CFI_DEF_CFA_REGISTER rsi | 815 | CFI_DEF_CFA rsi,SS+8-RBP /* reg/off reset after def_cfa_expr */ |
817 | leaq ARGOFFSET-RBP(%rsi), %rsp | 816 | leaq ARGOFFSET-RBP(%rsi), %rsp |
818 | CFI_DEF_CFA_REGISTER rsp | 817 | CFI_DEF_CFA_REGISTER rsp |
819 | CFI_ADJUST_CFA_OFFSET RBP-ARGOFFSET | 818 | CFI_ADJUST_CFA_OFFSET RBP-ARGOFFSET |
@@ -1530,6 +1529,7 @@ ENTRY(nmi) | |||
1530 | 1529 | ||
1531 | /* Use %rdx as out temp variable throughout */ | 1530 | /* Use %rdx as out temp variable throughout */ |
1532 | pushq_cfi %rdx | 1531 | pushq_cfi %rdx |
1532 | CFI_REL_OFFSET rdx, 0 | ||
1533 | 1533 | ||
1534 | /* | 1534 | /* |
1535 | * If %cs was not the kernel segment, then the NMI triggered in user | 1535 | * If %cs was not the kernel segment, then the NMI triggered in user |
@@ -1554,6 +1554,7 @@ ENTRY(nmi) | |||
1554 | */ | 1554 | */ |
1555 | lea 6*8(%rsp), %rdx | 1555 | lea 6*8(%rsp), %rdx |
1556 | test_in_nmi rdx, 4*8(%rsp), nested_nmi, first_nmi | 1556 | test_in_nmi rdx, 4*8(%rsp), nested_nmi, first_nmi |
1557 | CFI_REMEMBER_STATE | ||
1557 | 1558 | ||
1558 | nested_nmi: | 1559 | nested_nmi: |
1559 | /* | 1560 | /* |
@@ -1585,10 +1586,12 @@ nested_nmi: | |||
1585 | 1586 | ||
1586 | nested_nmi_out: | 1587 | nested_nmi_out: |
1587 | popq_cfi %rdx | 1588 | popq_cfi %rdx |
1589 | CFI_RESTORE rdx | ||
1588 | 1590 | ||
1589 | /* No need to check faults here */ | 1591 | /* No need to check faults here */ |
1590 | INTERRUPT_RETURN | 1592 | INTERRUPT_RETURN |
1591 | 1593 | ||
1594 | CFI_RESTORE_STATE | ||
1592 | first_nmi: | 1595 | first_nmi: |
1593 | /* | 1596 | /* |
1594 | * Because nested NMIs will use the pushed location that we | 1597 | * Because nested NMIs will use the pushed location that we |
@@ -1620,10 +1623,15 @@ first_nmi: | |||
1620 | * | pt_regs | | 1623 | * | pt_regs | |
1621 | * +-------------------------+ | 1624 | * +-------------------------+ |
1622 | * | 1625 | * |
1623 | * The saved RIP is used to fix up the copied RIP that a nested | 1626 | * The saved stack frame is used to fix up the copied stack frame |
1624 | * NMI may zero out. The original stack frame and the temp storage | 1627 | * that a nested NMI may change to make the interrupted NMI iret jump |
1628 | * to the repeat_nmi. The original stack frame and the temp storage | ||
1625 | * is also used by nested NMIs and can not be trusted on exit. | 1629 | * is also used by nested NMIs and can not be trusted on exit. |
1626 | */ | 1630 | */ |
1631 | /* Do not pop rdx, nested NMIs will corrupt that part of the stack */ | ||
1632 | movq (%rsp), %rdx | ||
1633 | CFI_RESTORE rdx | ||
1634 | |||
1627 | /* Set the NMI executing variable on the stack. */ | 1635 | /* Set the NMI executing variable on the stack. */ |
1628 | pushq_cfi $1 | 1636 | pushq_cfi $1 |
1629 | 1637 | ||
@@ -1631,22 +1639,39 @@ first_nmi: | |||
1631 | .rept 5 | 1639 | .rept 5 |
1632 | pushq_cfi 6*8(%rsp) | 1640 | pushq_cfi 6*8(%rsp) |
1633 | .endr | 1641 | .endr |
1642 | CFI_DEF_CFA_OFFSET SS+8-RIP | ||
1643 | |||
1644 | /* Everything up to here is safe from nested NMIs */ | ||
1645 | |||
1646 | /* | ||
1647 | * If there was a nested NMI, the first NMI's iret will return | ||
1648 | * here. But NMIs are still enabled and we can take another | ||
1649 | * nested NMI. The nested NMI checks the interrupted RIP to see | ||
1650 | * if it is between repeat_nmi and end_repeat_nmi, and if so | ||
1651 | * it will just return, as we are about to repeat an NMI anyway. | ||
1652 | * This makes it safe to copy to the stack frame that a nested | ||
1653 | * NMI will update. | ||
1654 | */ | ||
1655 | repeat_nmi: | ||
1656 | /* | ||
1657 | * Update the stack variable to say we are still in NMI (the update | ||
1658 | * is benign for the non-repeat case, where 1 was pushed just above | ||
1659 | * to this very stack slot). | ||
1660 | */ | ||
1661 | movq $1, 5*8(%rsp) | ||
1634 | 1662 | ||
1635 | /* Make another copy, this one may be modified by nested NMIs */ | 1663 | /* Make another copy, this one may be modified by nested NMIs */ |
1636 | .rept 5 | 1664 | .rept 5 |
1637 | pushq_cfi 4*8(%rsp) | 1665 | pushq_cfi 4*8(%rsp) |
1638 | .endr | 1666 | .endr |
1639 | 1667 | CFI_DEF_CFA_OFFSET SS+8-RIP | |
1640 | /* Do not pop rdx, nested NMIs will corrupt it */ | 1668 | end_repeat_nmi: |
1641 | movq 11*8(%rsp), %rdx | ||
1642 | 1669 | ||
1643 | /* | 1670 | /* |
1644 | * Everything below this point can be preempted by a nested | 1671 | * Everything below this point can be preempted by a nested |
1645 | * NMI if the first NMI took an exception. Repeated NMIs | 1672 | * NMI if the first NMI took an exception and reset our iret stack |
1646 | * caused by an exception and nested NMI will start here, and | 1673 | * so that we repeat another NMI. |
1647 | * can still be preempted by another NMI. | ||
1648 | */ | 1674 | */ |
1649 | restart_nmi: | ||
1650 | pushq_cfi $-1 /* ORIG_RAX: no syscall to restart */ | 1675 | pushq_cfi $-1 /* ORIG_RAX: no syscall to restart */ |
1651 | subq $ORIG_RAX-R15, %rsp | 1676 | subq $ORIG_RAX-R15, %rsp |
1652 | CFI_ADJUST_CFA_OFFSET ORIG_RAX-R15 | 1677 | CFI_ADJUST_CFA_OFFSET ORIG_RAX-R15 |
@@ -1675,26 +1700,6 @@ nmi_restore: | |||
1675 | CFI_ENDPROC | 1700 | CFI_ENDPROC |
1676 | END(nmi) | 1701 | END(nmi) |
1677 | 1702 | ||
1678 | /* | ||
1679 | * If an NMI hit an iret because of an exception or breakpoint, | ||
1680 | * it can lose its NMI context, and a nested NMI may come in. | ||
1681 | * In that case, the nested NMI will change the preempted NMI's | ||
1682 | * stack to jump to here when it does the final iret. | ||
1683 | */ | ||
1684 | repeat_nmi: | ||
1685 | INTR_FRAME | ||
1686 | /* Update the stack variable to say we are still in NMI */ | ||
1687 | movq $1, 5*8(%rsp) | ||
1688 | |||
1689 | /* copy the saved stack back to copy stack */ | ||
1690 | .rept 5 | ||
1691 | pushq_cfi 4*8(%rsp) | ||
1692 | .endr | ||
1693 | |||
1694 | jmp restart_nmi | ||
1695 | CFI_ENDPROC | ||
1696 | end_repeat_nmi: | ||
1697 | |||
1698 | ENTRY(ignore_sysret) | 1703 | ENTRY(ignore_sysret) |
1699 | CFI_STARTPROC | 1704 | CFI_STARTPROC |
1700 | mov $-ENOSYS,%eax | 1705 | mov $-ENOSYS,%eax |
diff --git a/arch/x86/kernel/i387.c b/arch/x86/kernel/i387.c index 739d8598f789..7734bcbb5a3a 100644 --- a/arch/x86/kernel/i387.c +++ b/arch/x86/kernel/i387.c | |||
@@ -16,6 +16,7 @@ | |||
16 | #include <asm/uaccess.h> | 16 | #include <asm/uaccess.h> |
17 | #include <asm/ptrace.h> | 17 | #include <asm/ptrace.h> |
18 | #include <asm/i387.h> | 18 | #include <asm/i387.h> |
19 | #include <asm/fpu-internal.h> | ||
19 | #include <asm/user.h> | 20 | #include <asm/user.h> |
20 | 21 | ||
21 | #ifdef CONFIG_X86_64 | 22 | #ifdef CONFIG_X86_64 |
@@ -32,6 +33,86 @@ | |||
32 | # define user32_fxsr_struct user_fxsr_struct | 33 | # define user32_fxsr_struct user_fxsr_struct |
33 | #endif | 34 | #endif |
34 | 35 | ||
36 | /* | ||
37 | * Were we in an interrupt that interrupted kernel mode? | ||
38 | * | ||
39 | * We can do a kernel_fpu_begin/end() pair *ONLY* if that | ||
40 | * pair does nothing at all: the thread must not have fpu (so | ||
41 | * that we don't try to save the FPU state), and TS must | ||
42 | * be set (so that the clts/stts pair does nothing that is | ||
43 | * visible in the interrupted kernel thread). | ||
44 | */ | ||
45 | static inline bool interrupted_kernel_fpu_idle(void) | ||
46 | { | ||
47 | return !__thread_has_fpu(current) && | ||
48 | (read_cr0() & X86_CR0_TS); | ||
49 | } | ||
50 | |||
51 | /* | ||
52 | * Were we in user mode (or vm86 mode) when we were | ||
53 | * interrupted? | ||
54 | * | ||
55 | * Doing kernel_fpu_begin/end() is ok if we are running | ||
56 | * in an interrupt context from user mode - we'll just | ||
57 | * save the FPU state as required. | ||
58 | */ | ||
59 | static inline bool interrupted_user_mode(void) | ||
60 | { | ||
61 | struct pt_regs *regs = get_irq_regs(); | ||
62 | return regs && user_mode_vm(regs); | ||
63 | } | ||
64 | |||
65 | /* | ||
66 | * Can we use the FPU in kernel mode with the | ||
67 | * whole "kernel_fpu_begin/end()" sequence? | ||
68 | * | ||
69 | * It's always ok in process context (ie "not interrupt") | ||
70 | * but it is sometimes ok even from an irq. | ||
71 | */ | ||
72 | bool irq_fpu_usable(void) | ||
73 | { | ||
74 | return !in_interrupt() || | ||
75 | interrupted_user_mode() || | ||
76 | interrupted_kernel_fpu_idle(); | ||
77 | } | ||
78 | EXPORT_SYMBOL(irq_fpu_usable); | ||
79 | |||
80 | void kernel_fpu_begin(void) | ||
81 | { | ||
82 | struct task_struct *me = current; | ||
83 | |||
84 | WARN_ON_ONCE(!irq_fpu_usable()); | ||
85 | preempt_disable(); | ||
86 | if (__thread_has_fpu(me)) { | ||
87 | __save_init_fpu(me); | ||
88 | __thread_clear_has_fpu(me); | ||
89 | /* We do 'stts()' in kernel_fpu_end() */ | ||
90 | } else { | ||
91 | percpu_write(fpu_owner_task, NULL); | ||
92 | clts(); | ||
93 | } | ||
94 | } | ||
95 | EXPORT_SYMBOL(kernel_fpu_begin); | ||
96 | |||
97 | void kernel_fpu_end(void) | ||
98 | { | ||
99 | stts(); | ||
100 | preempt_enable(); | ||
101 | } | ||
102 | EXPORT_SYMBOL(kernel_fpu_end); | ||
103 | |||
104 | void unlazy_fpu(struct task_struct *tsk) | ||
105 | { | ||
106 | preempt_disable(); | ||
107 | if (__thread_has_fpu(tsk)) { | ||
108 | __save_init_fpu(tsk); | ||
109 | __thread_fpu_end(tsk); | ||
110 | } else | ||
111 | tsk->fpu_counter = 0; | ||
112 | preempt_enable(); | ||
113 | } | ||
114 | EXPORT_SYMBOL(unlazy_fpu); | ||
115 | |||
35 | #ifdef CONFIG_MATH_EMULATION | 116 | #ifdef CONFIG_MATH_EMULATION |
36 | # define HAVE_HWFP (boot_cpu_data.hard_math) | 117 | # define HAVE_HWFP (boot_cpu_data.hard_math) |
37 | #else | 118 | #else |
@@ -44,7 +125,7 @@ EXPORT_SYMBOL_GPL(xstate_size); | |||
44 | unsigned int sig_xstate_ia32_size = sizeof(struct _fpstate_ia32); | 125 | unsigned int sig_xstate_ia32_size = sizeof(struct _fpstate_ia32); |
45 | static struct i387_fxsave_struct fx_scratch __cpuinitdata; | 126 | static struct i387_fxsave_struct fx_scratch __cpuinitdata; |
46 | 127 | ||
47 | void __cpuinit mxcsr_feature_mask_init(void) | 128 | static void __cpuinit mxcsr_feature_mask_init(void) |
48 | { | 129 | { |
49 | unsigned long mask = 0; | 130 | unsigned long mask = 0; |
50 | 131 | ||
diff --git a/arch/x86/kernel/irqinit.c b/arch/x86/kernel/irqinit.c index 313fb5cddbce..43e2b1cff0a7 100644 --- a/arch/x86/kernel/irqinit.c +++ b/arch/x86/kernel/irqinit.c | |||
@@ -306,10 +306,10 @@ void __init native_init_IRQ(void) | |||
306 | * us. (some of these will be overridden and become | 306 | * us. (some of these will be overridden and become |
307 | * 'special' SMP interrupts) | 307 | * 'special' SMP interrupts) |
308 | */ | 308 | */ |
309 | for (i = FIRST_EXTERNAL_VECTOR; i < NR_VECTORS; i++) { | 309 | i = FIRST_EXTERNAL_VECTOR; |
310 | for_each_clear_bit_from(i, used_vectors, NR_VECTORS) { | ||
310 | /* IA32_SYSCALL_VECTOR could be used in trap_init already. */ | 311 | /* IA32_SYSCALL_VECTOR could be used in trap_init already. */ |
311 | if (!test_bit(i, used_vectors)) | 312 | set_intr_gate(i, interrupt[i - FIRST_EXTERNAL_VECTOR]); |
312 | set_intr_gate(i, interrupt[i-FIRST_EXTERNAL_VECTOR]); | ||
313 | } | 313 | } |
314 | 314 | ||
315 | if (!acpi_ioapic && !of_ioapic) | 315 | if (!acpi_ioapic && !of_ioapic) |
diff --git a/arch/x86/kernel/kgdb.c b/arch/x86/kernel/kgdb.c index faba5771acad..fdc37b3d0ce3 100644 --- a/arch/x86/kernel/kgdb.c +++ b/arch/x86/kernel/kgdb.c | |||
@@ -67,8 +67,6 @@ struct dbg_reg_def_t dbg_reg_def[DBG_MAX_REG_NUM] = | |||
67 | { "ss", 4, offsetof(struct pt_regs, ss) }, | 67 | { "ss", 4, offsetof(struct pt_regs, ss) }, |
68 | { "ds", 4, offsetof(struct pt_regs, ds) }, | 68 | { "ds", 4, offsetof(struct pt_regs, ds) }, |
69 | { "es", 4, offsetof(struct pt_regs, es) }, | 69 | { "es", 4, offsetof(struct pt_regs, es) }, |
70 | { "fs", 4, -1 }, | ||
71 | { "gs", 4, -1 }, | ||
72 | #else | 70 | #else |
73 | { "ax", 8, offsetof(struct pt_regs, ax) }, | 71 | { "ax", 8, offsetof(struct pt_regs, ax) }, |
74 | { "bx", 8, offsetof(struct pt_regs, bx) }, | 72 | { "bx", 8, offsetof(struct pt_regs, bx) }, |
@@ -90,7 +88,11 @@ struct dbg_reg_def_t dbg_reg_def[DBG_MAX_REG_NUM] = | |||
90 | { "flags", 4, offsetof(struct pt_regs, flags) }, | 88 | { "flags", 4, offsetof(struct pt_regs, flags) }, |
91 | { "cs", 4, offsetof(struct pt_regs, cs) }, | 89 | { "cs", 4, offsetof(struct pt_regs, cs) }, |
92 | { "ss", 4, offsetof(struct pt_regs, ss) }, | 90 | { "ss", 4, offsetof(struct pt_regs, ss) }, |
91 | { "ds", 4, -1 }, | ||
92 | { "es", 4, -1 }, | ||
93 | #endif | 93 | #endif |
94 | { "fs", 4, -1 }, | ||
95 | { "gs", 4, -1 }, | ||
94 | }; | 96 | }; |
95 | 97 | ||
96 | int dbg_set_reg(int regno, void *mem, struct pt_regs *regs) | 98 | int dbg_set_reg(int regno, void *mem, struct pt_regs *regs) |
diff --git a/arch/x86/kernel/microcode_core.c b/arch/x86/kernel/microcode_core.c index fda91c307104..87a0f8688301 100644 --- a/arch/x86/kernel/microcode_core.c +++ b/arch/x86/kernel/microcode_core.c | |||
@@ -86,6 +86,7 @@ | |||
86 | 86 | ||
87 | #include <asm/microcode.h> | 87 | #include <asm/microcode.h> |
88 | #include <asm/processor.h> | 88 | #include <asm/processor.h> |
89 | #include <asm/cpu_device_id.h> | ||
89 | 90 | ||
90 | MODULE_DESCRIPTION("Microcode Update Driver"); | 91 | MODULE_DESCRIPTION("Microcode Update Driver"); |
91 | MODULE_AUTHOR("Tigran Aivazian <tigran@aivazian.fsnet.co.uk>"); | 92 | MODULE_AUTHOR("Tigran Aivazian <tigran@aivazian.fsnet.co.uk>"); |
@@ -504,6 +505,20 @@ static struct notifier_block __refdata mc_cpu_notifier = { | |||
504 | .notifier_call = mc_cpu_callback, | 505 | .notifier_call = mc_cpu_callback, |
505 | }; | 506 | }; |
506 | 507 | ||
508 | #ifdef MODULE | ||
509 | /* Autoload on Intel and AMD systems */ | ||
510 | static const struct x86_cpu_id microcode_id[] = { | ||
511 | #ifdef CONFIG_MICROCODE_INTEL | ||
512 | { X86_VENDOR_INTEL, X86_FAMILY_ANY, X86_MODEL_ANY, }, | ||
513 | #endif | ||
514 | #ifdef CONFIG_MICROCODE_AMD | ||
515 | { X86_VENDOR_AMD, X86_FAMILY_ANY, X86_MODEL_ANY, }, | ||
516 | #endif | ||
517 | {} | ||
518 | }; | ||
519 | MODULE_DEVICE_TABLE(x86cpu, microcode_id); | ||
520 | #endif | ||
521 | |||
507 | static int __init microcode_init(void) | 522 | static int __init microcode_init(void) |
508 | { | 523 | { |
509 | struct cpuinfo_x86 *c = &cpu_data(0); | 524 | struct cpuinfo_x86 *c = &cpu_data(0); |
diff --git a/arch/x86/kernel/nmi_selftest.c b/arch/x86/kernel/nmi_selftest.c index 0d01a8ea4e11..2c39dcd510fa 100644 --- a/arch/x86/kernel/nmi_selftest.c +++ b/arch/x86/kernel/nmi_selftest.c | |||
@@ -12,6 +12,7 @@ | |||
12 | #include <linux/smp.h> | 12 | #include <linux/smp.h> |
13 | #include <linux/cpumask.h> | 13 | #include <linux/cpumask.h> |
14 | #include <linux/delay.h> | 14 | #include <linux/delay.h> |
15 | #include <linux/init.h> | ||
15 | 16 | ||
16 | #include <asm/apic.h> | 17 | #include <asm/apic.h> |
17 | #include <asm/nmi.h> | 18 | #include <asm/nmi.h> |
@@ -20,35 +21,35 @@ | |||
20 | #define FAILURE 1 | 21 | #define FAILURE 1 |
21 | #define TIMEOUT 2 | 22 | #define TIMEOUT 2 |
22 | 23 | ||
23 | static int nmi_fail; | 24 | static int __initdata nmi_fail; |
24 | 25 | ||
25 | /* check to see if NMI IPIs work on this machine */ | 26 | /* check to see if NMI IPIs work on this machine */ |
26 | static DECLARE_BITMAP(nmi_ipi_mask, NR_CPUS) __read_mostly; | 27 | static DECLARE_BITMAP(nmi_ipi_mask, NR_CPUS) __initdata; |
27 | 28 | ||
28 | static int testcase_total; | 29 | static int __initdata testcase_total; |
29 | static int testcase_successes; | 30 | static int __initdata testcase_successes; |
30 | static int expected_testcase_failures; | 31 | static int __initdata expected_testcase_failures; |
31 | static int unexpected_testcase_failures; | 32 | static int __initdata unexpected_testcase_failures; |
32 | static int unexpected_testcase_unknowns; | 33 | static int __initdata unexpected_testcase_unknowns; |
33 | 34 | ||
34 | static int nmi_unk_cb(unsigned int val, struct pt_regs *regs) | 35 | static int __init nmi_unk_cb(unsigned int val, struct pt_regs *regs) |
35 | { | 36 | { |
36 | unexpected_testcase_unknowns++; | 37 | unexpected_testcase_unknowns++; |
37 | return NMI_HANDLED; | 38 | return NMI_HANDLED; |
38 | } | 39 | } |
39 | 40 | ||
40 | static void init_nmi_testsuite(void) | 41 | static void __init init_nmi_testsuite(void) |
41 | { | 42 | { |
42 | /* trap all the unknown NMIs we may generate */ | 43 | /* trap all the unknown NMIs we may generate */ |
43 | register_nmi_handler(NMI_UNKNOWN, nmi_unk_cb, 0, "nmi_selftest_unk"); | 44 | register_nmi_handler(NMI_UNKNOWN, nmi_unk_cb, 0, "nmi_selftest_unk"); |
44 | } | 45 | } |
45 | 46 | ||
46 | static void cleanup_nmi_testsuite(void) | 47 | static void __init cleanup_nmi_testsuite(void) |
47 | { | 48 | { |
48 | unregister_nmi_handler(NMI_UNKNOWN, "nmi_selftest_unk"); | 49 | unregister_nmi_handler(NMI_UNKNOWN, "nmi_selftest_unk"); |
49 | } | 50 | } |
50 | 51 | ||
51 | static int test_nmi_ipi_callback(unsigned int val, struct pt_regs *regs) | 52 | static int __init test_nmi_ipi_callback(unsigned int val, struct pt_regs *regs) |
52 | { | 53 | { |
53 | int cpu = raw_smp_processor_id(); | 54 | int cpu = raw_smp_processor_id(); |
54 | 55 | ||
@@ -58,7 +59,7 @@ static int test_nmi_ipi_callback(unsigned int val, struct pt_regs *regs) | |||
58 | return NMI_DONE; | 59 | return NMI_DONE; |
59 | } | 60 | } |
60 | 61 | ||
61 | static void test_nmi_ipi(struct cpumask *mask) | 62 | static void __init test_nmi_ipi(struct cpumask *mask) |
62 | { | 63 | { |
63 | unsigned long timeout; | 64 | unsigned long timeout; |
64 | 65 | ||
@@ -86,7 +87,7 @@ static void test_nmi_ipi(struct cpumask *mask) | |||
86 | return; | 87 | return; |
87 | } | 88 | } |
88 | 89 | ||
89 | static void remote_ipi(void) | 90 | static void __init remote_ipi(void) |
90 | { | 91 | { |
91 | cpumask_copy(to_cpumask(nmi_ipi_mask), cpu_online_mask); | 92 | cpumask_copy(to_cpumask(nmi_ipi_mask), cpu_online_mask); |
92 | cpumask_clear_cpu(smp_processor_id(), to_cpumask(nmi_ipi_mask)); | 93 | cpumask_clear_cpu(smp_processor_id(), to_cpumask(nmi_ipi_mask)); |
@@ -94,19 +95,19 @@ static void remote_ipi(void) | |||
94 | test_nmi_ipi(to_cpumask(nmi_ipi_mask)); | 95 | test_nmi_ipi(to_cpumask(nmi_ipi_mask)); |
95 | } | 96 | } |
96 | 97 | ||
97 | static void local_ipi(void) | 98 | static void __init local_ipi(void) |
98 | { | 99 | { |
99 | cpumask_clear(to_cpumask(nmi_ipi_mask)); | 100 | cpumask_clear(to_cpumask(nmi_ipi_mask)); |
100 | cpumask_set_cpu(smp_processor_id(), to_cpumask(nmi_ipi_mask)); | 101 | cpumask_set_cpu(smp_processor_id(), to_cpumask(nmi_ipi_mask)); |
101 | test_nmi_ipi(to_cpumask(nmi_ipi_mask)); | 102 | test_nmi_ipi(to_cpumask(nmi_ipi_mask)); |
102 | } | 103 | } |
103 | 104 | ||
104 | static void reset_nmi(void) | 105 | static void __init reset_nmi(void) |
105 | { | 106 | { |
106 | nmi_fail = 0; | 107 | nmi_fail = 0; |
107 | } | 108 | } |
108 | 109 | ||
109 | static void dotest(void (*testcase_fn)(void), int expected) | 110 | static void __init dotest(void (*testcase_fn)(void), int expected) |
110 | { | 111 | { |
111 | testcase_fn(); | 112 | testcase_fn(); |
112 | /* | 113 | /* |
@@ -131,12 +132,12 @@ static void dotest(void (*testcase_fn)(void), int expected) | |||
131 | reset_nmi(); | 132 | reset_nmi(); |
132 | } | 133 | } |
133 | 134 | ||
134 | static inline void print_testname(const char *testname) | 135 | static inline void __init print_testname(const char *testname) |
135 | { | 136 | { |
136 | printk("%12s:", testname); | 137 | printk("%12s:", testname); |
137 | } | 138 | } |
138 | 139 | ||
139 | void nmi_selftest(void) | 140 | void __init nmi_selftest(void) |
140 | { | 141 | { |
141 | init_nmi_testsuite(); | 142 | init_nmi_testsuite(); |
142 | 143 | ||
diff --git a/arch/x86/kernel/paravirt.c b/arch/x86/kernel/paravirt.c index ada2f99388dd..9c57c02e54f6 100644 --- a/arch/x86/kernel/paravirt.c +++ b/arch/x86/kernel/paravirt.c | |||
@@ -26,6 +26,7 @@ | |||
26 | 26 | ||
27 | #include <asm/bug.h> | 27 | #include <asm/bug.h> |
28 | #include <asm/paravirt.h> | 28 | #include <asm/paravirt.h> |
29 | #include <asm/debugreg.h> | ||
29 | #include <asm/desc.h> | 30 | #include <asm/desc.h> |
30 | #include <asm/setup.h> | 31 | #include <asm/setup.h> |
31 | #include <asm/pgtable.h> | 32 | #include <asm/pgtable.h> |
diff --git a/arch/x86/kernel/pci-dma.c b/arch/x86/kernel/pci-dma.c index 1c4d769e21ea..28e5e06fcba4 100644 --- a/arch/x86/kernel/pci-dma.c +++ b/arch/x86/kernel/pci-dma.c | |||
@@ -262,10 +262,11 @@ rootfs_initcall(pci_iommu_init); | |||
262 | 262 | ||
263 | static __devinit void via_no_dac(struct pci_dev *dev) | 263 | static __devinit void via_no_dac(struct pci_dev *dev) |
264 | { | 264 | { |
265 | if ((dev->class >> 8) == PCI_CLASS_BRIDGE_PCI && forbid_dac == 0) { | 265 | if (forbid_dac == 0) { |
266 | dev_info(&dev->dev, "disabling DAC on VIA PCI bridge\n"); | 266 | dev_info(&dev->dev, "disabling DAC on VIA PCI bridge\n"); |
267 | forbid_dac = 1; | 267 | forbid_dac = 1; |
268 | } | 268 | } |
269 | } | 269 | } |
270 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_VIA, PCI_ANY_ID, via_no_dac); | 270 | DECLARE_PCI_FIXUP_CLASS_FINAL(PCI_VENDOR_ID_VIA, PCI_ANY_ID, |
271 | PCI_CLASS_BRIDGE_PCI, 8, via_no_dac); | ||
271 | #endif | 272 | #endif |
diff --git a/arch/x86/kernel/probe_roms.c b/arch/x86/kernel/probe_roms.c index 34e06e84ce31..0bc72e2069e3 100644 --- a/arch/x86/kernel/probe_roms.c +++ b/arch/x86/kernel/probe_roms.c | |||
@@ -12,6 +12,7 @@ | |||
12 | #include <linux/pci.h> | 12 | #include <linux/pci.h> |
13 | #include <linux/export.h> | 13 | #include <linux/export.h> |
14 | 14 | ||
15 | #include <asm/probe_roms.h> | ||
15 | #include <asm/pci-direct.h> | 16 | #include <asm/pci-direct.h> |
16 | #include <asm/e820.h> | 17 | #include <asm/e820.h> |
17 | #include <asm/mmzone.h> | 18 | #include <asm/mmzone.h> |
diff --git a/arch/x86/kernel/process.c b/arch/x86/kernel/process.c index 44eefde92109..14baf78d5a1f 100644 --- a/arch/x86/kernel/process.c +++ b/arch/x86/kernel/process.c | |||
@@ -21,6 +21,7 @@ | |||
21 | #include <asm/idle.h> | 21 | #include <asm/idle.h> |
22 | #include <asm/uaccess.h> | 22 | #include <asm/uaccess.h> |
23 | #include <asm/i387.h> | 23 | #include <asm/i387.h> |
24 | #include <asm/fpu-internal.h> | ||
24 | #include <asm/debugreg.h> | 25 | #include <asm/debugreg.h> |
25 | 26 | ||
26 | struct kmem_cache *task_xstate_cachep; | 27 | struct kmem_cache *task_xstate_cachep; |
diff --git a/arch/x86/kernel/process_32.c b/arch/x86/kernel/process_32.c index 49888fefe794..9d7d4842bfaf 100644 --- a/arch/x86/kernel/process_32.c +++ b/arch/x86/kernel/process_32.c | |||
@@ -45,6 +45,7 @@ | |||
45 | #include <asm/ldt.h> | 45 | #include <asm/ldt.h> |
46 | #include <asm/processor.h> | 46 | #include <asm/processor.h> |
47 | #include <asm/i387.h> | 47 | #include <asm/i387.h> |
48 | #include <asm/fpu-internal.h> | ||
48 | #include <asm/desc.h> | 49 | #include <asm/desc.h> |
49 | #ifdef CONFIG_MATH_EMULATION | 50 | #ifdef CONFIG_MATH_EMULATION |
50 | #include <asm/math_emu.h> | 51 | #include <asm/math_emu.h> |
diff --git a/arch/x86/kernel/process_64.c b/arch/x86/kernel/process_64.c index e34257c70c28..292da13fc5aa 100644 --- a/arch/x86/kernel/process_64.c +++ b/arch/x86/kernel/process_64.c | |||
@@ -43,6 +43,7 @@ | |||
43 | #include <asm/system.h> | 43 | #include <asm/system.h> |
44 | #include <asm/processor.h> | 44 | #include <asm/processor.h> |
45 | #include <asm/i387.h> | 45 | #include <asm/i387.h> |
46 | #include <asm/fpu-internal.h> | ||
46 | #include <asm/mmu_context.h> | 47 | #include <asm/mmu_context.h> |
47 | #include <asm/prctl.h> | 48 | #include <asm/prctl.h> |
48 | #include <asm/desc.h> | 49 | #include <asm/desc.h> |
@@ -340,6 +341,7 @@ start_thread_common(struct pt_regs *regs, unsigned long new_ip, | |||
340 | loadsegment(es, _ds); | 341 | loadsegment(es, _ds); |
341 | loadsegment(ds, _ds); | 342 | loadsegment(ds, _ds); |
342 | load_gs_index(0); | 343 | load_gs_index(0); |
344 | current->thread.usersp = new_sp; | ||
343 | regs->ip = new_ip; | 345 | regs->ip = new_ip; |
344 | regs->sp = new_sp; | 346 | regs->sp = new_sp; |
345 | percpu_write(old_rsp, new_sp); | 347 | percpu_write(old_rsp, new_sp); |
diff --git a/arch/x86/kernel/ptrace.c b/arch/x86/kernel/ptrace.c index 50267386b766..78f05e438be5 100644 --- a/arch/x86/kernel/ptrace.c +++ b/arch/x86/kernel/ptrace.c | |||
@@ -27,6 +27,7 @@ | |||
27 | #include <asm/system.h> | 27 | #include <asm/system.h> |
28 | #include <asm/processor.h> | 28 | #include <asm/processor.h> |
29 | #include <asm/i387.h> | 29 | #include <asm/i387.h> |
30 | #include <asm/fpu-internal.h> | ||
30 | #include <asm/debugreg.h> | 31 | #include <asm/debugreg.h> |
31 | #include <asm/ldt.h> | 32 | #include <asm/ldt.h> |
32 | #include <asm/desc.h> | 33 | #include <asm/desc.h> |
diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c index d7d5099fe874..88638883176a 100644 --- a/arch/x86/kernel/setup.c +++ b/arch/x86/kernel/setup.c | |||
@@ -749,10 +749,16 @@ void __init setup_arch(char **cmdline_p) | |||
749 | #endif | 749 | #endif |
750 | #ifdef CONFIG_EFI | 750 | #ifdef CONFIG_EFI |
751 | if (!strncmp((char *)&boot_params.efi_info.efi_loader_signature, | 751 | if (!strncmp((char *)&boot_params.efi_info.efi_loader_signature, |
752 | EFI_LOADER_SIGNATURE, 4)) { | 752 | "EL32", 4)) { |
753 | efi_enabled = 1; | 753 | efi_enabled = 1; |
754 | efi_memblock_x86_reserve_range(); | 754 | efi_64bit = false; |
755 | } else if (!strncmp((char *)&boot_params.efi_info.efi_loader_signature, | ||
756 | "EL64", 4)) { | ||
757 | efi_enabled = 1; | ||
758 | efi_64bit = true; | ||
755 | } | 759 | } |
760 | if (efi_enabled && efi_memblock_x86_reserve_range()) | ||
761 | efi_enabled = 0; | ||
756 | #endif | 762 | #endif |
757 | 763 | ||
758 | x86_init.oem.arch_setup(); | 764 | x86_init.oem.arch_setup(); |
diff --git a/arch/x86/kernel/signal.c b/arch/x86/kernel/signal.c index 46a01bdc27e2..25edcfc9ba5b 100644 --- a/arch/x86/kernel/signal.c +++ b/arch/x86/kernel/signal.c | |||
@@ -24,6 +24,7 @@ | |||
24 | #include <asm/processor.h> | 24 | #include <asm/processor.h> |
25 | #include <asm/ucontext.h> | 25 | #include <asm/ucontext.h> |
26 | #include <asm/i387.h> | 26 | #include <asm/i387.h> |
27 | #include <asm/fpu-internal.h> | ||
27 | #include <asm/vdso.h> | 28 | #include <asm/vdso.h> |
28 | #include <asm/mce.h> | 29 | #include <asm/mce.h> |
29 | 30 | ||
diff --git a/arch/x86/kernel/smpboot.c b/arch/x86/kernel/smpboot.c index 58f78165d308..e578a79a3093 100644 --- a/arch/x86/kernel/smpboot.c +++ b/arch/x86/kernel/smpboot.c | |||
@@ -727,8 +727,6 @@ do_rest: | |||
727 | * the targeted processor. | 727 | * the targeted processor. |
728 | */ | 728 | */ |
729 | 729 | ||
730 | printk(KERN_DEBUG "smpboot cpu %d: start_ip = %lx\n", cpu, start_ip); | ||
731 | |||
732 | atomic_set(&init_deasserted, 0); | 730 | atomic_set(&init_deasserted, 0); |
733 | 731 | ||
734 | if (get_uv_system_type() != UV_NON_UNIQUE_APIC) { | 732 | if (get_uv_system_type() != UV_NON_UNIQUE_APIC) { |
@@ -778,9 +776,10 @@ do_rest: | |||
778 | schedule(); | 776 | schedule(); |
779 | } | 777 | } |
780 | 778 | ||
781 | if (cpumask_test_cpu(cpu, cpu_callin_mask)) | 779 | if (cpumask_test_cpu(cpu, cpu_callin_mask)) { |
780 | print_cpu_msr(&cpu_data(cpu)); | ||
782 | pr_debug("CPU%d: has booted.\n", cpu); | 781 | pr_debug("CPU%d: has booted.\n", cpu); |
783 | else { | 782 | } else { |
784 | boot_error = 1; | 783 | boot_error = 1; |
785 | if (*(volatile u32 *)TRAMPOLINE_SYM(trampoline_status) | 784 | if (*(volatile u32 *)TRAMPOLINE_SYM(trampoline_status) |
786 | == 0xA5A5A5A5) | 785 | == 0xA5A5A5A5) |
@@ -834,7 +833,7 @@ int __cpuinit native_cpu_up(unsigned int cpu) | |||
834 | 833 | ||
835 | if (apicid == BAD_APICID || apicid == boot_cpu_physical_apicid || | 834 | if (apicid == BAD_APICID || apicid == boot_cpu_physical_apicid || |
836 | !physid_isset(apicid, phys_cpu_present_map) || | 835 | !physid_isset(apicid, phys_cpu_present_map) || |
837 | (!x2apic_mode && apicid >= 255)) { | 836 | !apic->apic_id_valid(apicid)) { |
838 | printk(KERN_ERR "%s: bad cpu %d\n", __func__, cpu); | 837 | printk(KERN_ERR "%s: bad cpu %d\n", __func__, cpu); |
839 | return -EINVAL; | 838 | return -EINVAL; |
840 | } | 839 | } |
diff --git a/arch/x86/kernel/sys_x86_64.c b/arch/x86/kernel/sys_x86_64.c index 051489082d59..ef59642ff1bf 100644 --- a/arch/x86/kernel/sys_x86_64.c +++ b/arch/x86/kernel/sys_x86_64.c | |||
@@ -195,7 +195,7 @@ arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0, | |||
195 | { | 195 | { |
196 | struct vm_area_struct *vma; | 196 | struct vm_area_struct *vma; |
197 | struct mm_struct *mm = current->mm; | 197 | struct mm_struct *mm = current->mm; |
198 | unsigned long addr = addr0; | 198 | unsigned long addr = addr0, start_addr; |
199 | 199 | ||
200 | /* requested length too big for entire address space */ | 200 | /* requested length too big for entire address space */ |
201 | if (len > TASK_SIZE) | 201 | if (len > TASK_SIZE) |
@@ -223,25 +223,14 @@ arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0, | |||
223 | mm->free_area_cache = mm->mmap_base; | 223 | mm->free_area_cache = mm->mmap_base; |
224 | } | 224 | } |
225 | 225 | ||
226 | try_again: | ||
226 | /* either no address requested or can't fit in requested address hole */ | 227 | /* either no address requested or can't fit in requested address hole */ |
227 | addr = mm->free_area_cache; | 228 | start_addr = addr = mm->free_area_cache; |
228 | |||
229 | /* make sure it can fit in the remaining address space */ | ||
230 | if (addr > len) { | ||
231 | unsigned long tmp_addr = align_addr(addr - len, filp, | ||
232 | ALIGN_TOPDOWN); | ||
233 | |||
234 | vma = find_vma(mm, tmp_addr); | ||
235 | if (!vma || tmp_addr + len <= vma->vm_start) | ||
236 | /* remember the address as a hint for next time */ | ||
237 | return mm->free_area_cache = tmp_addr; | ||
238 | } | ||
239 | |||
240 | if (mm->mmap_base < len) | ||
241 | goto bottomup; | ||
242 | 229 | ||
243 | addr = mm->mmap_base-len; | 230 | if (addr < len) |
231 | goto fail; | ||
244 | 232 | ||
233 | addr -= len; | ||
245 | do { | 234 | do { |
246 | addr = align_addr(addr, filp, ALIGN_TOPDOWN); | 235 | addr = align_addr(addr, filp, ALIGN_TOPDOWN); |
247 | 236 | ||
@@ -263,6 +252,17 @@ arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0, | |||
263 | addr = vma->vm_start-len; | 252 | addr = vma->vm_start-len; |
264 | } while (len < vma->vm_start); | 253 | } while (len < vma->vm_start); |
265 | 254 | ||
255 | fail: | ||
256 | /* | ||
257 | * if hint left us with no space for the requested | ||
258 | * mapping then try again: | ||
259 | */ | ||
260 | if (start_addr != mm->mmap_base) { | ||
261 | mm->free_area_cache = mm->mmap_base; | ||
262 | mm->cached_hole_size = 0; | ||
263 | goto try_again; | ||
264 | } | ||
265 | |||
266 | bottomup: | 266 | bottomup: |
267 | /* | 267 | /* |
268 | * A failed mmap() very likely causes application failure, | 268 | * A failed mmap() very likely causes application failure, |
diff --git a/arch/x86/kernel/traps.c b/arch/x86/kernel/traps.c index 4bbe04d96744..ec61d4c1b93b 100644 --- a/arch/x86/kernel/traps.c +++ b/arch/x86/kernel/traps.c | |||
@@ -54,6 +54,7 @@ | |||
54 | #include <asm/traps.h> | 54 | #include <asm/traps.h> |
55 | #include <asm/desc.h> | 55 | #include <asm/desc.h> |
56 | #include <asm/i387.h> | 56 | #include <asm/i387.h> |
57 | #include <asm/fpu-internal.h> | ||
57 | #include <asm/mce.h> | 58 | #include <asm/mce.h> |
58 | 59 | ||
59 | #include <asm/mach_traps.h> | 60 | #include <asm/mach_traps.h> |
diff --git a/arch/x86/kernel/vm86_32.c b/arch/x86/kernel/vm86_32.c index b466cab5ba15..328cb37bb827 100644 --- a/arch/x86/kernel/vm86_32.c +++ b/arch/x86/kernel/vm86_32.c | |||
@@ -172,6 +172,7 @@ static void mark_screen_rdonly(struct mm_struct *mm) | |||
172 | spinlock_t *ptl; | 172 | spinlock_t *ptl; |
173 | int i; | 173 | int i; |
174 | 174 | ||
175 | down_write(&mm->mmap_sem); | ||
175 | pgd = pgd_offset(mm, 0xA0000); | 176 | pgd = pgd_offset(mm, 0xA0000); |
176 | if (pgd_none_or_clear_bad(pgd)) | 177 | if (pgd_none_or_clear_bad(pgd)) |
177 | goto out; | 178 | goto out; |
@@ -190,6 +191,7 @@ static void mark_screen_rdonly(struct mm_struct *mm) | |||
190 | } | 191 | } |
191 | pte_unmap_unlock(pte, ptl); | 192 | pte_unmap_unlock(pte, ptl); |
192 | out: | 193 | out: |
194 | up_write(&mm->mmap_sem); | ||
193 | flush_tlb(); | 195 | flush_tlb(); |
194 | } | 196 | } |
195 | 197 | ||
diff --git a/arch/x86/kernel/xsave.c b/arch/x86/kernel/xsave.c index 711091114119..e62728e30b01 100644 --- a/arch/x86/kernel/xsave.c +++ b/arch/x86/kernel/xsave.c | |||
@@ -6,6 +6,7 @@ | |||
6 | #include <linux/bootmem.h> | 6 | #include <linux/bootmem.h> |
7 | #include <linux/compat.h> | 7 | #include <linux/compat.h> |
8 | #include <asm/i387.h> | 8 | #include <asm/i387.h> |
9 | #include <asm/fpu-internal.h> | ||
9 | #ifdef CONFIG_IA32_EMULATION | 10 | #ifdef CONFIG_IA32_EMULATION |
10 | #include <asm/sigcontext32.h> | 11 | #include <asm/sigcontext32.h> |
11 | #endif | 12 | #endif |