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

Re: [Xen-devel] [Qemu-devel] Hvmloader: Modify ACPI to only supply _EJ0 methods for PCIslots that support hotplug by runtime patching



>>> On 22.10.13 at 06:08, "Gonglei (Arei)" <arei.gonglei@xxxxxxxxxx> wrote:
> Hi, guys. The new patch has been modified based on the principles you 
> suggested, thank you so much.
> Last time I test the patch based on the codes of 4.3.0.
> This time, I found that the system based on the codes of trunk causes the VM 
> reboot again and again, which I have not found out the reason.
> So i can not test the patch based on the codes of trunk (details in 
> EJ0_ACPI_PCI_Hotplug.patch)..

I'm afraid we will need you to figure out that problem first, and
then do the verification on -unstable. Even if the code shouldn't
be that different from 4.3, we still don't want to apply completely
untested stuff.

> --- a/tools/firmware/hvmloader/acpi/Makefile
> +++ b/tools/firmware/hvmloader/acpi/Makefile
> @@ -24,30 +24,46 @@ OBJS  = $(patsubst %.c,%.o,$(C_SRC))
>  CFLAGS += $(CFLAGS_xeninclude)
>  
>  vpath iasl $(PATH)
> +vpath python $(PATH)

Iirc this ought to be $(PYTHON) (also further down).

> +
> +.DELETE_ON_ERROR:$(filter dsdt_%.c,$(C_SRC))

Missing blank after ":".

>  dsdt_anycpu_qemu_xen.asl: dsdt.asl mk_dsdt
> -     awk 'NR > 1 {print s} {s=$$0}' $< > $@
> -     ./mk_dsdt --dm-version qemu-xen >> $@
> -
> +     awk 'NR > 1 {print s} {s=$$0}' $< > $@.tmp
> +     sed -i 's/AmlCode/dsdt_anycpu_qemu_xen/g' $@.tmp
> +     ./mk_dsdt --dm-version qemu-xen >> $@.tmp
> +     sed -i 's/aml_ej0_name/dsdt_anycpu_qemu_xen_aml_ej0_name/g' $@.tmp
> +     sed -i 's/aml_adr_dword/dsdt_anycpu_qemu_xen_aml_adr_dword/g' $@.tmp
> +     $(call move-if-changed,$@.tmp $@)
> +     

Line containing just a tab.

>  # NB. awk invocation is a portable alternative to 'head -n -1'
>  dsdt_%cpu.asl: dsdt.asl mk_dsdt
> -     awk 'NR > 1 {print s} {s=$$0}' $< > $@
> -     ./mk_dsdt --maxcpu $*  >> $@
> +     awk 'NR > 1 {print s} {s=$$0}' $< > $@.tmp
> +     sed -i 's/AmlCode/dsdt_$*cpu/g' $@.tmp
> +     ./mk_dsdt --maxcpu $*  >> $@.tmp
> +     $(call move-if-changed,$@.tmp $@)
>  
> -$(filter dsdt_%.c,$(C_SRC)): %.c: iasl %.asl
> -     iasl -vs -p $* -tc $*.asl
> -     sed -e 's/AmlCode/$*/g' $*.hex >$@
> -     echo "int $*_len=sizeof($*);" >>$@
> -     rm -f $*.aml $*.hex
> +$(filter dsdt_%.c,$(C_SRC)): %.c: iasl python %.asl

As you need to touch this anyway, please adjust it to match
common style: The input file should come first in the list of
dependencies, allowing you ...

> +     cpp -P $*.asl > $*.asl.i.orig

... use $< here (and further down where applicable) in favor of $*.

> +     python ../tools/acpi_extract_preprocess.py $*.asl.i.orig > $*.asl.i

Please be consistent in whether you put a blank after ">" and ">>".

> +     iasl -vs -l -tc -p $* $*.asl.i
> +     python ../tools/acpi_extract.py $*.lst > $@.tmp
> +     echo "int $*_len=sizeof($*);" >>$@.tmp
> +     if grep -q "$*_aml_ej0_name" $@.tmp; then echo "int 
> $*_aml_ej0_name_len=sizeof($*_aml_ej0_name);" >>$@.tmp; fi
> +     if grep -q "$*_aml_adr_dword" $@.tmp; then echo "int 
> $*_aml_adr_dword_len=sizeof($*_aml_adr_dword);" >>$@.tmp;fi

Missing blank before "fi".

> +python:
> +     @echo
> +     @echo "python is needed"
> +     @echo
> +     @exit 1

What is this good for? For one, the tools build already requires
Python. And then such a dependency would belong into the
configure scripts, not here.

> --- a/tools/firmware/hvmloader/acpi/build.c
> +++ b/tools/firmware/hvmloader/acpi/build.c

There are various coding style issues in the changes to this file.
Please make sure you match the style found elsewhere in here.

> @@ -30,6 +30,9 @@
>  #define align16(sz)        (((sz) + 15) & ~15)
>  #define fixed_strcpy(d, s) strncpy((d), (s), sizeof(d))
>  
> +
> +#define PCI_RMV_BASE 0xae0c
> +
>  extern struct acpi_20_rsdp Rsdp;
>  extern struct acpi_20_rsdt Rsdt;
>  extern struct acpi_20_xsdt Xsdt;
> @@ -404,6 +407,7 @@ void acpi_build_tables(struct acpi_config *config, 
> unsigned int physical)
>      unsigned char       *dsdt;
>      unsigned long        secondary_tables[ACPI_MAX_SECONDARY_TABLES];
>      int                  nr_secondaries, i;
> +    unsigned int rmvc_pcrm = 0;

Pointless initializer. You'd be better off moving the declaration to
the first use point anyway (and then it can have a proper initializer
right away).

> @@ -438,9 +442,27 @@ void acpi_build_tables(struct acpi_config *config, 
> unsigned int physical)
>          dsdt = mem_alloc(config->dsdt_anycpu_len, 16);
>          if (!dsdt) goto oom;
>          memcpy(dsdt, config->dsdt_anycpu, config->dsdt_anycpu_len);
> -        nr_processor_objects = HVM_MAX_VCPUS;

The movement to this assignment is clearly wrong, as it now
overwrites the different value stored when using the <= 15 CPUs
path.

This also raises the question of why you do the adjustment below
only in the >= 16 CPUs code path.

I also don't see how this adjustment is in line with mk_dsdt.c's
handling of the qemu-traditional case. Or is that building on
SeaBIOS only ever being used with upstream qemu?

> +        if(config->aml_adr_dword_len && config->aml_ej0_name_len &&
> +            (config->aml_adr_dword_len/sizeof(config->aml_adr_dword[0]) == 
> config->aml_ej0_name_len/sizeof(config->aml_ej0_name[0])))
> +        {
> +            rmvc_pcrm = inl(PCI_RMV_BASE); 
> +            printf("rmvc_pcrm is %x\n", rmvc_pcrm);
> +            for(i = 0;  i < 
> config->aml_adr_dword_len/sizeof(config->aml_adr_dword[0]); i ++)
> +            {
> +                /* Slot is in byte 2 in _ADR */
> +                unsigned char slot = dsdt[config->aml_adr_dword[i] + 2] & 
> 0x1F;
> +                /* Sanity check */
> +                if (memcmp(dsdt + config->aml_ej0_name[i], "_EJ0", 4)) {
> +                    goto oom;

A memcmp() failure should result in a meaningful error message;
definitely not "out of memory".

> +                }
> +                if (!(rmvc_pcrm & (0x1 << slot))) {
> +                    memcpy(dsdt + config->aml_ej0_name[i], "EJ0_", 4);
> +                }
> +            }
> +        }

> --- a/tools/firmware/hvmloader/ovmf.c
> +++ b/tools/firmware/hvmloader/ovmf.c
> @@ -79,7 +79,11 @@ static void ovmf_acpi_build_tables(void)
>          .dsdt_anycpu = dsdt_anycpu,
>          .dsdt_anycpu_len = dsdt_anycpu_len,
>          .dsdt_15cpu = NULL, 
> -        .dsdt_15cpu_len = 0
> +        .dsdt_15cpu_len = 0,
> +        .aml_ej0_name = NULL,
> +        .aml_adr_dword = NULL,
> +        .aml_ej0_name_len = 0,
> +        .aml_adr_dword_len = 0,

I don't see why you're adding these.

> --- a/tools/firmware/hvmloader/rombios.c
> +++ b/tools/firmware/hvmloader/rombios.c
> @@ -179,6 +179,10 @@ static void rombios_acpi_build_tables(void)
>          .dsdt_anycpu_len = dsdt_anycpu_len,
>          .dsdt_15cpu = dsdt_15cpu,
>          .dsdt_15cpu_len = dsdt_15cpu_len,
> +        .aml_ej0_name = NULL,
> +        .aml_adr_dword = NULL,
> +        .aml_ej0_name_len = 0,
> +        .aml_adr_dword_len = 0,

Same here.

Jan

_______________________________________________
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®.