Skip to content

Commit

Permalink
efi: move utf16 string functions to efi.h
Browse files Browse the repository at this point in the history
There are currently two implementations of the utf16 string functions.
Somewhat confusingly, they've got different names.

Centralise the functions in efi.h.

Reviewed-by: Tom Gundersen <teg@jklm.no>
Tested-by: Tom Gundersen <teg@jklm.no>
Reviewed-by: Mike Waychison <mikew@google.com>
Signed-off-by: Matt Fleming <matt.fleming@intel.com>
  • Loading branch information
Matt Fleming committed Apr 17, 2013
1 parent 07961ac commit d5abc7c
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 32 deletions.
17 changes: 0 additions & 17 deletions drivers/firmware/efivars.c
Original file line number Diff line number Diff line change
Expand Up @@ -172,23 +172,6 @@ static void efivar_update_sysfs_entries(struct work_struct *);
static DECLARE_WORK(efivar_work, efivar_update_sysfs_entries);
static bool efivar_wq_enabled = true;

/* Return the number of unicode characters in data */
static unsigned long
utf16_strnlen(efi_char16_t *s, size_t maxlength)
{
unsigned long length = 0;

while (*s++ != 0 && length < maxlength)
length++;
return length;
}

static inline unsigned long
utf16_strlen(efi_char16_t *s)
{
return utf16_strnlen(s, ~0UL);
}

/*
* Return the number of bytes is the length of this string
* Note: this is NOT the same as the number of unicode characters
Expand Down
19 changes: 4 additions & 15 deletions drivers/firmware/google/gsmi.c
Original file line number Diff line number Diff line change
Expand Up @@ -288,17 +288,6 @@ static int gsmi_exec(u8 func, u8 sub)
return rc;
}

/* Return the number of unicode characters in data */
static size_t
utf16_strlen(efi_char16_t *data, unsigned long maxlength)
{
unsigned long length = 0;

while (*data++ != 0 && length < maxlength)
length++;
return length;
}

static efi_status_t gsmi_get_variable(efi_char16_t *name,
efi_guid_t *vendor, u32 *attr,
unsigned long *data_size,
Expand All @@ -311,7 +300,7 @@ static efi_status_t gsmi_get_variable(efi_char16_t *name,
};
efi_status_t ret = EFI_SUCCESS;
unsigned long flags;
size_t name_len = utf16_strlen(name, GSMI_BUF_SIZE / 2);
size_t name_len = utf16_strnlen(name, GSMI_BUF_SIZE / 2);
int rc;

if (name_len >= GSMI_BUF_SIZE / 2)
Expand Down Expand Up @@ -380,7 +369,7 @@ static efi_status_t gsmi_get_next_variable(unsigned long *name_size,
return EFI_BAD_BUFFER_SIZE;

/* Let's make sure the thing is at least null-terminated */
if (utf16_strlen(name, GSMI_BUF_SIZE / 2) == GSMI_BUF_SIZE / 2)
if (utf16_strnlen(name, GSMI_BUF_SIZE / 2) == GSMI_BUF_SIZE / 2)
return EFI_INVALID_PARAMETER;

spin_lock_irqsave(&gsmi_dev.lock, flags);
Expand Down Expand Up @@ -408,7 +397,7 @@ static efi_status_t gsmi_get_next_variable(unsigned long *name_size,

/* Copy the name back */
memcpy(name, gsmi_dev.name_buf->start, GSMI_BUF_SIZE);
*name_size = utf16_strlen(name, GSMI_BUF_SIZE / 2) * 2;
*name_size = utf16_strnlen(name, GSMI_BUF_SIZE / 2) * 2;

/* copy guid to return buffer */
memcpy(vendor, &param.guid, sizeof(param.guid));
Expand All @@ -434,7 +423,7 @@ static efi_status_t gsmi_set_variable(efi_char16_t *name,
EFI_VARIABLE_BOOTSERVICE_ACCESS |
EFI_VARIABLE_RUNTIME_ACCESS,
};
size_t name_len = utf16_strlen(name, GSMI_BUF_SIZE / 2);
size_t name_len = utf16_strnlen(name, GSMI_BUF_SIZE / 2);
efi_status_t ret = EFI_SUCCESS;
int rc;
unsigned long flags;
Expand Down
17 changes: 17 additions & 0 deletions include/linux/efi.h
Original file line number Diff line number Diff line change
Expand Up @@ -719,6 +719,23 @@ static inline void memrange_efi_to_native(u64 *addr, u64 *npages)
*addr &= PAGE_MASK;
}

/* Return the number of unicode characters in data */
static inline unsigned long
utf16_strnlen(efi_char16_t *s, size_t maxlength)
{
unsigned long length = 0;

while (*s++ != 0 && length < maxlength)
length++;
return length;
}

static inline unsigned long
utf16_strlen(efi_char16_t *s)
{
return utf16_strnlen(s, ~0UL);
}

#if defined(CONFIG_EFI_VARS) || defined(CONFIG_EFI_VARS_MODULE)
/*
* EFI Variable support.
Expand Down

0 comments on commit d5abc7c

Please sign in to comment.