|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v5 13/24] hvmloader: construct SRAT
On 12/02/15 19:44, Wei Liu wrote:
> Signed-off-by: Wei Liu <wei.liu2@xxxxxxxxxx>
> Acked-by: Jan Beulich <JBeulich@xxxxxxxx>
> ---
> Changes in v3:
> 1. Remove redundant variable.
> 2. Coding style fix.
> 3. Add assertion.
>
> Changes in v2:
> 1. Remove explicit zero initializers.
> 2. Adapt to new vNUMA retrieval routine.
> 3. Move SRAT very late in secondary table build.
> ---
> tools/firmware/hvmloader/acpi/acpi2_0.h | 53 ++++++++++++++++++++++++
> tools/firmware/hvmloader/acpi/build.c | 72
> +++++++++++++++++++++++++++++++++
> 2 files changed, 125 insertions(+)
>
> diff --git a/tools/firmware/hvmloader/acpi/acpi2_0.h
> b/tools/firmware/hvmloader/acpi/acpi2_0.h
> index 7b22d80..6169213 100644
> --- a/tools/firmware/hvmloader/acpi/acpi2_0.h
> +++ b/tools/firmware/hvmloader/acpi/acpi2_0.h
> @@ -364,6 +364,57 @@ struct acpi_20_madt_intsrcovr {
> };
>
> /*
> + * System Resource Affinity Table header definition (SRAT)
> + */
> +struct acpi_20_srat {
> + struct acpi_header header;
> + uint32_t table_revision;
> + uint32_t reserved2[2];
> +};
> +
> +#define ACPI_SRAT_TABLE_REVISION 1
> +
> +/*
> + * System Resource Affinity Table structure types.
> + */
> +#define ACPI_PROCESSOR_AFFINITY 0x0
> +#define ACPI_MEMORY_AFFINITY 0x1
> +struct acpi_20_srat_processor {
> + uint8_t type;
> + uint8_t length;
> + uint8_t domain;
> + uint8_t apic_id;
> + uint32_t flags;
> + uint8_t sapic_id;
> + uint8_t domain_hi[3];
> + uint32_t reserved;
> +};
> +
> +/*
> + * Local APIC Affinity Flags. All other bits are reserved and must be 0.
> + */
> +#define ACPI_LOCAL_APIC_AFFIN_ENABLED (1 << 0)
> +
> +struct acpi_20_srat_memory {
> + uint8_t type;
> + uint8_t length;
> + uint32_t domain;
> + uint16_t reserved;
> + uint64_t base_address;
> + uint64_t mem_length;
> + uint32_t reserved2;
> + uint32_t flags;
> + uint64_t reserved3;
> +};
> +
> +/*
> + * Memory Affinity Flags. All other bits are reserved and must be 0.
> + */
> +#define ACPI_MEM_AFFIN_ENABLED (1 << 0)
> +#define ACPI_MEM_AFFIN_HOTPLUGGABLE (1 << 1)
> +#define ACPI_MEM_AFFIN_NONVOLATILE (1 << 2)
> +
> +/*
> * Table Signatures.
> */
> #define ACPI_2_0_RSDP_SIGNATURE ASCII64('R','S','D',' ','P','T','R',' ')
> @@ -375,6 +426,7 @@ struct acpi_20_madt_intsrcovr {
> #define ACPI_2_0_TCPA_SIGNATURE ASCII32('T','C','P','A')
> #define ACPI_2_0_HPET_SIGNATURE ASCII32('H','P','E','T')
> #define ACPI_2_0_WAET_SIGNATURE ASCII32('W','A','E','T')
> +#define ACPI_2_0_SRAT_SIGNATURE ASCII32('S','R','A','T')
>
> /*
> * Table revision numbers.
> @@ -388,6 +440,7 @@ struct acpi_20_madt_intsrcovr {
> #define ACPI_2_0_HPET_REVISION 0x01
> #define ACPI_2_0_WAET_REVISION 0x01
> #define ACPI_1_0_FADT_REVISION 0x01
> +#define ACPI_2_0_SRAT_REVISION 0x01
>
> #pragma pack ()
>
> diff --git a/tools/firmware/hvmloader/acpi/build.c
> b/tools/firmware/hvmloader/acpi/build.c
> index 1431296..3e96c23 100644
> --- a/tools/firmware/hvmloader/acpi/build.c
> +++ b/tools/firmware/hvmloader/acpi/build.c
> @@ -23,6 +23,7 @@
> #include "ssdt_pm.h"
> #include "../config.h"
> #include "../util.h"
> +#include "../vnuma.h"
> #include <xen/hvm/hvm_xs_strings.h>
> #include <xen/hvm/params.h>
>
> @@ -203,6 +204,66 @@ static struct acpi_20_waet *construct_waet(void)
> return waet;
> }
>
> +static struct acpi_20_srat *construct_srat(void)
> +{
> + struct acpi_20_srat *srat;
> + struct acpi_20_srat_processor *processor;
> + struct acpi_20_srat_memory *memory;
> + unsigned int size;
> + void *p;
> + int i;
unsigned
> +
> + size = sizeof(*srat) + sizeof(*processor) * hvm_info->nr_vcpus +
> + sizeof(*memory) * nr_vmemranges;
> +
> + p = mem_alloc(size, 16);
> + if ( !p )
> + return NULL;
> +
> + srat = p;
> + memset(srat, 0, sizeof(*srat));
Probably best to memset() all of size in one go, rather than memset()ing
each bit individually.
Otherwise, Reviewed-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
> + srat->header.signature = ACPI_2_0_SRAT_SIGNATURE;
> + srat->header.revision = ACPI_2_0_SRAT_REVISION;
> + fixed_strcpy(srat->header.oem_id, ACPI_OEM_ID);
> + fixed_strcpy(srat->header.oem_table_id, ACPI_OEM_TABLE_ID);
> + srat->header.oem_revision = ACPI_OEM_REVISION;
> + srat->header.creator_id = ACPI_CREATOR_ID;
> + srat->header.creator_revision = ACPI_CREATOR_REVISION;
> + srat->table_revision = ACPI_SRAT_TABLE_REVISION;
> +
> + processor = (struct acpi_20_srat_processor *)(srat + 1);
> + for ( i = 0; i < hvm_info->nr_vcpus; i++ )
> + {
> + memset(processor, 0, sizeof(*processor));
> + processor->type = ACPI_PROCESSOR_AFFINITY;
> + processor->length = sizeof(*processor);
> + processor->domain = vcpu_to_vnode[i];
> + processor->apic_id = LAPIC_ID(i);
> + processor->flags = ACPI_LOCAL_APIC_AFFIN_ENABLED;
> + processor++;
> + }
> +
> + memory = (struct acpi_20_srat_memory *)processor;
> + for ( i = 0; i < nr_vmemranges; i++ )
> + {
> + memset(memory, 0, sizeof(*memory));
> + memory->type = ACPI_MEMORY_AFFINITY;
> + memory->length = sizeof(*memory);
> + memory->domain = vmemrange[i].nid;
> + memory->flags = ACPI_MEM_AFFIN_ENABLED;
> + memory->base_address = vmemrange[i].start;
> + memory->mem_length = vmemrange[i].end - vmemrange[i].start;
> + memory++;
> + }
> +
> + ASSERT(((unsigned long)memory) - ((unsigned long)p) == size);
> +
> + srat->header.length = size;
> + set_checksum(srat, offsetof(struct acpi_header, checksum), size);
> +
> + return srat;
> +}
> +
> static int construct_passthrough_tables(unsigned long *table_ptrs,
> int nr_tables)
> {
> @@ -257,6 +318,7 @@ static int construct_secondary_tables(unsigned long
> *table_ptrs,
> struct acpi_20_hpet *hpet;
> struct acpi_20_waet *waet;
> struct acpi_20_tcpa *tcpa;
> + struct acpi_20_srat *srat;
> unsigned char *ssdt;
> static const uint16_t tis_signature[] = {0x0001, 0x0001, 0x0001};
> uint16_t *tis_hdr;
> @@ -346,6 +408,16 @@ static int construct_secondary_tables(unsigned long
> *table_ptrs,
> }
> }
>
> + /* SRAT */
> + if ( nr_vnodes > 0 )
> + {
> + srat = construct_srat();
> + if ( srat )
> + table_ptrs[nr_tables++] = (unsigned long)srat;
> + else
> + printf("Failed to build SRAT, skipping...\n");
> + }
> +
> /* Load any additional tables passed through. */
> nr_tables += construct_passthrough_tables(table_ptrs, nr_tables);
>
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |