[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH] x86: add a new SMP bring up way for tboot case
>>> On 05.01.12 at 15:53, "Wei, Gang" <gang.wei@xxxxxxxxx> wrote: > tboot may be trying to put APs waiting in MWAIT loops before launching Xen. > Xen could check the new flag field in v6 tboot shared page for the hint. If > TB_FLAG_AP_WAKE_SUPPORT bit in flag field is set, Xen BSP have to write the > monitored memory(g_tboot_shared->ap_wake_trigger) to bring APs out of MWAIT > loops. The sipi vector should be written in g_tboot_shared->ap_wake_addr > before > waking up APs. > > Signed-off-by: Joseph Cihula <joseph.cihula@xxxxxxxxx> > Signed-off-by: Shane Wang <shane.wang@xxxxxxxxx> > Signed-off-by: Gang Wei <gang.wei@xxxxxxxxx> > > diff -r cbf1ce3afd74 xen/arch/x86/smpboot.c > --- a/xen/arch/x86/smpboot.c Sat Dec 31 16:18:55 2011 +0800 > +++ b/xen/arch/x86/smpboot.c Sat Dec 31 18:50:14 2011 +0800 > @@ -586,7 +586,9 @@ > smpboot_setup_warm_reset_vector(start_eip); > > /* Starting actual IPI sequence... */ > - boot_error = wakeup_secondary_cpu(apicid, start_eip); > + boot_error = tboot_wake_ap(apicid, start_eip); As tboot.h is being included here anyway, it would seem more clean to me to guard the call with tboot_in_measured_env() here rather than in the called function. > + if ( boot_error ) > + boot_error = wakeup_secondary_cpu(apicid, start_eip); > > if ( !boot_error ) > { > diff -r cbf1ce3afd74 xen/arch/x86/tboot.c > --- a/xen/arch/x86/tboot.c Sat Dec 31 16:18:55 2011 +0800 > +++ b/xen/arch/x86/tboot.c Sat Dec 31 18:50:14 2011 +0800 > @@ -123,6 +123,10 @@ > printk(" shutdown_entry: 0x%08x\n", tboot_shared->shutdown_entry); > printk(" tboot_base: 0x%08x\n", tboot_shared->tboot_base); > printk(" tboot_size: 0x%x\n", tboot_shared->tboot_size); > + if ( tboot_shared->version >= 5 ) > + printk(" num_in_wfs: %u\n", tboot_shared->num_in_wfs); You're printing this field, but aren't making any other use of it? > + if ( tboot_shared->version >= 6 ) > + printk(" flags: 0x%08x\n", tboot_shared->flags); > > /* these will be needed by tboot_protect_mem_regions() and/or > tboot_parse_dmar_table(), so get them now */ > @@ -529,6 +533,19 @@ > panic("Memory integrity was lost on resume (%d)\n", error); > } > > +int tboot_wake_ap(int apicid, unsigned long sipi_vec) > +{ > + if ( tboot_in_measured_env() && g_tboot_shared->version >= 6 && > + (g_tboot_shared->flags & TB_FLAG_AP_WAKE_SUPPORT) ) > + { > + printk("waking AP %d w/ monitor write\n", apicid); Please, no once-per-CPU printk()-s, especially if they don't depend on per-CPU properties. > + g_tboot_shared->ap_wake_addr = sipi_vec; > + g_tboot_shared->ap_wake_trigger = apicid; > + return 0; > + } > + return -1; > +} > + > /* > * Local variables: > * mode: C > diff -r cbf1ce3afd74 xen/include/asm-x86/tboot.h > --- a/xen/include/asm-x86/tboot.h Sat Dec 31 16:18:55 2011 +0800 > +++ b/xen/include/asm-x86/tboot.h Sat Dec 31 18:50:14 2011 +0800 > @@ -85,7 +85,7 @@ > typedef struct __packed { > /* version 3+ fields: */ > uuid_t uuid; /* {663C8DFF-E8B3-4b82-AABF-19EA4D057A08} */ > - uint32_t version; /* Version number; currently supports 0.4 > */ > + uint32_t version; /* Version number; currently supports 0.6 > */ > uint32_t log_addr; /* physical addr of tb_log_t log */ > uint32_t shutdown_entry; /* entry point for tboot shutdown */ > uint32_t shutdown_type; /* type of shutdown (TB_SHUTDOWN_*) */ > @@ -99,6 +99,13 @@ > /* version 4+ fields: */ > /* populated by tboot; will be encrypted > */ > uint8_t s3_key[TB_KEY_SIZE]; > + /* version 5+ fields: */ > + uint8_t reserved_align[3]; /* used to 4byte-align num_in_wfs */ > + uint32_t num_in_wfs; /* number of processors in wait-for-SIPI */ > + /* version 6+ fields: */ > + uint32_t flags; > + uint64_t ap_wake_addr; /* phys addr of kernel/VMM SIPI vector */ > + uint32_t ap_wake_trigger; /* kernel/VMM writes APIC ID to wake AP */ > } tboot_shared_t; > > #define TB_SHUTDOWN_REBOOT 0 > @@ -107,6 +114,9 @@ > #define TB_SHUTDOWN_S3 3 > #define TB_SHUTDOWN_HALT 4 > > +#define TB_FLAG_AP_WAKE_SUPPORT 0x00000001 /* kernel/VMM use > INIT-SIPI-SIPI > + if clear, ap_wake_* if set > */ > + > /* {663C8DFF-E8B3-4b82-AABF-19EA4D057A08} */ > #define TBOOT_SHARED_UUID { 0x663c8dff, 0xe8b3, 0x4b82, 0xaabf, \ > { 0x19, 0xea, 0x4d, 0x5, 0x7a, 0x8 } }; > @@ -120,6 +130,7 @@ > int tboot_parse_dmar_table(acpi_table_handler dmar_handler); > int tboot_s3_resume(void); > void tboot_s3_error(int error); > +int tboot_wake_ap(int apicid, unsigned long sipi_vec); > > #endif /* __TBOOT_H__ */ _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |