Message ID | 1467688367-17320-6-git-send-email-zhaoshenglong@huawei.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Tue, Jul 05, 2016 at 11:12:35AM +0800, Shannon Zhao wrote: > From: Shannon Zhao <shannon.zhao@linaro.org> > > It uses static DSDT table like the way x86 uses. Currently the DSDT > table only contains processor device objects and it generates the > maximal objects which so far is 128. > > Signed-off-by: Shannon Zhao <shannon.zhao@linaro.org> > --- > tools/libacpi/Makefile | 15 ++++++++++++- > tools/libacpi/mk_dsdt.c | 51 ++++++++++++++++++++++++++++++++----------- > tools/libxl/Makefile | 5 ++++- > tools/libxl/libxl_arm_acpi.c | 5 +++++ > xen/include/public/arch-arm.h | 3 +++ > 5 files changed, 64 insertions(+), 15 deletions(-) > > diff --git a/tools/libacpi/Makefile b/tools/libacpi/Makefile > index 4068d9a..0401810 100644 > --- a/tools/libacpi/Makefile > +++ b/tools/libacpi/Makefile > @@ -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 Why is this needed? Which unstable hypervisor interface you need in order to build this? Wei.
On 2016/7/7 23:52, Wei Liu wrote: > On Tue, Jul 05, 2016 at 11:12:35AM +0800, Shannon Zhao wrote: >> > From: Shannon Zhao <shannon.zhao@linaro.org> >> > >> > It uses static DSDT table like the way x86 uses. Currently the DSDT >> > table only contains processor device objects and it generates the >> > maximal objects which so far is 128. >> > >> > Signed-off-by: Shannon Zhao <shannon.zhao@linaro.org> >> > --- >> > tools/libacpi/Makefile | 15 ++++++++++++- >> > tools/libacpi/mk_dsdt.c | 51 ++++++++++++++++++++++++++++++++----------- >> > tools/libxl/Makefile | 5 ++++- >> > tools/libxl/libxl_arm_acpi.c | 5 +++++ >> > xen/include/public/arch-arm.h | 3 +++ >> > 5 files changed, 64 insertions(+), 15 deletions(-) >> > >> > diff --git a/tools/libacpi/Makefile b/tools/libacpi/Makefile >> > index 4068d9a..0401810 100644 >> > --- a/tools/libacpi/Makefile >> > +++ b/tools/libacpi/Makefile >> > @@ -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 > Why is this needed? Which unstable hypervisor interface you need in > order to build this? It needs GUEST_MAX_VCPUS in mk_dsdt.c while the GUEST_MAX_VCPUS is defined under #if defined(__XEN__) || defined(__XEN_TOOLS__) in xen/include/public/arch-arm.h Thanks,
On Tue, Jul 12, 2016 at 11:50:32AM +0800, Shannon Zhao wrote: > > > On 2016/7/7 23:52, Wei Liu wrote: > > On Tue, Jul 05, 2016 at 11:12:35AM +0800, Shannon Zhao wrote: > >> > From: Shannon Zhao <shannon.zhao@linaro.org> > >> > > >> > It uses static DSDT table like the way x86 uses. Currently the DSDT > >> > table only contains processor device objects and it generates the > >> > maximal objects which so far is 128. > >> > > >> > Signed-off-by: Shannon Zhao <shannon.zhao@linaro.org> > >> > --- > >> > tools/libacpi/Makefile | 15 ++++++++++++- > >> > tools/libacpi/mk_dsdt.c | 51 ++++++++++++++++++++++++++++++++----------- > >> > tools/libxl/Makefile | 5 ++++- > >> > tools/libxl/libxl_arm_acpi.c | 5 +++++ > >> > xen/include/public/arch-arm.h | 3 +++ > >> > 5 files changed, 64 insertions(+), 15 deletions(-) > >> > > >> > diff --git a/tools/libacpi/Makefile b/tools/libacpi/Makefile > >> > index 4068d9a..0401810 100644 > >> > --- a/tools/libacpi/Makefile > >> > +++ b/tools/libacpi/Makefile > >> > @@ -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 > > Why is this needed? Which unstable hypervisor interface you need in > > order to build this? > It needs GUEST_MAX_VCPUS in mk_dsdt.c while the GUEST_MAX_VCPUS is > defined under #if defined(__XEN__) || defined(__XEN_TOOLS__) in > xen/include/public/arch-arm.h > OK. Let me elaborate a bit on this. The two macros basically imply everything enclosed in them is subject to change. I guess I can live with this because this is not a public facing interface for library users. Can you ack or nack my assessment? Wei. > Thanks, > -- > Shannon >
On 2016年07月12日 19:38, Wei Liu wrote: > On Tue, Jul 12, 2016 at 11:50:32AM +0800, Shannon Zhao wrote: >> > >> > >> > On 2016/7/7 23:52, Wei Liu wrote: >>> > > On Tue, Jul 05, 2016 at 11:12:35AM +0800, Shannon Zhao wrote: >>>>> > >> > From: Shannon Zhao <shannon.zhao@linaro.org> >>>>> > >> > >>>>> > >> > It uses static DSDT table like the way x86 uses. Currently the DSDT >>>>> > >> > table only contains processor device objects and it generates the >>>>> > >> > maximal objects which so far is 128. >>>>> > >> > >>>>> > >> > Signed-off-by: Shannon Zhao <shannon.zhao@linaro.org> >>>>> > >> > --- >>>>> > >> > tools/libacpi/Makefile | 15 ++++++++++++- >>>>> > >> > tools/libacpi/mk_dsdt.c | 51 ++++++++++++++++++++++++++++++++----------- >>>>> > >> > tools/libxl/Makefile | 5 ++++- >>>>> > >> > tools/libxl/libxl_arm_acpi.c | 5 +++++ >>>>> > >> > xen/include/public/arch-arm.h | 3 +++ >>>>> > >> > 5 files changed, 64 insertions(+), 15 deletions(-) >>>>> > >> > >>>>> > >> > diff --git a/tools/libacpi/Makefile b/tools/libacpi/Makefile >>>>> > >> > index 4068d9a..0401810 100644 >>>>> > >> > --- a/tools/libacpi/Makefile >>>>> > >> > +++ b/tools/libacpi/Makefile >>>>> > >> > @@ -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 >>> > > Why is this needed? Which unstable hypervisor interface you need in >>> > > order to build this? >> > It needs GUEST_MAX_VCPUS in mk_dsdt.c while the GUEST_MAX_VCPUS is >> > defined under #if defined(__XEN__) || defined(__XEN_TOOLS__) in >> > xen/include/public/arch-arm.h >> > > OK. Let me elaborate a bit on this. > > The two macros basically imply everything enclosed in them is subject to > change. I guess I can live with this because this is not a public facing > interface for library users. > > Can you ack or nack my assessment? Yeah, the mk_dsdt is just a middle result of compilation which is used to generate DSDT table. Thanks,
diff --git a/tools/libacpi/Makefile b/tools/libacpi/Makefile index 4068d9a..0401810 100644 --- a/tools/libacpi/Makefile +++ b/tools/libacpi/Makefile @@ -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" diff --git a/tools/libacpi/mk_dsdt.c b/tools/libacpi/mk_dsdt.c index 1322510..1d3ed0f 100644 --- a/tools/libacpi/mk_dsdt.c +++ b/tools/libacpi/mk_dsdt.c @@ -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"); diff --git a/tools/libxl/Makefile b/tools/libxl/Makefile index 88ab4d2..a398c8e 100644 --- a/tools/libxl/Makefile +++ b/tools/libxl/Makefile @@ -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 diff --git a/tools/libxl/libxl_arm_acpi.c b/tools/libxl/libxl_arm_acpi.c index 8c273f9..d1c066d 100644 --- a/tools/libxl/libxl_arm_acpi.c +++ b/tools/libxl/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) diff --git a/xen/include/public/arch-arm.h b/xen/include/public/arch-arm.h index 870bc3b..4a49254 100644 --- a/xen/include/public/arch-arm.h +++ b/xen/include/public/arch-arm.h @@ -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