Bootchooser with State Framework and dtb has permanently rebooting
Ian Abbott
abbotti at mev.co.uk
Tue Apr 18 06:30:29 PDT 2017
On 18/04/17 11:44, Norbert Wiedmann wrote:
> Hello All,
>
> in my system, based an a phyFlex i.mx6-Board, I am using the barebox bootchooser
> with the state framework as backend. The state framework uses dtb as storage
> backend.
> I have two productive systems which are update alternating, and a factory system
> for
> rescue.
>
> I have access to the state variables via dt-utils from the installed linux
> systems
> (with a small modification of libdt.c, regarding the phandle to the
> mtd-partition)
>
> Basically, everything works fine for me, but, after updating to barebox 2017.04
> and dt-utils-2017.03, I have a permanently rebooting when using bootchooser.
>
> With version 2016.12, I have an issue, where I am not sure weather I am using
> the features correct.
> Mh.., maybe I have a bug in the state declaration, which was tolerated so far,
> but I didn't find
> the reason.
>
> My problems are:
> - with barebox 2017.04
> -- permanently rebooting when starting a target by bootchooser
> - with barebox 2016.12:
> -- The bootchooser documentation explains that a
> bootchooser.<targetname>.boot-variable
> is need and must contain something the 'boot'-command understands.
> But when I am set the content of the 'boot'-variables to 'system1',
> 'system2' and 'factory',
> the mechanism fails and nothing will be booted.
> If I remove the boot-variables, the booting hangs.
> But, if the variables default is set emtpy (""), the booting works fine.
> (...but I have a bad
> feeling, because it is not documentation-conform)
> For me, it looks like the boot target selection works without any string
> in boot, but its name
> seems to beeing taken from the variable set's name. ('system1' is the
> variable set name, boot
> variable is empty, system1 is the name of the file in /env/boot/)
> -- with barebox 2016.12: after installing a fresh system, the very first
> writing to the backend
> (with the barebox state -s command), the systems hangs (but writing was
> done, I checked this by
> changing a variable's value before calling state -s, the new value was
> stored in dtb)
>
> My state declaration looks like this:
>
> state: stProjektName {
> magic = <0x27031977>;
> compatible = "barebox,state";
> backend-type = "dtb";
> backend = < &statepart >;
> backend-storage-type = "circular";
>
> bootchooser {
> system1 {
> #address-cells = <1>;
> #size-cells = <1>;
> boot{
> reg = <0x0 0x20>;
> type = "string";
> default = "";
> /* setting 'default = "system1";' will not work ! */
> };
> default_attempts {
> reg = <0x20 0x4>;
> type = "uint32";
> default = <0xffffffff>;
> };
> default_priority {
> reg = <0x24 0x4>;
> type = "uint32";
> default = <0x16>;
> };
> remaining_attempts {
> reg = <0x28 0x4>;
> type = "uint32";
> default = <0xffffffff>;
> };
> priority {
> reg = <0x2c 0x4>;
> type = "uint32";
> default = <0x16>;
> };
> };
>
> system2 {
> #address-cells = <1>;
> #size-cells = <1>;
>
> boot{
> reg = <0x40 0x20>;
> type = "string";
> default = "";
> };
> default_attempts {
> reg = <0x60 0x4>;
> type = "uint32";
> default = <0xffffffff>;
> };
> default_priority {
> reg = <0x64 0x4>;
> type = "uint32";
> default = <0x15>;
> };
> remaining_attempts {
> reg = <0x68 0x4>;
> type = "uint32";
> default = <0xffffffff>;
> };
> priority {
> reg = <0x6c 0x4>;
> type = "uint32";
> default = <0x15>;
> };
> };
>
> factory {
> #address-cells = <1>;
> #size-cells = <1>;
>
> boot{
> reg = <0x80 0x20>;
> type = "string";
> default = "";
> };
> default_attempts {
> reg = <0xa0 0x4>;
> type = "uint32";
> default = <0xffffffff>;
> };
> default_priority {
> reg = <0xa4 0x4>;
> type = "uint32";
> default = <0x0A>;
> };
> remaining_attempts {
> reg = <0xa8 0x4>;
> type = "uint32";
> default = <0xffffffff>;
> };
> priority {
> reg = <0xac 0x4>;
> type = "uint32";
> default = <0x0A>;
> };
> };
>
> last_chosen{
> reg = <0xc0 0x4>;
> type = "uint32";
> default = <0x01>;
> };
> };
> };
>
> .....
> /* these are my relevant mtd-partitions */
>
> partition at 0 {
> label = "barebox";
> reg = <0x0 0x400000>;
> };
>
> partition at 400000 {
> label = "barebox-environment";
> reg = <0x400000 0x0A0000>;
> };
>
> statepart: partition at 4a0000 {
> label = "barebox-states";
> reg = <0x4A0000 0x060000>;
> };
> ...
>
>
> This is the error output while rebooting when bootchooser is active:
> -------------------------------
> booting 'bootchooser'
> unable to handle paging request at address 0xe1a0000f
> pc : [<4fc07538>] lr : [<e12fff1e>]
> sp : 4ffefab8 ip : e1a00003 fp : 47e10e5c
> r10: 00000000 r9 : 00000000 r8 : 4fcad3d8
> r7 : 47e10954 r6 : 47bf5a00 r5 : 47bf5a00 r4 : 4fc059fc
> r3 : 00000015 r2 : 00000016 r1 : 4fc059fc r0 : 47bf5a00
> Flags: nzCv IRQs off FIQs off Mode SVC_32
> [<4fc07538>] (remove_free_block+0x14/0x5c) from [<4fc075b0>]
> (block_remove+0x30/0x38)
> [<4fc075b0>] (block_remove+0x30/0x38) from [<4fc075e8>]
> (block_merge_next+0x30/0x58)
> [<4fc075e8>] (block_merge_next+0x30/0x58) from [<4fc07a78>]
> (tlsf_free+0x7c/0x8c)
> [<4fc07a78>] (tlsf_free+0x7c/0x8c) from [<4fc0c05c>] (state_save+0x90/0xa4)
> [<4fc0c05c>] (state_save+0x90/0xa4) from [<4fc0e0c0>]
> (bootchooser_save+0x8c/0xe8)
> [<4fc0e0c0>] (bootchooser_save+0x8c/0xe8) from [<4fc0e388>]
> (bootchooser_get_target+0xcc/0xe0)
> [<4fc0e388>] (bootchooser_get_target+0xcc/0xe0) from [<4fc0e3c0>]
> (bootchooser_boot+0x24/0x114)
> [<4fc0e3c0>] (bootchooser_boot+0x24/0x114) from [<4fc11fb4>]
> (boot_entry+0x64/0xa0)
> [<4fc11fb4>] (boot_entry+0x64/0xa0) from [<4fc48258>] (do_boot+0x1dc/0x228)
> [<4fc48258>] (do_boot+0x1dc/0x228) from [<4fc03c98>] (execute_command+0x38/0x78)
> [<4fc03c98>] (execute_command+0x38/0x78) from [<4fc0a58c>]
> (run_list_real+0x878/0x9b8)
> [<4fc0a58c>] (run_list_real+0x878/0x9b8) from [<4fc0a158>]
> (run_list_real+0x444/0x9b8)
> [<4fc0a158>] (run_list_real+0x444/0x9b8) from [<4fc09b50>]
> (parse_stream_outer+0x144/0x208)
> [<4fc09b50>] (parse_stream_outer+0x144/0x208) from [<4fc09cb8>]
> (parse_string_outer+0xa4/0x100)
> [<4fc09cb8>] (parse_string_outer+0xa4/0x100) from [<4fc0a734>]
> (source_script+0x68/0xa0)
> [<4fc0a734>] (source_script+0x68/0xa0) from [<4fc0a7c0>] (do_source+0x54/0x78)
> [<4fc0a7c0>] (do_source+0x54/0x78) from [<4fc03c98>] (execute_command+0x38/0x78)
> [<4fc03c98>] (execute_command+0x38/0x78) from [<4fc0a58c>]
> (run_list_real+0x878/0x9b8)
> [<4fc0a58c>] (run_list_real+0x878/0x9b8) from [<4fc09b50>]
> (parse_stream_outer+0x144/0x208)
> [<4fc09b50>] (parse_stream_outer+0x144/0x208) from [<4fc09cb8>]
> (parse_string_outer+0xa4/0x100)
> [<4fc09cb8>] (parse_string_outer+0xa4/0x100) from [<4fc0a85c>]
> (run_command+0x34/0x4c)
> [<4fc0a85c>] (run_command+0x34/0x4c) from [<4fc00d68>]
> (start_barebox+0xa0/0x108)
> [<4fc00d68>] (start_barebox+0xa0/0x108) from [<4fc71404>]
> (barebox_non_pbl_start+0x188/0x1c0)
> [<4fc71404>] (barebox_non_pbl_start+0x188/0x1c0) from [<4fc00004>]
> (__bare_init_start+0x0/0x10)
>
> [<4fc734f8>] (unwind_backtrace+0x0/0xb8) from [<4fc01118>] (panic+0x28/0x38)
> [<4fc01118>] (panic+0x28/0x38) from [<4fc710b8>] (do_exception+0x10/0x14)
> [<4fc710b8>] (do_exception+0x10/0x14) from [<4fc7113c>]
> (do_data_abort+0x2c/0x38)
> [<4fc7113c>] (do_data_abort+0x2c/0x38) from [<4fc706f4>] (do_abort_6+0x48/0x54)
> ---------------------------
> -> system restarts
>
> When starting a boot target manually (e.g. 'boot factory'), I have reading
> access to the state
> variables via barebox-state.
>
>
> My questions are:
> - what is the reason for the error when booting 'bootchooser'?
> Is there an error within my state definition?
> - when using state framework and bootchooser, do I need the
> <boottarget>.boot - variables?
> - is the barebox 2017.04 and dt-utils-2017.03 compatible?
>
> Thank you for any help!
My guess is that the problem lies within
'state_backend_format_dtb_pack()' in
"common/state/backend_format_dtb.c". In particular, the call
'free(fdt);' looks suspicious since it has already passed the memory to
the caller via '*buf = (uint32_t *) fdt;'.
--
-=( Ian Abbott @ MEV Ltd. E-mail: <abbotti at mev.co.uk> )=-
-=( Web: http://www.mev.co.uk/ )=-
More information about the barebox
mailing list