aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSuzuki K. Poulose <suzuki.poulose@arm.com>2015-11-18 12:08:56 -0500
committerCatalin Marinas <catalin.marinas@arm.com>2015-11-26 13:02:42 -0500
commitd21182718400f51f0729ae8268d94bd820ec8b71 (patch)
tree39225ba3b0e4be910d3bedef54a8236d0f0bd02e
parent667c27597ca823f20c524bbd486c6709f905673b (diff)
arm64: cpufeature: Add helpers for extracting unsigned values
The cpuid_feature_extract_field() extracts the feature value as a signed integer. This could be problematic for features whose values are unsigned. e.g, ID_AA64DFR0_EL1:BRPs. Add an unsigned variant for the unsigned fields. Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org> Reported-by: AKASHI Takahiro <takahiro.akashi@linaro.org> Signed-off-by: Suzuki K. Poulose <suzuki.poulose@arm.com> Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
-rw-r--r--arch/arm64/include/asm/cpufeature.h12
1 files changed, 12 insertions, 0 deletions
diff --git a/arch/arm64/include/asm/cpufeature.h b/arch/arm64/include/asm/cpufeature.h
index 11d5bb0fdd54..7a161027ee12 100644
--- a/arch/arm64/include/asm/cpufeature.h
+++ b/arch/arm64/include/asm/cpufeature.h
@@ -123,6 +123,18 @@ cpuid_feature_extract_field(u64 features, int field)
123 return cpuid_feature_extract_field_width(features, field, 4); 123 return cpuid_feature_extract_field_width(features, field, 4);
124} 124}
125 125
126static inline unsigned int __attribute_const__
127cpuid_feature_extract_unsigned_field_width(u64 features, int field, int width)
128{
129 return (u64)(features << (64 - width - field)) >> (64 - width);
130}
131
132static inline unsigned int __attribute_const__
133cpuid_feature_extract_unsigned_field(u64 features, int field)
134{
135 return cpuid_feature_extract_unsigned_field_width(features, field, 4);
136}
137
126static inline u64 arm64_ftr_mask(struct arm64_ftr_bits *ftrp) 138static inline u64 arm64_ftr_mask(struct arm64_ftr_bits *ftrp)
127{ 139{
128 return (u64)GENMASK(ftrp->shift + ftrp->width - 1, ftrp->shift); 140 return (u64)GENMASK(ftrp->shift + ftrp->width - 1, ftrp->shift);