Commit 36a23663 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'arm64-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux

Pull arm64 fixes from Catalin Marinas:

 - SME save/restore for EFI fix - incorrect logic for detecting the need
   for saving/restoring the FFR state.

 - SME fix for a CPU ID field value.

 - Sysreg generation awk script fix (comparison operator).

 - Some typos in documentation or comments and silence a sparse warning
   (missing prototype).

* tag 'arm64-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux:
  arm64: Add kasan_hw_tags_enable() prototype to silence sparse
  arm64/sme: Fix EFI save/restore
  arm64/fpsimd: Fix typo in comment
  arm64/sysreg: Fix typo in Enum element regex
  arm64/sme: Fix SVE/SME typo in ABI documentation
  arm64/sme: Fix tests for 0b1111 value ID registers
parents ad6e0764 78cdaf3f
...@@ -371,7 +371,7 @@ The regset data starts with struct user_za_header, containing: ...@@ -371,7 +371,7 @@ The regset data starts with struct user_za_header, containing:
Appendix A. SME programmer's model (informative) Appendix A. SME programmer's model (informative)
================================================= =================================================
This section provides a minimal description of the additions made by SVE to the This section provides a minimal description of the additions made by SME to the
ARMv8-A programmer's model that are relevant to this document. ARMv8-A programmer's model that are relevant to this document.
Note: This section is for information only and not intended to be complete or Note: This section is for information only and not intended to be complete or
......
...@@ -843,9 +843,9 @@ ...@@ -843,9 +843,9 @@
#define ID_AA64SMFR0_F32F32_SHIFT 32 #define ID_AA64SMFR0_F32F32_SHIFT 32
#define ID_AA64SMFR0_FA64 0x1 #define ID_AA64SMFR0_FA64 0x1
#define ID_AA64SMFR0_I16I64 0x4 #define ID_AA64SMFR0_I16I64 0xf
#define ID_AA64SMFR0_F64F64 0x1 #define ID_AA64SMFR0_F64F64 0x1
#define ID_AA64SMFR0_I8I32 0x4 #define ID_AA64SMFR0_I8I32 0xf
#define ID_AA64SMFR0_F16F32 0x1 #define ID_AA64SMFR0_F16F32 0x1
#define ID_AA64SMFR0_B16F32 0x1 #define ID_AA64SMFR0_B16F32 0x1
#define ID_AA64SMFR0_F32F32 0x1 #define ID_AA64SMFR0_F32F32 0x1
......
...@@ -331,7 +331,7 @@ void task_set_vl_onexec(struct task_struct *task, enum vec_type type, ...@@ -331,7 +331,7 @@ void task_set_vl_onexec(struct task_struct *task, enum vec_type type,
* trapping to the kernel. * trapping to the kernel.
* *
* When stored, Z0-Z31 (incorporating Vn in bits[127:0] or the * When stored, Z0-Z31 (incorporating Vn in bits[127:0] or the
* corresponding Zn), P0-P15 and FFR are encoded in in * corresponding Zn), P0-P15 and FFR are encoded in
* task->thread.sve_state, formatted appropriately for vector * task->thread.sve_state, formatted appropriately for vector
* length task->thread.sve_vl or, if SVCR.SM is set, * length task->thread.sve_vl or, if SVCR.SM is set,
* task->thread.sme_vl. * task->thread.sme_vl.
...@@ -1916,10 +1916,15 @@ void __efi_fpsimd_begin(void) ...@@ -1916,10 +1916,15 @@ void __efi_fpsimd_begin(void)
if (system_supports_sme()) { if (system_supports_sme()) {
svcr = read_sysreg_s(SYS_SVCR); svcr = read_sysreg_s(SYS_SVCR);
if (!system_supports_fa64()) __this_cpu_write(efi_sm_state,
ffr = svcr & SVCR_SM_MASK; svcr & SVCR_SM_MASK);
__this_cpu_write(efi_sm_state, ffr); /*
* Unless we have FA64 FFR does not
* exist in streaming mode.
*/
if (!system_supports_fa64())
ffr = !(svcr & SVCR_SM_MASK);
} }
sve_save_state(sve_state + sve_ffr_offset(sve_max_vl()), sve_save_state(sve_state + sve_ffr_offset(sve_max_vl()),
...@@ -1964,8 +1969,13 @@ void __efi_fpsimd_end(void) ...@@ -1964,8 +1969,13 @@ void __efi_fpsimd_end(void)
sysreg_clear_set_s(SYS_SVCR, sysreg_clear_set_s(SYS_SVCR,
0, 0,
SVCR_SM_MASK); SVCR_SM_MASK);
/*
* Unless we have FA64 FFR does not
* exist in streaming mode.
*/
if (!system_supports_fa64()) if (!system_supports_fa64())
ffr = efi_sm_state; ffr = false;
} }
} }
......
...@@ -244,6 +244,11 @@ static void mte_update_gcr_excl(struct task_struct *task) ...@@ -244,6 +244,11 @@ static void mte_update_gcr_excl(struct task_struct *task)
SYS_GCR_EL1); SYS_GCR_EL1);
} }
#ifdef CONFIG_KASAN_HW_TAGS
/* Only called from assembly, silence sparse */
void __init kasan_hw_tags_enable(struct alt_instr *alt, __le32 *origptr,
__le32 *updptr, int nr_inst);
void __init kasan_hw_tags_enable(struct alt_instr *alt, __le32 *origptr, void __init kasan_hw_tags_enable(struct alt_instr *alt, __le32 *origptr,
__le32 *updptr, int nr_inst) __le32 *updptr, int nr_inst)
{ {
...@@ -252,6 +257,7 @@ void __init kasan_hw_tags_enable(struct alt_instr *alt, __le32 *origptr, ...@@ -252,6 +257,7 @@ void __init kasan_hw_tags_enable(struct alt_instr *alt, __le32 *origptr,
if (kasan_hw_tags_enabled()) if (kasan_hw_tags_enabled())
*updptr = cpu_to_le32(aarch64_insn_gen_nop()); *updptr = cpu_to_le32(aarch64_insn_gen_nop());
} }
#endif
void mte_thread_init_user(void) void mte_thread_init_user(void)
{ {
......
...@@ -253,7 +253,7 @@ END { ...@@ -253,7 +253,7 @@ END {
next next
} }
/0b[01]+/ && block = "Enum" { /0b[01]+/ && block == "Enum" {
expect_fields(2) expect_fields(2)
val = $1 val = $1
name = $2 name = $2
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment