diff mbox series

[kvm-unit-tests,v2,23/23] arm64: Add an efi/run script

Message ID 20220506205605.359830-24-nikos.nikoleris@arm.com (mailing list archive)
State New, archived
Headers show
Series EFI and ACPI support for arm64 | expand

Commit Message

Nikos Nikoleris May 6, 2022, 8:56 p.m. UTC
This change adds a efi/run script inspired by the one in x86. This
script will setup a folder with the test compiled as an EFI app and a
startup.nsh script. The script launches QEMU providing an image with
EDKII and the path to the folder with the test which is executed
automatically.

For example:

$> ./arm/efi/run ./arm/selftest.efi setup smp=2 mem=256

Signed-off-by: Nikos Nikoleris <nikos.nikoleris@arm.com>
---
 scripts/runtime.bash | 14 +++++-----
 arm/efi/run          | 61 ++++++++++++++++++++++++++++++++++++++++++++
 arm/run              |  8 ++++--
 arm/Makefile.common  |  1 +
 arm/dummy.c          |  4 +++
 5 files changed, 78 insertions(+), 10 deletions(-)
 create mode 100755 arm/efi/run
 create mode 100644 arm/dummy.c

Comments

Ricardo Koller June 21, 2022, 11:09 p.m. UTC | #1
On Fri, May 06, 2022 at 09:56:05PM +0100, Nikos Nikoleris wrote:
> This change adds a efi/run script inspired by the one in x86. This
> script will setup a folder with the test compiled as an EFI app and a
> startup.nsh script. The script launches QEMU providing an image with
> EDKII and the path to the folder with the test which is executed
> automatically.
> 
> For example:
> 
> $> ./arm/efi/run ./arm/selftest.efi setup smp=2 mem=256
> 
> Signed-off-by: Nikos Nikoleris <nikos.nikoleris@arm.com>
> ---
>  scripts/runtime.bash | 14 +++++-----
>  arm/efi/run          | 61 ++++++++++++++++++++++++++++++++++++++++++++
>  arm/run              |  8 ++++--
>  arm/Makefile.common  |  1 +
>  arm/dummy.c          |  4 +++
>  5 files changed, 78 insertions(+), 10 deletions(-)
>  create mode 100755 arm/efi/run
>  create mode 100644 arm/dummy.c
> 
> diff --git a/scripts/runtime.bash b/scripts/runtime.bash
> index 7d0180b..dc28f24 100644
> --- a/scripts/runtime.bash
> +++ b/scripts/runtime.bash
> @@ -131,14 +131,12 @@ function run()
>      fi
>  
>      last_line=$(premature_failure > >(tail -1)) && {
> -        skip=true
> -        if [ "${CONFIG_EFI}" == "y" ] && [[ "${last_line}" =~ "enabling apic" ]]; then
> -            skip=false
> -        fi
> -        if [ ${skip} == true ]; then
> -            print_result "SKIP" $testname "" "$last_line"
> -            return 77
> -        fi
> +        if [ "${CONFIG_EFI}" == "y" ] && [ "${ARCH}" = x86_64 ]; then
> +		if ! [[ "${last_line}" =~ "enabling apic" ]]; then
> +			print_result "SKIP" $testname "" "$last_line"
> +			return 77
> +		fi
> +	fi
>      }
>  
>      cmdline=$(get_cmdline $kernel)
> diff --git a/arm/efi/run b/arm/efi/run
> new file mode 100755
> index 0000000..dfff717
> --- /dev/null
> +++ b/arm/efi/run
> @@ -0,0 +1,61 @@
> +#!/bin/bash
> +
> +set -e
> +
> +if [ $# -eq 0 ]; then
> +	echo "Usage $0 TEST_CASE [QEMU_ARGS]"
> +	exit 2
> +fi
> +
> +if [ ! -f config.mak ]; then
> +	echo "run './configure --enable-efi && make' first. See ./configure -h"
> +	exit 2
> +fi
> +source config.mak
> +source scripts/arch-run.bash
> +source scripts/common.bash
> +
> +: "${EFI_SRC:=$(realpath "$(dirname "$0")/../")}"
> +: "${EFI_UEFI:=/usr/share/qemu-efi-aarch64/QEMU_EFI.fd}"
> +: "${EFI_TEST:=efi-tests}"
> +: "${EFI_CASE:=$(basename $1 .efi)}"
> +
> +if [ ! -f "$EFI_UEFI" ]; then
> +	echo "UEFI firmware not found: $EFI_UEFI"
> +	echo "Please install the UEFI firmware to this path"
> +	echo "Or specify the correct path with the env variable EFI_UEFI"
> +	exit 2
> +fi
> +
> +# Remove the TEST_CASE from $@
> +shift 1
> +
> +# Fish out the arguments for the test, they should be the next string
> +# after the "-append" option
> +qemu_args=()
> +cmd_args=()
> +while (( "$#" )); do
> +	if [ "$1" = "-append" ]; then
> +		cmd_args=$2
> +		shift 2

Does this work with params like this (2 words)?

	[pmu-cycle-counter]
	file = pmu.flat
	groups = pmu
	extra_params = -append 'cycle-counter 0'

> +	else
> +		qemu_args+=("$1")
> +		shift 1
> +	fi
> +done
> +
> +if [ "$EFI_CASE" = "_NO_FILE_4Uhere_" ]; then
> +	EFI_CASE=dummy
> +fi
> +
> +: "${EFI_CASE_DIR:="$EFI_TEST/$EFI_CASE"}"
> +mkdir -p "$EFI_CASE_DIR"
> +
> +cp "$EFI_SRC/$EFI_CASE.efi" "$EFI_TEST/$EFI_CASE/"
> +echo "@echo -off" > "$EFI_TEST/$EFI_CASE/startup.nsh"
> +echo "$EFI_CASE.efi" "${cmd_args[@]}" >> "$EFI_TEST/$EFI_CASE/startup.nsh"
> +
> +EFI_RUN=y $TEST_DIR/run \
> +       -bios "$EFI_UEFI" \
> +       -drive file.dir="$EFI_TEST/$EFI_CASE/",file.driver=vvfat,file.rw=on,format=raw,if=virtio \
> +       "${qemu_args[@]}"
> diff --git a/arm/run b/arm/run
> index 28a0b4a..e96875e 100755
> --- a/arm/run
> +++ b/arm/run
> @@ -67,7 +67,11 @@ fi
>  
>  A="-accel $ACCEL"
>  command="$qemu -nodefaults $M $A -cpu $processor $chr_testdev $pci_testdev"
> -command+=" -display none -serial stdio -kernel"
> +command+=" -display none -serial stdio"
>  command="$(migration_cmd) $(timeout_cmd) $command"
>  
> -run_qemu $command "$@"
> +if [ "$EFI_RUN" = "y" ]; then
> +	ENVIRON_DEFAULT=n run_qemu $command "$@"
> +else
> +	run_qemu $command -kernel "$@"
> +fi
> diff --git a/arm/Makefile.common b/arm/Makefile.common
> index a8007f4..aabd335 100644
> --- a/arm/Makefile.common
> +++ b/arm/Makefile.common
> @@ -12,6 +12,7 @@ tests-common += $(TEST_DIR)/gic.$(exe)
>  tests-common += $(TEST_DIR)/psci.$(exe)
>  tests-common += $(TEST_DIR)/sieve.$(exe)
>  tests-common += $(TEST_DIR)/pl031.$(exe)
> +tests-common += $(TEST_DIR)/dummy.$(exe)
>  
>  tests-all = $(tests-common) $(tests)
>  all: directories $(tests-all)
> diff --git a/arm/dummy.c b/arm/dummy.c
> new file mode 100644
> index 0000000..5019e79
> --- /dev/null
> +++ b/arm/dummy.c
> @@ -0,0 +1,4 @@
> +int main(int argc, char **argv)
> +{
> +	return 0;
> +}
> -- 
> 2.25.1
>
Nikos Nikoleris June 22, 2022, 2:13 p.m. UTC | #2
On 22/06/2022 00:09, Ricardo Koller wrote:
> On Fri, May 06, 2022 at 09:56:05PM +0100, Nikos Nikoleris wrote:
>> This change adds a efi/run script inspired by the one in x86. This
>> script will setup a folder with the test compiled as an EFI app and a
>> startup.nsh script. The script launches QEMU providing an image with
>> EDKII and the path to the folder with the test which is executed
>> automatically.
>>
>> For example:
>>
>> $> ./arm/efi/run ./arm/selftest.efi setup smp=2 mem=256
>>
>> Signed-off-by: Nikos Nikoleris <nikos.nikoleris@arm.com>
>> ---
>>   scripts/runtime.bash | 14 +++++-----
>>   arm/efi/run          | 61 ++++++++++++++++++++++++++++++++++++++++++++
>>   arm/run              |  8 ++++--
>>   arm/Makefile.common  |  1 +
>>   arm/dummy.c          |  4 +++
>>   5 files changed, 78 insertions(+), 10 deletions(-)
>>   create mode 100755 arm/efi/run
>>   create mode 100644 arm/dummy.c
>>
>> diff --git a/scripts/runtime.bash b/scripts/runtime.bash
>> index 7d0180b..dc28f24 100644
>> --- a/scripts/runtime.bash
>> +++ b/scripts/runtime.bash
>> @@ -131,14 +131,12 @@ function run()
>>       fi
>>
>>       last_line=$(premature_failure > >(tail -1)) && {
>> -        skip=true
>> -        if [ "${CONFIG_EFI}" == "y" ] && [[ "${last_line}" =~ "enabling apic" ]]; then
>> -            skip=false
>> -        fi
>> -        if [ ${skip} == true ]; then
>> -            print_result "SKIP" $testname "" "$last_line"
>> -            return 77
>> -        fi
>> +        if [ "${CONFIG_EFI}" == "y" ] && [ "${ARCH}" = x86_64 ]; then
>> +            if ! [[ "${last_line}" =~ "enabling apic" ]]; then
>> +                    print_result "SKIP" $testname "" "$last_line"
>> +                    return 77
>> +            fi
>> +    fi
>>       }
>>
>>       cmdline=$(get_cmdline $kernel)
>> diff --git a/arm/efi/run b/arm/efi/run
>> new file mode 100755
>> index 0000000..dfff717
>> --- /dev/null
>> +++ b/arm/efi/run
>> @@ -0,0 +1,61 @@
>> +#!/bin/bash
>> +
>> +set -e
>> +
>> +if [ $# -eq 0 ]; then
>> +    echo "Usage $0 TEST_CASE [QEMU_ARGS]"
>> +    exit 2
>> +fi
>> +
>> +if [ ! -f config.mak ]; then
>> +    echo "run './configure --enable-efi && make' first. See ./configure -h"
>> +    exit 2
>> +fi
>> +source config.mak
>> +source scripts/arch-run.bash
>> +source scripts/common.bash
>> +
>> +: "${EFI_SRC:=$(realpath "$(dirname "$0")/../")}"
>> +: "${EFI_UEFI:=/usr/share/qemu-efi-aarch64/QEMU_EFI.fd}"
>> +: "${EFI_TEST:=efi-tests}"
>> +: "${EFI_CASE:=$(basename $1 .efi)}"
>> +
>> +if [ ! -f "$EFI_UEFI" ]; then
>> +    echo "UEFI firmware not found: $EFI_UEFI"
>> +    echo "Please install the UEFI firmware to this path"
>> +    echo "Or specify the correct path with the env variable EFI_UEFI"
>> +    exit 2
>> +fi
>> +
>> +# Remove the TEST_CASE from $@
>> +shift 1
>> +
>> +# Fish out the arguments for the test, they should be the next string
>> +# after the "-append" option
>> +qemu_args=()
>> +cmd_args=()
>> +while (( "$#" )); do
>> +    if [ "$1" = "-append" ]; then
>> +            cmd_args=$2
>> +            shift 2
>
> Does this work with params like this (2 words)?
>
>       [pmu-cycle-counter]
>       file = pmu.flat
>       groups = pmu
>       extra_params = -append 'cycle-counter 0'
>

I think it does. cmd_args will take the value of the string that follows
append and in this case whatever is between the single/double quotes.

Thanks,

Nikos

>> +    else
>> +            qemu_args+=("$1")
>> +            shift 1
>> +    fi
>> +done
>> +
>> +if [ "$EFI_CASE" = "_NO_FILE_4Uhere_" ]; then
>> +    EFI_CASE=dummy
>> +fi
>> +
>> +: "${EFI_CASE_DIR:="$EFI_TEST/$EFI_CASE"}"
>> +mkdir -p "$EFI_CASE_DIR"
>> +
>> +cp "$EFI_SRC/$EFI_CASE.efi" "$EFI_TEST/$EFI_CASE/"
>> +echo "@echo -off" > "$EFI_TEST/$EFI_CASE/startup.nsh"
>> +echo "$EFI_CASE.efi" "${cmd_args[@]}" >> "$EFI_TEST/$EFI_CASE/startup.nsh"
>> +
>> +EFI_RUN=y $TEST_DIR/run \
>> +       -bios "$EFI_UEFI" \
>> +       -drive file.dir="$EFI_TEST/$EFI_CASE/",file.driver=vvfat,file.rw=on,format=raw,if=virtio \
>> +       "${qemu_args[@]}"
>> diff --git a/arm/run b/arm/run
>> index 28a0b4a..e96875e 100755
>> --- a/arm/run
>> +++ b/arm/run
>> @@ -67,7 +67,11 @@ fi
>>
>>   A="-accel $ACCEL"
>>   command="$qemu -nodefaults $M $A -cpu $processor $chr_testdev $pci_testdev"
>> -command+=" -display none -serial stdio -kernel"
>> +command+=" -display none -serial stdio"
>>   command="$(migration_cmd) $(timeout_cmd) $command"
>>
>> -run_qemu $command "$@"
>> +if [ "$EFI_RUN" = "y" ]; then
>> +    ENVIRON_DEFAULT=n run_qemu $command "$@"
>> +else
>> +    run_qemu $command -kernel "$@"
>> +fi
>> diff --git a/arm/Makefile.common b/arm/Makefile.common
>> index a8007f4..aabd335 100644
>> --- a/arm/Makefile.common
>> +++ b/arm/Makefile.common
>> @@ -12,6 +12,7 @@ tests-common += $(TEST_DIR)/gic.$(exe)
>>   tests-common += $(TEST_DIR)/psci.$(exe)
>>   tests-common += $(TEST_DIR)/sieve.$(exe)
>>   tests-common += $(TEST_DIR)/pl031.$(exe)
>> +tests-common += $(TEST_DIR)/dummy.$(exe)
>>
>>   tests-all = $(tests-common) $(tests)
>>   all: directories $(tests-all)
>> diff --git a/arm/dummy.c b/arm/dummy.c
>> new file mode 100644
>> index 0000000..5019e79
>> --- /dev/null
>> +++ b/arm/dummy.c
>> @@ -0,0 +1,4 @@
>> +int main(int argc, char **argv)
>> +{
>> +    return 0;
>> +}
>> --
>> 2.25.1
>>
IMPORTANT NOTICE: The contents of this email and any attachments are confidential and may also be privileged. If you are not the intended recipient, please notify the sender immediately and do not disclose the contents to any other person, use it for any purpose, or store or copy the information in any medium. Thank you.
Ricardo Koller June 30, 2022, 5:22 a.m. UTC | #3
On Wed, Jun 22, 2022 at 03:13:56PM +0100, Nikos Nikoleris wrote:
> On 22/06/2022 00:09, Ricardo Koller wrote:
> > On Fri, May 06, 2022 at 09:56:05PM +0100, Nikos Nikoleris wrote:
> > > This change adds a efi/run script inspired by the one in x86. This
> > > script will setup a folder with the test compiled as an EFI app and a
> > > startup.nsh script. The script launches QEMU providing an image with
> > > EDKII and the path to the folder with the test which is executed
> > > automatically.
> > > 
> > > For example:
> > > 
> > > $> ./arm/efi/run ./arm/selftest.efi setup smp=2 mem=256
> > > 
> > > Signed-off-by: Nikos Nikoleris <nikos.nikoleris@arm.com>
> > > ---
> > >   scripts/runtime.bash | 14 +++++-----
> > >   arm/efi/run          | 61 ++++++++++++++++++++++++++++++++++++++++++++
> > >   arm/run              |  8 ++++--
> > >   arm/Makefile.common  |  1 +
> > >   arm/dummy.c          |  4 +++
> > >   5 files changed, 78 insertions(+), 10 deletions(-)
> > >   create mode 100755 arm/efi/run
> > >   create mode 100644 arm/dummy.c
> > > 
> > > diff --git a/scripts/runtime.bash b/scripts/runtime.bash
> > > index 7d0180b..dc28f24 100644
> > > --- a/scripts/runtime.bash
> > > +++ b/scripts/runtime.bash
> > > @@ -131,14 +131,12 @@ function run()
> > >       fi
> > > 
> > >       last_line=$(premature_failure > >(tail -1)) && {
> > > -        skip=true
> > > -        if [ "${CONFIG_EFI}" == "y" ] && [[ "${last_line}" =~ "enabling apic" ]]; then
> > > -            skip=false
> > > -        fi
> > > -        if [ ${skip} == true ]; then
> > > -            print_result "SKIP" $testname "" "$last_line"
> > > -            return 77
> > > -        fi
> > > +        if [ "${CONFIG_EFI}" == "y" ] && [ "${ARCH}" = x86_64 ]; then
> > > +            if ! [[ "${last_line}" =~ "enabling apic" ]]; then
> > > +                    print_result "SKIP" $testname "" "$last_line"
> > > +                    return 77
> > > +            fi
> > > +    fi
> > >       }
> > > 
> > >       cmdline=$(get_cmdline $kernel)
> > > diff --git a/arm/efi/run b/arm/efi/run
> > > new file mode 100755
> > > index 0000000..dfff717
> > > --- /dev/null
> > > +++ b/arm/efi/run
> > > @@ -0,0 +1,61 @@
> > > +#!/bin/bash
> > > +
> > > +set -e
> > > +
> > > +if [ $# -eq 0 ]; then
> > > +    echo "Usage $0 TEST_CASE [QEMU_ARGS]"
> > > +    exit 2
> > > +fi
> > > +
> > > +if [ ! -f config.mak ]; then
> > > +    echo "run './configure --enable-efi && make' first. See ./configure -h"
> > > +    exit 2
> > > +fi
> > > +source config.mak
> > > +source scripts/arch-run.bash
> > > +source scripts/common.bash
> > > +
> > > +: "${EFI_SRC:=$(realpath "$(dirname "$0")/../")}"
> > > +: "${EFI_UEFI:=/usr/share/qemu-efi-aarch64/QEMU_EFI.fd}"
> > > +: "${EFI_TEST:=efi-tests}"
> > > +: "${EFI_CASE:=$(basename $1 .efi)}"
> > > +
> > > +if [ ! -f "$EFI_UEFI" ]; then
> > > +    echo "UEFI firmware not found: $EFI_UEFI"
> > > +    echo "Please install the UEFI firmware to this path"
> > > +    echo "Or specify the correct path with the env variable EFI_UEFI"
> > > +    exit 2
> > > +fi
> > > +
> > > +# Remove the TEST_CASE from $@
> > > +shift 1
> > > +
> > > +# Fish out the arguments for the test, they should be the next string
> > > +# after the "-append" option
> > > +qemu_args=()
> > > +cmd_args=()
> > > +while (( "$#" )); do
> > > +    if [ "$1" = "-append" ]; then
> > > +            cmd_args=$2
> > > +            shift 2
> > 
> > Does this work with params like this (2 words)?
> > 
> >       [pmu-cycle-counter]
> >       file = pmu.flat
> >       groups = pmu
> >       extra_params = -append 'cycle-counter 0'
> > 
> 
> I think it does. cmd_args will take the value of the string that follows
> append and in this case whatever is between the single/double quotes.

Just in case I tested it on bash and it works as expected.

So, with that:

Reviewed-by: Ricardo Koller <ricarkol@google.com>
diff mbox series

Patch

diff --git a/scripts/runtime.bash b/scripts/runtime.bash
index 7d0180b..dc28f24 100644
--- a/scripts/runtime.bash
+++ b/scripts/runtime.bash
@@ -131,14 +131,12 @@  function run()
     fi
 
     last_line=$(premature_failure > >(tail -1)) && {
-        skip=true
-        if [ "${CONFIG_EFI}" == "y" ] && [[ "${last_line}" =~ "enabling apic" ]]; then
-            skip=false
-        fi
-        if [ ${skip} == true ]; then
-            print_result "SKIP" $testname "" "$last_line"
-            return 77
-        fi
+        if [ "${CONFIG_EFI}" == "y" ] && [ "${ARCH}" = x86_64 ]; then
+		if ! [[ "${last_line}" =~ "enabling apic" ]]; then
+			print_result "SKIP" $testname "" "$last_line"
+			return 77
+		fi
+	fi
     }
 
     cmdline=$(get_cmdline $kernel)
diff --git a/arm/efi/run b/arm/efi/run
new file mode 100755
index 0000000..dfff717
--- /dev/null
+++ b/arm/efi/run
@@ -0,0 +1,61 @@ 
+#!/bin/bash
+
+set -e
+
+if [ $# -eq 0 ]; then
+	echo "Usage $0 TEST_CASE [QEMU_ARGS]"
+	exit 2
+fi
+
+if [ ! -f config.mak ]; then
+	echo "run './configure --enable-efi && make' first. See ./configure -h"
+	exit 2
+fi
+source config.mak
+source scripts/arch-run.bash
+source scripts/common.bash
+
+: "${EFI_SRC:=$(realpath "$(dirname "$0")/../")}"
+: "${EFI_UEFI:=/usr/share/qemu-efi-aarch64/QEMU_EFI.fd}"
+: "${EFI_TEST:=efi-tests}"
+: "${EFI_CASE:=$(basename $1 .efi)}"
+
+if [ ! -f "$EFI_UEFI" ]; then
+	echo "UEFI firmware not found: $EFI_UEFI"
+	echo "Please install the UEFI firmware to this path"
+	echo "Or specify the correct path with the env variable EFI_UEFI"
+	exit 2
+fi
+
+# Remove the TEST_CASE from $@
+shift 1
+
+# Fish out the arguments for the test, they should be the next string
+# after the "-append" option
+qemu_args=()
+cmd_args=()
+while (( "$#" )); do
+	if [ "$1" = "-append" ]; then
+		cmd_args=$2
+		shift 2
+	else
+		qemu_args+=("$1")
+		shift 1
+	fi
+done
+
+if [ "$EFI_CASE" = "_NO_FILE_4Uhere_" ]; then
+	EFI_CASE=dummy
+fi
+
+: "${EFI_CASE_DIR:="$EFI_TEST/$EFI_CASE"}"
+mkdir -p "$EFI_CASE_DIR"
+
+cp "$EFI_SRC/$EFI_CASE.efi" "$EFI_TEST/$EFI_CASE/"
+echo "@echo -off" > "$EFI_TEST/$EFI_CASE/startup.nsh"
+echo "$EFI_CASE.efi" "${cmd_args[@]}" >> "$EFI_TEST/$EFI_CASE/startup.nsh"
+
+EFI_RUN=y $TEST_DIR/run \
+       -bios "$EFI_UEFI" \
+       -drive file.dir="$EFI_TEST/$EFI_CASE/",file.driver=vvfat,file.rw=on,format=raw,if=virtio \
+       "${qemu_args[@]}"
diff --git a/arm/run b/arm/run
index 28a0b4a..e96875e 100755
--- a/arm/run
+++ b/arm/run
@@ -67,7 +67,11 @@  fi
 
 A="-accel $ACCEL"
 command="$qemu -nodefaults $M $A -cpu $processor $chr_testdev $pci_testdev"
-command+=" -display none -serial stdio -kernel"
+command+=" -display none -serial stdio"
 command="$(migration_cmd) $(timeout_cmd) $command"
 
-run_qemu $command "$@"
+if [ "$EFI_RUN" = "y" ]; then
+	ENVIRON_DEFAULT=n run_qemu $command "$@"
+else
+	run_qemu $command -kernel "$@"
+fi
diff --git a/arm/Makefile.common b/arm/Makefile.common
index a8007f4..aabd335 100644
--- a/arm/Makefile.common
+++ b/arm/Makefile.common
@@ -12,6 +12,7 @@  tests-common += $(TEST_DIR)/gic.$(exe)
 tests-common += $(TEST_DIR)/psci.$(exe)
 tests-common += $(TEST_DIR)/sieve.$(exe)
 tests-common += $(TEST_DIR)/pl031.$(exe)
+tests-common += $(TEST_DIR)/dummy.$(exe)
 
 tests-all = $(tests-common) $(tests)
 all: directories $(tests-all)
diff --git a/arm/dummy.c b/arm/dummy.c
new file mode 100644
index 0000000..5019e79
--- /dev/null
+++ b/arm/dummy.c
@@ -0,0 +1,4 @@ 
+int main(int argc, char **argv)
+{
+	return 0;
+}