@@ -22,6 +22,7 @@ MK_DSDT = $(ACPI_BUILD_DIR)/mk_dsdt
# Sources to be generated
C_SRC = $(ACPI_BUILD_DIR)/dsdt_anycpu.c $(ACPI_BUILD_DIR)/dsdt_15cpu.c
C_SRC += $(ACPI_BUILD_DIR)/dsdt_anycpu_qemu_xen.c $(ACPI_BUILD_DIR)/dsdt_pvh.c
+C_SRC += $(ACPI_BUILD_DIR)/dsdt_anycpu_arm.c
H_SRC = $(ACPI_BUILD_DIR)/ssdt_s3.h $(ACPI_BUILD_DIR)/ssdt_s4.h $(ACPI_BUILD_DIR)/ssdt_pm.h $(ACPI_BUILD_DIR)/ssdt_tpm.h
vpath iasl $(PATH)
@@ -35,7 +36,7 @@ $(H_SRC): $(ACPI_BUILD_DIR)/%.h: %.asl iasl
cd $(CURDIR)
$(MK_DSDT): mk_dsdt.c
- $(HOSTCC) $(HOSTCFLAGS) $(CFLAGS_xeninclude) -o $@ mk_dsdt.c
+ $(HOSTCC) $(HOSTCFLAGS) $(CFLAGS_xeninclude) -D__XEN_TOOLS__ -o $@ mk_dsdt.c
$(ACPI_BUILD_DIR)/dsdt_anycpu_qemu_xen.asl: dsdt.asl dsdt_acpi_info.asl $(MK_DSDT)
awk 'NR > 1 {print s} {s=$$0}' $< > $@
@@ -69,6 +70,18 @@ $(ACPI_BUILD_DIR)/dsdt_pvh.c: iasl $(ACPI_BUILD_DIR)/dsdt_pvh.asl
rm -f $*.aml $*.hex
cd $(CURDIR)
+$(ACPI_BUILD_DIR)/dsdt_anycpu_arm.asl: $(MK_DSDT)
+ printf "DefinitionBlock (\"DSDT.aml\", \"DSDT\", 3, \"XenARM\", \"Xen DSDT\", 1)\n{" > $@
+ $(MK_DSDT) --debug=$(debug) --arch arm >> $@
+
+$(ACPI_BUILD_DIR)/dsdt_anycpu_arm.c: iasl $(ACPI_BUILD_DIR)/dsdt_anycpu_arm.asl
+ cd $(ACPI_BUILD_DIR)
+ iasl -vs -p $* -tc $(ACPI_BUILD_DIR)/$*.asl
+ sed -e 's/AmlCode/$*/g' $*.hex >$@
+ echo "int $*_len=sizeof($*);" >>$@
+ rm -f $*.aml $*.hex
+ cd $(CURDIR)
+
iasl:
@echo
@echo "ACPI ASL compiler (iasl) is needed"
@@ -6,6 +6,7 @@
#include <stdlib.h>
#include <stdbool.h>
#include <xen/hvm/hvm_info_table.h>
+#include <xen/arch-arm.h>
static unsigned int indent_level;
static bool debug = false;
@@ -87,6 +88,7 @@ static struct option options[] = {
{ "dm-version", 1, 0, 'q' },
{ "debug", 1, 0, 'd' },
{ "no-dm", 0, 0, 'n' },
+ { "arch", 1, 0, 'a' },
{ 0, 0, 0, 0 }
};
@@ -94,7 +96,7 @@ int main(int argc, char **argv)
{
unsigned int slot, dev, intx, link, cpu, max_cpus = HVM_MAX_VCPUS;
dm_version dm_version = QEMU_XEN_TRADITIONAL;
- bool no_dm = 0;
+ bool no_dm = 0, arch_is_arm = false;
for ( ; ; )
{
@@ -133,6 +135,10 @@ int main(int argc, char **argv)
case 'n':
no_dm = 1;
break;
+ case 'a':
+ if (strcmp(optarg, "arm") == 0)
+ arch_is_arm = true;
+ break;
case 'd':
if (*optarg == 'y')
debug = true;
@@ -142,6 +148,9 @@ int main(int argc, char **argv)
}
}
+ if (arch_is_arm)
+ max_cpus = GUEST_MAX_VCPUS;
+
/**** DSDT DefinitionBlock start ****/
/* (we append to existing DSDT definition block) */
indent_level++;
@@ -149,19 +158,21 @@ int main(int argc, char **argv)
/**** Processor start ****/
push_block("Scope", "\\_SB");
- /* MADT checksum */
- stmt("OperationRegion", "MSUM, SystemMemory, \\_SB.MSUA, 1");
- push_block("Field", "MSUM, ByteAcc, NoLock, Preserve");
- indent(); printf("MSU, 8\n");
- pop_block();
+ if (!arch_is_arm) {
+ /* MADT checksum */
+ stmt("OperationRegion", "MSUM, SystemMemory, \\_SB.MSUA, 1");
+ push_block("Field", "MSUM, ByteAcc, NoLock, Preserve");
+ indent(); printf("MSU, 8\n");
+ pop_block();
- /* Processor object helpers. */
- push_block("Method", "PMAT, 2");
- push_block("If", "LLess(Arg0, NCPU)");
- stmt("Return", "ToBuffer(Arg1)");
- pop_block();
- stmt("Return", "Buffer() {0, 8, 0xff, 0xff, 0, 0, 0, 0}");
- pop_block();
+ /* Processor object helpers. */
+ push_block("Method", "PMAT, 2");
+ push_block("If", "LLess(Arg0, NCPU)");
+ stmt("Return", "ToBuffer(Arg1)");
+ pop_block();
+ stmt("Return", "Buffer() {0, 8, 0xff, 0xff, 0, 0, 0, 0}");
+ pop_block();
+ }
/* Define processor objects and control methods. */
for ( cpu = 0; cpu < max_cpus; cpu++)
@@ -170,6 +181,12 @@ int main(int argc, char **argv)
stmt("Name", "_HID, \"ACPI0007\"");
+ if (arch_is_arm) {
+ stmt("Name", "_UID, %d", cpu);
+ pop_block();
+ continue;
+ }
+
/* Name this processor's MADT LAPIC descriptor. */
stmt("OperationRegion",
"MATR, SystemMemory, Add(\\_SB.MAPA, %d), 8", cpu*8);
@@ -208,6 +225,14 @@ int main(int argc, char **argv)
pop_block();
}
+ if (arch_is_arm) {
+ pop_block();
+ /**** Processor end ****/
+ pop_block();
+ /**** DSDT DefinitionBlock end ****/
+ return 0;
+ }
+
/* Operation Region 'PRST': bitmask of online CPUs. */
stmt("OperationRegion", "PRST, SystemIO, 0xaf00, 32");
push_block("Field", "PRST, ByteAcc, NoLock, Preserve");
@@ -91,7 +91,10 @@ acpi:
LIBXL_OBJS-$(CONFIG_X86) += libxl_cpuid.o libxl_x86.o libxl_psr.o libxl_x86_acpi.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 dsdt_anycpu_arm.o
+
+dsdt_anycpu_arm.c:
+ $(MAKE) -C $(ACPI_PATH) ACPI_BUILD_DIR=$(shell pwd)
libxl_arm_acpi.o: libxl_arm_acpi.c
$(CC) -c $(CFLAGS) -I../../xen/include/ -o $@ libxl_arm_acpi.c
@@ -28,6 +28,11 @@ typedef uint64_t u64;
#include <acpi/acconfig.h>
#include <acpi/actbl.h>
+_hidden
+extern const unsigned char dsdt_anycpu_arm[];
+_hidden
+extern const int dsdt_anycpu_arm_len;
+
int libxl__prepare_acpi(libxl__gc *gc, libxl_domain_build_info *info,
libxl__domain_build_state *state,
struct xc_dom_image *dom)
@@ -431,6 +431,9 @@ typedef uint64_t xen_callback_t;
#define GUEST_RAM_BANK_BASES { GUEST_RAM0_BASE, GUEST_RAM1_BASE }
#define GUEST_RAM_BANK_SIZES { GUEST_RAM0_SIZE, GUEST_RAM1_SIZE }
+/* Current supported guest VCPUs */
+#define GUEST_MAX_VCPUS 128
+
/* Interrupts */
#define GUEST_TIMER_VIRT_PPI 27
#define GUEST_TIMER_PHYS_S_PPI 29