Re: [PATCH v5 06/17] efi_loader: bootmgr: add booting from removable media
Am 12. Mai 2022 11:12:47 MESZ schrieb AKASHI Takahiro : >Heinrich, > >On Thu, May 05, 2022 at 02:47:35PM +0200, Mark Kettenis wrote: >> > Date: Thu, 5 May 2022 14:05:04 +0200 (CEST) >> > From: Mark Kettenis >> > >> > > Date: Fri, 29 Apr 2022 19:03:22 +0200 >> > > From: Heinrich Schuchardt >> > > >> > > On 4/28/22 10:09, Masahisa Kojima wrote: >> > > > From: AKASHI Takahiro >> > > > >> > > > Under the current implementation, booting from removable media using >> > > > a architecture-specific default image name, say BOOTAA64.EFI, is >> > > > supported only in distro_bootcmd script. See the commit 74522c898b35 >> > > > ("efi_loader: Add distro boot script for removable media"). >> > > > >> > > > This is, however, half-baked implementation because >> > > > 1) UEFI specification requires this feature to be implemented as part >> > > > of Boot Manager's responsibility: >> > > > >> > > >3 - Boot Manager >> > > >3.5.1 Boot via the Simple File Protocol >> > > >When booting via the EFI_SIMPLE_FILE_SYSTEM_PROTOCOL, the FilePath >> > > > will >> > > >start with a device path that points to the device that implements >> > > > the >> > > >EFI_SIMPLE_FILE_SYSTEM_PROTOCOL or the EFI_BLOCK_IO_PROTOCOL. The >> > > > next >> > > >part of the FilePath may point to the file name, including >> > > >subdirectories, which contain the bootable image. If the file name >> > > > is >> > > >a null device path, the file name must be generated from the rules >> > > >defined below. >> > > >... >> > > >3.5.1.1 Removable Media Boot Behavior >> > > >To generate a file name when none is present in the FilePath, the >> > > >firmware must append a default file name in the form >> > > >\EFI\BOOT\BOOT{machine type short-name}.EFI ... >> > > > >> > > > 2) So (1) entails the hehavior that the user's preference of boot media >> > > > order should be determined by Boot and BootOrder variables. >> > > > >> > > > With this patch, the semantics mentioned above is fully implemented. >> > > > For example, if you want to boot the system from USB and SCSI in this >> > > > order, >> > > > * define Boot0001 which contains only a device path to the USB device >> > > >(without any file path/name) >> > > > * define Boot0002 which contains only a device path to the SCSI device, >> > > > and >> > > > * set BootOrder to Boot0001:Boot0002 >> > > > >> > > > To avoid build error for sandbox, default file name "BOOTSANDBOX.efi" >> > > > is defined even if it is out of scope of UEFI specification. >> > > > >> > > > Signed-off-by: AKASHI Takahiro >> > > > Signed-off-by: Masahisa Kojima >> > > > --- >> > > > Changes in v5: >> > > > - add default file name definition for SANDBOX to avoid build error >> > > > >> > > > Changes from original version: >> > > > - create new include file "efi_default_filename.h" to >> > > >avoid conflict with config_distro_bootcmd.h >> > > > - modify the target pointer of efi_free_pool(), expand_media_path() >> > > > should >> > > >only free the pointer allocated by efi_dp_from_file() function. >> > > > include/config_distro_bootcmd.h | 14 + >> > > > include/efi_default_filename.h | 33 ++ >> > > > lib/efi_loader/efi_bootmgr.c| 50 >> > > > - >> > > > 3 files changed, 83 insertions(+), 14 deletions(-) >> > > > create mode 100644 include/efi_default_filename.h >> > > > >> > > > diff --git a/include/config_distro_bootcmd.h >> > > > b/include/config_distro_bootcmd.h >> > > > index c55023889c..6a3110f27b 100644 >> > > > --- a/include/config_distro_bootcmd.h >> > > > +++ b/include/config_distro_bootcmd.h >> > > > @@ -91,19 +91,7 @@ >> > > > #endif >> > > > >> > > > #ifdef CONFIG_EFI_LOADER >> > > > -#if defined(CONFIG_ARM64) >> > > > -#define BOOTEFI_NAME "bootaa64.efi" >> > > > -#elif defined(CONFIG_ARM) >> > > > -#define BOOTEFI_NAME "bootarm.efi" >> > > > -#elif defined(CONFIG_X86_RUN_32BIT) >> > > > -#define BOOTEFI_NAME "bootia32.efi" >> > > > -#elif defined(CONFIG_X86_RUN_64BIT) >> > > > -#define BOOTEFI_NAME "bootx64.efi" >> > > > -#elif defined(CONFIG_ARCH_RV32I) >> > > > -#define BOOTEFI_NAME "bootriscv32.efi" >> > > > -#elif defined(CONFIG_ARCH_RV64I) >> > > > -#define BOOTEFI_NAME "bootriscv64.efi" >> > > > -#endif >> > > > +#include >> > > > #endif >> > > > >> > > > #ifdef BOOTEFI_NAME >> > > > diff --git a/include/efi_default_filename.h >> > > > b/include/efi_default_filename.h >> > > > new file mode 100644 >> > > > index 00..cb2ef9e131 >> > > > --- /dev/null >> > > > +++ b/include/efi_default_filename.h >> > > > @@ -0,0 +1,33 @@ >> > > > +/* SPDX-License-Identifier: GPL-2.0+ */ >> > > > +/* >> > > > + * Default boot file name when none is present in the FilePath. >> > > > + * This is defined in the UEFI specification. >> > > > + * >> > > > + * Copyright (c) 2022, Linaro Limited >> > > > + */ >> > > > +#ifndef _EFI_DEFAULT_FILENAME_H >> > > > +#define _E
Re: [PATCH v5 06/17] efi_loader: bootmgr: add booting from removable media
Heinrich, On Thu, May 05, 2022 at 02:47:35PM +0200, Mark Kettenis wrote: > > Date: Thu, 5 May 2022 14:05:04 +0200 (CEST) > > From: Mark Kettenis > > > > > Date: Fri, 29 Apr 2022 19:03:22 +0200 > > > From: Heinrich Schuchardt > > > > > > On 4/28/22 10:09, Masahisa Kojima wrote: > > > > From: AKASHI Takahiro > > > > > > > > Under the current implementation, booting from removable media using > > > > a architecture-specific default image name, say BOOTAA64.EFI, is > > > > supported only in distro_bootcmd script. See the commit 74522c898b35 > > > > ("efi_loader: Add distro boot script for removable media"). > > > > > > > > This is, however, half-baked implementation because > > > > 1) UEFI specification requires this feature to be implemented as part > > > > of Boot Manager's responsibility: > > > > > > > >3 - Boot Manager > > > >3.5.1 Boot via the Simple File Protocol > > > >When booting via the EFI_SIMPLE_FILE_SYSTEM_PROTOCOL, the FilePath > > > > will > > > >start with a device path that points to the device that implements > > > > the > > > >EFI_SIMPLE_FILE_SYSTEM_PROTOCOL or the EFI_BLOCK_IO_PROTOCOL. The > > > > next > > > >part of the FilePath may point to the file name, including > > > >subdirectories, which contain the bootable image. If the file name is > > > >a null device path, the file name must be generated from the rules > > > >defined below. > > > >... > > > >3.5.1.1 Removable Media Boot Behavior > > > >To generate a file name when none is present in the FilePath, the > > > >firmware must append a default file name in the form > > > >\EFI\BOOT\BOOT{machine type short-name}.EFI ... > > > > > > > > 2) So (1) entails the hehavior that the user's preference of boot media > > > > order should be determined by Boot and BootOrder variables. > > > > > > > > With this patch, the semantics mentioned above is fully implemented. > > > > For example, if you want to boot the system from USB and SCSI in this > > > > order, > > > > * define Boot0001 which contains only a device path to the USB device > > > >(without any file path/name) > > > > * define Boot0002 which contains only a device path to the SCSI device, > > > > and > > > > * set BootOrder to Boot0001:Boot0002 > > > > > > > > To avoid build error for sandbox, default file name "BOOTSANDBOX.efi" > > > > is defined even if it is out of scope of UEFI specification. > > > > > > > > Signed-off-by: AKASHI Takahiro > > > > Signed-off-by: Masahisa Kojima > > > > --- > > > > Changes in v5: > > > > - add default file name definition for SANDBOX to avoid build error > > > > > > > > Changes from original version: > > > > - create new include file "efi_default_filename.h" to > > > >avoid conflict with config_distro_bootcmd.h > > > > - modify the target pointer of efi_free_pool(), expand_media_path() > > > > should > > > >only free the pointer allocated by efi_dp_from_file() function. > > > > include/config_distro_bootcmd.h | 14 + > > > > include/efi_default_filename.h | 33 ++ > > > > lib/efi_loader/efi_bootmgr.c| 50 - > > > > 3 files changed, 83 insertions(+), 14 deletions(-) > > > > create mode 100644 include/efi_default_filename.h > > > > > > > > diff --git a/include/config_distro_bootcmd.h > > > > b/include/config_distro_bootcmd.h > > > > index c55023889c..6a3110f27b 100644 > > > > --- a/include/config_distro_bootcmd.h > > > > +++ b/include/config_distro_bootcmd.h > > > > @@ -91,19 +91,7 @@ > > > > #endif > > > > > > > > #ifdef CONFIG_EFI_LOADER > > > > -#if defined(CONFIG_ARM64) > > > > -#define BOOTEFI_NAME "bootaa64.efi" > > > > -#elif defined(CONFIG_ARM) > > > > -#define BOOTEFI_NAME "bootarm.efi" > > > > -#elif defined(CONFIG_X86_RUN_32BIT) > > > > -#define BOOTEFI_NAME "bootia32.efi" > > > > -#elif defined(CONFIG_X86_RUN_64BIT) > > > > -#define BOOTEFI_NAME "bootx64.efi" > > > > -#elif defined(CONFIG_ARCH_RV32I) > > > > -#define BOOTEFI_NAME "bootriscv32.efi" > > > > -#elif defined(CONFIG_ARCH_RV64I) > > > > -#define BOOTEFI_NAME "bootriscv64.efi" > > > > -#endif > > > > +#include > > > > #endif > > > > > > > > #ifdef BOOTEFI_NAME > > > > diff --git a/include/efi_default_filename.h > > > > b/include/efi_default_filename.h > > > > new file mode 100644 > > > > index 00..cb2ef9e131 > > > > --- /dev/null > > > > +++ b/include/efi_default_filename.h > > > > @@ -0,0 +1,33 @@ > > > > +/* SPDX-License-Identifier: GPL-2.0+ */ > > > > +/* > > > > + * Default boot file name when none is present in the FilePath. > > > > + * This is defined in the UEFI specification. > > > > + * > > > > + * Copyright (c) 2022, Linaro Limited > > > > + */ > > > > +#ifndef _EFI_DEFAULT_FILENAME_H > > > > +#define _EFI_DEFAULT_FILENAME_H > > > > + > > > > +#if defined(CONFIG_ARM64) > > > > +#define BOOTEFI_NAME "BOOTAA64.EFI" > > > > +#elif defined(CONFIG_ARM) > > > > +#define BOOTEFI_NAME "BOOTARM.EFI"
Re: [PATCH v5 06/17] efi_loader: bootmgr: add booting from removable media
> Date: Thu, 5 May 2022 14:35:36 +0200 > From: Heinrich Schuchardt > > On 5/5/22 14:20, Heinrich Schuchardt wrote: > > On 5/5/22 14:05, Mark Kettenis wrote: > >>> Date: Fri, 29 Apr 2022 19:03:22 +0200 > >>> From: Heinrich Schuchardt > >>> > >>> On 4/28/22 10:09, Masahisa Kojima wrote: > From: AKASHI Takahiro > > Under the current implementation, booting from removable media using > a architecture-specific default image name, say BOOTAA64.EFI, is > supported only in distro_bootcmd script. See the commit 74522c898b35 > ("efi_loader: Add distro boot script for removable media"). > > This is, however, half-baked implementation because > 1) UEFI specification requires this feature to be implemented as part > of Boot Manager's responsibility: > > 3 - Boot Manager > 3.5.1 Boot via the Simple File Protocol > When booting via the EFI_SIMPLE_FILE_SYSTEM_PROTOCOL, the > FilePath will > start with a device path that points to the device that > implements the > EFI_SIMPLE_FILE_SYSTEM_PROTOCOL or the EFI_BLOCK_IO_PROTOCOL. > The next > part of the FilePath may point to the file name, including > subdirectories, which contain the bootable image. If the file > name is > a null device path, the file name must be generated from the rules > defined below. > ... > 3.5.1.1 Removable Media Boot Behavior > To generate a file name when none is present in the FilePath, the > firmware must append a default file name in the form > \EFI\BOOT\BOOT{machine type short-name}.EFI ... > > 2) So (1) entails the hehavior that the user's preference of boot media > order should be determined by Boot and BootOrder variables. > > With this patch, the semantics mentioned above is fully implemented. > For example, if you want to boot the system from USB and SCSI in this > order, > * define Boot0001 which contains only a device path to the USB device > (without any file path/name) > * define Boot0002 which contains only a device path to the SCSI device, > and > * set BootOrder to Boot0001:Boot0002 > > To avoid build error for sandbox, default file name "BOOTSANDBOX.efi" > is defined even if it is out of scope of UEFI specification. > > Signed-off-by: AKASHI Takahiro > Signed-off-by: Masahisa Kojima > --- > Changes in v5: > - add default file name definition for SANDBOX to avoid build error > > Changes from original version: > - create new include file "efi_default_filename.h" to > avoid conflict with config_distro_bootcmd.h > - modify the target pointer of efi_free_pool(), expand_media_path() > should > only free the pointer allocated by efi_dp_from_file() function. > include/config_distro_bootcmd.h | 14 + > include/efi_default_filename.h | 33 ++ > lib/efi_loader/efi_bootmgr.c | 50 > - > 3 files changed, 83 insertions(+), 14 deletions(-) > create mode 100644 include/efi_default_filename.h > > diff --git a/include/config_distro_bootcmd.h > b/include/config_distro_bootcmd.h > index c55023889c..6a3110f27b 100644 > --- a/include/config_distro_bootcmd.h > +++ b/include/config_distro_bootcmd.h > @@ -91,19 +91,7 @@ > #endif > > #ifdef CONFIG_EFI_LOADER > -#if defined(CONFIG_ARM64) > -#define BOOTEFI_NAME "bootaa64.efi" > -#elif defined(CONFIG_ARM) > -#define BOOTEFI_NAME "bootarm.efi" > -#elif defined(CONFIG_X86_RUN_32BIT) > -#define BOOTEFI_NAME "bootia32.efi" > -#elif defined(CONFIG_X86_RUN_64BIT) > -#define BOOTEFI_NAME "bootx64.efi" > -#elif defined(CONFIG_ARCH_RV32I) > -#define BOOTEFI_NAME "bootriscv32.efi" > -#elif defined(CONFIG_ARCH_RV64I) > -#define BOOTEFI_NAME "bootriscv64.efi" > -#endif > +#include > #endif > > #ifdef BOOTEFI_NAME > diff --git a/include/efi_default_filename.h > b/include/efi_default_filename.h > new file mode 100644 > index 00..cb2ef9e131 > --- /dev/null > +++ b/include/efi_default_filename.h > @@ -0,0 +1,33 @@ > +/* SPDX-License-Identifier: GPL-2.0+ */ > +/* > + * Default boot file name when none is present in the FilePath. > + * This is defined in the UEFI specification. > + * > + * Copyright (c) 2022, Linaro Limited > + */ > +#ifndef _EFI_DEFAULT_FILENAME_H > +#define _EFI_DEFAULT_FILENAME_H > + > +#if defined(CONFIG_ARM64) > +#define BOOTEFI_NAME "BOOTAA64.EFI" > +#elif defined(CONFIG_ARM) > +#define BOOTEFI_NAME "BOOTARM.EFI" > +#elif defined(CONFIG_X86_64) > +#define BOOTEFI_NAME "
Re: [PATCH v5 06/17] efi_loader: bootmgr: add booting from removable media
> Date: Thu, 5 May 2022 14:05:04 +0200 (CEST) > From: Mark Kettenis > > > Date: Fri, 29 Apr 2022 19:03:22 +0200 > > From: Heinrich Schuchardt > > > > On 4/28/22 10:09, Masahisa Kojima wrote: > > > From: AKASHI Takahiro > > > > > > Under the current implementation, booting from removable media using > > > a architecture-specific default image name, say BOOTAA64.EFI, is > > > supported only in distro_bootcmd script. See the commit 74522c898b35 > > > ("efi_loader: Add distro boot script for removable media"). > > > > > > This is, however, half-baked implementation because > > > 1) UEFI specification requires this feature to be implemented as part > > > of Boot Manager's responsibility: > > > > > >3 - Boot Manager > > >3.5.1 Boot via the Simple File Protocol > > >When booting via the EFI_SIMPLE_FILE_SYSTEM_PROTOCOL, the FilePath will > > >start with a device path that points to the device that implements the > > >EFI_SIMPLE_FILE_SYSTEM_PROTOCOL or the EFI_BLOCK_IO_PROTOCOL. The next > > >part of the FilePath may point to the file name, including > > >subdirectories, which contain the bootable image. If the file name is > > >a null device path, the file name must be generated from the rules > > >defined below. > > >... > > >3.5.1.1 Removable Media Boot Behavior > > >To generate a file name when none is present in the FilePath, the > > >firmware must append a default file name in the form > > >\EFI\BOOT\BOOT{machine type short-name}.EFI ... > > > > > > 2) So (1) entails the hehavior that the user's preference of boot media > > > order should be determined by Boot and BootOrder variables. > > > > > > With this patch, the semantics mentioned above is fully implemented. > > > For example, if you want to boot the system from USB and SCSI in this > > > order, > > > * define Boot0001 which contains only a device path to the USB device > > >(without any file path/name) > > > * define Boot0002 which contains only a device path to the SCSI device, > > > and > > > * set BootOrder to Boot0001:Boot0002 > > > > > > To avoid build error for sandbox, default file name "BOOTSANDBOX.efi" > > > is defined even if it is out of scope of UEFI specification. > > > > > > Signed-off-by: AKASHI Takahiro > > > Signed-off-by: Masahisa Kojima > > > --- > > > Changes in v5: > > > - add default file name definition for SANDBOX to avoid build error > > > > > > Changes from original version: > > > - create new include file "efi_default_filename.h" to > > >avoid conflict with config_distro_bootcmd.h > > > - modify the target pointer of efi_free_pool(), expand_media_path() should > > >only free the pointer allocated by efi_dp_from_file() function. > > > include/config_distro_bootcmd.h | 14 + > > > include/efi_default_filename.h | 33 ++ > > > lib/efi_loader/efi_bootmgr.c| 50 - > > > 3 files changed, 83 insertions(+), 14 deletions(-) > > > create mode 100644 include/efi_default_filename.h > > > > > > diff --git a/include/config_distro_bootcmd.h > > > b/include/config_distro_bootcmd.h > > > index c55023889c..6a3110f27b 100644 > > > --- a/include/config_distro_bootcmd.h > > > +++ b/include/config_distro_bootcmd.h > > > @@ -91,19 +91,7 @@ > > > #endif > > > > > > #ifdef CONFIG_EFI_LOADER > > > -#if defined(CONFIG_ARM64) > > > -#define BOOTEFI_NAME "bootaa64.efi" > > > -#elif defined(CONFIG_ARM) > > > -#define BOOTEFI_NAME "bootarm.efi" > > > -#elif defined(CONFIG_X86_RUN_32BIT) > > > -#define BOOTEFI_NAME "bootia32.efi" > > > -#elif defined(CONFIG_X86_RUN_64BIT) > > > -#define BOOTEFI_NAME "bootx64.efi" > > > -#elif defined(CONFIG_ARCH_RV32I) > > > -#define BOOTEFI_NAME "bootriscv32.efi" > > > -#elif defined(CONFIG_ARCH_RV64I) > > > -#define BOOTEFI_NAME "bootriscv64.efi" > > > -#endif > > > +#include > > > #endif > > > > > > #ifdef BOOTEFI_NAME > > > diff --git a/include/efi_default_filename.h > > > b/include/efi_default_filename.h > > > new file mode 100644 > > > index 00..cb2ef9e131 > > > --- /dev/null > > > +++ b/include/efi_default_filename.h > > > @@ -0,0 +1,33 @@ > > > +/* SPDX-License-Identifier: GPL-2.0+ */ > > > +/* > > > + * Default boot file name when none is present in the FilePath. > > > + * This is defined in the UEFI specification. > > > + * > > > + * Copyright (c) 2022, Linaro Limited > > > + */ > > > +#ifndef _EFI_DEFAULT_FILENAME_H > > > +#define _EFI_DEFAULT_FILENAME_H > > > + > > > +#if defined(CONFIG_ARM64) > > > +#define BOOTEFI_NAME "BOOTAA64.EFI" > > > +#elif defined(CONFIG_ARM) > > > +#define BOOTEFI_NAME "BOOTARM.EFI" > > > +#elif defined(CONFIG_X86_64) > > > +#define BOOTEFI_NAME "BOOTX64.EFI" > > > +#elif defined(CONFIG_X86) > > > +#define BOOTEFI_NAME "BOOTIA32.EFI" > > > +#elif defined(CONFIG_ARCH_RV32I) > > > +#define BOOTEFI_NAME "BOOTRISCV32.EFI" > > > +#elif defined(CONFIG_ARCH_RV64I) > > > +#define BOOTEFI_NAME "BOOTRISCV64.EFI" > > > +#
Re: [PATCH v5 06/17] efi_loader: bootmgr: add booting from removable media
On 5/5/22 14:20, Heinrich Schuchardt wrote: On 5/5/22 14:05, Mark Kettenis wrote: Date: Fri, 29 Apr 2022 19:03:22 +0200 From: Heinrich Schuchardt On 4/28/22 10:09, Masahisa Kojima wrote: From: AKASHI Takahiro Under the current implementation, booting from removable media using a architecture-specific default image name, say BOOTAA64.EFI, is supported only in distro_bootcmd script. See the commit 74522c898b35 ("efi_loader: Add distro boot script for removable media"). This is, however, half-baked implementation because 1) UEFI specification requires this feature to be implemented as part of Boot Manager's responsibility: 3 - Boot Manager 3.5.1 Boot via the Simple File Protocol When booting via the EFI_SIMPLE_FILE_SYSTEM_PROTOCOL, the FilePath will start with a device path that points to the device that implements the EFI_SIMPLE_FILE_SYSTEM_PROTOCOL or the EFI_BLOCK_IO_PROTOCOL. The next part of the FilePath may point to the file name, including subdirectories, which contain the bootable image. If the file name is a null device path, the file name must be generated from the rules defined below. ... 3.5.1.1 Removable Media Boot Behavior To generate a file name when none is present in the FilePath, the firmware must append a default file name in the form \EFI\BOOT\BOOT{machine type short-name}.EFI ... 2) So (1) entails the hehavior that the user's preference of boot media order should be determined by Boot and BootOrder variables. With this patch, the semantics mentioned above is fully implemented. For example, if you want to boot the system from USB and SCSI in this order, * define Boot0001 which contains only a device path to the USB device (without any file path/name) * define Boot0002 which contains only a device path to the SCSI device, and * set BootOrder to Boot0001:Boot0002 To avoid build error for sandbox, default file name "BOOTSANDBOX.efi" is defined even if it is out of scope of UEFI specification. Signed-off-by: AKASHI Takahiro Signed-off-by: Masahisa Kojima --- Changes in v5: - add default file name definition for SANDBOX to avoid build error Changes from original version: - create new include file "efi_default_filename.h" to avoid conflict with config_distro_bootcmd.h - modify the target pointer of efi_free_pool(), expand_media_path() should only free the pointer allocated by efi_dp_from_file() function. include/config_distro_bootcmd.h | 14 + include/efi_default_filename.h | 33 ++ lib/efi_loader/efi_bootmgr.c | 50 - 3 files changed, 83 insertions(+), 14 deletions(-) create mode 100644 include/efi_default_filename.h diff --git a/include/config_distro_bootcmd.h b/include/config_distro_bootcmd.h index c55023889c..6a3110f27b 100644 --- a/include/config_distro_bootcmd.h +++ b/include/config_distro_bootcmd.h @@ -91,19 +91,7 @@ #endif #ifdef CONFIG_EFI_LOADER -#if defined(CONFIG_ARM64) -#define BOOTEFI_NAME "bootaa64.efi" -#elif defined(CONFIG_ARM) -#define BOOTEFI_NAME "bootarm.efi" -#elif defined(CONFIG_X86_RUN_32BIT) -#define BOOTEFI_NAME "bootia32.efi" -#elif defined(CONFIG_X86_RUN_64BIT) -#define BOOTEFI_NAME "bootx64.efi" -#elif defined(CONFIG_ARCH_RV32I) -#define BOOTEFI_NAME "bootriscv32.efi" -#elif defined(CONFIG_ARCH_RV64I) -#define BOOTEFI_NAME "bootriscv64.efi" -#endif +#include #endif #ifdef BOOTEFI_NAME diff --git a/include/efi_default_filename.h b/include/efi_default_filename.h new file mode 100644 index 00..cb2ef9e131 --- /dev/null +++ b/include/efi_default_filename.h @@ -0,0 +1,33 @@ +/* SPDX-License-Identifier: GPL-2.0+ */ +/* + * Default boot file name when none is present in the FilePath. + * This is defined in the UEFI specification. + * + * Copyright (c) 2022, Linaro Limited + */ +#ifndef _EFI_DEFAULT_FILENAME_H +#define _EFI_DEFAULT_FILENAME_H + +#if defined(CONFIG_ARM64) +#define BOOTEFI_NAME "BOOTAA64.EFI" +#elif defined(CONFIG_ARM) +#define BOOTEFI_NAME "BOOTARM.EFI" +#elif defined(CONFIG_X86_64) +#define BOOTEFI_NAME "BOOTX64.EFI" +#elif defined(CONFIG_X86) +#define BOOTEFI_NAME "BOOTIA32.EFI" +#elif defined(CONFIG_ARCH_RV32I) +#define BOOTEFI_NAME "BOOTRISCV32.EFI" +#elif defined(CONFIG_ARCH_RV64I) +#define BOOTEFI_NAME "BOOTRISCV64.EFI" +#elif defined(CONFIG_SANDBOX) +/* + * SANDBOX is not defined in UEFI specification, but + * this definition avoids build failure for SANDBOX. + */ +#define BOOTEFI_NAME "BOOTSANDBOX.EFI" The sandbox should boot the default binary for the host architecture: #ifndef _EFI_DEFAULT_FILENAME_H #define _EFI_DEFAULT_FILENAME_H #include #undef BOOTEFI_NAME #if HOST_ARCH == HOST_ARCH_X86_64 #define BOOTEFI_NAME "BOOTX64.EFI" #endif #if HOST_ARCH == HOST_ARCH_X86 #define BOOTEFI_NAME "BOOTIA32.EFI" #endif #if HOST_ARCH == HOST_ARCH_AARCH64 #define BOOTEFI_NAME "BOOTAA64.EFI" #endif #if HOST_ARCH == HOST_ARCH_ARM #define BOOTEFI_NAME "BOOTARM.E
Re: [PATCH v5 06/17] efi_loader: bootmgr: add booting from removable media
On 5/5/22 14:05, Mark Kettenis wrote: Date: Fri, 29 Apr 2022 19:03:22 +0200 From: Heinrich Schuchardt On 4/28/22 10:09, Masahisa Kojima wrote: From: AKASHI Takahiro Under the current implementation, booting from removable media using a architecture-specific default image name, say BOOTAA64.EFI, is supported only in distro_bootcmd script. See the commit 74522c898b35 ("efi_loader: Add distro boot script for removable media"). This is, however, half-baked implementation because 1) UEFI specification requires this feature to be implemented as part of Boot Manager's responsibility: 3 - Boot Manager 3.5.1 Boot via the Simple File Protocol When booting via the EFI_SIMPLE_FILE_SYSTEM_PROTOCOL, the FilePath will start with a device path that points to the device that implements the EFI_SIMPLE_FILE_SYSTEM_PROTOCOL or the EFI_BLOCK_IO_PROTOCOL. The next part of the FilePath may point to the file name, including subdirectories, which contain the bootable image. If the file name is a null device path, the file name must be generated from the rules defined below. ... 3.5.1.1 Removable Media Boot Behavior To generate a file name when none is present in the FilePath, the firmware must append a default file name in the form \EFI\BOOT\BOOT{machine type short-name}.EFI ... 2) So (1) entails the hehavior that the user's preference of boot media order should be determined by Boot and BootOrder variables. With this patch, the semantics mentioned above is fully implemented. For example, if you want to boot the system from USB and SCSI in this order, * define Boot0001 which contains only a device path to the USB device (without any file path/name) * define Boot0002 which contains only a device path to the SCSI device, and * set BootOrder to Boot0001:Boot0002 To avoid build error for sandbox, default file name "BOOTSANDBOX.efi" is defined even if it is out of scope of UEFI specification. Signed-off-by: AKASHI Takahiro Signed-off-by: Masahisa Kojima --- Changes in v5: - add default file name definition for SANDBOX to avoid build error Changes from original version: - create new include file "efi_default_filename.h" to avoid conflict with config_distro_bootcmd.h - modify the target pointer of efi_free_pool(), expand_media_path() should only free the pointer allocated by efi_dp_from_file() function. include/config_distro_bootcmd.h | 14 + include/efi_default_filename.h | 33 ++ lib/efi_loader/efi_bootmgr.c| 50 - 3 files changed, 83 insertions(+), 14 deletions(-) create mode 100644 include/efi_default_filename.h diff --git a/include/config_distro_bootcmd.h b/include/config_distro_bootcmd.h index c55023889c..6a3110f27b 100644 --- a/include/config_distro_bootcmd.h +++ b/include/config_distro_bootcmd.h @@ -91,19 +91,7 @@ #endif #ifdef CONFIG_EFI_LOADER -#if defined(CONFIG_ARM64) -#define BOOTEFI_NAME "bootaa64.efi" -#elif defined(CONFIG_ARM) -#define BOOTEFI_NAME "bootarm.efi" -#elif defined(CONFIG_X86_RUN_32BIT) -#define BOOTEFI_NAME "bootia32.efi" -#elif defined(CONFIG_X86_RUN_64BIT) -#define BOOTEFI_NAME "bootx64.efi" -#elif defined(CONFIG_ARCH_RV32I) -#define BOOTEFI_NAME "bootriscv32.efi" -#elif defined(CONFIG_ARCH_RV64I) -#define BOOTEFI_NAME "bootriscv64.efi" -#endif +#include #endif #ifdef BOOTEFI_NAME diff --git a/include/efi_default_filename.h b/include/efi_default_filename.h new file mode 100644 index 00..cb2ef9e131 --- /dev/null +++ b/include/efi_default_filename.h @@ -0,0 +1,33 @@ +/* SPDX-License-Identifier: GPL-2.0+ */ +/* + * Default boot file name when none is present in the FilePath. + * This is defined in the UEFI specification. + * + * Copyright (c) 2022, Linaro Limited + */ +#ifndef _EFI_DEFAULT_FILENAME_H +#define _EFI_DEFAULT_FILENAME_H + +#if defined(CONFIG_ARM64) +#define BOOTEFI_NAME "BOOTAA64.EFI" +#elif defined(CONFIG_ARM) +#define BOOTEFI_NAME "BOOTARM.EFI" +#elif defined(CONFIG_X86_64) +#define BOOTEFI_NAME "BOOTX64.EFI" +#elif defined(CONFIG_X86) +#define BOOTEFI_NAME "BOOTIA32.EFI" +#elif defined(CONFIG_ARCH_RV32I) +#define BOOTEFI_NAME "BOOTRISCV32.EFI" +#elif defined(CONFIG_ARCH_RV64I) +#define BOOTEFI_NAME "BOOTRISCV64.EFI" +#elif defined(CONFIG_SANDBOX) +/* + * SANDBOX is not defined in UEFI specification, but + * this definition avoids build failure for SANDBOX. + */ +#define BOOTEFI_NAME "BOOTSANDBOX.EFI" The sandbox should boot the default binary for the host architecture: #ifndef _EFI_DEFAULT_FILENAME_H #define _EFI_DEFAULT_FILENAME_H #include #undef BOOTEFI_NAME #if HOST_ARCH == HOST_ARCH_X86_64 #define BOOTEFI_NAME "BOOTX64.EFI" #endif #if HOST_ARCH == HOST_ARCH_X86 #define BOOTEFI_NAME "BOOTIA32.EFI" #endif #if HOST_ARCH == HOST_ARCH_AARCH64 #define BOOTEFI_NAME "BOOTAA64.EFI" #endif #if HOST_ARCH == HOST_ARCH_ARM #define BOOTEFI_NAME "BOOTARM.EFI" #endif #if HOST_ARCH == HOST_ARCH_RISCV3
Re: [PATCH v5 06/17] efi_loader: bootmgr: add booting from removable media
> Date: Fri, 29 Apr 2022 19:03:22 +0200 > From: Heinrich Schuchardt > > On 4/28/22 10:09, Masahisa Kojima wrote: > > From: AKASHI Takahiro > > > > Under the current implementation, booting from removable media using > > a architecture-specific default image name, say BOOTAA64.EFI, is > > supported only in distro_bootcmd script. See the commit 74522c898b35 > > ("efi_loader: Add distro boot script for removable media"). > > > > This is, however, half-baked implementation because > > 1) UEFI specification requires this feature to be implemented as part > > of Boot Manager's responsibility: > > > >3 - Boot Manager > >3.5.1 Boot via the Simple File Protocol > >When booting via the EFI_SIMPLE_FILE_SYSTEM_PROTOCOL, the FilePath will > >start with a device path that points to the device that implements the > >EFI_SIMPLE_FILE_SYSTEM_PROTOCOL or the EFI_BLOCK_IO_PROTOCOL. The next > >part of the FilePath may point to the file name, including > >subdirectories, which contain the bootable image. If the file name is > >a null device path, the file name must be generated from the rules > >defined below. > >... > >3.5.1.1 Removable Media Boot Behavior > >To generate a file name when none is present in the FilePath, the > >firmware must append a default file name in the form > >\EFI\BOOT\BOOT{machine type short-name}.EFI ... > > > > 2) So (1) entails the hehavior that the user's preference of boot media > > order should be determined by Boot and BootOrder variables. > > > > With this patch, the semantics mentioned above is fully implemented. > > For example, if you want to boot the system from USB and SCSI in this > > order, > > * define Boot0001 which contains only a device path to the USB device > >(without any file path/name) > > * define Boot0002 which contains only a device path to the SCSI device, > > and > > * set BootOrder to Boot0001:Boot0002 > > > > To avoid build error for sandbox, default file name "BOOTSANDBOX.efi" > > is defined even if it is out of scope of UEFI specification. > > > > Signed-off-by: AKASHI Takahiro > > Signed-off-by: Masahisa Kojima > > --- > > Changes in v5: > > - add default file name definition for SANDBOX to avoid build error > > > > Changes from original version: > > - create new include file "efi_default_filename.h" to > >avoid conflict with config_distro_bootcmd.h > > - modify the target pointer of efi_free_pool(), expand_media_path() should > >only free the pointer allocated by efi_dp_from_file() function. > > include/config_distro_bootcmd.h | 14 + > > include/efi_default_filename.h | 33 ++ > > lib/efi_loader/efi_bootmgr.c| 50 - > > 3 files changed, 83 insertions(+), 14 deletions(-) > > create mode 100644 include/efi_default_filename.h > > > > diff --git a/include/config_distro_bootcmd.h > > b/include/config_distro_bootcmd.h > > index c55023889c..6a3110f27b 100644 > > --- a/include/config_distro_bootcmd.h > > +++ b/include/config_distro_bootcmd.h > > @@ -91,19 +91,7 @@ > > #endif > > > > #ifdef CONFIG_EFI_LOADER > > -#if defined(CONFIG_ARM64) > > -#define BOOTEFI_NAME "bootaa64.efi" > > -#elif defined(CONFIG_ARM) > > -#define BOOTEFI_NAME "bootarm.efi" > > -#elif defined(CONFIG_X86_RUN_32BIT) > > -#define BOOTEFI_NAME "bootia32.efi" > > -#elif defined(CONFIG_X86_RUN_64BIT) > > -#define BOOTEFI_NAME "bootx64.efi" > > -#elif defined(CONFIG_ARCH_RV32I) > > -#define BOOTEFI_NAME "bootriscv32.efi" > > -#elif defined(CONFIG_ARCH_RV64I) > > -#define BOOTEFI_NAME "bootriscv64.efi" > > -#endif > > +#include > > #endif > > > > #ifdef BOOTEFI_NAME > > diff --git a/include/efi_default_filename.h b/include/efi_default_filename.h > > new file mode 100644 > > index 00..cb2ef9e131 > > --- /dev/null > > +++ b/include/efi_default_filename.h > > @@ -0,0 +1,33 @@ > > +/* SPDX-License-Identifier: GPL-2.0+ */ > > +/* > > + * Default boot file name when none is present in the FilePath. > > + * This is defined in the UEFI specification. > > + * > > + * Copyright (c) 2022, Linaro Limited > > + */ > > +#ifndef _EFI_DEFAULT_FILENAME_H > > +#define _EFI_DEFAULT_FILENAME_H > > + > > +#if defined(CONFIG_ARM64) > > +#define BOOTEFI_NAME "BOOTAA64.EFI" > > +#elif defined(CONFIG_ARM) > > +#define BOOTEFI_NAME "BOOTARM.EFI" > > +#elif defined(CONFIG_X86_64) > > +#define BOOTEFI_NAME "BOOTX64.EFI" > > +#elif defined(CONFIG_X86) > > +#define BOOTEFI_NAME "BOOTIA32.EFI" > > +#elif defined(CONFIG_ARCH_RV32I) > > +#define BOOTEFI_NAME "BOOTRISCV32.EFI" > > +#elif defined(CONFIG_ARCH_RV64I) > > +#define BOOTEFI_NAME "BOOTRISCV64.EFI" > > +#elif defined(CONFIG_SANDBOX) > > +/* > > + * SANDBOX is not defined in UEFI specification, but > > + * this definition avoids build failure for SANDBOX. > > + */ > > +#define BOOTEFI_NAME "BOOTSANDBOX.EFI" > > The sandbox should boot the default binary for the host architecture: > > #ifndef _EFI_DEFAULT_FILENA
Re: [PATCH v5 06/17] efi_loader: bootmgr: add booting from removable media
On 4/28/22 10:09, Masahisa Kojima wrote: From: AKASHI Takahiro Under the current implementation, booting from removable media using a architecture-specific default image name, say BOOTAA64.EFI, is supported only in distro_bootcmd script. See the commit 74522c898b35 ("efi_loader: Add distro boot script for removable media"). This is, however, half-baked implementation because 1) UEFI specification requires this feature to be implemented as part of Boot Manager's responsibility: 3 - Boot Manager 3.5.1 Boot via the Simple File Protocol When booting via the EFI_SIMPLE_FILE_SYSTEM_PROTOCOL, the FilePath will start with a device path that points to the device that implements the EFI_SIMPLE_FILE_SYSTEM_PROTOCOL or the EFI_BLOCK_IO_PROTOCOL. The next part of the FilePath may point to the file name, including subdirectories, which contain the bootable image. If the file name is a null device path, the file name must be generated from the rules defined below. ... 3.5.1.1 Removable Media Boot Behavior To generate a file name when none is present in the FilePath, the firmware must append a default file name in the form \EFI\BOOT\BOOT{machine type short-name}.EFI ... 2) So (1) entails the hehavior that the user's preference of boot media order should be determined by Boot and BootOrder variables. With this patch, the semantics mentioned above is fully implemented. For example, if you want to boot the system from USB and SCSI in this order, * define Boot0001 which contains only a device path to the USB device (without any file path/name) * define Boot0002 which contains only a device path to the SCSI device, and * set BootOrder to Boot0001:Boot0002 To avoid build error for sandbox, default file name "BOOTSANDBOX.efi" is defined even if it is out of scope of UEFI specification. Signed-off-by: AKASHI Takahiro Signed-off-by: Masahisa Kojima --- Changes in v5: - add default file name definition for SANDBOX to avoid build error Changes from original version: - create new include file "efi_default_filename.h" to avoid conflict with config_distro_bootcmd.h - modify the target pointer of efi_free_pool(), expand_media_path() should only free the pointer allocated by efi_dp_from_file() function. include/config_distro_bootcmd.h | 14 + include/efi_default_filename.h | 33 ++ lib/efi_loader/efi_bootmgr.c| 50 - 3 files changed, 83 insertions(+), 14 deletions(-) create mode 100644 include/efi_default_filename.h diff --git a/include/config_distro_bootcmd.h b/include/config_distro_bootcmd.h index c55023889c..6a3110f27b 100644 --- a/include/config_distro_bootcmd.h +++ b/include/config_distro_bootcmd.h @@ -91,19 +91,7 @@ #endif #ifdef CONFIG_EFI_LOADER -#if defined(CONFIG_ARM64) -#define BOOTEFI_NAME "bootaa64.efi" -#elif defined(CONFIG_ARM) -#define BOOTEFI_NAME "bootarm.efi" -#elif defined(CONFIG_X86_RUN_32BIT) -#define BOOTEFI_NAME "bootia32.efi" -#elif defined(CONFIG_X86_RUN_64BIT) -#define BOOTEFI_NAME "bootx64.efi" -#elif defined(CONFIG_ARCH_RV32I) -#define BOOTEFI_NAME "bootriscv32.efi" -#elif defined(CONFIG_ARCH_RV64I) -#define BOOTEFI_NAME "bootriscv64.efi" -#endif +#include #endif #ifdef BOOTEFI_NAME diff --git a/include/efi_default_filename.h b/include/efi_default_filename.h new file mode 100644 index 00..cb2ef9e131 --- /dev/null +++ b/include/efi_default_filename.h @@ -0,0 +1,33 @@ +/* SPDX-License-Identifier: GPL-2.0+ */ +/* + * Default boot file name when none is present in the FilePath. + * This is defined in the UEFI specification. + * + * Copyright (c) 2022, Linaro Limited + */ +#ifndef _EFI_DEFAULT_FILENAME_H +#define _EFI_DEFAULT_FILENAME_H + +#if defined(CONFIG_ARM64) +#define BOOTEFI_NAME "BOOTAA64.EFI" +#elif defined(CONFIG_ARM) +#define BOOTEFI_NAME "BOOTARM.EFI" +#elif defined(CONFIG_X86_64) +#define BOOTEFI_NAME "BOOTX64.EFI" +#elif defined(CONFIG_X86) +#define BOOTEFI_NAME "BOOTIA32.EFI" +#elif defined(CONFIG_ARCH_RV32I) +#define BOOTEFI_NAME "BOOTRISCV32.EFI" +#elif defined(CONFIG_ARCH_RV64I) +#define BOOTEFI_NAME "BOOTRISCV64.EFI" +#elif defined(CONFIG_SANDBOX) +/* + * SANDBOX is not defined in UEFI specification, but + * this definition avoids build failure for SANDBOX. + */ +#define BOOTEFI_NAME "BOOTSANDBOX.EFI" The sandbox should boot the default binary for the host architecture: #ifndef _EFI_DEFAULT_FILENAME_H #define _EFI_DEFAULT_FILENAME_H #include #undef BOOTEFI_NAME #if HOST_ARCH == HOST_ARCH_X86_64 #define BOOTEFI_NAME "BOOTX64.EFI" #endif #if HOST_ARCH == HOST_ARCH_X86 #define BOOTEFI_NAME "BOOTIA32.EFI" #endif #if HOST_ARCH == HOST_ARCH_AARCH64 #define BOOTEFI_NAME "BOOTAA64.EFI" #endif #if HOST_ARCH == HOST_ARCH_ARM #define BOOTEFI_NAME "BOOTARM.EFI" #endif #if HOST_ARCH == HOST_ARCH_RISCV32 #define BOOTEFI_NAME "BOOTRISCV32.EFI" #endif #if HOST_ARCH == HOST_ARCH_RISCV64 #define BOOTEFI_NAME "BOOTRISCV64.EFI" #endif #i
[PATCH v5 06/17] efi_loader: bootmgr: add booting from removable media
From: AKASHI Takahiro Under the current implementation, booting from removable media using a architecture-specific default image name, say BOOTAA64.EFI, is supported only in distro_bootcmd script. See the commit 74522c898b35 ("efi_loader: Add distro boot script for removable media"). This is, however, half-baked implementation because 1) UEFI specification requires this feature to be implemented as part of Boot Manager's responsibility: 3 - Boot Manager 3.5.1 Boot via the Simple File Protocol When booting via the EFI_SIMPLE_FILE_SYSTEM_PROTOCOL, the FilePath will start with a device path that points to the device that implements the EFI_SIMPLE_FILE_SYSTEM_PROTOCOL or the EFI_BLOCK_IO_PROTOCOL. The next part of the FilePath may point to the file name, including subdirectories, which contain the bootable image. If the file name is a null device path, the file name must be generated from the rules defined below. ... 3.5.1.1 Removable Media Boot Behavior To generate a file name when none is present in the FilePath, the firmware must append a default file name in the form \EFI\BOOT\BOOT{machine type short-name}.EFI ... 2) So (1) entails the hehavior that the user's preference of boot media order should be determined by Boot and BootOrder variables. With this patch, the semantics mentioned above is fully implemented. For example, if you want to boot the system from USB and SCSI in this order, * define Boot0001 which contains only a device path to the USB device (without any file path/name) * define Boot0002 which contains only a device path to the SCSI device, and * set BootOrder to Boot0001:Boot0002 To avoid build error for sandbox, default file name "BOOTSANDBOX.efi" is defined even if it is out of scope of UEFI specification. Signed-off-by: AKASHI Takahiro Signed-off-by: Masahisa Kojima --- Changes in v5: - add default file name definition for SANDBOX to avoid build error Changes from original version: - create new include file "efi_default_filename.h" to avoid conflict with config_distro_bootcmd.h - modify the target pointer of efi_free_pool(), expand_media_path() should only free the pointer allocated by efi_dp_from_file() function. include/config_distro_bootcmd.h | 14 + include/efi_default_filename.h | 33 ++ lib/efi_loader/efi_bootmgr.c| 50 - 3 files changed, 83 insertions(+), 14 deletions(-) create mode 100644 include/efi_default_filename.h diff --git a/include/config_distro_bootcmd.h b/include/config_distro_bootcmd.h index c55023889c..6a3110f27b 100644 --- a/include/config_distro_bootcmd.h +++ b/include/config_distro_bootcmd.h @@ -91,19 +91,7 @@ #endif #ifdef CONFIG_EFI_LOADER -#if defined(CONFIG_ARM64) -#define BOOTEFI_NAME "bootaa64.efi" -#elif defined(CONFIG_ARM) -#define BOOTEFI_NAME "bootarm.efi" -#elif defined(CONFIG_X86_RUN_32BIT) -#define BOOTEFI_NAME "bootia32.efi" -#elif defined(CONFIG_X86_RUN_64BIT) -#define BOOTEFI_NAME "bootx64.efi" -#elif defined(CONFIG_ARCH_RV32I) -#define BOOTEFI_NAME "bootriscv32.efi" -#elif defined(CONFIG_ARCH_RV64I) -#define BOOTEFI_NAME "bootriscv64.efi" -#endif +#include #endif #ifdef BOOTEFI_NAME diff --git a/include/efi_default_filename.h b/include/efi_default_filename.h new file mode 100644 index 00..cb2ef9e131 --- /dev/null +++ b/include/efi_default_filename.h @@ -0,0 +1,33 @@ +/* SPDX-License-Identifier: GPL-2.0+ */ +/* + * Default boot file name when none is present in the FilePath. + * This is defined in the UEFI specification. + * + * Copyright (c) 2022, Linaro Limited + */ +#ifndef _EFI_DEFAULT_FILENAME_H +#define _EFI_DEFAULT_FILENAME_H + +#if defined(CONFIG_ARM64) +#define BOOTEFI_NAME "BOOTAA64.EFI" +#elif defined(CONFIG_ARM) +#define BOOTEFI_NAME "BOOTARM.EFI" +#elif defined(CONFIG_X86_64) +#define BOOTEFI_NAME "BOOTX64.EFI" +#elif defined(CONFIG_X86) +#define BOOTEFI_NAME "BOOTIA32.EFI" +#elif defined(CONFIG_ARCH_RV32I) +#define BOOTEFI_NAME "BOOTRISCV32.EFI" +#elif defined(CONFIG_ARCH_RV64I) +#define BOOTEFI_NAME "BOOTRISCV64.EFI" +#elif defined(CONFIG_SANDBOX) +/* + * SANDBOX is not defined in UEFI specification, but + * this definition avoids build failure for SANDBOX. + */ +#define BOOTEFI_NAME "BOOTSANDBOX.EFI" +#else +#error Unsupported UEFI architecture +#endif + +#endif diff --git a/lib/efi_loader/efi_bootmgr.c b/lib/efi_loader/efi_bootmgr.c index 8c04ecbdc8..22a4302aac 100644 --- a/lib/efi_loader/efi_bootmgr.c +++ b/lib/efi_loader/efi_bootmgr.c @@ -11,6 +11,7 @@ #include #include #include +#include #include #include #include @@ -30,6 +31,50 @@ static const struct efi_runtime_services *rs; * should do normal or recovery boot. */ +/** + * expand_media_path() - expand a device path for default file name + * @device_path: device path to check against + * + * If @device_path is a media or disk partition which houses a file + * system, this function returns a full device path which con