Message ID | 1505278369-21605-4-git-send-email-tianyu.lan@intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Wed, Sep 13, 2017 at 12:52:49AM -0400, Lan Tianyu wrote: > @@ -88,7 +88,14 @@ static struct acpi_20_madt *construct_madt(struct acpi_ctxt *ctxt, > sz = sizeof(struct acpi_20_madt); > sz += sizeof(struct acpi_20_madt_intsrcovr) * 16; > sz += sizeof(struct acpi_20_madt_ioapic); > - sz += sizeof(struct acpi_20_madt_lapic) * hvminfo->nr_vcpus; > + > + for ( i = 0; i < hvminfo->nr_vcpus; i++ ) > + { > + if ( config->lapic_id(i) > 254) I guess you already know I'm going to complain that the way to get the apic id is different here than in the previous patch. > + sz += sizeof(struct acpi_20_madt_x2apic); > + else > + sz += sizeof(struct acpi_20_madt_lapic); > + } > > madt = ctxt->mem_ops.alloc(ctxt, sz, 16); > if (!madt) return NULL; > @@ -142,27 +149,46 @@ static struct acpi_20_madt *construct_madt(struct acpi_ctxt *ctxt, > io_apic->ioapic_id = config->ioapic_id; > io_apic->ioapic_addr = config->ioapic_base_address; > > - lapic = (struct acpi_20_madt_lapic *)(io_apic + 1); > + end = (struct acpi_20_madt_lapic *)(io_apic + 1); > } > else > - lapic = (struct acpi_20_madt_lapic *)(madt + 1); > + end = (struct acpi_20_madt_lapic *)(madt + 1); > > info->nr_cpus = hvminfo->nr_vcpus; > - info->madt_lapic0_addr = ctxt->mem_ops.v2p(ctxt, lapic); > + info->madt_lapic0_addr = ctxt->mem_ops.v2p(ctxt, end); > + > for ( i = 0; i < hvminfo->nr_vcpus; i++ ) > { > - memset(lapic, 0, sizeof(*lapic)); > - lapic->type = ACPI_PROCESSOR_LOCAL_APIC; > - lapic->length = sizeof(*lapic); > - /* Processor ID must match processor-object IDs in the DSDT. */ > - lapic->acpi_processor_id = i; > - lapic->apic_id = config->lapic_id(i); > - lapic->flags = (test_bit(i, hvminfo->vcpu_online) > - ? ACPI_LOCAL_APIC_ENABLED : 0); > - lapic++; > + unsigned int apic_id = config->lapic_id(i); > + > + if ( apic_id < 255 ) { > + struct acpi_20_madt_lapic *lapic = end; > + > + memset(lapic, 0, sizeof(*lapic)); > + lapic->type = ACPI_PROCESSOR_LOCAL_APIC; > + lapic->length = sizeof(*lapic); > + /* Processor ID must match processor-object IDs in the DSDT. */ > + lapic->acpi_processor_id = i; > + lapic->apic_id = apic_id; > + lapic->flags = test_bit(i, hvminfo->vcpu_online) > + ? ACPI_LOCAL_APIC_ENABLED : 0; > + end = ++lapic; > + } else { > + struct acpi_20_madt_x2apic *lapic = end; ^x2apic to avoid confusion? Thanks, Roger.
Forgot something on the previous reply. On Tue, Sep 19, 2017 at 02:41:39PM +0100, Roger Pau Monné wrote: > On Wed, Sep 13, 2017 at 12:52:49AM -0400, Lan Tianyu wrote: > > @@ -88,7 +88,14 @@ static struct acpi_20_madt *construct_madt(struct acpi_ctxt *ctxt, > > for ( i = 0; i < hvminfo->nr_vcpus; i++ ) > > { > > - memset(lapic, 0, sizeof(*lapic)); > > - lapic->type = ACPI_PROCESSOR_LOCAL_APIC; > > - lapic->length = sizeof(*lapic); > > - /* Processor ID must match processor-object IDs in the DSDT. */ > > - lapic->acpi_processor_id = i; > > - lapic->apic_id = config->lapic_id(i); > > - lapic->flags = (test_bit(i, hvminfo->vcpu_online) > > - ? ACPI_LOCAL_APIC_ENABLED : 0); > > - lapic++; > > + unsigned int apic_id = config->lapic_id(i); > > + > > + if ( apic_id < 255 ) { > > + struct acpi_20_madt_lapic *lapic = end; > > + > > + memset(lapic, 0, sizeof(*lapic)); > > + lapic->type = ACPI_PROCESSOR_LOCAL_APIC; > > + lapic->length = sizeof(*lapic); > > + /* Processor ID must match processor-object IDs in the DSDT. */ > > + lapic->acpi_processor_id = i; An assert(lapic->acpi_processor_id < 255) would be nice to have here. Thanks, Roger.
diff --git a/tools/libacpi/acpi2_0.h b/tools/libacpi/acpi2_0.h index 2619ba3..ada5131 100644 --- a/tools/libacpi/acpi2_0.h +++ b/tools/libacpi/acpi2_0.h @@ -322,6 +322,7 @@ struct acpi_20_waet { #define ACPI_IO_SAPIC 0x06 #define ACPI_PROCESSOR_LOCAL_SAPIC 0x07 #define ACPI_PLATFORM_INTERRUPT_SOURCES 0x08 +#define ACPI_PROCESSOR_LOCAL_X2APIC 0x09 /* * APIC Structure Definitions. @@ -338,6 +339,15 @@ struct acpi_20_madt_lapic { uint32_t flags; }; +struct acpi_20_madt_x2apic { + uint8_t type; + uint8_t length; + uint16_t reserved; /* reserved - must be zero */ + uint32_t apic_id; /* Processor x2APIC ID */ + uint32_t flags; + uint32_t acpi_processor_id; /* ACPI processor UID */ +}; + /* * Local APIC Flags. All other bits are reserved and must be 0. */ diff --git a/tools/libacpi/build.c b/tools/libacpi/build.c index f9881c9..4830339 100644 --- a/tools/libacpi/build.c +++ b/tools/libacpi/build.c @@ -78,9 +78,9 @@ static struct acpi_20_madt *construct_madt(struct acpi_ctxt *ctxt, struct acpi_20_madt *madt; struct acpi_20_madt_intsrcovr *intsrcovr; struct acpi_20_madt_ioapic *io_apic; - struct acpi_20_madt_lapic *lapic; const struct hvm_info_table *hvminfo = config->hvminfo; int i, sz; + void *end; if ( config->lapic_id == NULL ) return NULL; @@ -88,7 +88,14 @@ static struct acpi_20_madt *construct_madt(struct acpi_ctxt *ctxt, sz = sizeof(struct acpi_20_madt); sz += sizeof(struct acpi_20_madt_intsrcovr) * 16; sz += sizeof(struct acpi_20_madt_ioapic); - sz += sizeof(struct acpi_20_madt_lapic) * hvminfo->nr_vcpus; + + for ( i = 0; i < hvminfo->nr_vcpus; i++ ) + { + if ( config->lapic_id(i) > 254) + sz += sizeof(struct acpi_20_madt_x2apic); + else + sz += sizeof(struct acpi_20_madt_lapic); + } madt = ctxt->mem_ops.alloc(ctxt, sz, 16); if (!madt) return NULL; @@ -142,27 +149,46 @@ static struct acpi_20_madt *construct_madt(struct acpi_ctxt *ctxt, io_apic->ioapic_id = config->ioapic_id; io_apic->ioapic_addr = config->ioapic_base_address; - lapic = (struct acpi_20_madt_lapic *)(io_apic + 1); + end = (struct acpi_20_madt_lapic *)(io_apic + 1); } else - lapic = (struct acpi_20_madt_lapic *)(madt + 1); + end = (struct acpi_20_madt_lapic *)(madt + 1); info->nr_cpus = hvminfo->nr_vcpus; - info->madt_lapic0_addr = ctxt->mem_ops.v2p(ctxt, lapic); + info->madt_lapic0_addr = ctxt->mem_ops.v2p(ctxt, end); + for ( i = 0; i < hvminfo->nr_vcpus; i++ ) { - memset(lapic, 0, sizeof(*lapic)); - lapic->type = ACPI_PROCESSOR_LOCAL_APIC; - lapic->length = sizeof(*lapic); - /* Processor ID must match processor-object IDs in the DSDT. */ - lapic->acpi_processor_id = i; - lapic->apic_id = config->lapic_id(i); - lapic->flags = (test_bit(i, hvminfo->vcpu_online) - ? ACPI_LOCAL_APIC_ENABLED : 0); - lapic++; + unsigned int apic_id = config->lapic_id(i); + + if ( apic_id < 255 ) { + struct acpi_20_madt_lapic *lapic = end; + + memset(lapic, 0, sizeof(*lapic)); + lapic->type = ACPI_PROCESSOR_LOCAL_APIC; + lapic->length = sizeof(*lapic); + /* Processor ID must match processor-object IDs in the DSDT. */ + lapic->acpi_processor_id = i; + lapic->apic_id = apic_id; + lapic->flags = test_bit(i, hvminfo->vcpu_online) + ? ACPI_LOCAL_APIC_ENABLED : 0; + end = ++lapic; + } else { + struct acpi_20_madt_x2apic *lapic = end; + + memset(lapic, 0, sizeof(*lapic)); + lapic->type = ACPI_PROCESSOR_LOCAL_X2APIC; + lapic->length = sizeof(*lapic); + /* Processor ID must match processor-object IDs in the DSDT. */ + lapic->acpi_processor_id = i; + lapic->apic_id = apic_id; + lapic->flags = test_bit(i, hvminfo->vcpu_online) + ? ACPI_LOCAL_APIC_ENABLED : 0; + end = ++lapic; + } } - madt->header.length = (unsigned char *)lapic - (unsigned char *)madt; + madt->header.length = (unsigned char *)end - (unsigned char *)madt; set_checksum(madt, offsetof(struct acpi_header, checksum), madt->header.length); info->madt_csum_addr =