Message ID | 20230823164755.2874792-5-JPEWhacker@gmail.com |
---|---|
State | Changes Requested |
Delegated to: | Tom Rini |
Headers | show |
Series | cmd: gpt: GPT manipulation improvements | expand |
Hi Joshue, On Wed, 23 Aug 2023 at 10:48, Joshua Watt <jpewhacker@gmail.com> wrote: > > Adds an additional variable called gpt_partition_bootable that indicates > if the given partition is bootable or not. > > Signed-off-by: Joshua Watt <JPEWhacker@gmail.com> > --- > cmd/gpt.c | 9 +++++++-- > doc/usage/cmd/gpt.rst | 3 +++ > test/py/tests/test_gpt.py | 33 +++++++++++++++++++++++++++++++++ > 3 files changed, 43 insertions(+), 2 deletions(-) > > diff --git a/cmd/gpt.c b/cmd/gpt.c > index e6f7b0319a..7a8990e400 100644 > --- a/cmd/gpt.c > +++ b/cmd/gpt.c > @@ -723,7 +723,7 @@ static int gpt_enumerate(struct blk_desc *desc) > * gpt_setenv_part_variables() - setup partition environmental variables > * > * Setup the gpt_partition_name, gpt_partition_entry, gpt_partition_addr > - * and gpt_partition_size environment variables. > + * and gpt_partition_size, gpt_partition_bootable environment variables. > * > * @pinfo: pointer to disk partition > * @i: partition entry > @@ -750,6 +750,10 @@ static int gpt_setenv_part_variables(struct disk_partition *pinfo, int i) > if (ret) > goto fail; > > + ret = env_set_ulong("gpt_partition_bootable", !!(pinfo->bootable & PART_BOOTABLE)); > + if (ret) > + goto fail; > + > return 0; > > fail: > @@ -1057,7 +1061,8 @@ U_BOOT_CMD(gpt, CONFIG_SYS_MAXARGS, 1, do_gpt, > " gpt setenv mmc 0 $name\n" > " - setup environment variables for partition $name:\n" > " gpt_partition_addr, gpt_partition_size,\n" > - " gpt_partition_name, gpt_partition_entry\n" > + " gpt_partition_name, gpt_partition_entry,\n" > + " gpt_partition_bootable\n" Please use single quotes except for the """ for function headers. > " gpt enumerate mmc 0\n" > " - store list of partitions to gpt_partition_list environment variable\n" > " gpt guid <interface> <dev>\n" > diff --git a/doc/usage/cmd/gpt.rst b/doc/usage/cmd/gpt.rst > index ea2cf73a60..c9d15b2cba 100644 > --- a/doc/usage/cmd/gpt.rst > +++ b/doc/usage/cmd/gpt.rst > @@ -85,6 +85,7 @@ information about a particular partition. The variables are: > * gpt_partition_size (the size of the partition, in hexadecimal blocks) > * gpt_partition_name (the name of the partition) > * gpt_partition_entry (the partition number in the table, e.g. 1, 2, 3, etc.) > +* gpt_partition_bootable (1 if the partition is marked as bootable, 0 if not) > > To get the information about the partition named 'rootfs', issue the following > command: > @@ -99,6 +100,8 @@ command: > rootfs > => echo ${gpt_partition_entry} > 2 > + => echo ${gpt_partition_bootable} > + 0 > > The 'gpt enumerate' command will set the variable 'gpt_partition_list' with the > list of partition names on the device. For example: > diff --git a/test/py/tests/test_gpt.py b/test/py/tests/test_gpt.py > index 339468bc12..1537ceb8c8 100644 > --- a/test/py/tests/test_gpt.py > +++ b/test/py/tests/test_gpt.py > @@ -49,6 +49,7 @@ class GptTestDiskImage(object): > u_boot_utils.run_and_log(u_boot_console, cmd) > # part1 offset 1MB size 1MB > cmd = ('sgdisk', '--new=1:2048:4095', '--change-name=1:part1', > + '-A 1:set:2', > persistent) > # part2 offset 2MB size 1.5MB > u_boot_utils.run_and_log(u_boot_console, cmd) > @@ -117,6 +118,38 @@ def test_gpt_guid(state_disk_image, u_boot_console): > output = u_boot_console.run_command('gpt guid host 0') > assert '375a56f7-d6c9-4e81-b5f0-09d41ca89efe' in output > > +@pytest.mark.boardspec('sandbox') > +@pytest.mark.buildconfigspec('cmd_gpt') > +@pytest.mark.requiredtool('sgdisk') > +def test_gpt_setenv(state_disk_image, u_boot_console): > + """Test the gpt setenv command.""" > + u_boot_console.run_command('host bind 0 ' + state_disk_image.path) > + output = u_boot_console.run_command('gpt setenv host 0 part1') > + assert 'success!' in output > + output = u_boot_console.run_command('echo ${gpt_partition_addr}') > + assert output.rstrip() == '800' > + output = u_boot_console.run_command('echo ${gpt_partition_size}') > + assert output.rstrip() == '800' > + output = u_boot_console.run_command('echo ${gpt_partition_name}') > + assert output.rstrip() == 'part1' > + output = u_boot_console.run_command('echo ${gpt_partition_entry}') > + assert output.rstrip() == "1" > + output = u_boot_console.run_command('echo ${gpt_partition_bootable}') > + assert output.rstrip() == "1" > + > + output = u_boot_console.run_command('gpt setenv host 0 part2') > + assert 'success!' in output > + output = u_boot_console.run_command('echo ${gpt_partition_addr}') > + assert output.rstrip() == '1000' > + output = u_boot_console.run_command('echo ${gpt_partition_size}') > + assert output.rstrip() == 'c00' > + output = u_boot_console.run_command('echo ${gpt_partition_name}') > + assert output.rstrip() == 'part2' > + output = u_boot_console.run_command('echo ${gpt_partition_entry}') > + assert output.rstrip() == "2" > + output = u_boot_console.run_command('echo ${gpt_partition_bootable}') > + assert output.rstrip() == "0" > + > @pytest.mark.boardspec('sandbox') > @pytest.mark.buildconfigspec('cmd_gpt') > @pytest.mark.requiredtool('sgdisk') > -- > 2.33.0 > Regards, Simon
diff --git a/cmd/gpt.c b/cmd/gpt.c index e6f7b0319a..7a8990e400 100644 --- a/cmd/gpt.c +++ b/cmd/gpt.c @@ -723,7 +723,7 @@ static int gpt_enumerate(struct blk_desc *desc) * gpt_setenv_part_variables() - setup partition environmental variables * * Setup the gpt_partition_name, gpt_partition_entry, gpt_partition_addr - * and gpt_partition_size environment variables. + * and gpt_partition_size, gpt_partition_bootable environment variables. * * @pinfo: pointer to disk partition * @i: partition entry @@ -750,6 +750,10 @@ static int gpt_setenv_part_variables(struct disk_partition *pinfo, int i) if (ret) goto fail; + ret = env_set_ulong("gpt_partition_bootable", !!(pinfo->bootable & PART_BOOTABLE)); + if (ret) + goto fail; + return 0; fail: @@ -1057,7 +1061,8 @@ U_BOOT_CMD(gpt, CONFIG_SYS_MAXARGS, 1, do_gpt, " gpt setenv mmc 0 $name\n" " - setup environment variables for partition $name:\n" " gpt_partition_addr, gpt_partition_size,\n" - " gpt_partition_name, gpt_partition_entry\n" + " gpt_partition_name, gpt_partition_entry,\n" + " gpt_partition_bootable\n" " gpt enumerate mmc 0\n" " - store list of partitions to gpt_partition_list environment variable\n" " gpt guid <interface> <dev>\n" diff --git a/doc/usage/cmd/gpt.rst b/doc/usage/cmd/gpt.rst index ea2cf73a60..c9d15b2cba 100644 --- a/doc/usage/cmd/gpt.rst +++ b/doc/usage/cmd/gpt.rst @@ -85,6 +85,7 @@ information about a particular partition. The variables are: * gpt_partition_size (the size of the partition, in hexadecimal blocks) * gpt_partition_name (the name of the partition) * gpt_partition_entry (the partition number in the table, e.g. 1, 2, 3, etc.) +* gpt_partition_bootable (1 if the partition is marked as bootable, 0 if not) To get the information about the partition named 'rootfs', issue the following command: @@ -99,6 +100,8 @@ command: rootfs => echo ${gpt_partition_entry} 2 + => echo ${gpt_partition_bootable} + 0 The 'gpt enumerate' command will set the variable 'gpt_partition_list' with the list of partition names on the device. For example: diff --git a/test/py/tests/test_gpt.py b/test/py/tests/test_gpt.py index 339468bc12..1537ceb8c8 100644 --- a/test/py/tests/test_gpt.py +++ b/test/py/tests/test_gpt.py @@ -49,6 +49,7 @@ class GptTestDiskImage(object): u_boot_utils.run_and_log(u_boot_console, cmd) # part1 offset 1MB size 1MB cmd = ('sgdisk', '--new=1:2048:4095', '--change-name=1:part1', + '-A 1:set:2', persistent) # part2 offset 2MB size 1.5MB u_boot_utils.run_and_log(u_boot_console, cmd) @@ -117,6 +118,38 @@ def test_gpt_guid(state_disk_image, u_boot_console): output = u_boot_console.run_command('gpt guid host 0') assert '375a56f7-d6c9-4e81-b5f0-09d41ca89efe' in output +@pytest.mark.boardspec('sandbox') +@pytest.mark.buildconfigspec('cmd_gpt') +@pytest.mark.requiredtool('sgdisk') +def test_gpt_setenv(state_disk_image, u_boot_console): + """Test the gpt setenv command.""" + u_boot_console.run_command('host bind 0 ' + state_disk_image.path) + output = u_boot_console.run_command('gpt setenv host 0 part1') + assert 'success!' in output + output = u_boot_console.run_command('echo ${gpt_partition_addr}') + assert output.rstrip() == '800' + output = u_boot_console.run_command('echo ${gpt_partition_size}') + assert output.rstrip() == '800' + output = u_boot_console.run_command('echo ${gpt_partition_name}') + assert output.rstrip() == 'part1' + output = u_boot_console.run_command('echo ${gpt_partition_entry}') + assert output.rstrip() == "1" + output = u_boot_console.run_command('echo ${gpt_partition_bootable}') + assert output.rstrip() == "1" + + output = u_boot_console.run_command('gpt setenv host 0 part2') + assert 'success!' in output + output = u_boot_console.run_command('echo ${gpt_partition_addr}') + assert output.rstrip() == '1000' + output = u_boot_console.run_command('echo ${gpt_partition_size}') + assert output.rstrip() == 'c00' + output = u_boot_console.run_command('echo ${gpt_partition_name}') + assert output.rstrip() == 'part2' + output = u_boot_console.run_command('echo ${gpt_partition_entry}') + assert output.rstrip() == "2" + output = u_boot_console.run_command('echo ${gpt_partition_bootable}') + assert output.rstrip() == "0" + @pytest.mark.boardspec('sandbox') @pytest.mark.buildconfigspec('cmd_gpt') @pytest.mark.requiredtool('sgdisk')
Adds an additional variable called gpt_partition_bootable that indicates if the given partition is bootable or not. Signed-off-by: Joshua Watt <JPEWhacker@gmail.com> --- cmd/gpt.c | 9 +++++++-- doc/usage/cmd/gpt.rst | 3 +++ test/py/tests/test_gpt.py | 33 +++++++++++++++++++++++++++++++++ 3 files changed, 43 insertions(+), 2 deletions(-)