Pull request for efi-2023-01-rc5-3
Documentation: * Describe building documentation UEFI: * Add .data section to aarch64 EFI binaries and correct section flags * Correct sorting of capsules when updating * Populate console handles in system table Other: * Fix description of eth_env_[gs]et_enetaddr() return value * Avoid endless loop in sound play command -----BEGIN PGP SIGNATURE----- iQIzBAABCAAdFiEEbcT5xx8ppvoGt20zxIHbvCwFGsQFAmO1d9EACgkQxIHbvCwF GsQh/g/+L8SidakgdgkrKRm1eup+MmUrq1rZr1zdH35fx29nQCu5xUbqTfwLtST4 NDRKc/WnVqUbfMm9WEgSAp+0cUm2qrv9y5JpSEoLUHmt6ZZUh/KrbOdA32Cm07WD FjB+Ki49jGEewBP2wlLuIgXDgiROjiLvQ8fl4DJ0piQGdeFPsSqXJZj4V2gM6/SQ eyAwRxwp0dsGoPHxWpvclLJCjgU/9cebiauyN3/pPLYL1MsxP1/HruXgi5TyAxxo qBQAv/pjJKIVfjo8l6cPlon4niXembqcybg+jqv+UfFj0ZDZ39XZ/zAoycW4wEhF RQRQo5cwQnPEWCUDzFn6qBF7rLBmbfDbuByZfNIEHmneLYysB46+95Qy7lM0sCUi wfc2MuWavKZ1H99lR8UTqwf24FY9Q88OVaDw0LCo+GSuiSFv5XnUoMVVe/yu8CmY DSUtSoX1VV0JAozDrH+J7O8MkWISBCd/m4S/wDNnrb6b6gig/BSVN9wrpxtvSgrO LJ/4zkRbjiNuxDXv3lD1c7Xpq+pcdyBzreTnrvSgadq5sMcLXhuTLcyNXt0L7EbD FgMVAkt02HRSA/xovvGLCcqZ7P+DmBitoleWislFvBYS/cY/N16L2LxfEwSZLLpD iYcjNddKsECDEk1rVW3+cq1wPstxBSilQhom+dn/nx3rkZuK57Q= =ItVV -----END PGP SIGNATURE----- Merge tag 'efi-2023-01-rc5-3' of https://source.denx.de/u-boot/custodians/u-boot-efi Pull request for efi-2023-01-rc5-3 Documentation: * Describe building documentation UEFI: * Add .data section to aarch64 EFI binaries and correct section flags * Correct sorting of capsules when updating * Populate console handles in system table Other: * Fix description of eth_env_[gs]et_enetaddr() return value * Avoid endless loop in sound play command
This commit is contained in:
commit
8d6cbf5e6b
|
|
@ -25,7 +25,7 @@ pe_header:
|
||||||
.long IMAGE_NT_SIGNATURE /* 'PE' */
|
.long IMAGE_NT_SIGNATURE /* 'PE' */
|
||||||
coff_header:
|
coff_header:
|
||||||
.short IMAGE_FILE_MACHINE_ARM64 /* AArch64 */
|
.short IMAGE_FILE_MACHINE_ARM64 /* AArch64 */
|
||||||
.short 2 /* nr_sections */
|
.short 3 /* nr_sections */
|
||||||
.long 0 /* TimeDateStamp */
|
.long 0 /* TimeDateStamp */
|
||||||
.long 0 /* PointerToSymbolTable */
|
.long 0 /* PointerToSymbolTable */
|
||||||
.long 0 /* NumberOfSymbols */
|
.long 0 /* NumberOfSymbols */
|
||||||
|
|
@ -40,7 +40,7 @@ optional_header:
|
||||||
.short IMAGE_NT_OPTIONAL_HDR64_MAGIC /* PE32+ format */
|
.short IMAGE_NT_OPTIONAL_HDR64_MAGIC /* PE32+ format */
|
||||||
.byte 0x02 /* MajorLinkerVersion */
|
.byte 0x02 /* MajorLinkerVersion */
|
||||||
.byte 0x14 /* MinorLinkerVersion */
|
.byte 0x14 /* MinorLinkerVersion */
|
||||||
.long _edata - _start /* SizeOfCode */
|
.long _etext - _start /* SizeOfCode */
|
||||||
.long 0 /* SizeOfInitializedData */
|
.long 0 /* SizeOfInitializedData */
|
||||||
.long 0 /* SizeOfUninitializedData */
|
.long 0 /* SizeOfUninitializedData */
|
||||||
.long _start - ImageBase /* AddressOfEntryPoint */
|
.long _start - ImageBase /* AddressOfEntryPoint */
|
||||||
|
|
@ -48,7 +48,7 @@ optional_header:
|
||||||
|
|
||||||
extra_header_fields:
|
extra_header_fields:
|
||||||
.quad 0 /* ImageBase */
|
.quad 0 /* ImageBase */
|
||||||
.long 0x200 /* SectionAlignment */
|
.long 0x1000 /* SectionAlignment */
|
||||||
.long 0x200 /* FileAlignment */
|
.long 0x200 /* FileAlignment */
|
||||||
.short 0 /* MajorOperatingSystemVersion */
|
.short 0 /* MajorOperatingSystemVersion */
|
||||||
.short 0 /* MinorOperatingSystemVersion */
|
.short 0 /* MinorOperatingSystemVersion */
|
||||||
|
|
@ -100,25 +100,46 @@ section_table:
|
||||||
.long 0 /* PointerToLineNumbers */
|
.long 0 /* PointerToLineNumbers */
|
||||||
.short 0 /* NumberOfRelocations */
|
.short 0 /* NumberOfRelocations */
|
||||||
.short 0 /* NumberOfLineNumbers */
|
.short 0 /* NumberOfLineNumbers */
|
||||||
.long 0x42100040 /* Characteristics (section flags) */
|
/* Characteristics (section flags) */
|
||||||
|
.long (IMAGE_SCN_MEM_READ | \
|
||||||
|
IMAGE_SCN_MEM_DISCARDABLE | \
|
||||||
|
IMAGE_SCN_CNT_INITIALIZED_DATA)
|
||||||
|
|
||||||
.ascii ".text"
|
.ascii ".text"
|
||||||
.byte 0
|
.byte 0
|
||||||
.byte 0
|
.byte 0
|
||||||
.byte 0 /* end of 0 padding of section name */
|
.byte 0 /* end of 0 padding of section name */
|
||||||
.long _edata - _start /* VirtualSize */
|
.long _etext - _start /* VirtualSize */
|
||||||
.long _start - ImageBase /* VirtualAddress */
|
.long _start - ImageBase /* VirtualAddress */
|
||||||
.long _edata - _start /* SizeOfRawData */
|
.long _etext - _start /* SizeOfRawData */
|
||||||
.long _start - ImageBase /* PointerToRawData */
|
.long _start - ImageBase /* PointerToRawData */
|
||||||
|
.long 0 /* PointerToRelocations */
|
||||||
|
.long 0 /* PointerToLineNumbers */
|
||||||
|
.short 0 /* NumberOfRelocations */
|
||||||
|
.short 0 /* NumberOfLineNumbers */
|
||||||
|
/* Characteristics (section flags) */
|
||||||
|
.long (IMAGE_SCN_MEM_READ | \
|
||||||
|
IMAGE_SCN_MEM_EXECUTE | \
|
||||||
|
IMAGE_SCN_CNT_CODE)
|
||||||
|
|
||||||
.long 0 /* PointerToRelocations (0 for executables) */
|
.ascii ".data"
|
||||||
.long 0 /* PointerToLineNumbers (0 for executables) */
|
.byte 0
|
||||||
.short 0 /* NumberOfRelocations (0 for executables) */
|
.byte 0
|
||||||
.short 0 /* NumberOfLineNumbers (0 for executables) */
|
.byte 0 /* end of 0 padding of section name */
|
||||||
.long 0xe0500020 /* Characteristics (section flags) */
|
.long _data_size /* VirtualSize */
|
||||||
|
.long _data - ImageBase /* VirtualAddress */
|
||||||
|
.long _data_size /* SizeOfRawData */
|
||||||
|
.long _data - ImageBase /* PointerToRawData */
|
||||||
|
.long 0 /* PointerToRelocations */
|
||||||
|
.long 0 /* PointerToLineNumbers */
|
||||||
|
.short 0 /* NumberOfRelocations */
|
||||||
|
.short 0 /* NumberOfLineNumbers */
|
||||||
|
/* Characteristics (section flags) */
|
||||||
|
.long (IMAGE_SCN_MEM_WRITE | \
|
||||||
|
IMAGE_SCN_MEM_READ | \
|
||||||
|
IMAGE_SCN_CNT_INITIALIZED_DATA)
|
||||||
|
|
||||||
.align 9
|
.align 12
|
||||||
_start:
|
_start:
|
||||||
stp x29, x30, [sp, #-32]!
|
stp x29, x30, [sp, #-32]!
|
||||||
mov x29, sp
|
mov x29, sp
|
||||||
|
|
|
||||||
|
|
@ -18,11 +18,13 @@ SECTIONS
|
||||||
*(.gnu.linkonce.t.*)
|
*(.gnu.linkonce.t.*)
|
||||||
*(.srodata)
|
*(.srodata)
|
||||||
*(.rodata*)
|
*(.rodata*)
|
||||||
|
. = ALIGN(16);
|
||||||
|
*(.dynamic);
|
||||||
. = ALIGN(512);
|
. = ALIGN(512);
|
||||||
}
|
}
|
||||||
_etext = .;
|
_etext = .;
|
||||||
_text_size = . - _text;
|
_text_size = . - _text;
|
||||||
.dynamic : { *(.dynamic) }
|
. = ALIGN(4096);
|
||||||
.data : {
|
.data : {
|
||||||
_data = .;
|
_data = .;
|
||||||
*(.sdata)
|
*(.sdata)
|
||||||
|
|
@ -48,11 +50,11 @@ SECTIONS
|
||||||
_bss_end = .;
|
_bss_end = .;
|
||||||
_edata = .;
|
_edata = .;
|
||||||
}
|
}
|
||||||
|
_data_size = _edata - _data;
|
||||||
.rela.dyn : { *(.rela.dyn) }
|
.rela.dyn : { *(.rela.dyn) }
|
||||||
.rela.plt : { *(.rela.plt) }
|
.rela.plt : { *(.rela.plt) }
|
||||||
.rela.got : { *(.rela.got) }
|
.rela.got : { *(.rela.got) }
|
||||||
.rela.data : { *(.rela.data) *(.rela.data*) }
|
.rela.data : { *(.rela.data) *(.rela.data*) }
|
||||||
_data_size = . - _etext;
|
|
||||||
|
|
||||||
. = ALIGN(4096);
|
. = ALIGN(4096);
|
||||||
.dynsym : { *(.dynsym) }
|
.dynsym : { *(.dynsym) }
|
||||||
|
|
|
||||||
|
|
@ -48,12 +48,12 @@ static int do_play(struct cmd_tbl *cmdtp, int flag, int argc,
|
||||||
++argv;
|
++argv;
|
||||||
while (argc || first) {
|
while (argc || first) {
|
||||||
first = false;
|
first = false;
|
||||||
if (argc && *argv[0] != '-') {
|
if (argc) {
|
||||||
msec = dectoul(argv[0], NULL);
|
msec = dectoul(argv[0], NULL);
|
||||||
--argc;
|
--argc;
|
||||||
++argv;
|
++argv;
|
||||||
}
|
}
|
||||||
if (argc && *argv[0] != '-') {
|
if (argc) {
|
||||||
freq = dectoul(argv[0], NULL);
|
freq = dectoul(argv[0], NULL);
|
||||||
--argc;
|
--argc;
|
||||||
++argv;
|
++argv;
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,90 @@
|
||||||
|
.. SPDX-License-Identifier: GPL-2.0+:
|
||||||
|
|
||||||
|
Building documentation
|
||||||
|
======================
|
||||||
|
|
||||||
|
The U-Boot documentation is based on the Sphinx documentation generator.
|
||||||
|
|
||||||
|
HTML documentation
|
||||||
|
------------------
|
||||||
|
|
||||||
|
The *htmldocs* target is used to build the HTML documentation. It uses the
|
||||||
|
`Read the Docs Sphinx theme <https://sphinx-rtd-theme.readthedocs.io/en/stable/>`_.
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
# Create Python environment 'myenv'
|
||||||
|
python3 -m venv myenv
|
||||||
|
# Activate the Python environment
|
||||||
|
. myenv/bin/activate
|
||||||
|
# Install build requirements
|
||||||
|
python3 -m pip install -r doc/sphinx/requirements.txt
|
||||||
|
# Build the documentation
|
||||||
|
make htmldocs
|
||||||
|
# Deactivate the Python environment
|
||||||
|
deactivate
|
||||||
|
# Display the documentation in a graphical web browser
|
||||||
|
x-www-browser doc/output/index.html
|
||||||
|
|
||||||
|
Infodoc documentation
|
||||||
|
---------------------
|
||||||
|
|
||||||
|
The *infodocs* target builds both a texinfo and an info file:
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
# Create Python environment 'myenv'
|
||||||
|
python3 -m venv myenv
|
||||||
|
# Activate the Python environment
|
||||||
|
. myenv/bin/activate
|
||||||
|
# Install build requirements
|
||||||
|
python3 -m pip install -r doc/sphinx/requirements.txt
|
||||||
|
# Build the documentation
|
||||||
|
make infodocs
|
||||||
|
# Deactivate the Python environment
|
||||||
|
deactivate
|
||||||
|
# Display the documentation
|
||||||
|
info doc/output/texinfo/u-boot.info
|
||||||
|
|
||||||
|
PDF documentation
|
||||||
|
-----------------
|
||||||
|
|
||||||
|
The *pdfdocs* target is meant to be used to build PDF documenation.
|
||||||
|
As v2023.01 it fails with 'LaTeX Error: Too deeply nested'.
|
||||||
|
|
||||||
|
We can use texi2pdf instead:
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
# Create Python environment 'myenv'
|
||||||
|
python3 -m venv myenv
|
||||||
|
# Activate the Python environment
|
||||||
|
. myenv/bin/activate
|
||||||
|
# Install build requirements
|
||||||
|
python3 -m pip install -r doc/sphinx/requirements.txt
|
||||||
|
# Build the documentation
|
||||||
|
make texinfodocs
|
||||||
|
# Deactivate the Python environment
|
||||||
|
deactivate
|
||||||
|
# Convert to PDF
|
||||||
|
texi2pdf doc/output/texinfo/u-boot.texi
|
||||||
|
|
||||||
|
Texinfo documentation
|
||||||
|
---------------------
|
||||||
|
|
||||||
|
To build only the texinfo documentation the *texinfodocs* target is used:
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
# Create Python environment 'myenv'
|
||||||
|
python3 -m venv myenv
|
||||||
|
# Activate the Python environment
|
||||||
|
. myenv/bin/activate
|
||||||
|
# Install build requirements
|
||||||
|
python3 -m pip install -r doc/sphinx/requirements.txt
|
||||||
|
# Build the documentation
|
||||||
|
make texinfodocs
|
||||||
|
# Deactivate the Python environment
|
||||||
|
deactivate
|
||||||
|
|
||||||
|
The output is in file *doc/output/texinfo/u-boot.texi*.
|
||||||
|
|
@ -12,3 +12,4 @@ Build U-Boot
|
||||||
docker
|
docker
|
||||||
tools
|
tools
|
||||||
buildman
|
buildman
|
||||||
|
documentation
|
||||||
|
|
|
||||||
|
|
@ -51,6 +51,19 @@
|
||||||
#define IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER 12
|
#define IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER 12
|
||||||
#define IMAGE_SUBSYSTEM_EFI_ROM 13
|
#define IMAGE_SUBSYSTEM_EFI_ROM 13
|
||||||
|
|
||||||
|
/* Section flags */
|
||||||
|
#define IMAGE_SCN_CNT_CODE 0x00000020
|
||||||
|
#define IMAGE_SCN_CNT_INITIALIZED_DATA 0x00000040
|
||||||
|
#define IMAGE_SCN_CNT_UNINITIALIZED_ DATA 0x00000080
|
||||||
|
#define IMAGE_SCN_LNK_NRELOC_OVFL 0x01000000
|
||||||
|
#define IMAGE_SCN_MEM_DISCARDABLE 0x02000000
|
||||||
|
#define IMAGE_SCN_MEM_NOT_CACHED 0x04000000
|
||||||
|
#define IMAGE_SCN_MEM_NOT_PAGED 0x08000000
|
||||||
|
#define IMAGE_SCN_MEM_SHARED 0x10000000
|
||||||
|
#define IMAGE_SCN_MEM_EXECUTE 0x20000000
|
||||||
|
#define IMAGE_SCN_MEM_READ 0x40000000
|
||||||
|
#define IMAGE_SCN_MEM_WRITE 0x80000000
|
||||||
|
|
||||||
#define LINUX_ARM64_MAGIC 0x644d5241
|
#define LINUX_ARM64_MAGIC 0x644d5241
|
||||||
|
|
||||||
#endif /* _ASM_PE_H */
|
#endif /* _ASM_PE_H */
|
||||||
|
|
|
||||||
|
|
@ -173,6 +173,19 @@ s32 utf_to_lower(const s32 code);
|
||||||
*/
|
*/
|
||||||
s32 utf_to_upper(const s32 code);
|
s32 utf_to_upper(const s32 code);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* u16_strcasecmp() - compare two u16 strings case insensitively
|
||||||
|
*
|
||||||
|
* @s1: first string to compare
|
||||||
|
* @s2: second string to compare
|
||||||
|
* @n: maximum number of u16 to compare
|
||||||
|
* Return: 0 if the first n u16 are the same in s1 and s2
|
||||||
|
* < 0 if the first different u16 in s1 is less than the
|
||||||
|
* corresponding u16 in s2
|
||||||
|
* > 0 if the first different u16 in s1 is greater than the
|
||||||
|
*/
|
||||||
|
int u16_strcasecmp(const u16 *s1, const u16 *s2);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* u16_strncmp() - compare two u16 string
|
* u16_strncmp() - compare two u16 string
|
||||||
*
|
*
|
||||||
|
|
|
||||||
|
|
@ -226,7 +226,7 @@ int env_complete(char *var, int maxv, char *cmdv[], int maxsz, char *buf,
|
||||||
*
|
*
|
||||||
* @name: Environment variable to get (e.g. "ethaddr")
|
* @name: Environment variable to get (e.g. "ethaddr")
|
||||||
* @enetaddr: Place to put MAC address (6 bytes)
|
* @enetaddr: Place to put MAC address (6 bytes)
|
||||||
* Return: 0 if OK, 1 on error
|
* Return: 1 if OK, 0 on error
|
||||||
*/
|
*/
|
||||||
int eth_env_get_enetaddr(const char *name, uint8_t *enetaddr);
|
int eth_env_get_enetaddr(const char *name, uint8_t *enetaddr);
|
||||||
|
|
||||||
|
|
@ -235,7 +235,7 @@ int eth_env_get_enetaddr(const char *name, uint8_t *enetaddr);
|
||||||
*
|
*
|
||||||
* @name: Environment variable to set (e.g. "ethaddr")
|
* @name: Environment variable to set (e.g. "ethaddr")
|
||||||
* @enetaddr: Pointer to MAC address to put into the variable (6 bytes)
|
* @enetaddr: Pointer to MAC address to put into the variable (6 bytes)
|
||||||
* Return: 0 if OK, 1 on error
|
* Return: 0 if OK, non-zero otherwise
|
||||||
*/
|
*/
|
||||||
int eth_env_set_enetaddr(const char *name, const uint8_t *enetaddr);
|
int eth_env_set_enetaddr(const char *name, const uint8_t *enetaddr);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -350,6 +350,32 @@ s32 utf_to_upper(const s32 code)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* u16_strcasecmp() - compare two u16 strings case insensitively
|
||||||
|
*
|
||||||
|
* @s1: first string to compare
|
||||||
|
* @s2: second string to compare
|
||||||
|
* @n: maximum number of u16 to compare
|
||||||
|
* Return: 0 if the first n u16 are the same in s1 and s2
|
||||||
|
* < 0 if the first different u16 in s1 is less than the
|
||||||
|
* corresponding u16 in s2
|
||||||
|
* > 0 if the first different u16 in s1 is greater than the
|
||||||
|
*/
|
||||||
|
int u16_strcasecmp(const u16 *s1, const u16 *s2)
|
||||||
|
{
|
||||||
|
int ret = 0;
|
||||||
|
s32 c1, c2;
|
||||||
|
|
||||||
|
for (;;) {
|
||||||
|
c1 = utf_to_upper(utf16_get(&s1));
|
||||||
|
c2 = utf_to_upper(utf16_get(&s2));
|
||||||
|
ret = c1 - c2;
|
||||||
|
if (ret || !c1 || c1 == -1 || c2 == -1)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* u16_strncmp() - compare two u16 string
|
* u16_strncmp() - compare two u16 string
|
||||||
*
|
*
|
||||||
|
|
|
||||||
|
|
@ -3956,8 +3956,11 @@ efi_status_t efi_initialize_system_table(void)
|
||||||
* These entries will be set to NULL in ExitBootServices(). To avoid
|
* These entries will be set to NULL in ExitBootServices(). To avoid
|
||||||
* relocation in SetVirtualAddressMap(), set them dynamically.
|
* relocation in SetVirtualAddressMap(), set them dynamically.
|
||||||
*/
|
*/
|
||||||
|
systab.con_in_handle = efi_root;
|
||||||
systab.con_in = &efi_con_in;
|
systab.con_in = &efi_con_in;
|
||||||
|
systab.con_out_handle = efi_root;
|
||||||
systab.con_out = &efi_con_out;
|
systab.con_out = &efi_con_out;
|
||||||
|
systab.stderr_handle = efi_root;
|
||||||
systab.std_err = &efi_con_out;
|
systab.std_err = &efi_con_out;
|
||||||
systab.boottime = &efi_boot_services;
|
systab.boottime = &efi_boot_services;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1108,10 +1108,13 @@ static efi_status_t efi_capsule_scan_dir(u16 ***files, unsigned int *num)
|
||||||
/* ignore an error */
|
/* ignore an error */
|
||||||
EFI_CALL((*dirh->close)(dirh));
|
EFI_CALL((*dirh->close)(dirh));
|
||||||
|
|
||||||
/* in ascii order */
|
/*
|
||||||
/* FIXME: u16 version of strcasecmp */
|
* Capsule files are applied in case insensitive alphabetic order
|
||||||
|
*
|
||||||
|
* TODO: special handling of rightmost period
|
||||||
|
*/
|
||||||
qsort(tmp_files, count, sizeof(*tmp_files),
|
qsort(tmp_files, count, sizeof(*tmp_files),
|
||||||
(int (*)(const void *, const void *))strcasecmp);
|
(int (*)(const void *, const void *))u16_strcasecmp);
|
||||||
*files = tmp_files;
|
*files = tmp_files;
|
||||||
*num = count;
|
*num = count;
|
||||||
ret = EFI_SUCCESS;
|
ret = EFI_SUCCESS;
|
||||||
|
|
|
||||||
|
|
@ -624,6 +624,31 @@ static int unicode_test_utf_to_upper(struct unit_test_state *uts)
|
||||||
}
|
}
|
||||||
UNICODE_TEST(unicode_test_utf_to_upper);
|
UNICODE_TEST(unicode_test_utf_to_upper);
|
||||||
|
|
||||||
|
static int unicode_test_u16_strcasecmp(struct unit_test_state *uts)
|
||||||
|
{
|
||||||
|
ut_assert(u16_strcasecmp(u"abcd", u"abcd") == 0);
|
||||||
|
ut_assert(u16_strcasecmp(u"aBcd", u"abcd") == 0);
|
||||||
|
ut_assert(u16_strcasecmp(u"abcd", u"abCd") == 0);
|
||||||
|
ut_assert(u16_strcasecmp(u"abcdE", u"abcd") > 0);
|
||||||
|
ut_assert(u16_strcasecmp(u"abcd", u"abcdE") < 0);
|
||||||
|
ut_assert(u16_strcasecmp(u"abcE", u"abcd") > 0);
|
||||||
|
ut_assert(u16_strcasecmp(u"abcd", u"abcE") < 0);
|
||||||
|
ut_assert(u16_strcasecmp(u"abcd", u"abcd") == 0);
|
||||||
|
ut_assert(u16_strcasecmp(u"abcd", u"abcd") == 0);
|
||||||
|
if (CONFIG_IS_ENABLED(EFI_UNICODE_CAPITALIZATION)) {
|
||||||
|
/* Cyrillic letters */
|
||||||
|
ut_assert(u16_strcasecmp(u"\x043a\x043d\x0438\x0433\x0430",
|
||||||
|
u"\x041a\x041d\x0418\x0413\x0410") == 0);
|
||||||
|
ut_assert(u16_strcasecmp(u"\x043a\x043d\x0438\x0433\x0430",
|
||||||
|
u"\x041a\x041d\x0418\x0413\x0411") < 0);
|
||||||
|
ut_assert(u16_strcasecmp(u"\x043a\x043d\x0438\x0433\x0431",
|
||||||
|
u"\x041a\x041d\x0418\x0413\x0410") > 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
UNICODE_TEST(unicode_test_u16_strcasecmp);
|
||||||
|
|
||||||
static int unicode_test_u16_strncmp(struct unit_test_state *uts)
|
static int unicode_test_u16_strncmp(struct unit_test_state *uts)
|
||||||
{
|
{
|
||||||
ut_assert(u16_strncmp(u"abc", u"abc", 3) == 0);
|
ut_assert(u16_strncmp(u"abc", u"abc", 3) == 0);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue