Commit 60b5f529 authored by Jithu Joseph's avatar Jithu Joseph Committed by Aichun Shi
Browse files

platform/x86/intel/ifs: Disable irq during one load stage

mainline inclusion
from mainline-v6.10-rc1
commit bd25a3f5ed51540d873c6c581f4dab08aedc73ea
category: feature
bugzilla: https://gitee.com/openeuler/intel-kernel/issues/IASVRQ
CVE: N/A
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=bd25a3f5ed51540d873c6c581f4dab08aedc73ea



-------------------------------------

One of the stages in IFS image loading process involves loading individual
chunks (test patterns) from test image file to secure memory.

Driver issues a WRMSR(MSR_AUTHENTICATE_AND_COPY_CHUNK) operation to do
this. This operation can take up to 5 msec, and if an interrupt occurs
in between, the AUTH_AND_COPY_CHUNK u-code implementation aborts the
operation.

Interrupt sources such as NMI or SMI are handled by retrying. Regular
interrupts may occur frequently enough to prevent this operation from ever
completing. Disable irq on local cpu around the aforementioned WRMSR to
allow the operation to complete.

Intel-SIG: commit bd25a3f5ed51 platform/x86/intel/ifs: Disable irq during one load stage
Backport to support IFS(In Field Scan) SBAF(Structural Based Functional Test at Field)

Signed-off-by: default avatarJithu Joseph <jithu.joseph@intel.com>
Reviewed-by: default avatarTony Luck <tony.luck@intel.com>
Reviewed-by: default avatarAshok Raj <ashok.raj@intel.com>
Reviewed-by: default avatarKuppuswamy Sathyanarayanan <sathyanarayanan.kuppuswamy@linux.intel.com>
Link: https://lore.kernel.org/r/20240412172349.544064-4-jithu.joseph@intel.com


Reviewed-by: default avatarHans de Goede <hdegoede@redhat.com>
Signed-off-by: default avatarHans de Goede <hdegoede@redhat.com>
[ Aichun Shi: amend commit log ]
Signed-off-by: default avatarAichun Shi <aichun.shi@intel.com>
parent 5aba1a89
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -233,7 +233,9 @@ static int copy_hashes_authenticate_chunks_gen2(struct device *dev)
		chunk_table[0] = starting_chunk_nr + i;
		chunk_table[1] = linear_addr;
		do {
			local_irq_disable();
			wrmsrl(MSR_AUTHENTICATE_AND_COPY_CHUNK, (u64)chunk_table);
			local_irq_enable();
			rdmsrl(MSR_CHUNKS_AUTHENTICATION_STATUS, chunk_status.data);
			err_code = chunk_status.error_code;
		} while (err_code == AUTH_INTERRUPTED_ERROR && --retry_count);