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....@intel.com> > Signed-off-by: Xiaoyan Zhang <xiaoyan.zh...@intel.com> > Signed-off-by: Gang Wei <gang....@intel.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 */
smime.p7s
Description: S/MIME cryptographic signature
------------------------------------------------------------------------------ Monitor your physical, virtual and cloud infrastructure from a single web console. Get in-depth insight into apps, servers, databases, vmware, SAP, cloud infrastructure, etc. Download 30-day Free Trial. Pricing starts from $795 for 25 servers or applications! http://p.sf.net/sfu/zoho_dev2dev_nov
_______________________________________________ tboot-devel mailing list tboot-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/tboot-devel