Message ID | 1453540813-15764-6-git-send-email-zhaoshenglong@huawei.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Sat, 23 Jan 2016, Shannon Zhao wrote: > From: Shannon Zhao <shannon.zhao@linaro.org> > > acpi_boot_table_init() will be called in start_xen to get the RSDP and > all the table pointers. With this patch, we can get ACPI boot-time > tables from firmware on ARM64. > > Signed-off-by: Naresh Bhat <naresh.bhat@linaro.org> > Signed-off-by: Parth Dixit <parth.dixit@linaro.org> > Signed-off-by: Shannon Zhao <shannon.zhao@linaro.org> > --- > xen/arch/arm/acpi/Makefile | 1 + > xen/arch/arm/acpi/boot.c | 58 ++++++++++++++++++++++++++++++++++++++++++++++ > xen/arch/arm/setup.c | 4 ++++ > 3 files changed, 63 insertions(+) > create mode 100644 xen/arch/arm/acpi/boot.c > > diff --git a/xen/arch/arm/acpi/Makefile b/xen/arch/arm/acpi/Makefile > index b5be22d..196c40a 100644 > --- a/xen/arch/arm/acpi/Makefile > +++ b/xen/arch/arm/acpi/Makefile > @@ -1 +1,2 @@ > obj-y += lib.o > +obj-y += boot.o > diff --git a/xen/arch/arm/acpi/boot.c b/xen/arch/arm/acpi/boot.c > new file mode 100644 > index 0000000..1570f7e > --- /dev/null > +++ b/xen/arch/arm/acpi/boot.c > @@ -0,0 +1,58 @@ > +/* > + * ARM Specific Low-Level ACPI Boot Support > + * > + * Copyright (C) 2001, 2002 Paul Diefenbaugh <paul.s.diefenbaugh@intel.com> > + * Copyright (C) 2001 Jun Nakajima <jun.nakajima@intel.com> > + * Copyright (C) 2014, Naresh Bhat <naresh.bhat@linaro.org> > + * Copyright (C) 2015, Shannon Zhao <shannon.zhao@linaro.org> > + * > + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ > + * > + * This program is free software; you can redistribute it and/or modify > + * it under the terms of the GNU General Public License as published by > + * the Free Software Foundation; either version 2 of the License, or > + * (at your option) any later version. > + * > + * This program is distributed in the hope that 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, write to the Free Software > + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA > + * > + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ > + */ > + > +#include <xen/init.h> > +#include <xen/acpi.h> > + > +#include <asm/acpi.h> > + > +/* > + * acpi_boot_table_init() called from setup_arch(), always. > + * 1. find RSDP and get its address, and then find XSDT > + * 2. extract all tables and checksums them all > + * > + * return value: (currently ignored) > + * 0: success > + * !0: failure > + * > + * We can parse ACPI boot-time tables such as FADT, MADT after > + * this function is called. > + */ > +int __init acpi_boot_table_init(void) > +{ > + int error; > + > + /* Initialize the ACPI boot-time table parser. */ > + error = acpi_table_init(); > + if ( error ) > + { > + disable_acpi(); > + return error; > + } > + > + return 0; > +} > diff --git a/xen/arch/arm/setup.c b/xen/arch/arm/setup.c > index 0ba601e..c15a09d 100644 > --- a/xen/arch/arm/setup.c > +++ b/xen/arch/arm/setup.c > @@ -36,6 +36,7 @@ > #include <xen/pfn.h> > #include <xen/vmap.h> > #include <xen/libfdt/libfdt.h> > +#include <xen/acpi.h> > #include <asm/page.h> > #include <asm/current.h> > #include <asm/setup.h> > @@ -749,6 +750,9 @@ void __init start_xen(unsigned long boot_phys_offset, > > setup_mm(fdt_paddr, fdt_size); > > + /* Parse the ACPI tables for possible boot-time configuration */ > + acpi_boot_table_init(); As I asked before, why do you need to call acpi_boot_table_init() before vm_init? If you called acpi_boot_table_init() after vm_init(), you could implement __acpi_map_table with vmap, which would be better. > end_boot_allocator(); > > vm_init(); > -- > 2.0.4 > >
On 2016/1/27 22:54, Stefano Stabellini wrote: > On Sat, 23 Jan 2016, Shannon Zhao wrote: >> > From: Shannon Zhao <shannon.zhao@linaro.org> >> > >> > acpi_boot_table_init() will be called in start_xen to get the RSDP and >> > all the table pointers. With this patch, we can get ACPI boot-time >> > tables from firmware on ARM64. >> > >> > Signed-off-by: Naresh Bhat <naresh.bhat@linaro.org> >> > Signed-off-by: Parth Dixit <parth.dixit@linaro.org> >> > Signed-off-by: Shannon Zhao <shannon.zhao@linaro.org> >> > --- >> > xen/arch/arm/acpi/Makefile | 1 + >> > xen/arch/arm/acpi/boot.c | 58 ++++++++++++++++++++++++++++++++++++++++++++++ >> > xen/arch/arm/setup.c | 4 ++++ >> > 3 files changed, 63 insertions(+) >> > create mode 100644 xen/arch/arm/acpi/boot.c >> > >> > diff --git a/xen/arch/arm/acpi/Makefile b/xen/arch/arm/acpi/Makefile >> > index b5be22d..196c40a 100644 >> > --- a/xen/arch/arm/acpi/Makefile >> > +++ b/xen/arch/arm/acpi/Makefile >> > @@ -1 +1,2 @@ >> > obj-y += lib.o >> > +obj-y += boot.o >> > diff --git a/xen/arch/arm/acpi/boot.c b/xen/arch/arm/acpi/boot.c >> > new file mode 100644 >> > index 0000000..1570f7e >> > --- /dev/null >> > +++ b/xen/arch/arm/acpi/boot.c >> > @@ -0,0 +1,58 @@ >> > +/* >> > + * ARM Specific Low-Level ACPI Boot Support >> > + * >> > + * Copyright (C) 2001, 2002 Paul Diefenbaugh <paul.s.diefenbaugh@intel.com> >> > + * Copyright (C) 2001 Jun Nakajima <jun.nakajima@intel.com> >> > + * Copyright (C) 2014, Naresh Bhat <naresh.bhat@linaro.org> >> > + * Copyright (C) 2015, Shannon Zhao <shannon.zhao@linaro.org> >> > + * >> > + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ >> > + * >> > + * This program is free software; you can redistribute it and/or modify >> > + * it under the terms of the GNU General Public License as published by >> > + * the Free Software Foundation; either version 2 of the License, or >> > + * (at your option) any later version. >> > + * >> > + * This program is distributed in the hope that 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, write to the Free Software >> > + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA >> > + * >> > + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ >> > + */ >> > + >> > +#include <xen/init.h> >> > +#include <xen/acpi.h> >> > + >> > +#include <asm/acpi.h> >> > + >> > +/* >> > + * acpi_boot_table_init() called from setup_arch(), always. >> > + * 1. find RSDP and get its address, and then find XSDT >> > + * 2. extract all tables and checksums them all >> > + * >> > + * return value: (currently ignored) >> > + * 0: success >> > + * !0: failure >> > + * >> > + * We can parse ACPI boot-time tables such as FADT, MADT after >> > + * this function is called. >> > + */ >> > +int __init acpi_boot_table_init(void) >> > +{ >> > + int error; >> > + >> > + /* Initialize the ACPI boot-time table parser. */ >> > + error = acpi_table_init(); >> > + if ( error ) >> > + { >> > + disable_acpi(); >> > + return error; >> > + } >> > + >> > + return 0; >> > +} >> > diff --git a/xen/arch/arm/setup.c b/xen/arch/arm/setup.c >> > index 0ba601e..c15a09d 100644 >> > --- a/xen/arch/arm/setup.c >> > +++ b/xen/arch/arm/setup.c >> > @@ -36,6 +36,7 @@ >> > #include <xen/pfn.h> >> > #include <xen/vmap.h> >> > #include <xen/libfdt/libfdt.h> >> > +#include <xen/acpi.h> >> > #include <asm/page.h> >> > #include <asm/current.h> >> > #include <asm/setup.h> >> > @@ -749,6 +750,9 @@ void __init start_xen(unsigned long boot_phys_offset, >> > >> > setup_mm(fdt_paddr, fdt_size); >> > >> > + /* Parse the ACPI tables for possible boot-time configuration */ >> > + acpi_boot_table_init(); > As I asked before, why do you need to call acpi_boot_table_init() before > vm_init? If you called acpi_boot_table_init() after vm_init(), you > could implement __acpi_map_table with vmap, which would be better. > Yes, if we call acpi_boot_table_init() before vm_init, it needs to move end_boot_allocator after acpi_boot_table_init because it will assert in acpi_os_zalloc_memory. TBH, I'm not sure where acpi_boot_table_init should be called. The current way refers to x86. Thanks,
On Thu, 28 Jan 2016, Shannon Zhao wrote: > On 2016/1/27 22:54, Stefano Stabellini wrote: > > On Sat, 23 Jan 2016, Shannon Zhao wrote: > >> > From: Shannon Zhao <shannon.zhao@linaro.org> > >> > > >> > acpi_boot_table_init() will be called in start_xen to get the RSDP and > >> > all the table pointers. With this patch, we can get ACPI boot-time > >> > tables from firmware on ARM64. > >> > > >> > Signed-off-by: Naresh Bhat <naresh.bhat@linaro.org> > >> > Signed-off-by: Parth Dixit <parth.dixit@linaro.org> > >> > Signed-off-by: Shannon Zhao <shannon.zhao@linaro.org> > >> > --- > >> > xen/arch/arm/acpi/Makefile | 1 + > >> > xen/arch/arm/acpi/boot.c | 58 ++++++++++++++++++++++++++++++++++++++++++++++ > >> > xen/arch/arm/setup.c | 4 ++++ > >> > 3 files changed, 63 insertions(+) > >> > create mode 100644 xen/arch/arm/acpi/boot.c > >> > > >> > diff --git a/xen/arch/arm/acpi/Makefile b/xen/arch/arm/acpi/Makefile > >> > index b5be22d..196c40a 100644 > >> > --- a/xen/arch/arm/acpi/Makefile > >> > +++ b/xen/arch/arm/acpi/Makefile > >> > @@ -1 +1,2 @@ > >> > obj-y += lib.o > >> > +obj-y += boot.o > >> > diff --git a/xen/arch/arm/acpi/boot.c b/xen/arch/arm/acpi/boot.c > >> > new file mode 100644 > >> > index 0000000..1570f7e > >> > --- /dev/null > >> > +++ b/xen/arch/arm/acpi/boot.c > >> > @@ -0,0 +1,58 @@ > >> > +/* > >> > + * ARM Specific Low-Level ACPI Boot Support > >> > + * > >> > + * Copyright (C) 2001, 2002 Paul Diefenbaugh <paul.s.diefenbaugh@intel.com> > >> > + * Copyright (C) 2001 Jun Nakajima <jun.nakajima@intel.com> > >> > + * Copyright (C) 2014, Naresh Bhat <naresh.bhat@linaro.org> > >> > + * Copyright (C) 2015, Shannon Zhao <shannon.zhao@linaro.org> > >> > + * > >> > + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ > >> > + * > >> > + * This program is free software; you can redistribute it and/or modify > >> > + * it under the terms of the GNU General Public License as published by > >> > + * the Free Software Foundation; either version 2 of the License, or > >> > + * (at your option) any later version. > >> > + * > >> > + * This program is distributed in the hope that 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, write to the Free Software > >> > + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA > >> > + * > >> > + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ > >> > + */ > >> > + > >> > +#include <xen/init.h> > >> > +#include <xen/acpi.h> > >> > + > >> > +#include <asm/acpi.h> > >> > + > >> > +/* > >> > + * acpi_boot_table_init() called from setup_arch(), always. > >> > + * 1. find RSDP and get its address, and then find XSDT > >> > + * 2. extract all tables and checksums them all > >> > + * > >> > + * return value: (currently ignored) > >> > + * 0: success > >> > + * !0: failure > >> > + * > >> > + * We can parse ACPI boot-time tables such as FADT, MADT after > >> > + * this function is called. > >> > + */ > >> > +int __init acpi_boot_table_init(void) > >> > +{ > >> > + int error; > >> > + > >> > + /* Initialize the ACPI boot-time table parser. */ > >> > + error = acpi_table_init(); > >> > + if ( error ) > >> > + { > >> > + disable_acpi(); > >> > + return error; > >> > + } > >> > + > >> > + return 0; > >> > +} > >> > diff --git a/xen/arch/arm/setup.c b/xen/arch/arm/setup.c > >> > index 0ba601e..c15a09d 100644 > >> > --- a/xen/arch/arm/setup.c > >> > +++ b/xen/arch/arm/setup.c > >> > @@ -36,6 +36,7 @@ > >> > #include <xen/pfn.h> > >> > #include <xen/vmap.h> > >> > #include <xen/libfdt/libfdt.h> > >> > +#include <xen/acpi.h> > >> > #include <asm/page.h> > >> > #include <asm/current.h> > >> > #include <asm/setup.h> > >> > @@ -749,6 +750,9 @@ void __init start_xen(unsigned long boot_phys_offset, > >> > > >> > setup_mm(fdt_paddr, fdt_size); > >> > > >> > + /* Parse the ACPI tables for possible boot-time configuration */ > >> > + acpi_boot_table_init(); > > As I asked before, why do you need to call acpi_boot_table_init() before > > vm_init? If you called acpi_boot_table_init() after vm_init(), you > > could implement __acpi_map_table with vmap, which would be better. > > > Yes, if we call acpi_boot_table_init() before vm_init, it needs to move > end_boot_allocator after acpi_boot_table_init because it will assert in > acpi_os_zalloc_memory. Why does acpi_os_zalloc_memory assert exactly? > TBH, I'm not sure where acpi_boot_table_init should be called. The > current way refers to x86.
On 2016/1/28 18:44, Stefano Stabellini wrote: > On Thu, 28 Jan 2016, Shannon Zhao wrote: >> > On 2016/1/27 22:54, Stefano Stabellini wrote: >>> > > On Sat, 23 Jan 2016, Shannon Zhao wrote: >>>>> > >> > From: Shannon Zhao <shannon.zhao@linaro.org> >>>>> > >> > >>>>> > >> > acpi_boot_table_init() will be called in start_xen to get the RSDP and >>>>> > >> > all the table pointers. With this patch, we can get ACPI boot-time >>>>> > >> > tables from firmware on ARM64. >>>>> > >> > >>>>> > >> > Signed-off-by: Naresh Bhat <naresh.bhat@linaro.org> >>>>> > >> > Signed-off-by: Parth Dixit <parth.dixit@linaro.org> >>>>> > >> > Signed-off-by: Shannon Zhao <shannon.zhao@linaro.org> >>>>> > >> > --- >>>>> > >> > xen/arch/arm/acpi/Makefile | 1 + >>>>> > >> > xen/arch/arm/acpi/boot.c | 58 ++++++++++++++++++++++++++++++++++++++++++++++ >>>>> > >> > xen/arch/arm/setup.c | 4 ++++ >>>>> > >> > 3 files changed, 63 insertions(+) >>>>> > >> > create mode 100644 xen/arch/arm/acpi/boot.c >>>>> > >> > >>>>> > >> > diff --git a/xen/arch/arm/acpi/Makefile b/xen/arch/arm/acpi/Makefile >>>>> > >> > index b5be22d..196c40a 100644 >>>>> > >> > --- a/xen/arch/arm/acpi/Makefile >>>>> > >> > +++ b/xen/arch/arm/acpi/Makefile >>>>> > >> > @@ -1 +1,2 @@ >>>>> > >> > obj-y += lib.o >>>>> > >> > +obj-y += boot.o >>>>> > >> > diff --git a/xen/arch/arm/acpi/boot.c b/xen/arch/arm/acpi/boot.c >>>>> > >> > new file mode 100644 >>>>> > >> > index 0000000..1570f7e >>>>> > >> > --- /dev/null >>>>> > >> > +++ b/xen/arch/arm/acpi/boot.c >>>>> > >> > @@ -0,0 +1,58 @@ >>>>> > >> > +/* >>>>> > >> > + * ARM Specific Low-Level ACPI Boot Support >>>>> > >> > + * >>>>> > >> > + * Copyright (C) 2001, 2002 Paul Diefenbaugh <paul.s.diefenbaugh@intel.com> >>>>> > >> > + * Copyright (C) 2001 Jun Nakajima <jun.nakajima@intel.com> >>>>> > >> > + * Copyright (C) 2014, Naresh Bhat <naresh.bhat@linaro.org> >>>>> > >> > + * Copyright (C) 2015, Shannon Zhao <shannon.zhao@linaro.org> >>>>> > >> > + * >>>>> > >> > + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ >>>>> > >> > + * >>>>> > >> > + * This program is free software; you can redistribute it and/or modify >>>>> > >> > + * it under the terms of the GNU General Public License as published by >>>>> > >> > + * the Free Software Foundation; either version 2 of the License, or >>>>> > >> > + * (at your option) any later version. >>>>> > >> > + * >>>>> > >> > + * This program is distributed in the hope that 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, write to the Free Software >>>>> > >> > + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA >>>>> > >> > + * >>>>> > >> > + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ >>>>> > >> > + */ >>>>> > >> > + >>>>> > >> > +#include <xen/init.h> >>>>> > >> > +#include <xen/acpi.h> >>>>> > >> > + >>>>> > >> > +#include <asm/acpi.h> >>>>> > >> > + >>>>> > >> > +/* >>>>> > >> > + * acpi_boot_table_init() called from setup_arch(), always. >>>>> > >> > + * 1. find RSDP and get its address, and then find XSDT >>>>> > >> > + * 2. extract all tables and checksums them all >>>>> > >> > + * >>>>> > >> > + * return value: (currently ignored) >>>>> > >> > + * 0: success >>>>> > >> > + * !0: failure >>>>> > >> > + * >>>>> > >> > + * We can parse ACPI boot-time tables such as FADT, MADT after >>>>> > >> > + * this function is called. >>>>> > >> > + */ >>>>> > >> > +int __init acpi_boot_table_init(void) >>>>> > >> > +{ >>>>> > >> > + int error; >>>>> > >> > + >>>>> > >> > + /* Initialize the ACPI boot-time table parser. */ >>>>> > >> > + error = acpi_table_init(); >>>>> > >> > + if ( error ) >>>>> > >> > + { >>>>> > >> > + disable_acpi(); >>>>> > >> > + return error; >>>>> > >> > + } >>>>> > >> > + >>>>> > >> > + return 0; >>>>> > >> > +} >>>>> > >> > diff --git a/xen/arch/arm/setup.c b/xen/arch/arm/setup.c >>>>> > >> > index 0ba601e..c15a09d 100644 >>>>> > >> > --- a/xen/arch/arm/setup.c >>>>> > >> > +++ b/xen/arch/arm/setup.c >>>>> > >> > @@ -36,6 +36,7 @@ >>>>> > >> > #include <xen/pfn.h> >>>>> > >> > #include <xen/vmap.h> >>>>> > >> > #include <xen/libfdt/libfdt.h> >>>>> > >> > +#include <xen/acpi.h> >>>>> > >> > #include <asm/page.h> >>>>> > >> > #include <asm/current.h> >>>>> > >> > #include <asm/setup.h> >>>>> > >> > @@ -749,6 +750,9 @@ void __init start_xen(unsigned long boot_phys_offset, >>>>> > >> > >>>>> > >> > setup_mm(fdt_paddr, fdt_size); >>>>> > >> > >>>>> > >> > + /* Parse the ACPI tables for possible boot-time configuration */ >>>>> > >> > + acpi_boot_table_init(); >>> > > As I asked before, why do you need to call acpi_boot_table_init() before >>> > > vm_init? If you called acpi_boot_table_init() after vm_init(), you >>> > > could implement __acpi_map_table with vmap, which would be better. >>> > > >> > Yes, if we call acpi_boot_table_init() before vm_init, it needs to move >> > end_boot_allocator after acpi_boot_table_init because it will assert in >> > acpi_os_zalloc_memory. > Why does acpi_os_zalloc_memory assert exactly? > If call acpi_boot_table_init after end_boot_allocator, system_state != SYS_STATE_early_boot, acpi_os_zalloc_memory will call xzalloc_bytes to malloc memory but vm_init is not called, so the ASSERT(!ptr || is_xmalloc_memory(ptr)) will occurs. void *__init acpi_os_zalloc_memory(size_t sz) { void *ptr; if (system_state != SYS_STATE_early_boot) { ptr = xzalloc_bytes(sz); ASSERT(!ptr || is_xmalloc_memory(ptr)); return ptr; } ptr = acpi_os_alloc_memory(sz); return ptr ? memset(ptr, 0, sz) : NULL; }
On Thu, 28 Jan 2016, Shannon Zhao wrote: > On 2016/1/28 18:44, Stefano Stabellini wrote: > > On Thu, 28 Jan 2016, Shannon Zhao wrote: > >> > On 2016/1/27 22:54, Stefano Stabellini wrote: > >>> > > On Sat, 23 Jan 2016, Shannon Zhao wrote: > >>>>> > >> > From: Shannon Zhao <shannon.zhao@linaro.org> > >>>>> > >> > > >>>>> > >> > acpi_boot_table_init() will be called in start_xen to get the RSDP and > >>>>> > >> > all the table pointers. With this patch, we can get ACPI boot-time > >>>>> > >> > tables from firmware on ARM64. > >>>>> > >> > > >>>>> > >> > Signed-off-by: Naresh Bhat <naresh.bhat@linaro.org> > >>>>> > >> > Signed-off-by: Parth Dixit <parth.dixit@linaro.org> > >>>>> > >> > Signed-off-by: Shannon Zhao <shannon.zhao@linaro.org> > >>>>> > >> > --- > >>>>> > >> > xen/arch/arm/acpi/Makefile | 1 + > >>>>> > >> > xen/arch/arm/acpi/boot.c | 58 ++++++++++++++++++++++++++++++++++++++++++++++ > >>>>> > >> > xen/arch/arm/setup.c | 4 ++++ > >>>>> > >> > 3 files changed, 63 insertions(+) > >>>>> > >> > create mode 100644 xen/arch/arm/acpi/boot.c > >>>>> > >> > > >>>>> > >> > diff --git a/xen/arch/arm/acpi/Makefile b/xen/arch/arm/acpi/Makefile > >>>>> > >> > index b5be22d..196c40a 100644 > >>>>> > >> > --- a/xen/arch/arm/acpi/Makefile > >>>>> > >> > +++ b/xen/arch/arm/acpi/Makefile > >>>>> > >> > @@ -1 +1,2 @@ > >>>>> > >> > obj-y += lib.o > >>>>> > >> > +obj-y += boot.o > >>>>> > >> > diff --git a/xen/arch/arm/acpi/boot.c b/xen/arch/arm/acpi/boot.c > >>>>> > >> > new file mode 100644 > >>>>> > >> > index 0000000..1570f7e > >>>>> > >> > --- /dev/null > >>>>> > >> > +++ b/xen/arch/arm/acpi/boot.c > >>>>> > >> > @@ -0,0 +1,58 @@ > >>>>> > >> > +/* > >>>>> > >> > + * ARM Specific Low-Level ACPI Boot Support > >>>>> > >> > + * > >>>>> > >> > + * Copyright (C) 2001, 2002 Paul Diefenbaugh <paul.s.diefenbaugh@intel.com> > >>>>> > >> > + * Copyright (C) 2001 Jun Nakajima <jun.nakajima@intel.com> > >>>>> > >> > + * Copyright (C) 2014, Naresh Bhat <naresh.bhat@linaro.org> > >>>>> > >> > + * Copyright (C) 2015, Shannon Zhao <shannon.zhao@linaro.org> > >>>>> > >> > + * > >>>>> > >> > + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ > >>>>> > >> > + * > >>>>> > >> > + * This program is free software; you can redistribute it and/or modify > >>>>> > >> > + * it under the terms of the GNU General Public License as published by > >>>>> > >> > + * the Free Software Foundation; either version 2 of the License, or > >>>>> > >> > + * (at your option) any later version. > >>>>> > >> > + * > >>>>> > >> > + * This program is distributed in the hope that 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, write to the Free Software > >>>>> > >> > + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA > >>>>> > >> > + * > >>>>> > >> > + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ > >>>>> > >> > + */ > >>>>> > >> > + > >>>>> > >> > +#include <xen/init.h> > >>>>> > >> > +#include <xen/acpi.h> > >>>>> > >> > + > >>>>> > >> > +#include <asm/acpi.h> > >>>>> > >> > + > >>>>> > >> > +/* > >>>>> > >> > + * acpi_boot_table_init() called from setup_arch(), always. > >>>>> > >> > + * 1. find RSDP and get its address, and then find XSDT > >>>>> > >> > + * 2. extract all tables and checksums them all > >>>>> > >> > + * > >>>>> > >> > + * return value: (currently ignored) > >>>>> > >> > + * 0: success > >>>>> > >> > + * !0: failure > >>>>> > >> > + * > >>>>> > >> > + * We can parse ACPI boot-time tables such as FADT, MADT after > >>>>> > >> > + * this function is called. > >>>>> > >> > + */ > >>>>> > >> > +int __init acpi_boot_table_init(void) > >>>>> > >> > +{ > >>>>> > >> > + int error; > >>>>> > >> > + > >>>>> > >> > + /* Initialize the ACPI boot-time table parser. */ > >>>>> > >> > + error = acpi_table_init(); > >>>>> > >> > + if ( error ) > >>>>> > >> > + { > >>>>> > >> > + disable_acpi(); > >>>>> > >> > + return error; > >>>>> > >> > + } > >>>>> > >> > + > >>>>> > >> > + return 0; > >>>>> > >> > +} > >>>>> > >> > diff --git a/xen/arch/arm/setup.c b/xen/arch/arm/setup.c > >>>>> > >> > index 0ba601e..c15a09d 100644 > >>>>> > >> > --- a/xen/arch/arm/setup.c > >>>>> > >> > +++ b/xen/arch/arm/setup.c > >>>>> > >> > @@ -36,6 +36,7 @@ > >>>>> > >> > #include <xen/pfn.h> > >>>>> > >> > #include <xen/vmap.h> > >>>>> > >> > #include <xen/libfdt/libfdt.h> > >>>>> > >> > +#include <xen/acpi.h> > >>>>> > >> > #include <asm/page.h> > >>>>> > >> > #include <asm/current.h> > >>>>> > >> > #include <asm/setup.h> > >>>>> > >> > @@ -749,6 +750,9 @@ void __init start_xen(unsigned long boot_phys_offset, > >>>>> > >> > > >>>>> > >> > setup_mm(fdt_paddr, fdt_size); > >>>>> > >> > > >>>>> > >> > + /* Parse the ACPI tables for possible boot-time configuration */ > >>>>> > >> > + acpi_boot_table_init(); > >>> > > As I asked before, why do you need to call acpi_boot_table_init() before > >>> > > vm_init? If you called acpi_boot_table_init() after vm_init(), you > >>> > > could implement __acpi_map_table with vmap, which would be better. > >>> > > > >> > Yes, if we call acpi_boot_table_init() before vm_init, it needs to move > >> > end_boot_allocator after acpi_boot_table_init because it will assert in > >> > acpi_os_zalloc_memory. > > Why does acpi_os_zalloc_memory assert exactly? > > > > If call acpi_boot_table_init after end_boot_allocator, system_state != > SYS_STATE_early_boot, Could you please point out where end_boot_allocator changes system_state? > acpi_os_zalloc_memory will call xzalloc_bytes to > malloc memory but vm_init is not called, so the ASSERT(!ptr || > is_xmalloc_memory(ptr)) will occurs. > > void *__init acpi_os_zalloc_memory(size_t sz) > { > void *ptr; > > if (system_state != SYS_STATE_early_boot) { > ptr = xzalloc_bytes(sz); > ASSERT(!ptr || is_xmalloc_memory(ptr)); > return ptr; > } > ptr = acpi_os_alloc_memory(sz); > return ptr ? memset(ptr, 0, sz) : NULL; > }
On 2016/1/28 19:27, Stefano Stabellini wrote: > On Thu, 28 Jan 2016, Shannon Zhao wrote: >> On 2016/1/28 18:44, Stefano Stabellini wrote: >>> On Thu, 28 Jan 2016, Shannon Zhao wrote: >>>>> On 2016/1/27 22:54, Stefano Stabellini wrote: >>>>>>> On Sat, 23 Jan 2016, Shannon Zhao wrote: >>>>>>>>>>> From: Shannon Zhao <shannon.zhao@linaro.org> >>>>>>>>>>> >>>>>>>>>>> acpi_boot_table_init() will be called in start_xen to get the RSDP and >>>>>>>>>>> all the table pointers. With this patch, we can get ACPI boot-time >>>>>>>>>>> tables from firmware on ARM64. >>>>>>>>>>> >>>>>>>>>>> Signed-off-by: Naresh Bhat <naresh.bhat@linaro.org> >>>>>>>>>>> Signed-off-by: Parth Dixit <parth.dixit@linaro.org> >>>>>>>>>>> Signed-off-by: Shannon Zhao <shannon.zhao@linaro.org> >>>>>>>>>>> --- >>>>>>>>>>> xen/arch/arm/acpi/Makefile | 1 + >>>>>>>>>>> xen/arch/arm/acpi/boot.c | 58 ++++++++++++++++++++++++++++++++++++++++++++++ >>>>>>>>>>> xen/arch/arm/setup.c | 4 ++++ >>>>>>>>>>> 3 files changed, 63 insertions(+) >>>>>>>>>>> create mode 100644 xen/arch/arm/acpi/boot.c >>>>>>>>>>> >>>>>>>>>>> diff --git a/xen/arch/arm/acpi/Makefile b/xen/arch/arm/acpi/Makefile >>>>>>>>>>> index b5be22d..196c40a 100644 >>>>>>>>>>> --- a/xen/arch/arm/acpi/Makefile >>>>>>>>>>> +++ b/xen/arch/arm/acpi/Makefile >>>>>>>>>>> @@ -1 +1,2 @@ >>>>>>>>>>> obj-y += lib.o >>>>>>>>>>> +obj-y += boot.o >>>>>>>>>>> diff --git a/xen/arch/arm/acpi/boot.c b/xen/arch/arm/acpi/boot.c >>>>>>>>>>> new file mode 100644 >>>>>>>>>>> index 0000000..1570f7e >>>>>>>>>>> --- /dev/null >>>>>>>>>>> +++ b/xen/arch/arm/acpi/boot.c >>>>>>>>>>> @@ -0,0 +1,58 @@ >>>>>>>>>>> +/* >>>>>>>>>>> + * ARM Specific Low-Level ACPI Boot Support >>>>>>>>>>> + * >>>>>>>>>>> + * Copyright (C) 2001, 2002 Paul Diefenbaugh <paul.s.diefenbaugh@intel.com> >>>>>>>>>>> + * Copyright (C) 2001 Jun Nakajima <jun.nakajima@intel.com> >>>>>>>>>>> + * Copyright (C) 2014, Naresh Bhat <naresh.bhat@linaro.org> >>>>>>>>>>> + * Copyright (C) 2015, Shannon Zhao <shannon.zhao@linaro.org> >>>>>>>>>>> + * >>>>>>>>>>> + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ >>>>>>>>>>> + * >>>>>>>>>>> + * This program is free software; you can redistribute it and/or modify >>>>>>>>>>> + * it under the terms of the GNU General Public License as published by >>>>>>>>>>> + * the Free Software Foundation; either version 2 of the License, or >>>>>>>>>>> + * (at your option) any later version. >>>>>>>>>>> + * >>>>>>>>>>> + * This program is distributed in the hope that 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, write to the Free Software >>>>>>>>>>> + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA >>>>>>>>>>> + * >>>>>>>>>>> + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ >>>>>>>>>>> + */ >>>>>>>>>>> + >>>>>>>>>>> +#include <xen/init.h> >>>>>>>>>>> +#include <xen/acpi.h> >>>>>>>>>>> + >>>>>>>>>>> +#include <asm/acpi.h> >>>>>>>>>>> + >>>>>>>>>>> +/* >>>>>>>>>>> + * acpi_boot_table_init() called from setup_arch(), always. >>>>>>>>>>> + * 1. find RSDP and get its address, and then find XSDT >>>>>>>>>>> + * 2. extract all tables and checksums them all >>>>>>>>>>> + * >>>>>>>>>>> + * return value: (currently ignored) >>>>>>>>>>> + * 0: success >>>>>>>>>>> + * !0: failure >>>>>>>>>>> + * >>>>>>>>>>> + * We can parse ACPI boot-time tables such as FADT, MADT after >>>>>>>>>>> + * this function is called. >>>>>>>>>>> + */ >>>>>>>>>>> +int __init acpi_boot_table_init(void) >>>>>>>>>>> +{ >>>>>>>>>>> + int error; >>>>>>>>>>> + >>>>>>>>>>> + /* Initialize the ACPI boot-time table parser. */ >>>>>>>>>>> + error = acpi_table_init(); >>>>>>>>>>> + if ( error ) >>>>>>>>>>> + { >>>>>>>>>>> + disable_acpi(); >>>>>>>>>>> + return error; >>>>>>>>>>> + } >>>>>>>>>>> + >>>>>>>>>>> + return 0; >>>>>>>>>>> +} >>>>>>>>>>> diff --git a/xen/arch/arm/setup.c b/xen/arch/arm/setup.c >>>>>>>>>>> index 0ba601e..c15a09d 100644 >>>>>>>>>>> --- a/xen/arch/arm/setup.c >>>>>>>>>>> +++ b/xen/arch/arm/setup.c >>>>>>>>>>> @@ -36,6 +36,7 @@ >>>>>>>>>>> #include <xen/pfn.h> >>>>>>>>>>> #include <xen/vmap.h> >>>>>>>>>>> #include <xen/libfdt/libfdt.h> >>>>>>>>>>> +#include <xen/acpi.h> >>>>>>>>>>> #include <asm/page.h> >>>>>>>>>>> #include <asm/current.h> >>>>>>>>>>> #include <asm/setup.h> >>>>>>>>>>> @@ -749,6 +750,9 @@ void __init start_xen(unsigned long boot_phys_offset, >>>>>>>>>>> >>>>>>>>>>> setup_mm(fdt_paddr, fdt_size); >>>>>>>>>>> >>>>>>>>>>> + /* Parse the ACPI tables for possible boot-time configuration */ >>>>>>>>>>> + acpi_boot_table_init(); >>>>>>> As I asked before, why do you need to call acpi_boot_table_init() before >>>>>>> vm_init? If you called acpi_boot_table_init() after vm_init(), you >>>>>>> could implement __acpi_map_table with vmap, which would be better. >>>>>>> >>>>> Yes, if we call acpi_boot_table_init() before vm_init, it needs to move >>>>> end_boot_allocator after acpi_boot_table_init because it will assert in >>>>> acpi_os_zalloc_memory. >>> Why does acpi_os_zalloc_memory assert exactly? >>> >> >> If call acpi_boot_table_init after end_boot_allocator, system_state != >> SYS_STATE_early_boot, > > Could you please point out where end_boot_allocator changes > system_state? > Oh, sorry, I see. It doesn't change the system_state. I mixed this with the patch[1] which change the system_state to SYS_STATE_boot, then will cause assert. + system_state = SYS_STATE_boot; + vm_init(); + +/* + * Parse the ACPI tables for possible boot-time configuration + */ + +#if defined(CONFIG_ACPI) && defined(CONFIG_ARM_64) + acpi_boot_table_init(); +#endif But current implementation doesn't do that so it won't cause assert. While the true reason to move acpi_boot_table_init before end_boot_allocator is NUMA support. There is a discussion about it, see [2]. [1]http://lists.xenproject.org/archives/html/xen-devel/2015-02/msg00491.html [2]http://lists.xenproject.org/archives/html/xen-devel/2015-02/msg01157.html
On Thu, 28 Jan 2016, Shannon Zhao wrote: > On 2016/1/28 19:27, Stefano Stabellini wrote: > > On Thu, 28 Jan 2016, Shannon Zhao wrote: > >> On 2016/1/28 18:44, Stefano Stabellini wrote: > >>> On Thu, 28 Jan 2016, Shannon Zhao wrote: > >>>>> On 2016/1/27 22:54, Stefano Stabellini wrote: > >>>>>>> On Sat, 23 Jan 2016, Shannon Zhao wrote: > >>>>>>>>>>> From: Shannon Zhao <shannon.zhao@linaro.org> > >>>>>>>>>>> > >>>>>>>>>>> acpi_boot_table_init() will be called in start_xen to get the RSDP and > >>>>>>>>>>> all the table pointers. With this patch, we can get ACPI boot-time > >>>>>>>>>>> tables from firmware on ARM64. > >>>>>>>>>>> > >>>>>>>>>>> Signed-off-by: Naresh Bhat <naresh.bhat@linaro.org> > >>>>>>>>>>> Signed-off-by: Parth Dixit <parth.dixit@linaro.org> > >>>>>>>>>>> Signed-off-by: Shannon Zhao <shannon.zhao@linaro.org> > >>>>>>>>>>> --- > >>>>>>>>>>> xen/arch/arm/acpi/Makefile | 1 + > >>>>>>>>>>> xen/arch/arm/acpi/boot.c | 58 ++++++++++++++++++++++++++++++++++++++++++++++ > >>>>>>>>>>> xen/arch/arm/setup.c | 4 ++++ > >>>>>>>>>>> 3 files changed, 63 insertions(+) > >>>>>>>>>>> create mode 100644 xen/arch/arm/acpi/boot.c > >>>>>>>>>>> > >>>>>>>>>>> diff --git a/xen/arch/arm/acpi/Makefile b/xen/arch/arm/acpi/Makefile > >>>>>>>>>>> index b5be22d..196c40a 100644 > >>>>>>>>>>> --- a/xen/arch/arm/acpi/Makefile > >>>>>>>>>>> +++ b/xen/arch/arm/acpi/Makefile > >>>>>>>>>>> @@ -1 +1,2 @@ > >>>>>>>>>>> obj-y += lib.o > >>>>>>>>>>> +obj-y += boot.o > >>>>>>>>>>> diff --git a/xen/arch/arm/acpi/boot.c b/xen/arch/arm/acpi/boot.c > >>>>>>>>>>> new file mode 100644 > >>>>>>>>>>> index 0000000..1570f7e > >>>>>>>>>>> --- /dev/null > >>>>>>>>>>> +++ b/xen/arch/arm/acpi/boot.c > >>>>>>>>>>> @@ -0,0 +1,58 @@ > >>>>>>>>>>> +/* > >>>>>>>>>>> + * ARM Specific Low-Level ACPI Boot Support > >>>>>>>>>>> + * > >>>>>>>>>>> + * Copyright (C) 2001, 2002 Paul Diefenbaugh <paul.s.diefenbaugh@intel.com> > >>>>>>>>>>> + * Copyright (C) 2001 Jun Nakajima <jun.nakajima@intel.com> > >>>>>>>>>>> + * Copyright (C) 2014, Naresh Bhat <naresh.bhat@linaro.org> > >>>>>>>>>>> + * Copyright (C) 2015, Shannon Zhao <shannon.zhao@linaro.org> > >>>>>>>>>>> + * > >>>>>>>>>>> + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ > >>>>>>>>>>> + * > >>>>>>>>>>> + * This program is free software; you can redistribute it and/or modify > >>>>>>>>>>> + * it under the terms of the GNU General Public License as published by > >>>>>>>>>>> + * the Free Software Foundation; either version 2 of the License, or > >>>>>>>>>>> + * (at your option) any later version. > >>>>>>>>>>> + * > >>>>>>>>>>> + * This program is distributed in the hope that 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, write to the Free Software > >>>>>>>>>>> + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA > >>>>>>>>>>> + * > >>>>>>>>>>> + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ > >>>>>>>>>>> + */ > >>>>>>>>>>> + > >>>>>>>>>>> +#include <xen/init.h> > >>>>>>>>>>> +#include <xen/acpi.h> > >>>>>>>>>>> + > >>>>>>>>>>> +#include <asm/acpi.h> > >>>>>>>>>>> + > >>>>>>>>>>> +/* > >>>>>>>>>>> + * acpi_boot_table_init() called from setup_arch(), always. > >>>>>>>>>>> + * 1. find RSDP and get its address, and then find XSDT > >>>>>>>>>>> + * 2. extract all tables and checksums them all > >>>>>>>>>>> + * > >>>>>>>>>>> + * return value: (currently ignored) > >>>>>>>>>>> + * 0: success > >>>>>>>>>>> + * !0: failure > >>>>>>>>>>> + * > >>>>>>>>>>> + * We can parse ACPI boot-time tables such as FADT, MADT after > >>>>>>>>>>> + * this function is called. > >>>>>>>>>>> + */ > >>>>>>>>>>> +int __init acpi_boot_table_init(void) > >>>>>>>>>>> +{ > >>>>>>>>>>> + int error; > >>>>>>>>>>> + > >>>>>>>>>>> + /* Initialize the ACPI boot-time table parser. */ > >>>>>>>>>>> + error = acpi_table_init(); > >>>>>>>>>>> + if ( error ) > >>>>>>>>>>> + { > >>>>>>>>>>> + disable_acpi(); > >>>>>>>>>>> + return error; > >>>>>>>>>>> + } > >>>>>>>>>>> + > >>>>>>>>>>> + return 0; > >>>>>>>>>>> +} > >>>>>>>>>>> diff --git a/xen/arch/arm/setup.c b/xen/arch/arm/setup.c > >>>>>>>>>>> index 0ba601e..c15a09d 100644 > >>>>>>>>>>> --- a/xen/arch/arm/setup.c > >>>>>>>>>>> +++ b/xen/arch/arm/setup.c > >>>>>>>>>>> @@ -36,6 +36,7 @@ > >>>>>>>>>>> #include <xen/pfn.h> > >>>>>>>>>>> #include <xen/vmap.h> > >>>>>>>>>>> #include <xen/libfdt/libfdt.h> > >>>>>>>>>>> +#include <xen/acpi.h> > >>>>>>>>>>> #include <asm/page.h> > >>>>>>>>>>> #include <asm/current.h> > >>>>>>>>>>> #include <asm/setup.h> > >>>>>>>>>>> @@ -749,6 +750,9 @@ void __init start_xen(unsigned long boot_phys_offset, > >>>>>>>>>>> > >>>>>>>>>>> setup_mm(fdt_paddr, fdt_size); > >>>>>>>>>>> > >>>>>>>>>>> + /* Parse the ACPI tables for possible boot-time configuration */ > >>>>>>>>>>> + acpi_boot_table_init(); > >>>>>>> As I asked before, why do you need to call acpi_boot_table_init() before > >>>>>>> vm_init? If you called acpi_boot_table_init() after vm_init(), you > >>>>>>> could implement __acpi_map_table with vmap, which would be better. > >>>>>>> > >>>>> Yes, if we call acpi_boot_table_init() before vm_init, it needs to move > >>>>> end_boot_allocator after acpi_boot_table_init because it will assert in > >>>>> acpi_os_zalloc_memory. > >>> Why does acpi_os_zalloc_memory assert exactly? > >>> > >> > >> If call acpi_boot_table_init after end_boot_allocator, system_state != > >> SYS_STATE_early_boot, > > > > Could you please point out where end_boot_allocator changes > > system_state? > > > Oh, sorry, I see. It doesn't change the system_state. I mixed this with > the patch[1] which change the system_state to SYS_STATE_boot, then will > cause assert. > > + system_state = SYS_STATE_boot; > + > vm_init(); > + > +/* > + * Parse the ACPI tables for possible boot-time configuration > + */ > + > +#if defined(CONFIG_ACPI) && defined(CONFIG_ARM_64) > + acpi_boot_table_init(); > +#endif > > But current implementation doesn't do that so it won't cause assert. > > While the true reason to move acpi_boot_table_init before > end_boot_allocator is NUMA support. There is a discussion about it, see [2]. > > [1]http://lists.xenproject.org/archives/html/xen-devel/2015-02/msg00491.html > [2]http://lists.xenproject.org/archives/html/xen-devel/2015-02/msg01157.html All right, that's a good reason. Please fix the commit message of the patch that moves end_boot_allocator. Also mention that it's done this way on x86 too.
diff --git a/xen/arch/arm/acpi/Makefile b/xen/arch/arm/acpi/Makefile index b5be22d..196c40a 100644 --- a/xen/arch/arm/acpi/Makefile +++ b/xen/arch/arm/acpi/Makefile @@ -1 +1,2 @@ obj-y += lib.o +obj-y += boot.o diff --git a/xen/arch/arm/acpi/boot.c b/xen/arch/arm/acpi/boot.c new file mode 100644 index 0000000..1570f7e --- /dev/null +++ b/xen/arch/arm/acpi/boot.c @@ -0,0 +1,58 @@ +/* + * ARM Specific Low-Level ACPI Boot Support + * + * Copyright (C) 2001, 2002 Paul Diefenbaugh <paul.s.diefenbaugh@intel.com> + * Copyright (C) 2001 Jun Nakajima <jun.nakajima@intel.com> + * Copyright (C) 2014, Naresh Bhat <naresh.bhat@linaro.org> + * Copyright (C) 2015, Shannon Zhao <shannon.zhao@linaro.org> + * + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that 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, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ + +#include <xen/init.h> +#include <xen/acpi.h> + +#include <asm/acpi.h> + +/* + * acpi_boot_table_init() called from setup_arch(), always. + * 1. find RSDP and get its address, and then find XSDT + * 2. extract all tables and checksums them all + * + * return value: (currently ignored) + * 0: success + * !0: failure + * + * We can parse ACPI boot-time tables such as FADT, MADT after + * this function is called. + */ +int __init acpi_boot_table_init(void) +{ + int error; + + /* Initialize the ACPI boot-time table parser. */ + error = acpi_table_init(); + if ( error ) + { + disable_acpi(); + return error; + } + + return 0; +} diff --git a/xen/arch/arm/setup.c b/xen/arch/arm/setup.c index 0ba601e..c15a09d 100644 --- a/xen/arch/arm/setup.c +++ b/xen/arch/arm/setup.c @@ -36,6 +36,7 @@ #include <xen/pfn.h> #include <xen/vmap.h> #include <xen/libfdt/libfdt.h> +#include <xen/acpi.h> #include <asm/page.h> #include <asm/current.h> #include <asm/setup.h> @@ -749,6 +750,9 @@ void __init start_xen(unsigned long boot_phys_offset, setup_mm(fdt_paddr, fdt_size); + /* Parse the ACPI tables for possible boot-time configuration */ + acpi_boot_table_init(); + end_boot_allocator(); vm_init();