* [PATCH] kexec/dt-ops.c: Fix check against 'fdt_add_subnode' return value
@ 2018-11-11 20:30 Bhupesh Sharma
2018-11-12 2:24 ` AKASHI Takahiro
0 siblings, 1 reply; 13+ messages in thread
From: Bhupesh Sharma @ 2018-11-11 20:30 UTC (permalink / raw)
To: kexec; +Cc: AKASHI Takahiro, bhsharma, bhupesh.linux, Simon Horman
Vicenç reported (via [1]) that currently executing kexec with
'--dtb' option and passing a .dtb which doesn't have a '/chosen' node
leads to the following error:
# kexec -d --dtb dtb_without_chosen_node.dtb --append 'cmdline' --load Image
dtb_set_property: fdt_add_subnode failed: <valid offset/length>
kexec: Set device tree bootargs failed.
This happens because currently we check the return value of
'fdt_add_subnode()' function call in 'dt-ops.c' incorrectly:
result = fdt_add_subnode(new_dtb, nodeoffset, node);
if (result) {
dbgprintf("%s: fdt_add_subnode failed: %s\n", _func__,
fdt_strerror(result));
goto on_error;
}
As we can see in 'fdt_rw.c', a positive return value from
'fdt_add_subnode()' function doesn't indicate an error.
We can see that the Linux kernel (see 'drivers/firmware/efi/libstub/fdt.c'
for example) also checks the 'fdt_add_subnode()' function against negative
return values for errors. See an example below from 'update_fdt()' function in
'drivers/firmware/efi/libstub/fdt.c':
node = fdt_add_subnode(fdt, 0, "chosen");
if (node < 0) {
status = node;
<..snip..>
goto fdt_set_fail;
}
This patch fixes the same in 'kexec-tools'.
[1]. http://lists.infradead.org/pipermail/kexec/2018-October/021746.html
Cc: Simon Horman <horms@verge.net.au>
Cc: AKASHI Takahiro <takahiro.akashi@linaro.org>
Reported-by: Vicente Bergas <vicencb@gmail.com>
Signed-off-by: Bhupesh Sharma <bhsharma@redhat.com>
---
kexec/dt-ops.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/kexec/dt-ops.c b/kexec/dt-ops.c
index 915dbf55afd2..f15174c3c74e 100644
--- a/kexec/dt-ops.c
+++ b/kexec/dt-ops.c
@@ -84,7 +84,7 @@ int dtb_set_property(char **dtb, off_t *dtb_size, const char *node,
if (nodeoffset == -FDT_ERR_NOTFOUND) {
result = fdt_add_subnode(new_dtb, nodeoffset, node);
- if (result) {
+ if (result < 0) {
dbgprintf("%s: fdt_add_subnode failed: %s\n", __func__,
fdt_strerror(result));
goto on_error;
--
2.7.4
_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec
^ permalink raw reply related [flat|nested] 13+ messages in thread
* Re: [PATCH] kexec/dt-ops.c: Fix check against 'fdt_add_subnode' return value
2018-11-11 20:30 [PATCH] kexec/dt-ops.c: Fix check against 'fdt_add_subnode' return value Bhupesh Sharma
@ 2018-11-12 2:24 ` AKASHI Takahiro
2018-11-15 14:10 ` Simon Horman
0 siblings, 1 reply; 13+ messages in thread
From: AKASHI Takahiro @ 2018-11-12 2:24 UTC (permalink / raw)
To: Bhupesh Sharma; +Cc: bhupesh.linux, kexec, Simon Horman
On Mon, Nov 12, 2018 at 02:00:16AM +0530, Bhupesh Sharma wrote:
> Vicenç reported (via [1]) that currently executing kexec with
> '--dtb' option and passing a .dtb which doesn't have a '/chosen' node
> leads to the following error:
>
> # kexec -d --dtb dtb_without_chosen_node.dtb --append 'cmdline' --load Image
>
> dtb_set_property: fdt_add_subnode failed: <valid offset/length>
> kexec: Set device tree bootargs failed.
>
> This happens because currently we check the return value of
> 'fdt_add_subnode()' function call in 'dt-ops.c' incorrectly:
>
> result = fdt_add_subnode(new_dtb, nodeoffset, node);
> if (result) {
> dbgprintf("%s: fdt_add_subnode failed: %s\n", _func__,
> fdt_strerror(result));
> goto on_error;
> }
>
> As we can see in 'fdt_rw.c', a positive return value from
> 'fdt_add_subnode()' function doesn't indicate an error.
>
> We can see that the Linux kernel (see 'drivers/firmware/efi/libstub/fdt.c'
> for example) also checks the 'fdt_add_subnode()' function against negative
> return values for errors. See an example below from 'update_fdt()' function in
> 'drivers/firmware/efi/libstub/fdt.c':
>
> node = fdt_add_subnode(fdt, 0, "chosen");
> if (node < 0) {
> status = node;
> <..snip..>
> goto fdt_set_fail;
> }
>
> This patch fixes the same in 'kexec-tools'.
Looks good.
Thank you.
-Takahiro Akashi
> [1]. http://lists.infradead.org/pipermail/kexec/2018-October/021746.html
>
> Cc: Simon Horman <horms@verge.net.au>
> Cc: AKASHI Takahiro <takahiro.akashi@linaro.org>
> Reported-by: Vicente Bergas <vicencb@gmail.com>
> Signed-off-by: Bhupesh Sharma <bhsharma@redhat.com>
> ---
> kexec/dt-ops.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/kexec/dt-ops.c b/kexec/dt-ops.c
> index 915dbf55afd2..f15174c3c74e 100644
> --- a/kexec/dt-ops.c
> +++ b/kexec/dt-ops.c
> @@ -84,7 +84,7 @@ int dtb_set_property(char **dtb, off_t *dtb_size, const char *node,
> if (nodeoffset == -FDT_ERR_NOTFOUND) {
> result = fdt_add_subnode(new_dtb, nodeoffset, node);
>
> - if (result) {
> + if (result < 0) {
> dbgprintf("%s: fdt_add_subnode failed: %s\n", __func__,
> fdt_strerror(result));
> goto on_error;
> --
> 2.7.4
>
_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec
^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH] kexec/dt-ops.c: Fix check against 'fdt_add_subnode' return value
@ 2018-11-12 16:10 Vicente Bergas
0 siblings, 0 replies; 13+ messages in thread
From: Vicente Bergas @ 2018-11-12 16:10 UTC (permalink / raw)
To: bhsharma; +Cc: takahiro.akashi, horms, kexec
On Mon, 12 Nov 2018 02:00:16 +0530, Bhupesh Sharma wrote:
> Vicenç reported (via [1]) that currently executing kexec with
> '--dtb' option and passing a .dtb which doesn't have a '/chosen' node
> leads to the following error:
>
> # kexec -d --dtb dtb_without_chosen_node.dtb --append 'cmdline' --load Image
>
> dtb_set_property: fdt_add_subnode failed: <valid offset/length>
> kexec: Set device tree bootargs failed.
>
> This happens because currently we check the return value of
> 'fdt_add_subnode()' function call in 'dt-ops.c' incorrectly:
>
> result = fdt_add_subnode(new_dtb, nodeoffset, node);
> if (result) {
> dbgprintf("%s: fdt_add_subnode failed: %s\n", _func__,
> fdt_strerror(result));
> goto on_error;
> }
>
> As we can see in 'fdt_rw.c', a positive return value from
> 'fdt_add_subnode()' function doesn't indicate an error.
>
> We can see that the Linux kernel (see 'drivers/firmware/efi/libstub/fdt.c'
> for example) also checks the 'fdt_add_subnode()' function against negative
> return values for errors. See an example below from 'update_fdt()' function in
> 'drivers/firmware/efi/libstub/fdt.c':
>
> node = fdt_add_subnode(fdt, 0, "chosen");
> if (node < 0) {
> status = node;
> <..snip..>
> goto fdt_set_fail;
> }
>
> This patch fixes the same in 'kexec-tools'.
The patch looks fine, but the end result is still non-working:
# kexec -d --load Image --append 'debug' --dtb no_chosen.dtb
...
dtb_set_property: fdt_setprop failed: FDT_ERR_BADOFFSET
kexec: Set device tree bootargs failed.
Also tested this with the same result:
--- a/kexec/dt-ops.c
+++ b/kexec/dt-ops.c
@@ -84,11 +84,13 @@
if (nodeoffset == -FDT_ERR_NOTFOUND) {
result = fdt_add_subnode(new_dtb, nodeoffset, node);
- if (result) {
+ if (result < 0) {
dbgprintf("%s: fdt_add_subnode failed: %s\n", __func__,
fdt_strerror(result));
goto on_error;
}
+
+ nodeoffset = result;
} else if (nodeoffset < 0) {
dbgprintf("%s: fdt_path_offset failed: %s\n", __func__,
fdt_strerror(nodeoffset));
Regards,
Vicenç.
> [1]. http://lists.infradead.org/pipermail/kexec/2018-October/021746.html
>
> Cc: Simon Horman <horms@verge.net.au>
> Cc: AKASHI Takahiro <takahiro.akashi@linaro.org>
> Reported-by: Vicente Bergas <vicencb@gmail.com>
> Signed-off-by: Bhupesh Sharma <bhsharma@redhat.com>
> ---
> kexec/dt-ops.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/kexec/dt-ops.c b/kexec/dt-ops.c
> index 915dbf55afd2..f15174c3c74e 100644
> --- a/kexec/dt-ops.c
> +++ b/kexec/dt-ops.c
> @@ -84,7 +84,7 @@ int dtb_set_property(char **dtb, off_t *dtb_size, const char *node,
> if (nodeoffset == -FDT_ERR_NOTFOUND) {
> result = fdt_add_subnode(new_dtb, nodeoffset, node);
>
> - if (result) {
> + if (result < 0) {
> dbgprintf("%s: fdt_add_subnode failed: %s\n", __func__,
> fdt_strerror(result));
> goto on_error;
> --
> 2.7.4
_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH] kexec/dt-ops.c: Fix check against 'fdt_add_subnode' return value
2018-11-12 2:24 ` AKASHI Takahiro
@ 2018-11-15 14:10 ` Simon Horman
2018-11-15 14:13 ` Simon Horman
0 siblings, 1 reply; 13+ messages in thread
From: Simon Horman @ 2018-11-15 14:10 UTC (permalink / raw)
To: AKASHI Takahiro, Bhupesh Sharma, kexec, bhupesh.linux
On Mon, Nov 12, 2018 at 11:24:07AM +0900, AKASHI Takahiro wrote:
> On Mon, Nov 12, 2018 at 02:00:16AM +0530, Bhupesh Sharma wrote:
> > Vicenç reported (via [1]) that currently executing kexec with
> > '--dtb' option and passing a .dtb which doesn't have a '/chosen' node
> > leads to the following error:
> >
> > # kexec -d --dtb dtb_without_chosen_node.dtb --append 'cmdline' --load Image
> >
> > dtb_set_property: fdt_add_subnode failed: <valid offset/length>
> > kexec: Set device tree bootargs failed.
> >
> > This happens because currently we check the return value of
> > 'fdt_add_subnode()' function call in 'dt-ops.c' incorrectly:
> >
> > result = fdt_add_subnode(new_dtb, nodeoffset, node);
> > if (result) {
> > dbgprintf("%s: fdt_add_subnode failed: %s\n", _func__,
> > fdt_strerror(result));
> > goto on_error;
> > }
> >
> > As we can see in 'fdt_rw.c', a positive return value from
> > 'fdt_add_subnode()' function doesn't indicate an error.
> >
> > We can see that the Linux kernel (see 'drivers/firmware/efi/libstub/fdt.c'
> > for example) also checks the 'fdt_add_subnode()' function against negative
> > return values for errors. See an example below from 'update_fdt()' function in
> > 'drivers/firmware/efi/libstub/fdt.c':
> >
> > node = fdt_add_subnode(fdt, 0, "chosen");
> > if (node < 0) {
> > status = node;
> > <..snip..>
> > goto fdt_set_fail;
> > }
> >
> > This patch fixes the same in 'kexec-tools'.
>
> Looks good.
> Thank you.
> -Takahiro Akashi
Thanks, applied.
_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH] kexec/dt-ops.c: Fix check against 'fdt_add_subnode' return value
2018-11-15 14:10 ` Simon Horman
@ 2018-11-15 14:13 ` Simon Horman
2018-11-15 18:38 ` Vicente Bergas
0 siblings, 1 reply; 13+ messages in thread
From: Simon Horman @ 2018-11-15 14:13 UTC (permalink / raw)
To: AKASHI Takahiro, Bhupesh Sharma, kexec, bhupesh.linux,
Vicente Bergas
On Thu, Nov 15, 2018 at 06:10:36AM -0800, Simon Horman wrote:
> On Mon, Nov 12, 2018 at 11:24:07AM +0900, AKASHI Takahiro wrote:
> > On Mon, Nov 12, 2018 at 02:00:16AM +0530, Bhupesh Sharma wrote:
> > > Vicenç reported (via [1]) that currently executing kexec with
> > > '--dtb' option and passing a .dtb which doesn't have a '/chosen' node
> > > leads to the following error:
> > >
> > > # kexec -d --dtb dtb_without_chosen_node.dtb --append 'cmdline' --load Image
> > >
> > > dtb_set_property: fdt_add_subnode failed: <valid offset/length>
> > > kexec: Set device tree bootargs failed.
> > >
> > > This happens because currently we check the return value of
> > > 'fdt_add_subnode()' function call in 'dt-ops.c' incorrectly:
> > >
> > > result = fdt_add_subnode(new_dtb, nodeoffset, node);
> > > if (result) {
> > > dbgprintf("%s: fdt_add_subnode failed: %s\n", _func__,
> > > fdt_strerror(result));
> > > goto on_error;
> > > }
> > >
> > > As we can see in 'fdt_rw.c', a positive return value from
> > > 'fdt_add_subnode()' function doesn't indicate an error.
> > >
> > > We can see that the Linux kernel (see 'drivers/firmware/efi/libstub/fdt.c'
> > > for example) also checks the 'fdt_add_subnode()' function against negative
> > > return values for errors. See an example below from 'update_fdt()' function in
> > > 'drivers/firmware/efi/libstub/fdt.c':
> > >
> > > node = fdt_add_subnode(fdt, 0, "chosen");
> > > if (node < 0) {
> > > status = node;
> > > <..snip..>
> > > goto fdt_set_fail;
> > > }
> > >
> > > This patch fixes the same in 'kexec-tools'.
> >
> > Looks good.
> > Thank you.
> > -Takahiro Akashi
>
> Thanks, applied.
Perhaps I was a little too hasty there, I have dropped the patch for now.
Vicente, does this patch work for you?
_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH] kexec/dt-ops.c: Fix check against 'fdt_add_subnode' return value
2018-11-15 14:13 ` Simon Horman
@ 2018-11-15 18:38 ` Vicente Bergas
2018-11-15 19:40 ` Bhupesh Sharma
2018-11-16 12:03 ` Bhupesh Sharma
0 siblings, 2 replies; 13+ messages in thread
From: Vicente Bergas @ 2018-11-15 18:38 UTC (permalink / raw)
To: Simon Horman; +Cc: Takahiro Akashi, bhsharma, bhupesh.linux, kexec
On Thu, Nov 15, 2018 at 3:14 PM Simon Horman <horms@verge.net.au> wrote:
>
> On Thu, Nov 15, 2018 at 06:10:36AM -0800, Simon Horman wrote:
> > On Mon, Nov 12, 2018 at 11:24:07AM +0900, AKASHI Takahiro wrote:
> > > On Mon, Nov 12, 2018 at 02:00:16AM +0530, Bhupesh Sharma wrote:
> > > > Vicenç reported (via [1]) that currently executing kexec with
> > > > '--dtb' option and passing a .dtb which doesn't have a '/chosen' node
> > > > leads to the following error:
> > > >
> > > > # kexec -d --dtb dtb_without_chosen_node.dtb --append 'cmdline' --load Image
> > > >
> > > > dtb_set_property: fdt_add_subnode failed: <valid offset/length>
> > > > kexec: Set device tree bootargs failed.
> > > >
> > > > This happens because currently we check the return value of
> > > > 'fdt_add_subnode()' function call in 'dt-ops.c' incorrectly:
> > > >
> > > > result = fdt_add_subnode(new_dtb, nodeoffset, node);
> > > > if (result) {
> > > > dbgprintf("%s: fdt_add_subnode failed: %s\n", _func__,
> > > > fdt_strerror(result));
> > > > goto on_error;
> > > > }
> > > >
> > > > As we can see in 'fdt_rw.c', a positive return value from
> > > > 'fdt_add_subnode()' function doesn't indicate an error.
> > > >
> > > > We can see that the Linux kernel (see 'drivers/firmware/efi/libstub/fdt.c'
> > > > for example) also checks the 'fdt_add_subnode()' function against negative
> > > > return values for errors. See an example below from 'update_fdt()' function in
> > > > 'drivers/firmware/efi/libstub/fdt.c':
> > > >
> > > > node = fdt_add_subnode(fdt, 0, "chosen");
> > > > if (node < 0) {
> > > > status = node;
> > > > <..snip..>
> > > > goto fdt_set_fail;
> > > > }
> > > >
> > > > This patch fixes the same in 'kexec-tools'.
> > >
> > > Looks good.
> > > Thank you.
> > > -Takahiro Akashi
> >
> > Thanks, applied.
>
> Perhaps I was a little too hasty there, I have dropped the patch for now.
>
> Vicente, does this patch work for you?
The patch looks fine, but the end result is still non-working:
# kexec -d --load Image --append 'debug' --dtb no_chosen.dtb
...
dtb_set_property: fdt_setprop failed: FDT_ERR_BADOFFSET
kexec: Set device tree bootargs failed.
Also tested this with the same result:
--- a/kexec/dt-ops.c
+++ b/kexec/dt-ops.c
@@ -84,11 +84,13 @@
if (nodeoffset == -FDT_ERR_NOTFOUND) {
result = fdt_add_subnode(new_dtb, nodeoffset, node);
- if (result) {
+ if (result < 0) {
dbgprintf("%s: fdt_add_subnode failed: %s\n", __func__,
fdt_strerror(result));
goto on_error;
}
+
+ nodeoffset = result;
} else if (nodeoffset < 0) {
dbgprintf("%s: fdt_path_offset failed: %s\n", __func__,
fdt_strerror(nodeoffset));
Regards,
Vicenç.
_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH] kexec/dt-ops.c: Fix check against 'fdt_add_subnode' return value
2018-11-15 18:38 ` Vicente Bergas
@ 2018-11-15 19:40 ` Bhupesh Sharma
2018-11-16 12:03 ` Bhupesh Sharma
1 sibling, 0 replies; 13+ messages in thread
From: Bhupesh Sharma @ 2018-11-15 19:40 UTC (permalink / raw)
To: vicencb; +Cc: AKASHI Takahiro, Bhupesh SHARMA, Simon Horman, kexec mailing list
Hi Vicenç, Simon,
On Fri, Nov 16, 2018 at 12:08 AM Vicente Bergas <vicencb@gmail.com> wrote:
>
> On Thu, Nov 15, 2018 at 3:14 PM Simon Horman <horms@verge.net.au> wrote:
> >
> > On Thu, Nov 15, 2018 at 06:10:36AM -0800, Simon Horman wrote:
> > > On Mon, Nov 12, 2018 at 11:24:07AM +0900, AKASHI Takahiro wrote:
> > > > On Mon, Nov 12, 2018 at 02:00:16AM +0530, Bhupesh Sharma wrote:
> > > > > Vicenç reported (via [1]) that currently executing kexec with
> > > > > '--dtb' option and passing a .dtb which doesn't have a '/chosen' node
> > > > > leads to the following error:
> > > > >
> > > > > # kexec -d --dtb dtb_without_chosen_node.dtb --append 'cmdline' --load Image
> > > > >
> > > > > dtb_set_property: fdt_add_subnode failed: <valid offset/length>
> > > > > kexec: Set device tree bootargs failed.
> > > > >
> > > > > This happens because currently we check the return value of
> > > > > 'fdt_add_subnode()' function call in 'dt-ops.c' incorrectly:
> > > > >
> > > > > result = fdt_add_subnode(new_dtb, nodeoffset, node);
> > > > > if (result) {
> > > > > dbgprintf("%s: fdt_add_subnode failed: %s\n", _func__,
> > > > > fdt_strerror(result));
> > > > > goto on_error;
> > > > > }
> > > > >
> > > > > As we can see in 'fdt_rw.c', a positive return value from
> > > > > 'fdt_add_subnode()' function doesn't indicate an error.
> > > > >
> > > > > We can see that the Linux kernel (see 'drivers/firmware/efi/libstub/fdt.c'
> > > > > for example) also checks the 'fdt_add_subnode()' function against negative
> > > > > return values for errors. See an example below from 'update_fdt()' function in
> > > > > 'drivers/firmware/efi/libstub/fdt.c':
> > > > >
> > > > > node = fdt_add_subnode(fdt, 0, "chosen");
> > > > > if (node < 0) {
> > > > > status = node;
> > > > > <..snip..>
> > > > > goto fdt_set_fail;
> > > > > }
> > > > >
> > > > > This patch fixes the same in 'kexec-tools'.
> > > >
> > > > Looks good.
> > > > Thank you.
> > > > -Takahiro Akashi
> > >
> > > Thanks, applied.
> >
> > Perhaps I was a little too hasty there, I have dropped the patch for now.
> >
> > Vicente, does this patch work for you?
>
> The patch looks fine, but the end result is still non-working:
> # kexec -d --load Image --append 'debug' --dtb no_chosen.dtb
> ...
> dtb_set_property: fdt_setprop failed: FDT_ERR_BADOFFSET
> kexec: Set device tree bootargs failed.
>
> Also tested this with the same result:
> --- a/kexec/dt-ops.c
> +++ b/kexec/dt-ops.c
> @@ -84,11 +84,13 @@
> if (nodeoffset == -FDT_ERR_NOTFOUND) {
> result = fdt_add_subnode(new_dtb, nodeoffset, node);
>
> - if (result) {
> + if (result < 0) {
> dbgprintf("%s: fdt_add_subnode failed: %s\n", __func__,
> fdt_strerror(result));
> goto on_error;
> }
> +
> + nodeoffset = result;
> } else if (nodeoffset < 0) {
> dbgprintf("%s: fdt_path_offset failed: %s\n", __func__,
> fdt_strerror(nodeoffset));
>
I am checking this at my end today. I will come back with either an
updated patch or some queries (in case I run into some issues)
probably by tomorrow.
Thanks,
Bhupesh
_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH] kexec/dt-ops.c: Fix check against 'fdt_add_subnode' return value
2018-11-15 18:38 ` Vicente Bergas
2018-11-15 19:40 ` Bhupesh Sharma
@ 2018-11-16 12:03 ` Bhupesh Sharma
2018-11-16 15:29 ` Vicente Bergas
1 sibling, 1 reply; 13+ messages in thread
From: Bhupesh Sharma @ 2018-11-16 12:03 UTC (permalink / raw)
To: vicencb; +Cc: AKASHI Takahiro, Bhupesh SHARMA, Simon Horman, kexec mailing list
Hi Vicenç,
I tried the patch at my end and it works fine as per my checks.
So, can I request you to provide some additional data which will help
me understand your environment better. See inline:
On Fri, Nov 16, 2018 at 12:08 AM Vicente Bergas <vicencb@gmail.com> wrote:
>
> On Thu, Nov 15, 2018 at 3:14 PM Simon Horman <horms@verge.net.au> wrote:
> >
> > On Thu, Nov 15, 2018 at 06:10:36AM -0800, Simon Horman wrote:
> > > On Mon, Nov 12, 2018 at 11:24:07AM +0900, AKASHI Takahiro wrote:
> > > > On Mon, Nov 12, 2018 at 02:00:16AM +0530, Bhupesh Sharma wrote:
> > > > > Vicenç reported (via [1]) that currently executing kexec with
> > > > > '--dtb' option and passing a .dtb which doesn't have a '/chosen' node
> > > > > leads to the following error:
> > > > >
> > > > > # kexec -d --dtb dtb_without_chosen_node.dtb --append 'cmdline' --load Image
> > > > >
> > > > > dtb_set_property: fdt_add_subnode failed: <valid offset/length>
> > > > > kexec: Set device tree bootargs failed.
> > > > >
> > > > > This happens because currently we check the return value of
> > > > > 'fdt_add_subnode()' function call in 'dt-ops.c' incorrectly:
> > > > >
> > > > > result = fdt_add_subnode(new_dtb, nodeoffset, node);
> > > > > if (result) {
> > > > > dbgprintf("%s: fdt_add_subnode failed: %s\n", _func__,
> > > > > fdt_strerror(result));
> > > > > goto on_error;
> > > > > }
> > > > >
> > > > > As we can see in 'fdt_rw.c', a positive return value from
> > > > > 'fdt_add_subnode()' function doesn't indicate an error.
> > > > >
> > > > > We can see that the Linux kernel (see 'drivers/firmware/efi/libstub/fdt.c'
> > > > > for example) also checks the 'fdt_add_subnode()' function against negative
> > > > > return values for errors. See an example below from 'update_fdt()' function in
> > > > > 'drivers/firmware/efi/libstub/fdt.c':
> > > > >
> > > > > node = fdt_add_subnode(fdt, 0, "chosen");
> > > > > if (node < 0) {
> > > > > status = node;
> > > > > <..snip..>
> > > > > goto fdt_set_fail;
> > > > > }
> > > > >
> > > > > This patch fixes the same in 'kexec-tools'.
> > > >
> > > > Looks good.
> > > > Thank you.
> > > > -Takahiro Akashi
> > >
> > > Thanks, applied.
> >
> > Perhaps I was a little too hasty there, I have dropped the patch for now.
> >
> > Vicente, does this patch work for you?
>
> The patch looks fine, but the end result is still non-working:
> # kexec -d --load Image --append 'debug' --dtb no_chosen.dtb
Can you share the .dts with which you see this issue and steps you use
to create the .dtb file at your end?
I normally use at my end the following command:
dtc -o no-chosen.dtb -I dts -O dtb no-chosen.dts
Thanks,
Bhupesh
> ...
> dtb_set_property: fdt_setprop failed: FDT_ERR_BADOFFSET
> kexec: Set device tree bootargs failed.
>
> Also tested this with the same result:
> --- a/kexec/dt-ops.c
> +++ b/kexec/dt-ops.c
> @@ -84,11 +84,13 @@
> if (nodeoffset == -FDT_ERR_NOTFOUND) {
> result = fdt_add_subnode(new_dtb, nodeoffset, node);
>
> - if (result) {
> + if (result < 0) {
> dbgprintf("%s: fdt_add_subnode failed: %s\n", __func__,
> fdt_strerror(result));
> goto on_error;
> }
> +
> + nodeoffset = result;
> } else if (nodeoffset < 0) {
> dbgprintf("%s: fdt_path_offset failed: %s\n", __func__,
> fdt_strerror(nodeoffset));
>
> Regards,
> Vicenç.
_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH] kexec/dt-ops.c: Fix check against 'fdt_add_subnode' return value
2018-11-16 12:03 ` Bhupesh Sharma
@ 2018-11-16 15:29 ` Vicente Bergas
2018-11-28 22:00 ` Bhupesh Sharma
0 siblings, 1 reply; 13+ messages in thread
From: Vicente Bergas @ 2018-11-16 15:29 UTC (permalink / raw)
To: bhsharma; +Cc: Takahiro Akashi, Bhupesh SHARMA, Simon Horman, kexec
On Fri, Nov 16, 2018 at 1:04 PM Bhupesh Sharma <bhsharma@redhat.com> wrote:
>
> Hi Vicenç,
>
> I tried the patch at my end and it works fine as per my checks.
> So, can I request you to provide some additional data which will help
> me understand your environment better. See inline:
>
> On Fri, Nov 16, 2018 at 12:08 AM Vicente Bergas <vicencb@gmail.com> wrote:
> >
> > On Thu, Nov 15, 2018 at 3:14 PM Simon Horman <horms@verge.net.au> wrote:
> > >
> > > On Thu, Nov 15, 2018 at 06:10:36AM -0800, Simon Horman wrote:
> > > > On Mon, Nov 12, 2018 at 11:24:07AM +0900, AKASHI Takahiro wrote:
> > > > > On Mon, Nov 12, 2018 at 02:00:16AM +0530, Bhupesh Sharma wrote:
> > > > > > Vicenç reported (via [1]) that currently executing kexec with
> > > > > > '--dtb' option and passing a .dtb which doesn't have a '/chosen' node
> > > > > > leads to the following error:
> > > > > >
> > > > > > # kexec -d --dtb dtb_without_chosen_node.dtb --append 'cmdline' --load Image
> > > > > >
> > > > > > dtb_set_property: fdt_add_subnode failed: <valid offset/length>
> > > > > > kexec: Set device tree bootargs failed.
> > > > > >
> > > > > > This happens because currently we check the return value of
> > > > > > 'fdt_add_subnode()' function call in 'dt-ops.c' incorrectly:
> > > > > >
> > > > > > result = fdt_add_subnode(new_dtb, nodeoffset, node);
> > > > > > if (result) {
> > > > > > dbgprintf("%s: fdt_add_subnode failed: %s\n", _func__,
> > > > > > fdt_strerror(result));
> > > > > > goto on_error;
> > > > > > }
> > > > > >
> > > > > > As we can see in 'fdt_rw.c', a positive return value from
> > > > > > 'fdt_add_subnode()' function doesn't indicate an error.
> > > > > >
> > > > > > We can see that the Linux kernel (see 'drivers/firmware/efi/libstub/fdt.c'
> > > > > > for example) also checks the 'fdt_add_subnode()' function against negative
> > > > > > return values for errors. See an example below from 'update_fdt()' function in
> > > > > > 'drivers/firmware/efi/libstub/fdt.c':
> > > > > >
> > > > > > node = fdt_add_subnode(fdt, 0, "chosen");
> > > > > > if (node < 0) {
> > > > > > status = node;
> > > > > > <..snip..>
> > > > > > goto fdt_set_fail;
> > > > > > }
> > > > > >
> > > > > > This patch fixes the same in 'kexec-tools'.
> > > > >
> > > > > Looks good.
> > > > > Thank you.
> > > > > -Takahiro Akashi
> > > >
> > > > Thanks, applied.
> > >
> > > Perhaps I was a little too hasty there, I have dropped the patch for now.
> > >
> > > Vicente, does this patch work for you?
> >
> > The patch looks fine, but the end result is still non-working:
> > # kexec -d --load Image --append 'debug' --dtb no_chosen.dtb
>
> Can you share the .dts with which you see this issue and steps you use
> to create the .dtb file at your end?
>
> I normally use at my end the following command:
> dtc -o no-chosen.dtb -I dts -O dtb no-chosen.dts
>
> Thanks,
> Bhupesh
Hi Bhupesh,
the issue is not with dtc, it is with kexec. The following script
reproduces the issue:
#!/bin/sh -ve
uname -m
# aarch64
git clone 'https://git.kernel.org/pub/scm/utils/kernel/kexec/kexec-tools.git'
kexec-tools-orig
cp -a kexec-tools-orig kexec-tools-test
git -C kexec-tools-orig checkout -b orig 'v2.0.18'
git -C kexec-tools-test checkout -b test 'v2.0.18'
cat patch.diff
#--- a/kexec/dt-ops.c
#+++ b/kexec/dt-ops.c
#@@ -84,7 +84,7 @@ int dtb_set_property(char **dtb, off_t *dtb_size,
const char *node,
# if (nodeoffset == -FDT_ERR_NOTFOUND) {
# result = fdt_add_subnode(new_dtb, nodeoffset, node);
#
#- if (result) {
#+ if (result < 0) {
# dbgprintf("%s: fdt_add_subnode failed: %s\n", __func__,
# fdt_strerror(result));
# goto on_error;
patch -d kexec-tools-test -p1 < patch.diff
( cd kexec-tools-orig ; ./bootstrap )
( cd kexec-tools-test ; ./bootstrap )
( cd kexec-tools-orig ; ./configure )
( cd kexec-tools-test ; ./configure )
make -C kexec-tools-orig
make -C kexec-tools-test
wget 'http://mirror.archlinuxarm.org/aarch64/core/linux-aarch64-4.19.2-1-aarch64.pkg.tar.xz'
bsdtar xf 'linux-aarch64-4.19.2-1-aarch64.pkg.tar.xz'
sudo kexec-tools-orig/build/sbin/kexec -d --load boot/Image --append
'debug' --dtb boot/dtbs/rockchip/rk3399-sapphire.dtb
# dtb_set_property: fdt_add_subnode failed: <valid offset/length>
# kexec: Set device tree bootargs failed.
sudo kexec-tools-test/build/sbin/kexec -d --load boot/Image --append
'debug' --dtb boot/dtbs/rockchip/rk3399-sapphire.dtb
# dtb_set_property: fdt_setprop failed: FDT_ERR_BADOFFSET
# kexec: Set device tree bootargs failed.
Regards,
Vicenç.
> > ...
> > dtb_set_property: fdt_setprop failed: FDT_ERR_BADOFFSET
> > kexec: Set device tree bootargs failed.
> >
> > Also tested this with the same result:
> > --- a/kexec/dt-ops.c
> > +++ b/kexec/dt-ops.c
> > @@ -84,11 +84,13 @@
> > if (nodeoffset == -FDT_ERR_NOTFOUND) {
> > result = fdt_add_subnode(new_dtb, nodeoffset, node);
> >
> > - if (result) {
> > + if (result < 0) {
> > dbgprintf("%s: fdt_add_subnode failed: %s\n", __func__,
> > fdt_strerror(result));
> > goto on_error;
> > }
> > +
> > + nodeoffset = result;
> > } else if (nodeoffset < 0) {
> > dbgprintf("%s: fdt_path_offset failed: %s\n", __func__,
> > fdt_strerror(nodeoffset));
> >
> > Regards,
> > Vicenç.
_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH] kexec/dt-ops.c: Fix check against 'fdt_add_subnode' return value
2018-11-16 15:29 ` Vicente Bergas
@ 2018-11-28 22:00 ` Bhupesh Sharma
2018-11-30 5:40 ` Bhupesh Sharma
0 siblings, 1 reply; 13+ messages in thread
From: Bhupesh Sharma @ 2018-11-28 22:00 UTC (permalink / raw)
To: vicencb; +Cc: AKASHI Takahiro, Bhupesh SHARMA, Simon Horman, kexec mailing list
Hi Vicenç,
Sorry I got busy and just got some spare time to look at this issue. I
am able to fix it partially, but I am still not completely happy with
it, but mainly here is the issue for the 'kexec load' option - we are
passing wrong 'nodeoffset' while calling 'fdt_add_subnode()', which
should be 0 instead of FDT_ERR_NOTFOUND when the chosen node is not
seen in the passed dtb :
From 2433daf279744ae30fa9c74ec5b39507740d7163 Mon Sep 17 00:00:00 2001
From: Bhupesh Sharma <bhsharma@redhat.com>
Date: Thu, 29 Nov 2018 00:41:06 +0530
Subject: [PATCH] Add some debug logs
Signed-off-by: Bhupesh Sharma <bhsharma@redhat.com>
---
kexec/arch/arm64/kexec-arm64.c | 8 ++++++++
kexec/dt-ops.c | 3 ++-
kexec/libfdt/fdt_ro.c | 14 +++++++-------
kexec/libfdt/fdt_rw.c | 2 ++
4 files changed, 19 insertions(+), 8 deletions(-)
diff --git a/kexec/arch/arm64/kexec-arm64.c b/kexec/arch/arm64/kexec-arm64.c
index 6c7d2512b1d4..e29afc30db43 100644
--- a/kexec/arch/arm64/kexec-arm64.c
+++ b/kexec/arch/arm64/kexec-arm64.c
@@ -207,6 +207,9 @@ static int set_bootargs(struct dtb *dtb, const
char *command_line)
if (!command_line || !command_line[0])
return 0;
+ dbgprintf("%s: found %s\n", __func__, dtb->path);
+ dump_fdt(dtb->buf);
+
result = dtb_set_bootargs(&dtb->buf, &dtb->size, command_line);
if (result) {
@@ -413,6 +416,11 @@ static int setup_2nd_dtb(struct dtb *dtb, char
*command_line, int on_crash)
}
result = set_bootargs(dtb, command_line);
+ if (result) {
+ fprintf(stderr, "kexec: cannot set bootargs.\n");
+ result = -EINVAL;
+ goto on_error;
+ }
/* determine #address-cells and #size-cells */
result = get_cells_size(dtb->buf, &address_cells, &size_cells);
diff --git a/kexec/dt-ops.c b/kexec/dt-ops.c
index a0276f1e48b3..79b0404bafc4 100644
--- a/kexec/dt-ops.c
+++ b/kexec/dt-ops.c
@@ -86,13 +86,14 @@ int dtb_set_property(char **dtb, off_t *dtb_size,
const char *node,
nodeoffset = fdt_path_offset(new_dtb, node);
if (nodeoffset == -FDT_ERR_NOTFOUND) {
- result = fdt_add_subnode(new_dtb, nodeoffset, node);
+ result = fdt_add_subnode(new_dtb, 0, node);
if (result < 0) {
dbgprintf("%s: fdt_add_subnode failed: %s\n", __func__,
fdt_strerror(result));
goto on_error;
}
+ nodeoffset = result;
} else if (nodeoffset < 0) {
dbgprintf("%s: fdt_path_offset failed: %s\n", __func__,
fdt_strerror(nodeoffset));
diff --git a/kexec/libfdt/fdt_ro.c b/kexec/libfdt/fdt_ro.c
index 129b532bcc1a..0dce53083c96 100644
--- a/kexec/libfdt/fdt_ro.c
+++ b/kexec/libfdt/fdt_ro.c
@@ -105,14 +105,14 @@ int fdt_subnode_offset_namelen(const void *fdt,
int offset,
FDT_CHECK_HEADER(fdt);
for (depth = 0;
- offset >= 0;
- offset = fdt_next_node(fdt, offset, &depth)) {
- if (depth < 0)
- return -FDT_ERR_NOTFOUND;
- else if ((depth == 1)
- && _fdt_nodename_eq(fdt, offset, name, namelen))
+ (offset >= 0) && (depth >= 0);
+ offset = fdt_next_node(fdt, offset, &depth))
+ if ((depth == 1)
+ && _fdt_nodename_eq(fdt, offset, name, namelen))
return offset;
- }
+
+ if (depth < 0)
+ return -FDT_ERR_NOTFOUND;
return offset; /* error */
}
diff --git a/kexec/libfdt/fdt_rw.c b/kexec/libfdt/fdt_rw.c
index 8e7ec4cb7bcd..2fac7c0731c0 100644
--- a/kexec/libfdt/fdt_rw.c
+++ b/kexec/libfdt/fdt_rw.c
@@ -101,6 +101,8 @@ static int _fdt_splice(void *fdt, void
*splicepoint, int oldlen, int newlen)
if (((p + oldlen) < p) || ((p + oldlen) > end))
return -FDT_ERR_BADOFFSET;
+ if ((p < (char *)fdt) || ((end - oldlen + newlen) < (char *)fdt))
+ return -FDT_ERR_BADOFFSET;
if ((end - oldlen + newlen) > ((char *)fdt + fdt_totalsize(fdt)))
return -FDT_ERR_NOSPACE;
memmove(p + newlen, p + oldlen, end - p - oldlen);
--
2.7.4
Here are some logs at my end after this fix (I used some earlier work
I did for dump'ing dtb on arm64 boards to get the dtb logs:
<https://www.spinics.net/lists/kexec/msg20951.html>):
# kexec -d -l /root/Image --append 'debug' --dtb /root/rk3399-sapphire.dtb
<..snip..>
image_arm64_load: PE format: yes
/ {
compatible = "rockchip,rk3399-sapphire";
interrupt-parent = <0x00000001>;
#address-cells = <0x00000002>;
#size-cells = <0x00000002>;
model = "Sapphire-RK3399 Board";
/chosen {
bootargs = "debug";
};
aliases {
<..snip..>
};
get_cells_size: #address-cells:2 #size-cells:2
cells_size_fitted: 0-0
cells_size_fitted: 0-0
setup_2nd_dtb: no kaslr-seed found
dtb: base 81ef0000, size d0a1h (53409)
sym: sha256_starts info: 12 other: 00 shndx: 1 value: ec0 size: 6c
sym: sha256_starts value: 81f00ec0 addr: 81f00018
machine_apply_elf_rel: CALL26 580006b394000000->580006b3940003aa
sym: sha256_update info: 12 other: 00 shndx: 1 value: 5168 size: c
sym: sha256_update value: 81f05168 addr: 81f00034
machine_apply_elf_rel: CALL26 9100427394000000->910042739400144d
sym: sha256_finish info: 12 other: 00 shndx: 1 value: 5174 size: 1cc
sym: sha256_finish value: 81f05174 addr: 81f00050
machine_apply_elf_rel: CALL26 aa1403e094000000->aa1403e094001449
sym: memcmp info: 12 other: 00 shndx: 1 value: 64c size: 34
sym: memcmp value: 81f0064c addr: 81f00060
machine_apply_elf_rel: CALL26 340003c094000000->340003c09400017b
sym: printf info: 12 other: 00 shndx: 1 value: 55c size: 90
sym: printf value: 81f0055c addr: 81f00070
machine_apply_elf_rel: CALL26 5800046094000000->580004609400013b
sym: printf info: 12 other: 00 shndx: 1 value: 55c size: 90
sym: printf value: 81f0055c addr: 81f00078
machine_apply_elf_rel: CALL26 5800047594000000->5800047594000139
sym: printf info: 12 other: 00 shndx: 1 value: 55c size: 90
sym: printf value: 81f0055c addr: 81f00088
machine_apply_elf_rel: CALL26 9100067394000000->9100067394000135
sym: printf info: 12 other: 00 shndx: 1 value: 55c size: 90
sym: printf value: 81f0055c addr: 81f000a8
machine_apply_elf_rel: CALL26 5800036094000000->580003609400012d
sym: printf info: 12 other: 00 shndx: 1 value: 55c size: 90
sym: printf value: 81f0055c addr: 81f000b0
machine_apply_elf_rel: CALL26 910402e194000000->910402e19400012b
sym: printf info: 12 other: 00 shndx: 1 value: 55c size: 90
sym: printf value: 81f0055c addr: 81f000c0
machine_apply_elf_rel: CALL26 9100067394000000->9100067394000127
sym: printf info: 12 other: 00 shndx: 1 value: 55c size: 90
sym: printf value: 81f0055c addr: 81f000d4
machine_apply_elf_rel: CALL26 5280002094000000->5280002094000122
sym: .data info: 03 other: 00 shndx: 4 value: 0 size: 0
sym: .data value: 81f053b8 addr: 81f000f0
machine_apply_elf_rel: ABS64 0000000000000000->0000000081f053b8
sym: .rodata.str1.1 info: 03 other: 00 shndx: 3 value: 0 size: 0
sym: .rodata.str1.1 value: 81f05348 addr: 81f000f8
machine_apply_elf_rel: ABS64 0000000000000000->0000000081f05348
sym: .rodata.str1.1 info: 03 other: 00 shndx: 3 value: 0 size: 0
sym: .rodata.str1.1 value: 81f05368 addr: 81f00100
machine_apply_elf_rel: ABS64 0000000000000000->0000000081f05368
sym: .rodata.str1.1 info: 03 other: 00 shndx: 3 value: 0 size: 0
sym: .rodata.str1.1 value: 81f05378 addr: 81f00108
machine_apply_elf_rel: ABS64 0000000000000000->0000000081f05378
sym: .rodata.str1.1 info: 03 other: 00 shndx: 3 value: 0 size: 0
sym: .rodata.str1.1 value: 81f0537e addr: 81f00110
machine_apply_elf_rel: ABS64 0000000000000000->0000000081f0537e
sym: .rodata.str1.1 info: 03 other: 00 shndx: 3 value: 0 size: 0
sym: .rodata.str1.1 value: 81f05380 addr: 81f00118
machine_apply_elf_rel: ABS64 0000000000000000->0000000081f05380
sym: printf info: 12 other: 00 shndx: 1 value: 55c size: 90
sym: printf value: 81f0055c addr: 81f0012c
machine_apply_elf_rel: CALL26 9400000094000000->940000009400010c
sym: setup_arch info: 12 other: 00 shndx: 1 value: eb8 size: 4
sym: setup_arch value: 81f00eb8 addr: 81f00130
machine_apply_elf_rel: CALL26 5800016094000000->5800016094000362
sym: verify_sha256_digest info: 12 other: 00 shndx: 1 value: 0 size: f0
sym: verify_sha256_digest value: 81f00000 addr: 81f00140
machine_apply_elf_rel: CALL26 3400004094000000->3400004097ffffb0
sym: post_verification_setup_arch info: 12 other: 00 shndx: 1 value: eb4 size: 4
sym: post_verification_setup_arch value: 81f00eb4 addr: 81f00150
machine_apply_elf_rel: JUMP26 d503201f14000000->d503201f14000359
sym: .rodata.str1.1 info: 03 other: 00 shndx: 3 value: 0 size: 0
sym: .rodata.str1.1 value: 81f05390 addr: 81f00158
machine_apply_elf_rel: ABS64 0000000000000000->0000000081f05390
sym: .data info: 03 other: 00 shndx: 4 value: 0 size: 0
sym: .data value: 81f053b8 addr: 81f00160
machine_apply_elf_rel: ABS64 0000000000000000->0000000081f053b8
sym: putchar info: 12 other: 00 shndx: 1 value: eb0 size: 4
sym: putchar value: 81f00eb0 addr: 81f001c4
machine_apply_elf_rel: CALL26 f94037a194000000->f94037a19400033b
sym: putchar info: 12 other: 00 shndx: 1 value: eb0 size: 4
sym: putchar value: 81f00eb0 addr: 81f00238
machine_apply_elf_rel: CALL26 910006f794000000->910006f79400031e
sym: putchar info: 12 other: 00 shndx: 1 value: eb0 size: 4
sym: putchar value: 81f00eb0 addr: 81f00490
machine_apply_elf_rel: CALL26 9100073994000000->9100073994000288
sym: .rodata.str1.1 info: 03 other: 00 shndx: 3 value: 0 size: 0
sym: .rodata.str1.1 value: 81f053a2 addr: 81f004d0
machine_apply_elf_rel: ABS64 0000000000000000->0000000081f053a2
sym: vsprintf info: 12 other: 00 shndx: 1 value: 168 size: 364
sym: vsprintf value: 81f00168 addr: 81f00550
machine_apply_elf_rel: CALL26 a8d07bfd94000000->a8d07bfd97ffff06
sym: vsprintf info: 12 other: 00 shndx: 1 value: 168 size: 364
sym: vsprintf value: 81f00168 addr: 81f005e0
machine_apply_elf_rel: CALL26 a8d17bfd94000000->a8d17bfd97fffee2
sym: purgatory info: 12 other: 00 shndx: 1 value: 120 size: 34
sym: purgatory value: 81f00120 addr: 81f00688
machine_apply_elf_rel: CALL26 5800001194000000->5800001197fffea6
sym: arm64_kernel_entry info: 10 other: 00 shndx: 4 value: 128 size: 8
sym: arm64_kernel_entry value: 81f054e0 addr: 81f0068c
machine_apply_elf_rel: LD_PREL_LO19 5800000058000011->58000000580272b1
sym: arm64_dtb_addr info: 10 other: 00 shndx: 4 value: 130 size: 8
sym: arm64_dtb_addr value: 81f054e8 addr: 81f00690
machine_apply_elf_rel: LD_PREL_LO19 aa1f03e158000000->aa1f03e1580272c0
sym: sha256_process info: 12 other: 00 shndx: 1 value: f2c size: 4134
sym: sha256_process value: 81f00f2c addr: 81f050cc
machine_apply_elf_rel: CALL26 d101029494000000->d101029497ffef98
sym: memcpy info: 12 other: 00 shndx: 1 value: 62c size: 20
sym: memcpy value: 81f0062c addr: 81f05128
machine_apply_elf_rel: JUMP26 b4fffc5814000000->b4fffc5817ffed41
sym: memcpy info: 12 other: 00 shndx: 1 value: 62c size: 20
sym: memcpy value: 81f0062c addr: 81f05140
machine_apply_elf_rel: CALL26 aa1503e094000000->aa1503e097ffed3b
sym: sha256_process info: 12 other: 00 shndx: 1 value: f2c size: 4134
sym: sha256_process value: 81f00f2c addr: 81f0514c
machine_apply_elf_rel: CALL26 cb1302d694000000->cb1302d697ffef78
sym: .data info: 03 other: 00 shndx: 4 value: 0 size: 0
sym: .data value: 81f054f0 addr: 81f05340
machine_apply_elf_rel: ABS64 0000000000000000->0000000081f054f0
kexec_load: entry = 0x81f00680 flags = 0xb70000
nr_segments = 3
segment[0].buf = 0xffff8bab0010
segment[0].bufsz = 0x1999a00
segment[0].mem = 0x80480000
segment[0].memsz = 0x1a70000
segment[1].buf = 0x16984e10
segment[1].bufsz = 0xd0a1
segment[1].mem = 0x81ef0000
segment[1].memsz = 0x10000
segment[2].buf = 0x16992230
segment[2].bufsz = 0x5530
segment[2].mem = 0x81f00000
segment[2].memsz = 0x10000
I will try to stabilize this more both for 'kexec load' and 'kexec
dump' use-cases and try to send a patch soon to fix this issue.
Regards,
Bhupesh
On Fri, Nov 16, 2018 at 8:59 PM Vicente Bergas <vicencb@gmail.com> wrote:
>
> On Fri, Nov 16, 2018 at 1:04 PM Bhupesh Sharma <bhsharma@redhat.com> wrote:
> >
> > Hi Vicenç,
> >
> > I tried the patch at my end and it works fine as per my checks.
> > So, can I request you to provide some additional data which will help
> > me understand your environment better. See inline:
> >
> > On Fri, Nov 16, 2018 at 12:08 AM Vicente Bergas <vicencb@gmail.com> wrote:
> > >
> > > On Thu, Nov 15, 2018 at 3:14 PM Simon Horman <horms@verge.net.au> wrote:
> > > >
> > > > On Thu, Nov 15, 2018 at 06:10:36AM -0800, Simon Horman wrote:
> > > > > On Mon, Nov 12, 2018 at 11:24:07AM +0900, AKASHI Takahiro wrote:
> > > > > > On Mon, Nov 12, 2018 at 02:00:16AM +0530, Bhupesh Sharma wrote:
> > > > > > > Vicenç reported (via [1]) that currently executing kexec with
> > > > > > > '--dtb' option and passing a .dtb which doesn't have a '/chosen' node
> > > > > > > leads to the following error:
> > > > > > >
> > > > > > > # kexec -d --dtb dtb_without_chosen_node.dtb --append 'cmdline' --load Image
> > > > > > >
> > > > > > > dtb_set_property: fdt_add_subnode failed: <valid offset/length>
> > > > > > > kexec: Set device tree bootargs failed.
> > > > > > >
> > > > > > > This happens because currently we check the return value of
> > > > > > > 'fdt_add_subnode()' function call in 'dt-ops.c' incorrectly:
> > > > > > >
> > > > > > > result = fdt_add_subnode(new_dtb, nodeoffset, node);
> > > > > > > if (result) {
> > > > > > > dbgprintf("%s: fdt_add_subnode failed: %s\n", _func__,
> > > > > > > fdt_strerror(result));
> > > > > > > goto on_error;
> > > > > > > }
> > > > > > >
> > > > > > > As we can see in 'fdt_rw.c', a positive return value from
> > > > > > > 'fdt_add_subnode()' function doesn't indicate an error.
> > > > > > >
> > > > > > > We can see that the Linux kernel (see 'drivers/firmware/efi/libstub/fdt.c'
> > > > > > > for example) also checks the 'fdt_add_subnode()' function against negative
> > > > > > > return values for errors. See an example below from 'update_fdt()' function in
> > > > > > > 'drivers/firmware/efi/libstub/fdt.c':
> > > > > > >
> > > > > > > node = fdt_add_subnode(fdt, 0, "chosen");
> > > > > > > if (node < 0) {
> > > > > > > status = node;
> > > > > > > <..snip..>
> > > > > > > goto fdt_set_fail;
> > > > > > > }
> > > > > > >
> > > > > > > This patch fixes the same in 'kexec-tools'.
> > > > > >
> > > > > > Looks good.
> > > > > > Thank you.
> > > > > > -Takahiro Akashi
> > > > >
> > > > > Thanks, applied.
> > > >
> > > > Perhaps I was a little too hasty there, I have dropped the patch for now.
> > > >
> > > > Vicente, does this patch work for you?
> > >
> > > The patch looks fine, but the end result is still non-working:
> > > # kexec -d --load Image --append 'debug' --dtb no_chosen.dtb
> >
> > Can you share the .dts with which you see this issue and steps you use
> > to create the .dtb file at your end?
> >
> > I normally use at my end the following command:
> > dtc -o no-chosen.dtb -I dts -O dtb no-chosen.dts
> >
> > Thanks,
> > Bhupesh
>
> Hi Bhupesh,
> the issue is not with dtc, it is with kexec. The following script
> reproduces the issue:
> #!/bin/sh -ve
>
> uname -m
> # aarch64
>
> git clone 'https://git.kernel.org/pub/scm/utils/kernel/kexec/kexec-tools.git'
> kexec-tools-orig
> cp -a kexec-tools-orig kexec-tools-test
> git -C kexec-tools-orig checkout -b orig 'v2.0.18'
> git -C kexec-tools-test checkout -b test 'v2.0.18'
>
> cat patch.diff
> #--- a/kexec/dt-ops.c
> #+++ b/kexec/dt-ops.c
> #@@ -84,7 +84,7 @@ int dtb_set_property(char **dtb, off_t *dtb_size,
> const char *node,
> # if (nodeoffset == -FDT_ERR_NOTFOUND) {
> # result = fdt_add_subnode(new_dtb, nodeoffset, node);
> #
> #- if (result) {
> #+ if (result < 0) {
> # dbgprintf("%s: fdt_add_subnode failed: %s\n", __func__,
> # fdt_strerror(result));
> # goto on_error;
> patch -d kexec-tools-test -p1 < patch.diff
>
> ( cd kexec-tools-orig ; ./bootstrap )
> ( cd kexec-tools-test ; ./bootstrap )
> ( cd kexec-tools-orig ; ./configure )
> ( cd kexec-tools-test ; ./configure )
> make -C kexec-tools-orig
> make -C kexec-tools-test
>
> wget 'http://mirror.archlinuxarm.org/aarch64/core/linux-aarch64-4.19.2-1-aarch64.pkg.tar.xz'
> bsdtar xf 'linux-aarch64-4.19.2-1-aarch64.pkg.tar.xz'
>
> sudo kexec-tools-orig/build/sbin/kexec -d --load boot/Image --append
> 'debug' --dtb boot/dtbs/rockchip/rk3399-sapphire.dtb
> # dtb_set_property: fdt_add_subnode failed: <valid offset/length>
> # kexec: Set device tree bootargs failed.
>
> sudo kexec-tools-test/build/sbin/kexec -d --load boot/Image --append
> 'debug' --dtb boot/dtbs/rockchip/rk3399-sapphire.dtb
> # dtb_set_property: fdt_setprop failed: FDT_ERR_BADOFFSET
> # kexec: Set device tree bootargs failed.
>
> Regards,
> Vicenç.
>
> > > ...
> > > dtb_set_property: fdt_setprop failed: FDT_ERR_BADOFFSET
> > > kexec: Set device tree bootargs failed.
> > >
> > > Also tested this with the same result:
> > > --- a/kexec/dt-ops.c
> > > +++ b/kexec/dt-ops.c
> > > @@ -84,11 +84,13 @@
> > > if (nodeoffset == -FDT_ERR_NOTFOUND) {
> > > result = fdt_add_subnode(new_dtb, nodeoffset, node);
> > >
> > > - if (result) {
> > > + if (result < 0) {
> > > dbgprintf("%s: fdt_add_subnode failed: %s\n", __func__,
> > > fdt_strerror(result));
> > > goto on_error;
> > > }
> > > +
> > > + nodeoffset = result;
> > > } else if (nodeoffset < 0) {
> > > dbgprintf("%s: fdt_path_offset failed: %s\n", __func__,
> > > fdt_strerror(nodeoffset));
> > >
> > > Regards,
> > > Vicenç.
_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec
^ permalink raw reply related [flat|nested] 13+ messages in thread
* Re: [PATCH] kexec/dt-ops.c: Fix check against 'fdt_add_subnode' return value
2018-11-28 22:00 ` Bhupesh Sharma
@ 2018-11-30 5:40 ` Bhupesh Sharma
2018-11-30 14:59 ` Vicente Bergas
0 siblings, 1 reply; 13+ messages in thread
From: Bhupesh Sharma @ 2018-11-30 5:40 UTC (permalink / raw)
To: Vicente Bergas
Cc: AKASHI Takahiro, Bhupesh SHARMA, Simon Horman, kexec mailing list
Hi Vicenç,
I have posted a revised and more comprehensive patchset for this issue
today (please see the same here:
<http://lists.infradead.org/pipermail/kexec/2018-November/021999.html>)
I was able to exercise all the basic 'kexe load' and 'kdump' use cases
on arm64 after these changes and I can also get the use-cases where we
don't have a '/chosen' node in the .dtb to either PASS or FAIL with
correct error reporting. Here is a listing of the basic use cases and
their results:
# kexec -d -l Image --append=debug --dtb rk3399-sapphire.dtb
ok
# kexec -d -l Image --reuse-cmdline --initrd=/boot/initramfs-`uname -r`.img
ok
# kexec -d -p Image --reuse-cmdline --initrd=/boot/initramfs-`uname -r`.img
ok
# kexec -d -p Image --append=debug --dtb rk3399-sapphire.dtb
<..snip..>
setup_2nd_dtb: /chosen node not found - can't create dtb for dump
kernel: FDT_ERR_NOTFOUND
kexec: setup_2nd_dtb failed.
kexec: load failed.
Cannot load Image
Can you please try and test this patchset on your setup and let me
know in case you land in any further issues?
Thanks,
Bhupesh
On Thu, Nov 29, 2018 at 3:30 AM Bhupesh Sharma <bhsharma@redhat.com> wrote:
>
> Hi Vicenç,
>
> Sorry I got busy and just got some spare time to look at this issue. I
> am able to fix it partially, but I am still not completely happy with
> it, but mainly here is the issue for the 'kexec load' option - we are
> passing wrong 'nodeoffset' while calling 'fdt_add_subnode()', which
> should be 0 instead of FDT_ERR_NOTFOUND when the chosen node is not
> seen in the passed dtb :
>
> From 2433daf279744ae30fa9c74ec5b39507740d7163 Mon Sep 17 00:00:00 2001
> From: Bhupesh Sharma <bhsharma@redhat.com>
> Date: Thu, 29 Nov 2018 00:41:06 +0530
> Subject: [PATCH] Add some debug logs
>
> Signed-off-by: Bhupesh Sharma <bhsharma@redhat.com>
> ---
> kexec/arch/arm64/kexec-arm64.c | 8 ++++++++
> kexec/dt-ops.c | 3 ++-
> kexec/libfdt/fdt_ro.c | 14 +++++++-------
> kexec/libfdt/fdt_rw.c | 2 ++
> 4 files changed, 19 insertions(+), 8 deletions(-)
>
> diff --git a/kexec/arch/arm64/kexec-arm64.c b/kexec/arch/arm64/kexec-arm64.c
> index 6c7d2512b1d4..e29afc30db43 100644
> --- a/kexec/arch/arm64/kexec-arm64.c
> +++ b/kexec/arch/arm64/kexec-arm64.c
> @@ -207,6 +207,9 @@ static int set_bootargs(struct dtb *dtb, const
> char *command_line)
> if (!command_line || !command_line[0])
> return 0;
>
> + dbgprintf("%s: found %s\n", __func__, dtb->path);
> + dump_fdt(dtb->buf);
> +
> result = dtb_set_bootargs(&dtb->buf, &dtb->size, command_line);
>
> if (result) {
> @@ -413,6 +416,11 @@ static int setup_2nd_dtb(struct dtb *dtb, char
> *command_line, int on_crash)
> }
>
> result = set_bootargs(dtb, command_line);
> + if (result) {
> + fprintf(stderr, "kexec: cannot set bootargs.\n");
> + result = -EINVAL;
> + goto on_error;
> + }
>
> /* determine #address-cells and #size-cells */
> result = get_cells_size(dtb->buf, &address_cells, &size_cells);
> diff --git a/kexec/dt-ops.c b/kexec/dt-ops.c
> index a0276f1e48b3..79b0404bafc4 100644
> --- a/kexec/dt-ops.c
> +++ b/kexec/dt-ops.c
> @@ -86,13 +86,14 @@ int dtb_set_property(char **dtb, off_t *dtb_size,
> const char *node,
> nodeoffset = fdt_path_offset(new_dtb, node);
>
> if (nodeoffset == -FDT_ERR_NOTFOUND) {
> - result = fdt_add_subnode(new_dtb, nodeoffset, node);
> + result = fdt_add_subnode(new_dtb, 0, node);
>
> if (result < 0) {
> dbgprintf("%s: fdt_add_subnode failed: %s\n", __func__,
> fdt_strerror(result));
> goto on_error;
> }
> + nodeoffset = result;
> } else if (nodeoffset < 0) {
> dbgprintf("%s: fdt_path_offset failed: %s\n", __func__,
> fdt_strerror(nodeoffset));
> diff --git a/kexec/libfdt/fdt_ro.c b/kexec/libfdt/fdt_ro.c
> index 129b532bcc1a..0dce53083c96 100644
> --- a/kexec/libfdt/fdt_ro.c
> +++ b/kexec/libfdt/fdt_ro.c
> @@ -105,14 +105,14 @@ int fdt_subnode_offset_namelen(const void *fdt,
> int offset,
> FDT_CHECK_HEADER(fdt);
>
> for (depth = 0;
> - offset >= 0;
> - offset = fdt_next_node(fdt, offset, &depth)) {
> - if (depth < 0)
> - return -FDT_ERR_NOTFOUND;
> - else if ((depth == 1)
> - && _fdt_nodename_eq(fdt, offset, name, namelen))
> + (offset >= 0) && (depth >= 0);
> + offset = fdt_next_node(fdt, offset, &depth))
> + if ((depth == 1)
> + && _fdt_nodename_eq(fdt, offset, name, namelen))
> return offset;
> - }
> +
> + if (depth < 0)
> + return -FDT_ERR_NOTFOUND;
>
> return offset; /* error */
> }
> diff --git a/kexec/libfdt/fdt_rw.c b/kexec/libfdt/fdt_rw.c
> index 8e7ec4cb7bcd..2fac7c0731c0 100644
> --- a/kexec/libfdt/fdt_rw.c
> +++ b/kexec/libfdt/fdt_rw.c
> @@ -101,6 +101,8 @@ static int _fdt_splice(void *fdt, void
> *splicepoint, int oldlen, int newlen)
>
> if (((p + oldlen) < p) || ((p + oldlen) > end))
> return -FDT_ERR_BADOFFSET;
> + if ((p < (char *)fdt) || ((end - oldlen + newlen) < (char *)fdt))
> + return -FDT_ERR_BADOFFSET;
> if ((end - oldlen + newlen) > ((char *)fdt + fdt_totalsize(fdt)))
> return -FDT_ERR_NOSPACE;
> memmove(p + newlen, p + oldlen, end - p - oldlen);
> --
> 2.7.4
>
> Here are some logs at my end after this fix (I used some earlier work
> I did for dump'ing dtb on arm64 boards to get the dtb logs:
> <https://www.spinics.net/lists/kexec/msg20951.html>):
>
> # kexec -d -l /root/Image --append 'debug' --dtb /root/rk3399-sapphire.dtb
> <..snip..>
>
> image_arm64_load: PE format: yes
> / {
> compatible = "rockchip,rk3399-sapphire";
> interrupt-parent = <0x00000001>;
> #address-cells = <0x00000002>;
> #size-cells = <0x00000002>;
> model = "Sapphire-RK3399 Board";
> /chosen {
> bootargs = "debug";
> };
> aliases {
>
> <..snip..>
> };
> get_cells_size: #address-cells:2 #size-cells:2
> cells_size_fitted: 0-0
> cells_size_fitted: 0-0
> setup_2nd_dtb: no kaslr-seed found
> dtb: base 81ef0000, size d0a1h (53409)
> sym: sha256_starts info: 12 other: 00 shndx: 1 value: ec0 size: 6c
> sym: sha256_starts value: 81f00ec0 addr: 81f00018
> machine_apply_elf_rel: CALL26 580006b394000000->580006b3940003aa
> sym: sha256_update info: 12 other: 00 shndx: 1 value: 5168 size: c
> sym: sha256_update value: 81f05168 addr: 81f00034
> machine_apply_elf_rel: CALL26 9100427394000000->910042739400144d
> sym: sha256_finish info: 12 other: 00 shndx: 1 value: 5174 size: 1cc
> sym: sha256_finish value: 81f05174 addr: 81f00050
> machine_apply_elf_rel: CALL26 aa1403e094000000->aa1403e094001449
> sym: memcmp info: 12 other: 00 shndx: 1 value: 64c size: 34
> sym: memcmp value: 81f0064c addr: 81f00060
> machine_apply_elf_rel: CALL26 340003c094000000->340003c09400017b
> sym: printf info: 12 other: 00 shndx: 1 value: 55c size: 90
> sym: printf value: 81f0055c addr: 81f00070
> machine_apply_elf_rel: CALL26 5800046094000000->580004609400013b
> sym: printf info: 12 other: 00 shndx: 1 value: 55c size: 90
> sym: printf value: 81f0055c addr: 81f00078
> machine_apply_elf_rel: CALL26 5800047594000000->5800047594000139
> sym: printf info: 12 other: 00 shndx: 1 value: 55c size: 90
> sym: printf value: 81f0055c addr: 81f00088
> machine_apply_elf_rel: CALL26 9100067394000000->9100067394000135
> sym: printf info: 12 other: 00 shndx: 1 value: 55c size: 90
> sym: printf value: 81f0055c addr: 81f000a8
> machine_apply_elf_rel: CALL26 5800036094000000->580003609400012d
> sym: printf info: 12 other: 00 shndx: 1 value: 55c size: 90
> sym: printf value: 81f0055c addr: 81f000b0
> machine_apply_elf_rel: CALL26 910402e194000000->910402e19400012b
> sym: printf info: 12 other: 00 shndx: 1 value: 55c size: 90
> sym: printf value: 81f0055c addr: 81f000c0
> machine_apply_elf_rel: CALL26 9100067394000000->9100067394000127
> sym: printf info: 12 other: 00 shndx: 1 value: 55c size: 90
> sym: printf value: 81f0055c addr: 81f000d4
> machine_apply_elf_rel: CALL26 5280002094000000->5280002094000122
> sym: .data info: 03 other: 00 shndx: 4 value: 0 size: 0
> sym: .data value: 81f053b8 addr: 81f000f0
> machine_apply_elf_rel: ABS64 0000000000000000->0000000081f053b8
> sym: .rodata.str1.1 info: 03 other: 00 shndx: 3 value: 0 size: 0
> sym: .rodata.str1.1 value: 81f05348 addr: 81f000f8
> machine_apply_elf_rel: ABS64 0000000000000000->0000000081f05348
> sym: .rodata.str1.1 info: 03 other: 00 shndx: 3 value: 0 size: 0
> sym: .rodata.str1.1 value: 81f05368 addr: 81f00100
> machine_apply_elf_rel: ABS64 0000000000000000->0000000081f05368
> sym: .rodata.str1.1 info: 03 other: 00 shndx: 3 value: 0 size: 0
> sym: .rodata.str1.1 value: 81f05378 addr: 81f00108
> machine_apply_elf_rel: ABS64 0000000000000000->0000000081f05378
> sym: .rodata.str1.1 info: 03 other: 00 shndx: 3 value: 0 size: 0
> sym: .rodata.str1.1 value: 81f0537e addr: 81f00110
> machine_apply_elf_rel: ABS64 0000000000000000->0000000081f0537e
> sym: .rodata.str1.1 info: 03 other: 00 shndx: 3 value: 0 size: 0
> sym: .rodata.str1.1 value: 81f05380 addr: 81f00118
> machine_apply_elf_rel: ABS64 0000000000000000->0000000081f05380
> sym: printf info: 12 other: 00 shndx: 1 value: 55c size: 90
> sym: printf value: 81f0055c addr: 81f0012c
> machine_apply_elf_rel: CALL26 9400000094000000->940000009400010c
> sym: setup_arch info: 12 other: 00 shndx: 1 value: eb8 size: 4
> sym: setup_arch value: 81f00eb8 addr: 81f00130
> machine_apply_elf_rel: CALL26 5800016094000000->5800016094000362
> sym: verify_sha256_digest info: 12 other: 00 shndx: 1 value: 0 size: f0
> sym: verify_sha256_digest value: 81f00000 addr: 81f00140
> machine_apply_elf_rel: CALL26 3400004094000000->3400004097ffffb0
> sym: post_verification_setup_arch info: 12 other: 00 shndx: 1 value: eb4 size: 4
> sym: post_verification_setup_arch value: 81f00eb4 addr: 81f00150
> machine_apply_elf_rel: JUMP26 d503201f14000000->d503201f14000359
> sym: .rodata.str1.1 info: 03 other: 00 shndx: 3 value: 0 size: 0
> sym: .rodata.str1.1 value: 81f05390 addr: 81f00158
> machine_apply_elf_rel: ABS64 0000000000000000->0000000081f05390
> sym: .data info: 03 other: 00 shndx: 4 value: 0 size: 0
> sym: .data value: 81f053b8 addr: 81f00160
> machine_apply_elf_rel: ABS64 0000000000000000->0000000081f053b8
> sym: putchar info: 12 other: 00 shndx: 1 value: eb0 size: 4
> sym: putchar value: 81f00eb0 addr: 81f001c4
> machine_apply_elf_rel: CALL26 f94037a194000000->f94037a19400033b
> sym: putchar info: 12 other: 00 shndx: 1 value: eb0 size: 4
> sym: putchar value: 81f00eb0 addr: 81f00238
> machine_apply_elf_rel: CALL26 910006f794000000->910006f79400031e
> sym: putchar info: 12 other: 00 shndx: 1 value: eb0 size: 4
> sym: putchar value: 81f00eb0 addr: 81f00490
> machine_apply_elf_rel: CALL26 9100073994000000->9100073994000288
> sym: .rodata.str1.1 info: 03 other: 00 shndx: 3 value: 0 size: 0
> sym: .rodata.str1.1 value: 81f053a2 addr: 81f004d0
> machine_apply_elf_rel: ABS64 0000000000000000->0000000081f053a2
> sym: vsprintf info: 12 other: 00 shndx: 1 value: 168 size: 364
> sym: vsprintf value: 81f00168 addr: 81f00550
> machine_apply_elf_rel: CALL26 a8d07bfd94000000->a8d07bfd97ffff06
> sym: vsprintf info: 12 other: 00 shndx: 1 value: 168 size: 364
> sym: vsprintf value: 81f00168 addr: 81f005e0
> machine_apply_elf_rel: CALL26 a8d17bfd94000000->a8d17bfd97fffee2
> sym: purgatory info: 12 other: 00 shndx: 1 value: 120 size: 34
> sym: purgatory value: 81f00120 addr: 81f00688
> machine_apply_elf_rel: CALL26 5800001194000000->5800001197fffea6
> sym: arm64_kernel_entry info: 10 other: 00 shndx: 4 value: 128 size: 8
> sym: arm64_kernel_entry value: 81f054e0 addr: 81f0068c
> machine_apply_elf_rel: LD_PREL_LO19 5800000058000011->58000000580272b1
> sym: arm64_dtb_addr info: 10 other: 00 shndx: 4 value: 130 size: 8
> sym: arm64_dtb_addr value: 81f054e8 addr: 81f00690
> machine_apply_elf_rel: LD_PREL_LO19 aa1f03e158000000->aa1f03e1580272c0
> sym: sha256_process info: 12 other: 00 shndx: 1 value: f2c size: 4134
> sym: sha256_process value: 81f00f2c addr: 81f050cc
> machine_apply_elf_rel: CALL26 d101029494000000->d101029497ffef98
> sym: memcpy info: 12 other: 00 shndx: 1 value: 62c size: 20
> sym: memcpy value: 81f0062c addr: 81f05128
> machine_apply_elf_rel: JUMP26 b4fffc5814000000->b4fffc5817ffed41
> sym: memcpy info: 12 other: 00 shndx: 1 value: 62c size: 20
> sym: memcpy value: 81f0062c addr: 81f05140
> machine_apply_elf_rel: CALL26 aa1503e094000000->aa1503e097ffed3b
> sym: sha256_process info: 12 other: 00 shndx: 1 value: f2c size: 4134
> sym: sha256_process value: 81f00f2c addr: 81f0514c
> machine_apply_elf_rel: CALL26 cb1302d694000000->cb1302d697ffef78
> sym: .data info: 03 other: 00 shndx: 4 value: 0 size: 0
> sym: .data value: 81f054f0 addr: 81f05340
> machine_apply_elf_rel: ABS64 0000000000000000->0000000081f054f0
> kexec_load: entry = 0x81f00680 flags = 0xb70000
> nr_segments = 3
> segment[0].buf = 0xffff8bab0010
> segment[0].bufsz = 0x1999a00
> segment[0].mem = 0x80480000
> segment[0].memsz = 0x1a70000
> segment[1].buf = 0x16984e10
> segment[1].bufsz = 0xd0a1
> segment[1].mem = 0x81ef0000
> segment[1].memsz = 0x10000
> segment[2].buf = 0x16992230
> segment[2].bufsz = 0x5530
> segment[2].mem = 0x81f00000
> segment[2].memsz = 0x10000
>
> I will try to stabilize this more both for 'kexec load' and 'kexec
> dump' use-cases and try to send a patch soon to fix this issue.
>
> Regards,
> Bhupesh
> On Fri, Nov 16, 2018 at 8:59 PM Vicente Bergas <vicencb@gmail.com> wrote:
> >
> > On Fri, Nov 16, 2018 at 1:04 PM Bhupesh Sharma <bhsharma@redhat.com> wrote:
> > >
> > > Hi Vicenç,
> > >
> > > I tried the patch at my end and it works fine as per my checks.
> > > So, can I request you to provide some additional data which will help
> > > me understand your environment better. See inline:
> > >
> > > On Fri, Nov 16, 2018 at 12:08 AM Vicente Bergas <vicencb@gmail.com> wrote:
> > > >
> > > > On Thu, Nov 15, 2018 at 3:14 PM Simon Horman <horms@verge.net.au> wrote:
> > > > >
> > > > > On Thu, Nov 15, 2018 at 06:10:36AM -0800, Simon Horman wrote:
> > > > > > On Mon, Nov 12, 2018 at 11:24:07AM +0900, AKASHI Takahiro wrote:
> > > > > > > On Mon, Nov 12, 2018 at 02:00:16AM +0530, Bhupesh Sharma wrote:
> > > > > > > > Vicenç reported (via [1]) that currently executing kexec with
> > > > > > > > '--dtb' option and passing a .dtb which doesn't have a '/chosen' node
> > > > > > > > leads to the following error:
> > > > > > > >
> > > > > > > > # kexec -d --dtb dtb_without_chosen_node.dtb --append 'cmdline' --load Image
> > > > > > > >
> > > > > > > > dtb_set_property: fdt_add_subnode failed: <valid offset/length>
> > > > > > > > kexec: Set device tree bootargs failed.
> > > > > > > >
> > > > > > > > This happens because currently we check the return value of
> > > > > > > > 'fdt_add_subnode()' function call in 'dt-ops.c' incorrectly:
> > > > > > > >
> > > > > > > > result = fdt_add_subnode(new_dtb, nodeoffset, node);
> > > > > > > > if (result) {
> > > > > > > > dbgprintf("%s: fdt_add_subnode failed: %s\n", _func__,
> > > > > > > > fdt_strerror(result));
> > > > > > > > goto on_error;
> > > > > > > > }
> > > > > > > >
> > > > > > > > As we can see in 'fdt_rw.c', a positive return value from
> > > > > > > > 'fdt_add_subnode()' function doesn't indicate an error.
> > > > > > > >
> > > > > > > > We can see that the Linux kernel (see 'drivers/firmware/efi/libstub/fdt.c'
> > > > > > > > for example) also checks the 'fdt_add_subnode()' function against negative
> > > > > > > > return values for errors. See an example below from 'update_fdt()' function in
> > > > > > > > 'drivers/firmware/efi/libstub/fdt.c':
> > > > > > > >
> > > > > > > > node = fdt_add_subnode(fdt, 0, "chosen");
> > > > > > > > if (node < 0) {
> > > > > > > > status = node;
> > > > > > > > <..snip..>
> > > > > > > > goto fdt_set_fail;
> > > > > > > > }
> > > > > > > >
> > > > > > > > This patch fixes the same in 'kexec-tools'.
> > > > > > >
> > > > > > > Looks good.
> > > > > > > Thank you.
> > > > > > > -Takahiro Akashi
> > > > > >
> > > > > > Thanks, applied.
> > > > >
> > > > > Perhaps I was a little too hasty there, I have dropped the patch for now.
> > > > >
> > > > > Vicente, does this patch work for you?
> > > >
> > > > The patch looks fine, but the end result is still non-working:
> > > > # kexec -d --load Image --append 'debug' --dtb no_chosen.dtb
> > >
> > > Can you share the .dts with which you see this issue and steps you use
> > > to create the .dtb file at your end?
> > >
> > > I normally use at my end the following command:
> > > dtc -o no-chosen.dtb -I dts -O dtb no-chosen.dts
> > >
> > > Thanks,
> > > Bhupesh
> >
> > Hi Bhupesh,
> > the issue is not with dtc, it is with kexec. The following script
> > reproduces the issue:
> > #!/bin/sh -ve
> >
> > uname -m
> > # aarch64
> >
> > git clone 'https://git.kernel.org/pub/scm/utils/kernel/kexec/kexec-tools.git'
> > kexec-tools-orig
> > cp -a kexec-tools-orig kexec-tools-test
> > git -C kexec-tools-orig checkout -b orig 'v2.0.18'
> > git -C kexec-tools-test checkout -b test 'v2.0.18'
> >
> > cat patch.diff
> > #--- a/kexec/dt-ops.c
> > #+++ b/kexec/dt-ops.c
> > #@@ -84,7 +84,7 @@ int dtb_set_property(char **dtb, off_t *dtb_size,
> > const char *node,
> > # if (nodeoffset == -FDT_ERR_NOTFOUND) {
> > # result = fdt_add_subnode(new_dtb, nodeoffset, node);
> > #
> > #- if (result) {
> > #+ if (result < 0) {
> > # dbgprintf("%s: fdt_add_subnode failed: %s\n", __func__,
> > # fdt_strerror(result));
> > # goto on_error;
> > patch -d kexec-tools-test -p1 < patch.diff
> >
> > ( cd kexec-tools-orig ; ./bootstrap )
> > ( cd kexec-tools-test ; ./bootstrap )
> > ( cd kexec-tools-orig ; ./configure )
> > ( cd kexec-tools-test ; ./configure )
> > make -C kexec-tools-orig
> > make -C kexec-tools-test
> >
> > wget 'http://mirror.archlinuxarm.org/aarch64/core/linux-aarch64-4.19.2-1-aarch64.pkg.tar.xz'
> > bsdtar xf 'linux-aarch64-4.19.2-1-aarch64.pkg.tar.xz'
> >
> > sudo kexec-tools-orig/build/sbin/kexec -d --load boot/Image --append
> > 'debug' --dtb boot/dtbs/rockchip/rk3399-sapphire.dtb
> > # dtb_set_property: fdt_add_subnode failed: <valid offset/length>
> > # kexec: Set device tree bootargs failed.
> >
> > sudo kexec-tools-test/build/sbin/kexec -d --load boot/Image --append
> > 'debug' --dtb boot/dtbs/rockchip/rk3399-sapphire.dtb
> > # dtb_set_property: fdt_setprop failed: FDT_ERR_BADOFFSET
> > # kexec: Set device tree bootargs failed.
> >
> > Regards,
> > Vicenç.
> >
> > > > ...
> > > > dtb_set_property: fdt_setprop failed: FDT_ERR_BADOFFSET
> > > > kexec: Set device tree bootargs failed.
> > > >
> > > > Also tested this with the same result:
> > > > --- a/kexec/dt-ops.c
> > > > +++ b/kexec/dt-ops.c
> > > > @@ -84,11 +84,13 @@
> > > > if (nodeoffset == -FDT_ERR_NOTFOUND) {
> > > > result = fdt_add_subnode(new_dtb, nodeoffset, node);
> > > >
> > > > - if (result) {
> > > > + if (result < 0) {
> > > > dbgprintf("%s: fdt_add_subnode failed: %s\n", __func__,
> > > > fdt_strerror(result));
> > > > goto on_error;
> > > > }
> > > > +
> > > > + nodeoffset = result;
> > > > } else if (nodeoffset < 0) {
> > > > dbgprintf("%s: fdt_path_offset failed: %s\n", __func__,
> > > > fdt_strerror(nodeoffset));
> > > >
> > > > Regards,
> > > > Vicenç.
_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH] kexec/dt-ops.c: Fix check against 'fdt_add_subnode' return value
2018-11-30 5:40 ` Bhupesh Sharma
@ 2018-11-30 14:59 ` Vicente Bergas
2018-11-30 15:03 ` Bhupesh Sharma
0 siblings, 1 reply; 13+ messages in thread
From: Vicente Bergas @ 2018-11-30 14:59 UTC (permalink / raw)
To: bhsharma; +Cc: Takahiro Akashi, Bhupesh SHARMA, Simon Horman, kexec
On Fri, Nov 30, 2018 at 6:41 AM Bhupesh Sharma <bhsharma@redhat.com> wrote:
>
> Hi Vicenç,
>
> I have posted a revised and more comprehensive patchset for this issue
> today (please see the same here:
> <http://lists.infradead.org/pipermail/kexec/2018-November/021999.html>)
>
> I was able to exercise all the basic 'kexe load' and 'kdump' use cases
> on arm64 after these changes and I can also get the use-cases where we
> don't have a '/chosen' node in the .dtb to either PASS or FAIL with
> correct error reporting. Here is a listing of the basic use cases and
> their results:
>
> # kexec -d -l Image --append=debug --dtb rk3399-sapphire.dtb
> ok
>
> # kexec -d -l Image --reuse-cmdline --initrd=/boot/initramfs-`uname -r`.img
> ok
>
> # kexec -d -p Image --reuse-cmdline --initrd=/boot/initramfs-`uname -r`.img
> ok
>
> # kexec -d -p Image --append=debug --dtb rk3399-sapphire.dtb
> <..snip..>
> setup_2nd_dtb: /chosen node not found - can't create dtb for dump
> kernel: FDT_ERR_NOTFOUND
> kexec: setup_2nd_dtb failed.
> kexec: load failed.
> Cannot load Image
>
> Can you please try and test this patchset on your setup and let me
> know in case you land in any further issues?
Hi Bhupesh,
thank you, this is an improvement.
Unfortunately there is a remaining issue with the initrd option and
without the reuse-cmdline option:
kexec -d -l /boot/Image --dtb /boot/dtbs/rockchip/rk3399-sapphire.dtb
--initrd /boot/initramfs-linux.img
...
get_cells_size: #address-cells:2 #size-cells:2
cells_size_fitted: 0-0
cells_size_fitted: 0-0
setup_2nd_dtb: no kaslr-seed found
initrd: base 1d36000, size 5b3d3dh (5979453)
dtb_set_initrd: start 30629888, end 36609341, size 5979453 (5839 KiB)
dtb_set_property: fdt_add_subnode failed: FDT_ERR_EXISTS
dtb_delete_property: fdt_path_offset failed: FDT_ERR_NOTFOUND
kexec: load failed.
Cannot load /boot/Image
In any case, do not worry and take your time, this is not a blocker issue.
Regards,
Vicenç.
> Thanks,
> Bhupesh
>
>
> On Thu, Nov 29, 2018 at 3:30 AM Bhupesh Sharma <bhsharma@redhat.com> wrote:
> >
> > Hi Vicenç,
> >
> > Sorry I got busy and just got some spare time to look at this issue. I
> > am able to fix it partially, but I am still not completely happy with
> > it, but mainly here is the issue for the 'kexec load' option - we are
> > passing wrong 'nodeoffset' while calling 'fdt_add_subnode()', which
> > should be 0 instead of FDT_ERR_NOTFOUND when the chosen node is not
> > seen in the passed dtb :
> >
> > From 2433daf279744ae30fa9c74ec5b39507740d7163 Mon Sep 17 00:00:00 2001
> > From: Bhupesh Sharma <bhsharma@redhat.com>
> > Date: Thu, 29 Nov 2018 00:41:06 +0530
> > Subject: [PATCH] Add some debug logs
> >
> > Signed-off-by: Bhupesh Sharma <bhsharma@redhat.com>
> > ---
> > kexec/arch/arm64/kexec-arm64.c | 8 ++++++++
> > kexec/dt-ops.c | 3 ++-
> > kexec/libfdt/fdt_ro.c | 14 +++++++-------
> > kexec/libfdt/fdt_rw.c | 2 ++
> > 4 files changed, 19 insertions(+), 8 deletions(-)
> >
> > diff --git a/kexec/arch/arm64/kexec-arm64.c b/kexec/arch/arm64/kexec-arm64.c
> > index 6c7d2512b1d4..e29afc30db43 100644
> > --- a/kexec/arch/arm64/kexec-arm64.c
> > +++ b/kexec/arch/arm64/kexec-arm64.c
> > @@ -207,6 +207,9 @@ static int set_bootargs(struct dtb *dtb, const
> > char *command_line)
> > if (!command_line || !command_line[0])
> > return 0;
> >
> > + dbgprintf("%s: found %s\n", __func__, dtb->path);
> > + dump_fdt(dtb->buf);
> > +
> > result = dtb_set_bootargs(&dtb->buf, &dtb->size, command_line);
> >
> > if (result) {
> > @@ -413,6 +416,11 @@ static int setup_2nd_dtb(struct dtb *dtb, char
> > *command_line, int on_crash)
> > }
> >
> > result = set_bootargs(dtb, command_line);
> > + if (result) {
> > + fprintf(stderr, "kexec: cannot set bootargs.\n");
> > + result = -EINVAL;
> > + goto on_error;
> > + }
> >
> > /* determine #address-cells and #size-cells */
> > result = get_cells_size(dtb->buf, &address_cells, &size_cells);
> > diff --git a/kexec/dt-ops.c b/kexec/dt-ops.c
> > index a0276f1e48b3..79b0404bafc4 100644
> > --- a/kexec/dt-ops.c
> > +++ b/kexec/dt-ops.c
> > @@ -86,13 +86,14 @@ int dtb_set_property(char **dtb, off_t *dtb_size,
> > const char *node,
> > nodeoffset = fdt_path_offset(new_dtb, node);
> >
> > if (nodeoffset == -FDT_ERR_NOTFOUND) {
> > - result = fdt_add_subnode(new_dtb, nodeoffset, node);
> > + result = fdt_add_subnode(new_dtb, 0, node);
> >
> > if (result < 0) {
> > dbgprintf("%s: fdt_add_subnode failed: %s\n", __func__,
> > fdt_strerror(result));
> > goto on_error;
> > }
> > + nodeoffset = result;
> > } else if (nodeoffset < 0) {
> > dbgprintf("%s: fdt_path_offset failed: %s\n", __func__,
> > fdt_strerror(nodeoffset));
> > diff --git a/kexec/libfdt/fdt_ro.c b/kexec/libfdt/fdt_ro.c
> > index 129b532bcc1a..0dce53083c96 100644
> > --- a/kexec/libfdt/fdt_ro.c
> > +++ b/kexec/libfdt/fdt_ro.c
> > @@ -105,14 +105,14 @@ int fdt_subnode_offset_namelen(const void *fdt,
> > int offset,
> > FDT_CHECK_HEADER(fdt);
> >
> > for (depth = 0;
> > - offset >= 0;
> > - offset = fdt_next_node(fdt, offset, &depth)) {
> > - if (depth < 0)
> > - return -FDT_ERR_NOTFOUND;
> > - else if ((depth == 1)
> > - && _fdt_nodename_eq(fdt, offset, name, namelen))
> > + (offset >= 0) && (depth >= 0);
> > + offset = fdt_next_node(fdt, offset, &depth))
> > + if ((depth == 1)
> > + && _fdt_nodename_eq(fdt, offset, name, namelen))
> > return offset;
> > - }
> > +
> > + if (depth < 0)
> > + return -FDT_ERR_NOTFOUND;
> >
> > return offset; /* error */
> > }
> > diff --git a/kexec/libfdt/fdt_rw.c b/kexec/libfdt/fdt_rw.c
> > index 8e7ec4cb7bcd..2fac7c0731c0 100644
> > --- a/kexec/libfdt/fdt_rw.c
> > +++ b/kexec/libfdt/fdt_rw.c
> > @@ -101,6 +101,8 @@ static int _fdt_splice(void *fdt, void
> > *splicepoint, int oldlen, int newlen)
> >
> > if (((p + oldlen) < p) || ((p + oldlen) > end))
> > return -FDT_ERR_BADOFFSET;
> > + if ((p < (char *)fdt) || ((end - oldlen + newlen) < (char *)fdt))
> > + return -FDT_ERR_BADOFFSET;
> > if ((end - oldlen + newlen) > ((char *)fdt + fdt_totalsize(fdt)))
> > return -FDT_ERR_NOSPACE;
> > memmove(p + newlen, p + oldlen, end - p - oldlen);
> > --
> > 2.7.4
> >
> > Here are some logs at my end after this fix (I used some earlier work
> > I did for dump'ing dtb on arm64 boards to get the dtb logs:
> > <https://www.spinics.net/lists/kexec/msg20951.html>):
> >
> > # kexec -d -l /root/Image --append 'debug' --dtb /root/rk3399-sapphire.dtb
> > <..snip..>
> >
> > image_arm64_load: PE format: yes
> > / {
> > compatible = "rockchip,rk3399-sapphire";
> > interrupt-parent = <0x00000001>;
> > #address-cells = <0x00000002>;
> > #size-cells = <0x00000002>;
> > model = "Sapphire-RK3399 Board";
> > /chosen {
> > bootargs = "debug";
> > };
> > aliases {
> >
> > <..snip..>
> > };
> > get_cells_size: #address-cells:2 #size-cells:2
> > cells_size_fitted: 0-0
> > cells_size_fitted: 0-0
> > setup_2nd_dtb: no kaslr-seed found
> > dtb: base 81ef0000, size d0a1h (53409)
> > sym: sha256_starts info: 12 other: 00 shndx: 1 value: ec0 size: 6c
> > sym: sha256_starts value: 81f00ec0 addr: 81f00018
> > machine_apply_elf_rel: CALL26 580006b394000000->580006b3940003aa
> > sym: sha256_update info: 12 other: 00 shndx: 1 value: 5168 size: c
> > sym: sha256_update value: 81f05168 addr: 81f00034
> > machine_apply_elf_rel: CALL26 9100427394000000->910042739400144d
> > sym: sha256_finish info: 12 other: 00 shndx: 1 value: 5174 size: 1cc
> > sym: sha256_finish value: 81f05174 addr: 81f00050
> > machine_apply_elf_rel: CALL26 aa1403e094000000->aa1403e094001449
> > sym: memcmp info: 12 other: 00 shndx: 1 value: 64c size: 34
> > sym: memcmp value: 81f0064c addr: 81f00060
> > machine_apply_elf_rel: CALL26 340003c094000000->340003c09400017b
> > sym: printf info: 12 other: 00 shndx: 1 value: 55c size: 90
> > sym: printf value: 81f0055c addr: 81f00070
> > machine_apply_elf_rel: CALL26 5800046094000000->580004609400013b
> > sym: printf info: 12 other: 00 shndx: 1 value: 55c size: 90
> > sym: printf value: 81f0055c addr: 81f00078
> > machine_apply_elf_rel: CALL26 5800047594000000->5800047594000139
> > sym: printf info: 12 other: 00 shndx: 1 value: 55c size: 90
> > sym: printf value: 81f0055c addr: 81f00088
> > machine_apply_elf_rel: CALL26 9100067394000000->9100067394000135
> > sym: printf info: 12 other: 00 shndx: 1 value: 55c size: 90
> > sym: printf value: 81f0055c addr: 81f000a8
> > machine_apply_elf_rel: CALL26 5800036094000000->580003609400012d
> > sym: printf info: 12 other: 00 shndx: 1 value: 55c size: 90
> > sym: printf value: 81f0055c addr: 81f000b0
> > machine_apply_elf_rel: CALL26 910402e194000000->910402e19400012b
> > sym: printf info: 12 other: 00 shndx: 1 value: 55c size: 90
> > sym: printf value: 81f0055c addr: 81f000c0
> > machine_apply_elf_rel: CALL26 9100067394000000->9100067394000127
> > sym: printf info: 12 other: 00 shndx: 1 value: 55c size: 90
> > sym: printf value: 81f0055c addr: 81f000d4
> > machine_apply_elf_rel: CALL26 5280002094000000->5280002094000122
> > sym: .data info: 03 other: 00 shndx: 4 value: 0 size: 0
> > sym: .data value: 81f053b8 addr: 81f000f0
> > machine_apply_elf_rel: ABS64 0000000000000000->0000000081f053b8
> > sym: .rodata.str1.1 info: 03 other: 00 shndx: 3 value: 0 size: 0
> > sym: .rodata.str1.1 value: 81f05348 addr: 81f000f8
> > machine_apply_elf_rel: ABS64 0000000000000000->0000000081f05348
> > sym: .rodata.str1.1 info: 03 other: 00 shndx: 3 value: 0 size: 0
> > sym: .rodata.str1.1 value: 81f05368 addr: 81f00100
> > machine_apply_elf_rel: ABS64 0000000000000000->0000000081f05368
> > sym: .rodata.str1.1 info: 03 other: 00 shndx: 3 value: 0 size: 0
> > sym: .rodata.str1.1 value: 81f05378 addr: 81f00108
> > machine_apply_elf_rel: ABS64 0000000000000000->0000000081f05378
> > sym: .rodata.str1.1 info: 03 other: 00 shndx: 3 value: 0 size: 0
> > sym: .rodata.str1.1 value: 81f0537e addr: 81f00110
> > machine_apply_elf_rel: ABS64 0000000000000000->0000000081f0537e
> > sym: .rodata.str1.1 info: 03 other: 00 shndx: 3 value: 0 size: 0
> > sym: .rodata.str1.1 value: 81f05380 addr: 81f00118
> > machine_apply_elf_rel: ABS64 0000000000000000->0000000081f05380
> > sym: printf info: 12 other: 00 shndx: 1 value: 55c size: 90
> > sym: printf value: 81f0055c addr: 81f0012c
> > machine_apply_elf_rel: CALL26 9400000094000000->940000009400010c
> > sym: setup_arch info: 12 other: 00 shndx: 1 value: eb8 size: 4
> > sym: setup_arch value: 81f00eb8 addr: 81f00130
> > machine_apply_elf_rel: CALL26 5800016094000000->5800016094000362
> > sym: verify_sha256_digest info: 12 other: 00 shndx: 1 value: 0 size: f0
> > sym: verify_sha256_digest value: 81f00000 addr: 81f00140
> > machine_apply_elf_rel: CALL26 3400004094000000->3400004097ffffb0
> > sym: post_verification_setup_arch info: 12 other: 00 shndx: 1 value: eb4 size: 4
> > sym: post_verification_setup_arch value: 81f00eb4 addr: 81f00150
> > machine_apply_elf_rel: JUMP26 d503201f14000000->d503201f14000359
> > sym: .rodata.str1.1 info: 03 other: 00 shndx: 3 value: 0 size: 0
> > sym: .rodata.str1.1 value: 81f05390 addr: 81f00158
> > machine_apply_elf_rel: ABS64 0000000000000000->0000000081f05390
> > sym: .data info: 03 other: 00 shndx: 4 value: 0 size: 0
> > sym: .data value: 81f053b8 addr: 81f00160
> > machine_apply_elf_rel: ABS64 0000000000000000->0000000081f053b8
> > sym: putchar info: 12 other: 00 shndx: 1 value: eb0 size: 4
> > sym: putchar value: 81f00eb0 addr: 81f001c4
> > machine_apply_elf_rel: CALL26 f94037a194000000->f94037a19400033b
> > sym: putchar info: 12 other: 00 shndx: 1 value: eb0 size: 4
> > sym: putchar value: 81f00eb0 addr: 81f00238
> > machine_apply_elf_rel: CALL26 910006f794000000->910006f79400031e
> > sym: putchar info: 12 other: 00 shndx: 1 value: eb0 size: 4
> > sym: putchar value: 81f00eb0 addr: 81f00490
> > machine_apply_elf_rel: CALL26 9100073994000000->9100073994000288
> > sym: .rodata.str1.1 info: 03 other: 00 shndx: 3 value: 0 size: 0
> > sym: .rodata.str1.1 value: 81f053a2 addr: 81f004d0
> > machine_apply_elf_rel: ABS64 0000000000000000->0000000081f053a2
> > sym: vsprintf info: 12 other: 00 shndx: 1 value: 168 size: 364
> > sym: vsprintf value: 81f00168 addr: 81f00550
> > machine_apply_elf_rel: CALL26 a8d07bfd94000000->a8d07bfd97ffff06
> > sym: vsprintf info: 12 other: 00 shndx: 1 value: 168 size: 364
> > sym: vsprintf value: 81f00168 addr: 81f005e0
> > machine_apply_elf_rel: CALL26 a8d17bfd94000000->a8d17bfd97fffee2
> > sym: purgatory info: 12 other: 00 shndx: 1 value: 120 size: 34
> > sym: purgatory value: 81f00120 addr: 81f00688
> > machine_apply_elf_rel: CALL26 5800001194000000->5800001197fffea6
> > sym: arm64_kernel_entry info: 10 other: 00 shndx: 4 value: 128 size: 8
> > sym: arm64_kernel_entry value: 81f054e0 addr: 81f0068c
> > machine_apply_elf_rel: LD_PREL_LO19 5800000058000011->58000000580272b1
> > sym: arm64_dtb_addr info: 10 other: 00 shndx: 4 value: 130 size: 8
> > sym: arm64_dtb_addr value: 81f054e8 addr: 81f00690
> > machine_apply_elf_rel: LD_PREL_LO19 aa1f03e158000000->aa1f03e1580272c0
> > sym: sha256_process info: 12 other: 00 shndx: 1 value: f2c size: 4134
> > sym: sha256_process value: 81f00f2c addr: 81f050cc
> > machine_apply_elf_rel: CALL26 d101029494000000->d101029497ffef98
> > sym: memcpy info: 12 other: 00 shndx: 1 value: 62c size: 20
> > sym: memcpy value: 81f0062c addr: 81f05128
> > machine_apply_elf_rel: JUMP26 b4fffc5814000000->b4fffc5817ffed41
> > sym: memcpy info: 12 other: 00 shndx: 1 value: 62c size: 20
> > sym: memcpy value: 81f0062c addr: 81f05140
> > machine_apply_elf_rel: CALL26 aa1503e094000000->aa1503e097ffed3b
> > sym: sha256_process info: 12 other: 00 shndx: 1 value: f2c size: 4134
> > sym: sha256_process value: 81f00f2c addr: 81f0514c
> > machine_apply_elf_rel: CALL26 cb1302d694000000->cb1302d697ffef78
> > sym: .data info: 03 other: 00 shndx: 4 value: 0 size: 0
> > sym: .data value: 81f054f0 addr: 81f05340
> > machine_apply_elf_rel: ABS64 0000000000000000->0000000081f054f0
> > kexec_load: entry = 0x81f00680 flags = 0xb70000
> > nr_segments = 3
> > segment[0].buf = 0xffff8bab0010
> > segment[0].bufsz = 0x1999a00
> > segment[0].mem = 0x80480000
> > segment[0].memsz = 0x1a70000
> > segment[1].buf = 0x16984e10
> > segment[1].bufsz = 0xd0a1
> > segment[1].mem = 0x81ef0000
> > segment[1].memsz = 0x10000
> > segment[2].buf = 0x16992230
> > segment[2].bufsz = 0x5530
> > segment[2].mem = 0x81f00000
> > segment[2].memsz = 0x10000
> >
> > I will try to stabilize this more both for 'kexec load' and 'kexec
> > dump' use-cases and try to send a patch soon to fix this issue.
> >
> > Regards,
> > Bhupesh
> > On Fri, Nov 16, 2018 at 8:59 PM Vicente Bergas <vicencb@gmail.com> wrote:
> > >
> > > On Fri, Nov 16, 2018 at 1:04 PM Bhupesh Sharma <bhsharma@redhat.com> wrote:
> > > >
> > > > Hi Vicenç,
> > > >
> > > > I tried the patch at my end and it works fine as per my checks.
> > > > So, can I request you to provide some additional data which will help
> > > > me understand your environment better. See inline:
> > > >
> > > > On Fri, Nov 16, 2018 at 12:08 AM Vicente Bergas <vicencb@gmail.com> wrote:
> > > > >
> > > > > On Thu, Nov 15, 2018 at 3:14 PM Simon Horman <horms@verge.net.au> wrote:
> > > > > >
> > > > > > On Thu, Nov 15, 2018 at 06:10:36AM -0800, Simon Horman wrote:
> > > > > > > On Mon, Nov 12, 2018 at 11:24:07AM +0900, AKASHI Takahiro wrote:
> > > > > > > > On Mon, Nov 12, 2018 at 02:00:16AM +0530, Bhupesh Sharma wrote:
> > > > > > > > > Vicenç reported (via [1]) that currently executing kexec with
> > > > > > > > > '--dtb' option and passing a .dtb which doesn't have a '/chosen' node
> > > > > > > > > leads to the following error:
> > > > > > > > >
> > > > > > > > > # kexec -d --dtb dtb_without_chosen_node.dtb --append 'cmdline' --load Image
> > > > > > > > >
> > > > > > > > > dtb_set_property: fdt_add_subnode failed: <valid offset/length>
> > > > > > > > > kexec: Set device tree bootargs failed.
> > > > > > > > >
> > > > > > > > > This happens because currently we check the return value of
> > > > > > > > > 'fdt_add_subnode()' function call in 'dt-ops.c' incorrectly:
> > > > > > > > >
> > > > > > > > > result = fdt_add_subnode(new_dtb, nodeoffset, node);
> > > > > > > > > if (result) {
> > > > > > > > > dbgprintf("%s: fdt_add_subnode failed: %s\n", _func__,
> > > > > > > > > fdt_strerror(result));
> > > > > > > > > goto on_error;
> > > > > > > > > }
> > > > > > > > >
> > > > > > > > > As we can see in 'fdt_rw.c', a positive return value from
> > > > > > > > > 'fdt_add_subnode()' function doesn't indicate an error.
> > > > > > > > >
> > > > > > > > > We can see that the Linux kernel (see 'drivers/firmware/efi/libstub/fdt.c'
> > > > > > > > > for example) also checks the 'fdt_add_subnode()' function against negative
> > > > > > > > > return values for errors. See an example below from 'update_fdt()' function in
> > > > > > > > > 'drivers/firmware/efi/libstub/fdt.c':
> > > > > > > > >
> > > > > > > > > node = fdt_add_subnode(fdt, 0, "chosen");
> > > > > > > > > if (node < 0) {
> > > > > > > > > status = node;
> > > > > > > > > <..snip..>
> > > > > > > > > goto fdt_set_fail;
> > > > > > > > > }
> > > > > > > > >
> > > > > > > > > This patch fixes the same in 'kexec-tools'.
> > > > > > > >
> > > > > > > > Looks good.
> > > > > > > > Thank you.
> > > > > > > > -Takahiro Akashi
> > > > > > >
> > > > > > > Thanks, applied.
> > > > > >
> > > > > > Perhaps I was a little too hasty there, I have dropped the patch for now.
> > > > > >
> > > > > > Vicente, does this patch work for you?
> > > > >
> > > > > The patch looks fine, but the end result is still non-working:
> > > > > # kexec -d --load Image --append 'debug' --dtb no_chosen.dtb
> > > >
> > > > Can you share the .dts with which you see this issue and steps you use
> > > > to create the .dtb file at your end?
> > > >
> > > > I normally use at my end the following command:
> > > > dtc -o no-chosen.dtb -I dts -O dtb no-chosen.dts
> > > >
> > > > Thanks,
> > > > Bhupesh
> > >
> > > Hi Bhupesh,
> > > the issue is not with dtc, it is with kexec. The following script
> > > reproduces the issue:
> > > #!/bin/sh -ve
> > >
> > > uname -m
> > > # aarch64
> > >
> > > git clone 'https://git.kernel.org/pub/scm/utils/kernel/kexec/kexec-tools.git'
> > > kexec-tools-orig
> > > cp -a kexec-tools-orig kexec-tools-test
> > > git -C kexec-tools-orig checkout -b orig 'v2.0.18'
> > > git -C kexec-tools-test checkout -b test 'v2.0.18'
> > >
> > > cat patch.diff
> > > #--- a/kexec/dt-ops.c
> > > #+++ b/kexec/dt-ops.c
> > > #@@ -84,7 +84,7 @@ int dtb_set_property(char **dtb, off_t *dtb_size,
> > > const char *node,
> > > # if (nodeoffset == -FDT_ERR_NOTFOUND) {
> > > # result = fdt_add_subnode(new_dtb, nodeoffset, node);
> > > #
> > > #- if (result) {
> > > #+ if (result < 0) {
> > > # dbgprintf("%s: fdt_add_subnode failed: %s\n", __func__,
> > > # fdt_strerror(result));
> > > # goto on_error;
> > > patch -d kexec-tools-test -p1 < patch.diff
> > >
> > > ( cd kexec-tools-orig ; ./bootstrap )
> > > ( cd kexec-tools-test ; ./bootstrap )
> > > ( cd kexec-tools-orig ; ./configure )
> > > ( cd kexec-tools-test ; ./configure )
> > > make -C kexec-tools-orig
> > > make -C kexec-tools-test
> > >
> > > wget 'http://mirror.archlinuxarm.org/aarch64/core/linux-aarch64-4.19.2-1-aarch64.pkg.tar.xz'
> > > bsdtar xf 'linux-aarch64-4.19.2-1-aarch64.pkg.tar.xz'
> > >
> > > sudo kexec-tools-orig/build/sbin/kexec -d --load boot/Image --append
> > > 'debug' --dtb boot/dtbs/rockchip/rk3399-sapphire.dtb
> > > # dtb_set_property: fdt_add_subnode failed: <valid offset/length>
> > > # kexec: Set device tree bootargs failed.
> > >
> > > sudo kexec-tools-test/build/sbin/kexec -d --load boot/Image --append
> > > 'debug' --dtb boot/dtbs/rockchip/rk3399-sapphire.dtb
> > > # dtb_set_property: fdt_setprop failed: FDT_ERR_BADOFFSET
> > > # kexec: Set device tree bootargs failed.
> > >
> > > Regards,
> > > Vicenç.
> > >
> > > > > ...
> > > > > dtb_set_property: fdt_setprop failed: FDT_ERR_BADOFFSET
> > > > > kexec: Set device tree bootargs failed.
> > > > >
> > > > > Also tested this with the same result:
> > > > > --- a/kexec/dt-ops.c
> > > > > +++ b/kexec/dt-ops.c
> > > > > @@ -84,11 +84,13 @@
> > > > > if (nodeoffset == -FDT_ERR_NOTFOUND) {
> > > > > result = fdt_add_subnode(new_dtb, nodeoffset, node);
> > > > >
> > > > > - if (result) {
> > > > > + if (result < 0) {
> > > > > dbgprintf("%s: fdt_add_subnode failed: %s\n", __func__,
> > > > > fdt_strerror(result));
> > > > > goto on_error;
> > > > > }
> > > > > +
> > > > > + nodeoffset = result;
> > > > > } else if (nodeoffset < 0) {
> > > > > dbgprintf("%s: fdt_path_offset failed: %s\n", __func__,
> > > > > fdt_strerror(nodeoffset));
> > > > >
> > > > > Regards,
> > > > > Vicenç.
_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH] kexec/dt-ops.c: Fix check against 'fdt_add_subnode' return value
2018-11-30 14:59 ` Vicente Bergas
@ 2018-11-30 15:03 ` Bhupesh Sharma
0 siblings, 0 replies; 13+ messages in thread
From: Bhupesh Sharma @ 2018-11-30 15:03 UTC (permalink / raw)
To: Vicente Bergas
Cc: AKASHI Takahiro, Bhupesh SHARMA, Simon Horman, kexec mailing list
Thanks for the feedback.
On Fri, Nov 30, 2018 at 8:29 PM Vicente Bergas <vicencb@gmail.com> wrote:
>
> On Fri, Nov 30, 2018 at 6:41 AM Bhupesh Sharma <bhsharma@redhat.com> wrote:
> >
> > Hi Vicenç,
> >
> > I have posted a revised and more comprehensive patchset for this issue
> > today (please see the same here:
> > <http://lists.infradead.org/pipermail/kexec/2018-November/021999.html>)
> >
> > I was able to exercise all the basic 'kexe load' and 'kdump' use cases
> > on arm64 after these changes and I can also get the use-cases where we
> > don't have a '/chosen' node in the .dtb to either PASS or FAIL with
> > correct error reporting. Here is a listing of the basic use cases and
> > their results:
> >
> > # kexec -d -l Image --append=debug --dtb rk3399-sapphire.dtb
> > ok
> >
> > # kexec -d -l Image --reuse-cmdline --initrd=/boot/initramfs-`uname -r`.img
> > ok
> >
> > # kexec -d -p Image --reuse-cmdline --initrd=/boot/initramfs-`uname -r`.img
> > ok
> >
> > # kexec -d -p Image --append=debug --dtb rk3399-sapphire.dtb
> > <..snip..>
> > setup_2nd_dtb: /chosen node not found - can't create dtb for dump
> > kernel: FDT_ERR_NOTFOUND
> > kexec: setup_2nd_dtb failed.
> > kexec: load failed.
> > Cannot load Image
> >
> > Can you please try and test this patchset on your setup and let me
> > know in case you land in any further issues?
>
> Hi Bhupesh,
> thank you, this is an improvement.
> Unfortunately there is a remaining issue with the initrd option and
> without the reuse-cmdline option:
> kexec -d -l /boot/Image --dtb /boot/dtbs/rockchip/rk3399-sapphire.dtb
> --initrd /boot/initramfs-linux.img
> ...
> get_cells_size: #address-cells:2 #size-cells:2
> cells_size_fitted: 0-0
> cells_size_fitted: 0-0
> setup_2nd_dtb: no kaslr-seed found
> initrd: base 1d36000, size 5b3d3dh (5979453)
> dtb_set_initrd: start 30629888, end 36609341, size 5979453 (5839 KiB)
> dtb_set_property: fdt_add_subnode failed: FDT_ERR_EXISTS
> dtb_delete_property: fdt_path_offset failed: FDT_ERR_NOTFOUND
> kexec: load failed.
> Cannot load /boot/Image
>
> In any case, do not worry and take your time, this is not a blocker issue.
I remember testing this use case as well (but perhaps not with the
rockchip dtb) and did not meet this issue.
Let me recheck with the rockchip dtb as well and will send a v2
patchset if a fix is needed.
But its good to know that the rest of the issues are fixed.
Thanks,
Bhupesh
>
> > Thanks,
> > Bhupesh
> >
> >
> > On Thu, Nov 29, 2018 at 3:30 AM Bhupesh Sharma <bhsharma@redhat.com> wrote:
> > >
> > > Hi Vicenç,
> > >
> > > Sorry I got busy and just got some spare time to look at this issue. I
> > > am able to fix it partially, but I am still not completely happy with
> > > it, but mainly here is the issue for the 'kexec load' option - we are
> > > passing wrong 'nodeoffset' while calling 'fdt_add_subnode()', which
> > > should be 0 instead of FDT_ERR_NOTFOUND when the chosen node is not
> > > seen in the passed dtb :
> > >
> > > From 2433daf279744ae30fa9c74ec5b39507740d7163 Mon Sep 17 00:00:00 2001
> > > From: Bhupesh Sharma <bhsharma@redhat.com>
> > > Date: Thu, 29 Nov 2018 00:41:06 +0530
> > > Subject: [PATCH] Add some debug logs
> > >
> > > Signed-off-by: Bhupesh Sharma <bhsharma@redhat.com>
> > > ---
> > > kexec/arch/arm64/kexec-arm64.c | 8 ++++++++
> > > kexec/dt-ops.c | 3 ++-
> > > kexec/libfdt/fdt_ro.c | 14 +++++++-------
> > > kexec/libfdt/fdt_rw.c | 2 ++
> > > 4 files changed, 19 insertions(+), 8 deletions(-)
> > >
> > > diff --git a/kexec/arch/arm64/kexec-arm64.c b/kexec/arch/arm64/kexec-arm64.c
> > > index 6c7d2512b1d4..e29afc30db43 100644
> > > --- a/kexec/arch/arm64/kexec-arm64.c
> > > +++ b/kexec/arch/arm64/kexec-arm64.c
> > > @@ -207,6 +207,9 @@ static int set_bootargs(struct dtb *dtb, const
> > > char *command_line)
> > > if (!command_line || !command_line[0])
> > > return 0;
> > >
> > > + dbgprintf("%s: found %s\n", __func__, dtb->path);
> > > + dump_fdt(dtb->buf);
> > > +
> > > result = dtb_set_bootargs(&dtb->buf, &dtb->size, command_line);
> > >
> > > if (result) {
> > > @@ -413,6 +416,11 @@ static int setup_2nd_dtb(struct dtb *dtb, char
> > > *command_line, int on_crash)
> > > }
> > >
> > > result = set_bootargs(dtb, command_line);
> > > + if (result) {
> > > + fprintf(stderr, "kexec: cannot set bootargs.\n");
> > > + result = -EINVAL;
> > > + goto on_error;
> > > + }
> > >
> > > /* determine #address-cells and #size-cells */
> > > result = get_cells_size(dtb->buf, &address_cells, &size_cells);
> > > diff --git a/kexec/dt-ops.c b/kexec/dt-ops.c
> > > index a0276f1e48b3..79b0404bafc4 100644
> > > --- a/kexec/dt-ops.c
> > > +++ b/kexec/dt-ops.c
> > > @@ -86,13 +86,14 @@ int dtb_set_property(char **dtb, off_t *dtb_size,
> > > const char *node,
> > > nodeoffset = fdt_path_offset(new_dtb, node);
> > >
> > > if (nodeoffset == -FDT_ERR_NOTFOUND) {
> > > - result = fdt_add_subnode(new_dtb, nodeoffset, node);
> > > + result = fdt_add_subnode(new_dtb, 0, node);
> > >
> > > if (result < 0) {
> > > dbgprintf("%s: fdt_add_subnode failed: %s\n", __func__,
> > > fdt_strerror(result));
> > > goto on_error;
> > > }
> > > + nodeoffset = result;
> > > } else if (nodeoffset < 0) {
> > > dbgprintf("%s: fdt_path_offset failed: %s\n", __func__,
> > > fdt_strerror(nodeoffset));
> > > diff --git a/kexec/libfdt/fdt_ro.c b/kexec/libfdt/fdt_ro.c
> > > index 129b532bcc1a..0dce53083c96 100644
> > > --- a/kexec/libfdt/fdt_ro.c
> > > +++ b/kexec/libfdt/fdt_ro.c
> > > @@ -105,14 +105,14 @@ int fdt_subnode_offset_namelen(const void *fdt,
> > > int offset,
> > > FDT_CHECK_HEADER(fdt);
> > >
> > > for (depth = 0;
> > > - offset >= 0;
> > > - offset = fdt_next_node(fdt, offset, &depth)) {
> > > - if (depth < 0)
> > > - return -FDT_ERR_NOTFOUND;
> > > - else if ((depth == 1)
> > > - && _fdt_nodename_eq(fdt, offset, name, namelen))
> > > + (offset >= 0) && (depth >= 0);
> > > + offset = fdt_next_node(fdt, offset, &depth))
> > > + if ((depth == 1)
> > > + && _fdt_nodename_eq(fdt, offset, name, namelen))
> > > return offset;
> > > - }
> > > +
> > > + if (depth < 0)
> > > + return -FDT_ERR_NOTFOUND;
> > >
> > > return offset; /* error */
> > > }
> > > diff --git a/kexec/libfdt/fdt_rw.c b/kexec/libfdt/fdt_rw.c
> > > index 8e7ec4cb7bcd..2fac7c0731c0 100644
> > > --- a/kexec/libfdt/fdt_rw.c
> > > +++ b/kexec/libfdt/fdt_rw.c
> > > @@ -101,6 +101,8 @@ static int _fdt_splice(void *fdt, void
> > > *splicepoint, int oldlen, int newlen)
> > >
> > > if (((p + oldlen) < p) || ((p + oldlen) > end))
> > > return -FDT_ERR_BADOFFSET;
> > > + if ((p < (char *)fdt) || ((end - oldlen + newlen) < (char *)fdt))
> > > + return -FDT_ERR_BADOFFSET;
> > > if ((end - oldlen + newlen) > ((char *)fdt + fdt_totalsize(fdt)))
> > > return -FDT_ERR_NOSPACE;
> > > memmove(p + newlen, p + oldlen, end - p - oldlen);
> > > --
> > > 2.7.4
> > >
> > > Here are some logs at my end after this fix (I used some earlier work
> > > I did for dump'ing dtb on arm64 boards to get the dtb logs:
> > > <https://www.spinics.net/lists/kexec/msg20951.html>):
> > >
> > > # kexec -d -l /root/Image --append 'debug' --dtb /root/rk3399-sapphire.dtb
> > > <..snip..>
> > >
> > > image_arm64_load: PE format: yes
> > > / {
> > > compatible = "rockchip,rk3399-sapphire";
> > > interrupt-parent = <0x00000001>;
> > > #address-cells = <0x00000002>;
> > > #size-cells = <0x00000002>;
> > > model = "Sapphire-RK3399 Board";
> > > /chosen {
> > > bootargs = "debug";
> > > };
> > > aliases {
> > >
> > > <..snip..>
> > > };
> > > get_cells_size: #address-cells:2 #size-cells:2
> > > cells_size_fitted: 0-0
> > > cells_size_fitted: 0-0
> > > setup_2nd_dtb: no kaslr-seed found
> > > dtb: base 81ef0000, size d0a1h (53409)
> > > sym: sha256_starts info: 12 other: 00 shndx: 1 value: ec0 size: 6c
> > > sym: sha256_starts value: 81f00ec0 addr: 81f00018
> > > machine_apply_elf_rel: CALL26 580006b394000000->580006b3940003aa
> > > sym: sha256_update info: 12 other: 00 shndx: 1 value: 5168 size: c
> > > sym: sha256_update value: 81f05168 addr: 81f00034
> > > machine_apply_elf_rel: CALL26 9100427394000000->910042739400144d
> > > sym: sha256_finish info: 12 other: 00 shndx: 1 value: 5174 size: 1cc
> > > sym: sha256_finish value: 81f05174 addr: 81f00050
> > > machine_apply_elf_rel: CALL26 aa1403e094000000->aa1403e094001449
> > > sym: memcmp info: 12 other: 00 shndx: 1 value: 64c size: 34
> > > sym: memcmp value: 81f0064c addr: 81f00060
> > > machine_apply_elf_rel: CALL26 340003c094000000->340003c09400017b
> > > sym: printf info: 12 other: 00 shndx: 1 value: 55c size: 90
> > > sym: printf value: 81f0055c addr: 81f00070
> > > machine_apply_elf_rel: CALL26 5800046094000000->580004609400013b
> > > sym: printf info: 12 other: 00 shndx: 1 value: 55c size: 90
> > > sym: printf value: 81f0055c addr: 81f00078
> > > machine_apply_elf_rel: CALL26 5800047594000000->5800047594000139
> > > sym: printf info: 12 other: 00 shndx: 1 value: 55c size: 90
> > > sym: printf value: 81f0055c addr: 81f00088
> > > machine_apply_elf_rel: CALL26 9100067394000000->9100067394000135
> > > sym: printf info: 12 other: 00 shndx: 1 value: 55c size: 90
> > > sym: printf value: 81f0055c addr: 81f000a8
> > > machine_apply_elf_rel: CALL26 5800036094000000->580003609400012d
> > > sym: printf info: 12 other: 00 shndx: 1 value: 55c size: 90
> > > sym: printf value: 81f0055c addr: 81f000b0
> > > machine_apply_elf_rel: CALL26 910402e194000000->910402e19400012b
> > > sym: printf info: 12 other: 00 shndx: 1 value: 55c size: 90
> > > sym: printf value: 81f0055c addr: 81f000c0
> > > machine_apply_elf_rel: CALL26 9100067394000000->9100067394000127
> > > sym: printf info: 12 other: 00 shndx: 1 value: 55c size: 90
> > > sym: printf value: 81f0055c addr: 81f000d4
> > > machine_apply_elf_rel: CALL26 5280002094000000->5280002094000122
> > > sym: .data info: 03 other: 00 shndx: 4 value: 0 size: 0
> > > sym: .data value: 81f053b8 addr: 81f000f0
> > > machine_apply_elf_rel: ABS64 0000000000000000->0000000081f053b8
> > > sym: .rodata.str1.1 info: 03 other: 00 shndx: 3 value: 0 size: 0
> > > sym: .rodata.str1.1 value: 81f05348 addr: 81f000f8
> > > machine_apply_elf_rel: ABS64 0000000000000000->0000000081f05348
> > > sym: .rodata.str1.1 info: 03 other: 00 shndx: 3 value: 0 size: 0
> > > sym: .rodata.str1.1 value: 81f05368 addr: 81f00100
> > > machine_apply_elf_rel: ABS64 0000000000000000->0000000081f05368
> > > sym: .rodata.str1.1 info: 03 other: 00 shndx: 3 value: 0 size: 0
> > > sym: .rodata.str1.1 value: 81f05378 addr: 81f00108
> > > machine_apply_elf_rel: ABS64 0000000000000000->0000000081f05378
> > > sym: .rodata.str1.1 info: 03 other: 00 shndx: 3 value: 0 size: 0
> > > sym: .rodata.str1.1 value: 81f0537e addr: 81f00110
> > > machine_apply_elf_rel: ABS64 0000000000000000->0000000081f0537e
> > > sym: .rodata.str1.1 info: 03 other: 00 shndx: 3 value: 0 size: 0
> > > sym: .rodata.str1.1 value: 81f05380 addr: 81f00118
> > > machine_apply_elf_rel: ABS64 0000000000000000->0000000081f05380
> > > sym: printf info: 12 other: 00 shndx: 1 value: 55c size: 90
> > > sym: printf value: 81f0055c addr: 81f0012c
> > > machine_apply_elf_rel: CALL26 9400000094000000->940000009400010c
> > > sym: setup_arch info: 12 other: 00 shndx: 1 value: eb8 size: 4
> > > sym: setup_arch value: 81f00eb8 addr: 81f00130
> > > machine_apply_elf_rel: CALL26 5800016094000000->5800016094000362
> > > sym: verify_sha256_digest info: 12 other: 00 shndx: 1 value: 0 size: f0
> > > sym: verify_sha256_digest value: 81f00000 addr: 81f00140
> > > machine_apply_elf_rel: CALL26 3400004094000000->3400004097ffffb0
> > > sym: post_verification_setup_arch info: 12 other: 00 shndx: 1 value: eb4 size: 4
> > > sym: post_verification_setup_arch value: 81f00eb4 addr: 81f00150
> > > machine_apply_elf_rel: JUMP26 d503201f14000000->d503201f14000359
> > > sym: .rodata.str1.1 info: 03 other: 00 shndx: 3 value: 0 size: 0
> > > sym: .rodata.str1.1 value: 81f05390 addr: 81f00158
> > > machine_apply_elf_rel: ABS64 0000000000000000->0000000081f05390
> > > sym: .data info: 03 other: 00 shndx: 4 value: 0 size: 0
> > > sym: .data value: 81f053b8 addr: 81f00160
> > > machine_apply_elf_rel: ABS64 0000000000000000->0000000081f053b8
> > > sym: putchar info: 12 other: 00 shndx: 1 value: eb0 size: 4
> > > sym: putchar value: 81f00eb0 addr: 81f001c4
> > > machine_apply_elf_rel: CALL26 f94037a194000000->f94037a19400033b
> > > sym: putchar info: 12 other: 00 shndx: 1 value: eb0 size: 4
> > > sym: putchar value: 81f00eb0 addr: 81f00238
> > > machine_apply_elf_rel: CALL26 910006f794000000->910006f79400031e
> > > sym: putchar info: 12 other: 00 shndx: 1 value: eb0 size: 4
> > > sym: putchar value: 81f00eb0 addr: 81f00490
> > > machine_apply_elf_rel: CALL26 9100073994000000->9100073994000288
> > > sym: .rodata.str1.1 info: 03 other: 00 shndx: 3 value: 0 size: 0
> > > sym: .rodata.str1.1 value: 81f053a2 addr: 81f004d0
> > > machine_apply_elf_rel: ABS64 0000000000000000->0000000081f053a2
> > > sym: vsprintf info: 12 other: 00 shndx: 1 value: 168 size: 364
> > > sym: vsprintf value: 81f00168 addr: 81f00550
> > > machine_apply_elf_rel: CALL26 a8d07bfd94000000->a8d07bfd97ffff06
> > > sym: vsprintf info: 12 other: 00 shndx: 1 value: 168 size: 364
> > > sym: vsprintf value: 81f00168 addr: 81f005e0
> > > machine_apply_elf_rel: CALL26 a8d17bfd94000000->a8d17bfd97fffee2
> > > sym: purgatory info: 12 other: 00 shndx: 1 value: 120 size: 34
> > > sym: purgatory value: 81f00120 addr: 81f00688
> > > machine_apply_elf_rel: CALL26 5800001194000000->5800001197fffea6
> > > sym: arm64_kernel_entry info: 10 other: 00 shndx: 4 value: 128 size: 8
> > > sym: arm64_kernel_entry value: 81f054e0 addr: 81f0068c
> > > machine_apply_elf_rel: LD_PREL_LO19 5800000058000011->58000000580272b1
> > > sym: arm64_dtb_addr info: 10 other: 00 shndx: 4 value: 130 size: 8
> > > sym: arm64_dtb_addr value: 81f054e8 addr: 81f00690
> > > machine_apply_elf_rel: LD_PREL_LO19 aa1f03e158000000->aa1f03e1580272c0
> > > sym: sha256_process info: 12 other: 00 shndx: 1 value: f2c size: 4134
> > > sym: sha256_process value: 81f00f2c addr: 81f050cc
> > > machine_apply_elf_rel: CALL26 d101029494000000->d101029497ffef98
> > > sym: memcpy info: 12 other: 00 shndx: 1 value: 62c size: 20
> > > sym: memcpy value: 81f0062c addr: 81f05128
> > > machine_apply_elf_rel: JUMP26 b4fffc5814000000->b4fffc5817ffed41
> > > sym: memcpy info: 12 other: 00 shndx: 1 value: 62c size: 20
> > > sym: memcpy value: 81f0062c addr: 81f05140
> > > machine_apply_elf_rel: CALL26 aa1503e094000000->aa1503e097ffed3b
> > > sym: sha256_process info: 12 other: 00 shndx: 1 value: f2c size: 4134
> > > sym: sha256_process value: 81f00f2c addr: 81f0514c
> > > machine_apply_elf_rel: CALL26 cb1302d694000000->cb1302d697ffef78
> > > sym: .data info: 03 other: 00 shndx: 4 value: 0 size: 0
> > > sym: .data value: 81f054f0 addr: 81f05340
> > > machine_apply_elf_rel: ABS64 0000000000000000->0000000081f054f0
> > > kexec_load: entry = 0x81f00680 flags = 0xb70000
> > > nr_segments = 3
> > > segment[0].buf = 0xffff8bab0010
> > > segment[0].bufsz = 0x1999a00
> > > segment[0].mem = 0x80480000
> > > segment[0].memsz = 0x1a70000
> > > segment[1].buf = 0x16984e10
> > > segment[1].bufsz = 0xd0a1
> > > segment[1].mem = 0x81ef0000
> > > segment[1].memsz = 0x10000
> > > segment[2].buf = 0x16992230
> > > segment[2].bufsz = 0x5530
> > > segment[2].mem = 0x81f00000
> > > segment[2].memsz = 0x10000
> > >
> > > I will try to stabilize this more both for 'kexec load' and 'kexec
> > > dump' use-cases and try to send a patch soon to fix this issue.
> > >
> > > Regards,
> > > Bhupesh
> > > On Fri, Nov 16, 2018 at 8:59 PM Vicente Bergas <vicencb@gmail.com> wrote:
> > > >
> > > > On Fri, Nov 16, 2018 at 1:04 PM Bhupesh Sharma <bhsharma@redhat.com> wrote:
> > > > >
> > > > > Hi Vicenç,
> > > > >
> > > > > I tried the patch at my end and it works fine as per my checks.
> > > > > So, can I request you to provide some additional data which will help
> > > > > me understand your environment better. See inline:
> > > > >
> > > > > On Fri, Nov 16, 2018 at 12:08 AM Vicente Bergas <vicencb@gmail.com> wrote:
> > > > > >
> > > > > > On Thu, Nov 15, 2018 at 3:14 PM Simon Horman <horms@verge.net.au> wrote:
> > > > > > >
> > > > > > > On Thu, Nov 15, 2018 at 06:10:36AM -0800, Simon Horman wrote:
> > > > > > > > On Mon, Nov 12, 2018 at 11:24:07AM +0900, AKASHI Takahiro wrote:
> > > > > > > > > On Mon, Nov 12, 2018 at 02:00:16AM +0530, Bhupesh Sharma wrote:
> > > > > > > > > > Vicenç reported (via [1]) that currently executing kexec with
> > > > > > > > > > '--dtb' option and passing a .dtb which doesn't have a '/chosen' node
> > > > > > > > > > leads to the following error:
> > > > > > > > > >
> > > > > > > > > > # kexec -d --dtb dtb_without_chosen_node.dtb --append 'cmdline' --load Image
> > > > > > > > > >
> > > > > > > > > > dtb_set_property: fdt_add_subnode failed: <valid offset/length>
> > > > > > > > > > kexec: Set device tree bootargs failed.
> > > > > > > > > >
> > > > > > > > > > This happens because currently we check the return value of
> > > > > > > > > > 'fdt_add_subnode()' function call in 'dt-ops.c' incorrectly:
> > > > > > > > > >
> > > > > > > > > > result = fdt_add_subnode(new_dtb, nodeoffset, node);
> > > > > > > > > > if (result) {
> > > > > > > > > > dbgprintf("%s: fdt_add_subnode failed: %s\n", _func__,
> > > > > > > > > > fdt_strerror(result));
> > > > > > > > > > goto on_error;
> > > > > > > > > > }
> > > > > > > > > >
> > > > > > > > > > As we can see in 'fdt_rw.c', a positive return value from
> > > > > > > > > > 'fdt_add_subnode()' function doesn't indicate an error.
> > > > > > > > > >
> > > > > > > > > > We can see that the Linux kernel (see 'drivers/firmware/efi/libstub/fdt.c'
> > > > > > > > > > for example) also checks the 'fdt_add_subnode()' function against negative
> > > > > > > > > > return values for errors. See an example below from 'update_fdt()' function in
> > > > > > > > > > 'drivers/firmware/efi/libstub/fdt.c':
> > > > > > > > > >
> > > > > > > > > > node = fdt_add_subnode(fdt, 0, "chosen");
> > > > > > > > > > if (node < 0) {
> > > > > > > > > > status = node;
> > > > > > > > > > <..snip..>
> > > > > > > > > > goto fdt_set_fail;
> > > > > > > > > > }
> > > > > > > > > >
> > > > > > > > > > This patch fixes the same in 'kexec-tools'.
> > > > > > > > >
> > > > > > > > > Looks good.
> > > > > > > > > Thank you.
> > > > > > > > > -Takahiro Akashi
> > > > > > > >
> > > > > > > > Thanks, applied.
> > > > > > >
> > > > > > > Perhaps I was a little too hasty there, I have dropped the patch for now.
> > > > > > >
> > > > > > > Vicente, does this patch work for you?
> > > > > >
> > > > > > The patch looks fine, but the end result is still non-working:
> > > > > > # kexec -d --load Image --append 'debug' --dtb no_chosen.dtb
> > > > >
> > > > > Can you share the .dts with which you see this issue and steps you use
> > > > > to create the .dtb file at your end?
> > > > >
> > > > > I normally use at my end the following command:
> > > > > dtc -o no-chosen.dtb -I dts -O dtb no-chosen.dts
> > > > >
> > > > > Thanks,
> > > > > Bhupesh
> > > >
> > > > Hi Bhupesh,
> > > > the issue is not with dtc, it is with kexec. The following script
> > > > reproduces the issue:
> > > > #!/bin/sh -ve
> > > >
> > > > uname -m
> > > > # aarch64
> > > >
> > > > git clone 'https://git.kernel.org/pub/scm/utils/kernel/kexec/kexec-tools.git'
> > > > kexec-tools-orig
> > > > cp -a kexec-tools-orig kexec-tools-test
> > > > git -C kexec-tools-orig checkout -b orig 'v2.0.18'
> > > > git -C kexec-tools-test checkout -b test 'v2.0.18'
> > > >
> > > > cat patch.diff
> > > > #--- a/kexec/dt-ops.c
> > > > #+++ b/kexec/dt-ops.c
> > > > #@@ -84,7 +84,7 @@ int dtb_set_property(char **dtb, off_t *dtb_size,
> > > > const char *node,
> > > > # if (nodeoffset == -FDT_ERR_NOTFOUND) {
> > > > # result = fdt_add_subnode(new_dtb, nodeoffset, node);
> > > > #
> > > > #- if (result) {
> > > > #+ if (result < 0) {
> > > > # dbgprintf("%s: fdt_add_subnode failed: %s\n", __func__,
> > > > # fdt_strerror(result));
> > > > # goto on_error;
> > > > patch -d kexec-tools-test -p1 < patch.diff
> > > >
> > > > ( cd kexec-tools-orig ; ./bootstrap )
> > > > ( cd kexec-tools-test ; ./bootstrap )
> > > > ( cd kexec-tools-orig ; ./configure )
> > > > ( cd kexec-tools-test ; ./configure )
> > > > make -C kexec-tools-orig
> > > > make -C kexec-tools-test
> > > >
> > > > wget 'http://mirror.archlinuxarm.org/aarch64/core/linux-aarch64-4.19.2-1-aarch64.pkg.tar.xz'
> > > > bsdtar xf 'linux-aarch64-4.19.2-1-aarch64.pkg.tar.xz'
> > > >
> > > > sudo kexec-tools-orig/build/sbin/kexec -d --load boot/Image --append
> > > > 'debug' --dtb boot/dtbs/rockchip/rk3399-sapphire.dtb
> > > > # dtb_set_property: fdt_add_subnode failed: <valid offset/length>
> > > > # kexec: Set device tree bootargs failed.
> > > >
> > > > sudo kexec-tools-test/build/sbin/kexec -d --load boot/Image --append
> > > > 'debug' --dtb boot/dtbs/rockchip/rk3399-sapphire.dtb
> > > > # dtb_set_property: fdt_setprop failed: FDT_ERR_BADOFFSET
> > > > # kexec: Set device tree bootargs failed.
> > > >
> > > > Regards,
> > > > Vicenç.
> > > >
> > > > > > ...
> > > > > > dtb_set_property: fdt_setprop failed: FDT_ERR_BADOFFSET
> > > > > > kexec: Set device tree bootargs failed.
> > > > > >
> > > > > > Also tested this with the same result:
> > > > > > --- a/kexec/dt-ops.c
> > > > > > +++ b/kexec/dt-ops.c
> > > > > > @@ -84,11 +84,13 @@
> > > > > > if (nodeoffset == -FDT_ERR_NOTFOUND) {
> > > > > > result = fdt_add_subnode(new_dtb, nodeoffset, node);
> > > > > >
> > > > > > - if (result) {
> > > > > > + if (result < 0) {
> > > > > > dbgprintf("%s: fdt_add_subnode failed: %s\n", __func__,
> > > > > > fdt_strerror(result));
> > > > > > goto on_error;
> > > > > > }
> > > > > > +
> > > > > > + nodeoffset = result;
> > > > > > } else if (nodeoffset < 0) {
> > > > > > dbgprintf("%s: fdt_path_offset failed: %s\n", __func__,
> > > > > > fdt_strerror(nodeoffset));
> > > > > >
> > > > > > Regards,
> > > > > > Vicenç.
_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec
^ permalink raw reply [flat|nested] 13+ messages in thread
end of thread, other threads:[~2018-11-30 15:03 UTC | newest]
Thread overview: 13+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2018-11-11 20:30 [PATCH] kexec/dt-ops.c: Fix check against 'fdt_add_subnode' return value Bhupesh Sharma
2018-11-12 2:24 ` AKASHI Takahiro
2018-11-15 14:10 ` Simon Horman
2018-11-15 14:13 ` Simon Horman
2018-11-15 18:38 ` Vicente Bergas
2018-11-15 19:40 ` Bhupesh Sharma
2018-11-16 12:03 ` Bhupesh Sharma
2018-11-16 15:29 ` Vicente Bergas
2018-11-28 22:00 ` Bhupesh Sharma
2018-11-30 5:40 ` Bhupesh Sharma
2018-11-30 14:59 ` Vicente Bergas
2018-11-30 15:03 ` Bhupesh Sharma
-- strict thread matches above, loose matches on Subject: below --
2018-11-12 16:10 Vicente Bergas
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox