Skip to content

Commit

Permalink
arm64: Add hwcaps for crypto and CRC32 extensions.
Browse files Browse the repository at this point in the history
Advertise the optional cryptographic and CRC32 instructions to
user space where present. Several hwcap bits [3-7] are allocated.

Signed-off-by: Steve Capper <[email protected]>
[bit 2 is taken now so use bits 3-7 instead]
Signed-off-by: Ard Biesheuvel <[email protected]>
Signed-off-by: Catalin Marinas <[email protected]>
  • Loading branch information
stevecapperlinaro authored and ctmarinas committed Dec 19, 2013
1 parent 148eb0a commit 4bff28c
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 1 deletion.
6 changes: 5 additions & 1 deletion arch/arm64/include/uapi/asm/hwcap.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,10 @@
#define HWCAP_FP (1 << 0)
#define HWCAP_ASIMD (1 << 1)
#define HWCAP_EVTSTRM (1 << 2)

#define HWCAP_AES (1 << 3)
#define HWCAP_PMULL (1 << 4)
#define HWCAP_SHA1 (1 << 5)
#define HWCAP_SHA2 (1 << 6)
#define HWCAP_CRC32 (1 << 7)

#endif /* _UAPI__ASM_HWCAP_H */
37 changes: 37 additions & 0 deletions arch/arm64/kernel/setup.c
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,7 @@ bool arch_match_cpu_phys_id(int cpu, u64 phys_id)
static void __init setup_processor(void)
{
struct cpu_info *cpu_info;
u64 features, block;

cpu_info = lookup_processor_type(read_cpuid_id());
if (!cpu_info) {
Expand All @@ -141,6 +142,37 @@ static void __init setup_processor(void)

sprintf(init_utsname()->machine, ELF_PLATFORM);
elf_hwcap = 0;

/*
* ID_AA64ISAR0_EL1 contains 4-bit wide signed feature blocks.
* The blocks we test below represent incremental functionality
* for non-negative values. Negative values are reserved.
*/
features = read_cpuid(ID_AA64ISAR0_EL1);
block = (features >> 4) & 0xf;
if (!(block & 0x8)) {
switch (block) {
default:
case 2:
elf_hwcap |= HWCAP_PMULL;
case 1:
elf_hwcap |= HWCAP_AES;
case 0:
break;
}
}

block = (features >> 8) & 0xf;
if (block && !(block & 0x8))
elf_hwcap |= HWCAP_SHA1;

block = (features >> 12) & 0xf;
if (block && !(block & 0x8))
elf_hwcap |= HWCAP_SHA2;

block = (features >> 16) & 0xf;
if (block && !(block & 0x8))
elf_hwcap |= HWCAP_CRC32;
}

static void __init setup_machine_fdt(phys_addr_t dt_phys)
Expand Down Expand Up @@ -280,6 +312,11 @@ static const char *hwcap_str[] = {
"fp",
"asimd",
"evtstrm",
"aes",
"pmull",
"sha1",
"sha2",
"crc32",
NULL
};

Expand Down

0 comments on commit 4bff28c

Please sign in to comment.