[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH v2 11/17] libxl/arm: Construct ACPI DSDT table



Hi Shannon,

On 23/06/16 04:16, Shannon Zhao wrote:

[...]

diff --git a/tools/libxl/Makefile b/tools/libxl/Makefile
index 264b6ef..5347480 100644
--- a/tools/libxl/Makefile
+++ b/tools/libxl/Makefile
@@ -77,7 +77,29 @@ endif

  LIBXL_OBJS-$(CONFIG_X86) += libxl_cpuid.o libxl_x86.o libxl_psr.o
  LIBXL_OBJS-$(CONFIG_ARM) += libxl_nocpuid.o libxl_arm.o libxl_libfdt_compat.o
-LIBXL_OBJS-$(CONFIG_ARM) += libxl_arm_acpi.o
+LIBXL_OBJS-$(CONFIG_ARM) += libxl_arm_acpi.o libxl_dsdt_anycpu_arm.o
+
+vpath iasl $(PATH)
+libxl_mk_dsdt_arm: libxl_mk_dsdt_arm.c
+       $(CC) $(CFLAGS) -o $@ libxl_mk_dsdt_arm.c
+
+libxl_dsdt_anycpu_arm.asl: libxl_empty_dsdt_arm.asl libxl_mk_dsdt_arm
+       awk 'NR > 1 {print s} {s=$$0}' $< > $@
+       ./libxl_mk_dsdt_arm >> $@
+
+libxl_dsdt_anycpu_arm.c: %.c: iasl %.asl
+       iasl -vs -p $* -tc $*.asl
+       sed -e 's/AmlCode/$*/g' $*.hex >$@
+       echo "int $*_len=sizeof($*);" >>$@
+       rm -f $*.aml $*.hex
+

I don't like the idea to add iasl as a dependency for all ARM platforms. For instance ARMv7 platform will not use ACPI, but we still ask users to install iasl. So I think we should allow the user to opt-in/opt-out for ACPI.

Any opinions?

+iasl:
+       @echo
+       @echo "ACPI ASL compiler (iasl) is needed"
+       @echo "Download and install Intel ACPI CA from"
+       @echo "http://acpica.org/downloads/";
+       @echo
+       @exit 1

It is really a pain to discover the dependency in the middle of a build. The presence of iasl should be done by the configure.


  libxl_arm_acpi.o: libxl_arm_acpi.c
        $(CC) -c $(CFLAGS) -I../../xen/include/ -o $@ libxl_arm_acpi.c
diff --git a/tools/libxl/libxl_arm_acpi.c b/tools/libxl/libxl_arm_acpi.c
index 353d774..45fc354 100644
--- a/tools/libxl/libxl_arm_acpi.c
+++ b/tools/libxl/libxl_arm_acpi.c
@@ -54,6 +54,9 @@ enum {
      NUMS,
  };

+extern unsigned char libxl_dsdt_anycpu_arm[];
+extern int libxl_dsdt_anycpu_arm_len;

Not sure this is the right place to mention it, but I don't find the actual declaration.

Both variables should be const and _hidden. Also, the *_len should be at least const int.

+
  struct acpitable {
      void *table;
      size_t size;
@@ -256,6 +259,17 @@ static void make_acpi_fadt(libxl__gc *gc, struct 
xc_dom_image *dom)
      dom->acpitable_size += ROUNDUP(acpitables[FADT].size, 3);
  }

+static void make_acpi_dsdt(libxl__gc *gc, struct xc_dom_image *dom)
+{
+    acpitables[DSDT].table = libxl__zalloc(gc, libxl_dsdt_anycpu_arm_len);
+    memcpy(acpitables[DSDT].table, libxl_dsdt_anycpu_arm,
+           libxl_dsdt_anycpu_arm_len);
+
+    acpitables[DSDT].size = libxl_dsdt_anycpu_arm_len;
+    /* Align to 64bit. */
+    dom->acpitable_size += ROUNDUP(acpitables[DSDT].size, 3);
+}
+
  int libxl__prepare_acpi(libxl__gc *gc, libxl_domain_build_info *info,
                          libxl__domain_build_state *state,
                          struct xc_dom_image *dom)
@@ -284,6 +298,7 @@ int libxl__prepare_acpi(libxl__gc *gc, 
libxl_domain_build_info *info,
        return rc;

      make_acpi_fadt(gc, dom);
+    make_acpi_dsdt(gc, dom);

      return 0;
  }
diff --git a/tools/libxl/libxl_arm_acpi.h b/tools/libxl/libxl_arm_acpi.h
index 9b58de6..b0fd9ce 100644
--- a/tools/libxl/libxl_arm_acpi.h
+++ b/tools/libxl/libxl_arm_acpi.h
@@ -19,6 +19,8 @@

  #include <xc_dom.h>

+#define DOMU_MAX_VCPUS 128
+

I would rather define the maximum number of VCPUS in public/arch_arm.h to avoid defining the current number of vCPUs supported in multiple places.

  int libxl__prepare_acpi(libxl__gc *gc, libxl_domain_build_info *info,
                          libxl__domain_build_state *state,
                          struct xc_dom_image *dom);
diff --git a/tools/libxl/libxl_empty_dsdt_arm.asl 
b/tools/libxl/libxl_empty_dsdt_arm.asl
new file mode 100644
index 0000000..005fa6a
--- /dev/null
+++ b/tools/libxl/libxl_empty_dsdt_arm.asl
@@ -0,0 +1,22 @@
+/******************************************************************************
+ * DSDT for Xen ARM DomU
+ *
+ * Copyright (c) 2004, Intel Corporation.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; If not, see <http://www.gnu.org/licenses/>.
+ */
+
+DefinitionBlock ("DSDT.aml", "DSDT", 3, "XenARM", "Xen DSDT", 1)
+{
+
+}
diff --git a/tools/libxl/libxl_mk_dsdt_arm.c b/tools/libxl/libxl_mk_dsdt_arm.c
new file mode 100644
index 0000000..96fadbd
--- /dev/null
+++ b/tools/libxl/libxl_mk_dsdt_arm.c

Can we share the code from tools/firmware/acpi/mk_dsdt.c?

@@ -0,0 +1,94 @@
+#include <stdio.h>
+#include <stdarg.h>
+#include <stdint.h>
+#include <string.h>
+#include <stdlib.h>
+#include "libxl_arm_acpi.h"
+
+static unsigned int indent_level;
+
+static void indent(void)
+{
+    unsigned int i;
+    for ( i = 0; i < indent_level; i++ )
+        printf("    ");
+}
+
+static __attribute__((format(printf, 2, 3)))
+void _stmt(const char *name, const char *fmt, ...)
+{
+    va_list args;
+
+    indent();
+    printf("%s", name);
+
+    if ( !fmt )
+        return;
+
+    printf(" ( ");
+    va_start(args, fmt);
+    vprintf(fmt, args);
+    va_end(args);
+    printf(" )");
+}
+
+#define stmt(n, f, a...)                        \
+    do {                                        \
+        _stmt(n, f , ## a );                    \
+        printf("\n");                           \
+    } while (0)
+
+#define push_block(n, f, a...)                  \
+    do {                                        \
+        _stmt(n, f , ## a );                    \
+        printf(" {\n");                         \
+        indent_level++;                         \
+    } while (0)
+
+static void pop_block(void)
+{
+    indent_level--;
+    indent();
+    printf("}\n");
+}
+
+int main(int argc, char **argv)
+{
+    unsigned int cpu, max_cpus = DOMU_MAX_VCPUS;
+
+    /**** DSDT DefinitionBlock start ****/
+    /* (we append to existing DSDT definition block) */
+    indent_level++;
+
+    /**** Processor start ****/
+    push_block("Scope", "\\_SB");
+
+    /* Define processor objects and control methods. */
+    for ( cpu = 0; cpu < max_cpus; cpu++)
+    {
+        push_block("Processor", "PR%02X, %d, 0x0000b010, 0x06", cpu, cpu);
+
+        stmt("Name", "_HID, \"ACPI0007\"");
+        stmt("Name", "_UID, %d", cpu);
+
+        pop_block();
+    }
+
+    pop_block();
+    /**** Processor end ****/
+
+    pop_block();
+    /**** DSDT DefinitionBlock end ****/
+
+    return 0;
+}
+
+/*
+ * Local variables:
+ * mode: C
+ * c-file-style: "BSD"
+ * c-basic-offset: 4
+ * tab-width: 4
+ * indent-tabs-mode: nil
+ * End:
+ */


Regards,

--
Julien Grall

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.