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
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Date:	Wed, 14 Nov 2012 11:14:49 +0000
From:	"Wei, Gang" <gang.wei@...el.com>
To:	"Ren, Qiaowei" <qiaowei.ren@...el.com>,
	Thomas Gleixner <tglx@...utronix.de>,
	Ingo Molnar <mingo@...hat.com>,
	"H. Peter Anvin" <hpa@...or.com>, "x86@...nel.org" <x86@...nel.org>
CC:	"Maliszewski, Richard L" <richard.l.maliszewski@...el.com>,
	"linux-kernel@...r.kernel.org" <linux-kernel@...r.kernel.org>,
	"tboot-devel@...ts.sourceforge.net" 
	<tboot-devel@...ts.sourceforge.net>,
	Xiaoyan Zhang <xiaoyan.zhang@...el.com>,
	"Wei, Gang" <gang.wei@...el.com>
Subject: RE: [PATCH v2] x86: add a new SMP bring up way for tboot case

Any comments on this patch?

Jimmy

Ren, Qiaowei wrote onĀ 2012-10-11:
> tboot provides a better AP wakeup mechanism based on cpu MWAIT feature
> for OS/VMM. With this mechanism, system will boot faster and will NOT
> require VT to be enabled. But it requires that OS/VMM must have support
> it, otherwise system can never boot up.
> 
> Once this mechanism is enabled, tboot will put APs waiting in MWAIT
> loops before launching kernel. kernel can check the new flag field in v6
> tboot shared page for the hint. If the bit TB_FLAG_AP_WAKE_SUPPORT in
> flag field is set, kernel BSP has to write the monitored memory
> (tboot->ap_wake_trigger) to bring APs out of MWAIT loops. The sipi
> vector should be written in tboot->ap_wake_addr before waking up APs.
> 
> Signed-off-by: Qiaowei Ren <qiaowei.ren@...el.com>
> Signed-off-by: Xiaoyan Zhang <xiaoyan.zhang@...el.com>
> Signed-off-by: Gang Wei <gang.wei@...el.com>
> ---
>  arch/x86/kernel/smpboot.c |   21 +++++++++++----------
>  arch/x86/kernel/tboot.c   |   17 +++++++++++++++++
>  include/linux/tboot.h     |   17 +++++++++++++++++
>  3 files changed, 45 insertions(+), 10 deletions(-)
> diff --git a/arch/x86/kernel/smpboot.c b/arch/x86/kernel/smpboot.c
> index c80a33b..884c3e7 100644
> --- a/arch/x86/kernel/smpboot.c
> +++ b/arch/x86/kernel/smpboot.c
> @@ -662,8 +662,7 @@ static int __cpuinit do_boot_cpu(int apicid, int cpu,
> struct task_struct *idle)
>  	/* start_ip had better be page-aligned! */
>  	unsigned long start_ip = real_mode_header->trampoline_start;
> -	unsigned long boot_error = 0;
> -	int timeout;
> +	int timeout, boot_error = 0;
> 
>  	/* Just in case we booted with a single CPU. */
>  	alternatives_enable_smp();
> @@ -710,14 +709,16 @@ static int __cpuinit do_boot_cpu(int apicid, int
cpu,
> struct task_struct *idle)
>  		}
>  	}
> -	/* -	 * Kick the secondary CPU. Use the method in the APIC driver
-	 *
> if it's defined - or use an INIT boot APIC message otherwise: -	 */
-	if
> (apic->wakeup_secondary_cpu) -		boot_error =
> apic->wakeup_secondary_cpu(apicid, start_ip); -	else -
boot_error =
> wakeup_secondary_cpu_via_init(apicid, start_ip); +	if
> (!tboot_wake_up(apicid, start_ip)) { +		/* +		 *
Kick the secondary CPU.
> Use the method in the APIC driver +		 * if it's defined - or use
an INIT
> boot APIC message otherwise: +		 */ +		if
(apic->wakeup_secondary_cpu)
> +			boot_error = apic->wakeup_secondary_cpu(apicid,
start_ip); +		else
> +			boot_error = wakeup_secondary_cpu_via_init(apicid,
start_ip); +	}
> 
>  	if (!boot_error) {
>  		/*
> diff --git a/arch/x86/kernel/tboot.c b/arch/x86/kernel/tboot.c
> index f84fe00..e5e50b8 100644
> --- a/arch/x86/kernel/tboot.c
> +++ b/arch/x86/kernel/tboot.c
> @@ -101,6 +101,8 @@ void __init tboot_probe(void)
>  	pr_debug("shutdown_entry: 0x%x\n", tboot->shutdown_entry);
>  	pr_debug("tboot_base: 0x%08x\n", tboot->tboot_base);
>  	pr_debug("tboot_size: 0x%x\n", tboot->tboot_size);
> +	if (tboot->version >= 6)
> +		pr_info("flags: 0x%08x\n", tboot->flags);
>  }
>  
>  static pgd_t *tboot_pg_dir;
> @@ -453,3 +455,18 @@ int tboot_force_iommu(void)
> 
>  	return 1;
>  }
> +
> +int tboot_wake_up(int apicid, unsigned long sipi_vec)
> +{
> +	if (!tboot_enabled())
> +		return 0;
> +
> +	if ((tboot->version < 6) ||
> +	    !(tboot->flags & TB_FLAG_AP_WAKE_SUPPORT))
> +		return 0;
> +
> +	tboot->ap_wake_addr = sipi_vec;
> +	tboot->ap_wake_trigger = apicid;
> +
> +	return 1;
> +}
> diff --git a/include/linux/tboot.h b/include/linux/tboot.h
> index c75128b..d65f7e9 100644
> --- a/include/linux/tboot.h
> +++ b/include/linux/tboot.h
> @@ -124,8 +124,23 @@ struct tboot {
> 
>  	/* number of processors in wait-for-SIPI */
>  	u32 num_in_wfs;
> +
> +	/*
> +	 * version 6+ fields:
> +	 */
> +
> +	u32 flags;
> +
> +	/* phys addr of kernel/VMM SIPI vector */
> +	u64 ap_wake_addr;
> +
> +	/* kernel/VMM writes APIC ID to wake AP */
> +	u32 ap_wake_trigger;
>  } __packed;
> +/* kernel/VMM use INIT-SIPI-SIPI if clear, ap_wake_* if set */
> +#define TB_FLAG_AP_WAKE_SUPPORT 0X00000001
> +
>  /*
>   * UUID for tboot data struct to facilitate matching
>   * defined as {663C8DFF-E8B3-4b82-AABF-19EA4D057A08} by tboot, which is
> @@ -146,6 +161,7 @@ extern void tboot_shutdown(u32 shutdown_type);
>  extern struct acpi_table_header *tboot_get_dmar_table(
>  				      struct acpi_table_header *dmar_tbl);
>  extern int tboot_force_iommu(void);
> +extern int tboot_wake_up(int apicid, unsigned long sipi_vec);
> 
>  #else
> @@ -156,6 +172,7 @@ extern int tboot_force_iommu(void);
>  					do { } while (0)
>  #define tboot_get_dmar_table(dmar_tbl)	(dmar_tbl)
>  #define tboot_force_iommu()		0
> +#define tboot_wake_up(apicid, sipi_vec) 0
> 
>  #endif /* !CONFIG_INTEL_TXT */

Download attachment "smime.p7s" of type "application/pkcs7-signature" (8586 bytes)

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ