lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening linux-cve-announce PHC | |
Open Source and information security mailing list archives
| ||
|
Date: Fri, 01 May 2009 21:48:34 -0700 From: Yinghai Lu <yinghai@...nel.org> To: Ingo Molnar <mingo@...e.hu>, Thomas Gleixner <tglx@...utronix.de>, "H. Peter Anvin" <hpa@...or.com>, "linux-kernel@...r.kernel.org" <linux-kernel@...r.kernel.org> CC: Ed Swierk <eswierk@...stanetworks.com>, Cyrill Gorcunov <gorcunov@...il.com> Subject: [PATCH] x86: read apic id if it is not acpi_lapic Ed found that on 32bit, boot_cpu_physical_apicid is not read right, when mptable is broken. interesting, actually three path 1. acpi: at that time, at that time that is already read from reg. 2. mptable: that only read from mptable. 3. no madt, and no mptable, that use default apic id 0 for 64bit, -1 for 32bit so could read that apic id for 2/3 path. also could avoid set fixmap that lapic two times when acpi_lapic is used. and need to move cpu_has_apic earlier and call apic_disable() Reported-by: Ed Swierk <eswierk@...stanetworks.com> Signed-off-by: Yinghai Lu <yinghai@...nel.org> Cc: Cyrill Gorcunov <gorcunov@...nvz.org> --- arch/x86/kernel/apic/apic.c | 29 +++++++++++++++++++++-------- 1 file changed, 21 insertions(+), 8 deletions(-) Index: linux-2.6/arch/x86/kernel/apic/apic.c =================================================================== --- linux-2.6.orig/arch/x86/kernel/apic/apic.c +++ linux-2.6/arch/x86/kernel/apic/apic.c @@ -1574,6 +1574,8 @@ void __init early_init_lapic_mapping(voi */ void __init init_apic_mappings(void) { + unsigned int new_apicid; + if (x2apic_mode) { boot_cpu_physical_apicid = read_apic_id(); return; @@ -1590,21 +1592,32 @@ void __init init_apic_mappings(void) } else apic_phys = mp_lapic_addr; - set_fixmap_nocache(FIX_APIC_BASE, apic_phys); + /* lets check if we may to NOP'ify apic operations */ + if (!cpu_has_apic) { + pr_info("APIC: disable apic facility\n"); + apic_disable(); + return; + } + + /* + * acpi lapic path already map that address in + * acpi_register_lapic_address() + */ apic_printk(APIC_VERBOSE, "mapped APIC to %08lx (%08lx)\n", APIC_BASE, apic_phys); + if (acpi_lapic) + return; + set_fixmap_nocache(FIX_APIC_BASE, apic_phys); /* * Fetch the APIC ID of the BSP in case we have a * default configuration (or the MP table is broken). */ - if (boot_cpu_physical_apicid == -1U) - boot_cpu_physical_apicid = read_apic_id(); - - /* lets check if we may to NOP'ify apic operations */ - if (!cpu_has_apic) { - pr_info("APIC: disable apic facility\n"); - apic_disable(); + new_apicid = read_apic_id(); + if (boot_cpu_physical_apicid != new_apicid) { + boot_cpu_physical_apicid = new_apicid; + apic_version[new_apicid] = + GET_APIC_VERSION(apic_read(APIC_LVR)); } } -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@...r.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists