diff options
Diffstat (limited to 'arch')
| -rw-r--r-- | arch/arm64/net/bpf_jit_comp.c | 5 | ||||
| -rw-r--r-- | arch/s390/Kconfig | 1 | ||||
| -rw-r--r-- | arch/s390/configs/debug_defconfig | 14 | ||||
| -rw-r--r-- | arch/s390/configs/defconfig | 14 | ||||
| -rw-r--r-- | arch/s390/configs/zfcpdump_defconfig | 1 | ||||
| -rw-r--r-- | arch/s390/crypto/phmac_s390.c | 52 | ||||
| -rw-r--r-- | arch/s390/include/asm/pci.h | 1 | ||||
| -rw-r--r-- | arch/s390/mm/dump_pagetables.c | 21 | ||||
| -rw-r--r-- | arch/s390/pci/pci_event.c | 4 | ||||
| -rw-r--r-- | arch/s390/pci/pci_irq.c | 9 | ||||
| -rw-r--r-- | arch/x86/Makefile | 2 | ||||
| -rw-r--r-- | arch/x86/events/intel/core.c | 1 | ||||
| -rw-r--r-- | arch/x86/events/intel/ds.c | 3 | ||||
| -rw-r--r-- | arch/x86/events/intel/uncore.c | 1 | ||||
| -rw-r--r-- | arch/x86/include/asm/intel-family.h | 6 | ||||
| -rw-r--r-- | arch/x86/include/asm/page_64.h | 3 | ||||
| -rw-r--r-- | arch/x86/kernel/cpu/amd.c | 12 | ||||
| -rw-r--r-- | arch/x86/kernel/cpu/microcode/amd.c | 20 | ||||
| -rw-r--r-- | arch/x86/kernel/fpu/core.c | 3 | ||||
| -rw-r--r-- | arch/x86/net/bpf_jit_comp.c | 2 | 
20 files changed, 111 insertions, 64 deletions
diff --git a/arch/arm64/net/bpf_jit_comp.c b/arch/arm64/net/bpf_jit_comp.c index ab83089c3d8f..0c9a50a1e73e 100644 --- a/arch/arm64/net/bpf_jit_comp.c +++ b/arch/arm64/net/bpf_jit_comp.c @@ -1213,6 +1213,7 @@ static int build_insn(const struct bpf_insn *insn, struct jit_ctx *ctx,  	u8 src = bpf2a64[insn->src_reg];  	const u8 tmp = bpf2a64[TMP_REG_1];  	const u8 tmp2 = bpf2a64[TMP_REG_2]; +	const u8 tmp3 = bpf2a64[TMP_REG_3];  	const u8 fp = bpf2a64[BPF_REG_FP];  	const u8 arena_vm_base = bpf2a64[ARENA_VM_START];  	const u8 priv_sp = bpf2a64[PRIVATE_SP]; @@ -1757,8 +1758,8 @@ emit_cond_jmp:  	case BPF_ST | BPF_PROBE_MEM32 | BPF_W:  	case BPF_ST | BPF_PROBE_MEM32 | BPF_DW:  		if (BPF_MODE(insn->code) == BPF_PROBE_MEM32) { -			emit(A64_ADD(1, tmp2, dst, arena_vm_base), ctx); -			dst = tmp2; +			emit(A64_ADD(1, tmp3, dst, arena_vm_base), ctx); +			dst = tmp3;  		}  		if (dst == fp) {  			dst_adj = ctx->priv_sp_used ? priv_sp : A64_SP; diff --git a/arch/s390/Kconfig b/arch/s390/Kconfig index c4145672ca34..df22b10d9141 100644 --- a/arch/s390/Kconfig +++ b/arch/s390/Kconfig @@ -158,7 +158,6 @@ config S390  	select ARCH_WANT_IRQS_OFF_ACTIVATE_MM  	select ARCH_WANT_KERNEL_PMD_MKWRITE  	select ARCH_WANT_LD_ORPHAN_WARN -	select ARCH_WANT_OPTIMIZE_HUGETLB_VMEMMAP  	select ARCH_WANTS_THP_SWAP  	select BUILDTIME_TABLE_SORT  	select CLONE_BACKWARDS2 diff --git a/arch/s390/configs/debug_defconfig b/arch/s390/configs/debug_defconfig index b31c1df90257..8433f769f7e1 100644 --- a/arch/s390/configs/debug_defconfig +++ b/arch/s390/configs/debug_defconfig @@ -101,6 +101,7 @@ CONFIG_SLUB_STATS=y  CONFIG_MEMORY_HOTPLUG=y  CONFIG_MEMORY_HOTREMOVE=y  CONFIG_KSM=y +CONFIG_PERSISTENT_HUGE_ZERO_FOLIO=y  CONFIG_TRANSPARENT_HUGEPAGE=y  CONFIG_CMA_DEBUGFS=y  CONFIG_CMA_SYSFS=y @@ -123,12 +124,12 @@ CONFIG_TLS_DEVICE=y  CONFIG_TLS_TOE=y  CONFIG_XFRM_USER=m  CONFIG_NET_KEY=m -CONFIG_XDP_SOCKETS=y -CONFIG_XDP_SOCKETS_DIAG=m -CONFIG_DIBS=y -CONFIG_DIBS_LO=y  CONFIG_SMC=m  CONFIG_SMC_DIAG=m +CONFIG_DIBS=y +CONFIG_DIBS_LO=y +CONFIG_XDP_SOCKETS=y +CONFIG_XDP_SOCKETS_DIAG=m  CONFIG_INET=y  CONFIG_IP_MULTICAST=y  CONFIG_IP_ADVANCED_ROUTER=y @@ -472,6 +473,7 @@ CONFIG_SCSI_DH_EMC=m  CONFIG_SCSI_DH_ALUA=m  CONFIG_MD=y  CONFIG_BLK_DEV_MD=y +CONFIG_MD_LLBITMAP=y  # CONFIG_MD_BITMAP_FILE is not set  CONFIG_MD_LINEAR=m  CONFIG_MD_CLUSTER=m @@ -654,9 +656,12 @@ CONFIG_JFS_POSIX_ACL=y  CONFIG_JFS_SECURITY=y  CONFIG_JFS_STATISTICS=y  CONFIG_XFS_FS=y +CONFIG_XFS_SUPPORT_V4=y +CONFIG_XFS_SUPPORT_ASCII_CI=y  CONFIG_XFS_QUOTA=y  CONFIG_XFS_POSIX_ACL=y  CONFIG_XFS_RT=y +# CONFIG_XFS_ONLINE_SCRUB is not set  CONFIG_XFS_DEBUG=y  CONFIG_GFS2_FS=m  CONFIG_GFS2_FS_LOCKING_DLM=y @@ -666,7 +671,6 @@ CONFIG_BTRFS_FS_POSIX_ACL=y  CONFIG_BTRFS_DEBUG=y  CONFIG_BTRFS_ASSERT=y  CONFIG_NILFS2_FS=m -CONFIG_FS_DAX=y  CONFIG_EXPORTFS_BLOCK_OPS=y  CONFIG_FS_ENCRYPTION=y  CONFIG_FS_VERITY=y diff --git a/arch/s390/configs/defconfig b/arch/s390/configs/defconfig index 161dad7ef211..4414dabd04a6 100644 --- a/arch/s390/configs/defconfig +++ b/arch/s390/configs/defconfig @@ -94,6 +94,7 @@ CONFIG_SLAB_BUCKETS=y  CONFIG_MEMORY_HOTPLUG=y  CONFIG_MEMORY_HOTREMOVE=y  CONFIG_KSM=y +CONFIG_PERSISTENT_HUGE_ZERO_FOLIO=y  CONFIG_TRANSPARENT_HUGEPAGE=y  CONFIG_CMA_SYSFS=y  CONFIG_CMA_AREAS=7 @@ -114,12 +115,12 @@ CONFIG_TLS_DEVICE=y  CONFIG_TLS_TOE=y  CONFIG_XFRM_USER=m  CONFIG_NET_KEY=m -CONFIG_XDP_SOCKETS=y -CONFIG_XDP_SOCKETS_DIAG=m -CONFIG_DIBS=y -CONFIG_DIBS_LO=y  CONFIG_SMC=m  CONFIG_SMC_DIAG=m +CONFIG_DIBS=y +CONFIG_DIBS_LO=y +CONFIG_XDP_SOCKETS=y +CONFIG_XDP_SOCKETS_DIAG=m  CONFIG_INET=y  CONFIG_IP_MULTICAST=y  CONFIG_IP_ADVANCED_ROUTER=y @@ -462,6 +463,7 @@ CONFIG_SCSI_DH_EMC=m  CONFIG_SCSI_DH_ALUA=m  CONFIG_MD=y  CONFIG_BLK_DEV_MD=y +CONFIG_MD_LLBITMAP=y  # CONFIG_MD_BITMAP_FILE is not set  CONFIG_MD_LINEAR=m  CONFIG_MD_CLUSTER=m @@ -644,16 +646,18 @@ CONFIG_JFS_POSIX_ACL=y  CONFIG_JFS_SECURITY=y  CONFIG_JFS_STATISTICS=y  CONFIG_XFS_FS=y +CONFIG_XFS_SUPPORT_V4=y +CONFIG_XFS_SUPPORT_ASCII_CI=y  CONFIG_XFS_QUOTA=y  CONFIG_XFS_POSIX_ACL=y  CONFIG_XFS_RT=y +# CONFIG_XFS_ONLINE_SCRUB is not set  CONFIG_GFS2_FS=m  CONFIG_GFS2_FS_LOCKING_DLM=y  CONFIG_OCFS2_FS=m  CONFIG_BTRFS_FS=y  CONFIG_BTRFS_FS_POSIX_ACL=y  CONFIG_NILFS2_FS=m -CONFIG_FS_DAX=y  CONFIG_EXPORTFS_BLOCK_OPS=y  CONFIG_FS_ENCRYPTION=y  CONFIG_FS_VERITY=y diff --git a/arch/s390/configs/zfcpdump_defconfig b/arch/s390/configs/zfcpdump_defconfig index ed0b137353ad..b5478267d6a7 100644 --- a/arch/s390/configs/zfcpdump_defconfig +++ b/arch/s390/configs/zfcpdump_defconfig @@ -33,7 +33,6 @@ CONFIG_NET=y  CONFIG_DEVTMPFS=y  CONFIG_DEVTMPFS_SAFE=y  CONFIG_BLK_DEV_RAM=y -# CONFIG_DCSSBLK is not set  # CONFIG_DASD is not set  CONFIG_ENCLOSURE_SERVICES=y  CONFIG_SCSI=y diff --git a/arch/s390/crypto/phmac_s390.c b/arch/s390/crypto/phmac_s390.c index 7ecfdc4fba2d..89f3e6d8fd89 100644 --- a/arch/s390/crypto/phmac_s390.c +++ b/arch/s390/crypto/phmac_s390.c @@ -169,11 +169,18 @@ struct kmac_sha2_ctx {  	u64 buflen[2];  }; +enum async_op { +	OP_NOP = 0, +	OP_UPDATE, +	OP_FINAL, +	OP_FINUP, +}; +  /* phmac request context */  struct phmac_req_ctx {  	struct hash_walk_helper hwh;  	struct kmac_sha2_ctx kmac_ctx; -	bool final; +	enum async_op async_op;  };  /* @@ -610,6 +617,7 @@ static int phmac_update(struct ahash_request *req)  	 * using engine to serialize requests.  	 */  	if (rc == 0 || rc == -EKEYEXPIRED) { +		req_ctx->async_op = OP_UPDATE;  		atomic_inc(&tfm_ctx->via_engine_ctr);  		rc = crypto_transfer_hash_request_to_engine(phmac_crypto_engine, req);  		if (rc != -EINPROGRESS) @@ -647,8 +655,7 @@ static int phmac_final(struct ahash_request *req)  	 * using engine to serialize requests.  	 */  	if (rc == 0 || rc == -EKEYEXPIRED) { -		req->nbytes = 0; -		req_ctx->final = true; +		req_ctx->async_op = OP_FINAL;  		atomic_inc(&tfm_ctx->via_engine_ctr);  		rc = crypto_transfer_hash_request_to_engine(phmac_crypto_engine, req);  		if (rc != -EINPROGRESS) @@ -676,13 +683,16 @@ static int phmac_finup(struct ahash_request *req)  	if (rc)  		goto out; +	req_ctx->async_op = OP_FINUP; +  	/* Try synchronous operations if no active engine usage */  	if (!atomic_read(&tfm_ctx->via_engine_ctr)) {  		rc = phmac_kmac_update(req, false);  		if (rc == 0) -			req->nbytes = 0; +			req_ctx->async_op = OP_FINAL;  	} -	if (!rc && !req->nbytes && !atomic_read(&tfm_ctx->via_engine_ctr)) { +	if (!rc && req_ctx->async_op == OP_FINAL && +	    !atomic_read(&tfm_ctx->via_engine_ctr)) {  		rc = phmac_kmac_final(req, false);  		if (rc == 0)  			goto out; @@ -694,7 +704,7 @@ static int phmac_finup(struct ahash_request *req)  	 * using engine to serialize requests.  	 */  	if (rc == 0 || rc == -EKEYEXPIRED) { -		req_ctx->final = true; +		/* req->async_op has been set to either OP_FINUP or OP_FINAL */  		atomic_inc(&tfm_ctx->via_engine_ctr);  		rc = crypto_transfer_hash_request_to_engine(phmac_crypto_engine, req);  		if (rc != -EINPROGRESS) @@ -855,15 +865,16 @@ static int phmac_do_one_request(struct crypto_engine *engine, void *areq)  	/*  	 * Three kinds of requests come in here: -	 * update when req->nbytes > 0 and req_ctx->final is false -	 * final when req->nbytes = 0 and req_ctx->final is true -	 * finup when req->nbytes > 0 and req_ctx->final is true -	 * For update and finup the hwh walk needs to be prepared and -	 * up to date but the actual nr of bytes in req->nbytes may be -	 * any non zero number. For final there is no hwh walk needed. +	 * 1. req->async_op == OP_UPDATE with req->nbytes > 0 +	 * 2. req->async_op == OP_FINUP with req->nbytes > 0 +	 * 3. req->async_op == OP_FINAL +	 * For update and finup the hwh walk has already been prepared +	 * by the caller. For final there is no hwh walk needed.  	 */ -	if (req->nbytes) { +	switch (req_ctx->async_op) { +	case OP_UPDATE: +	case OP_FINUP:  		rc = phmac_kmac_update(req, true);  		if (rc == -EKEYEXPIRED) {  			/* @@ -880,10 +891,11 @@ static int phmac_do_one_request(struct crypto_engine *engine, void *areq)  			hwh_advance(hwh, rc);  			goto out;  		} -		req->nbytes = 0; -	} - -	if (req_ctx->final) { +		if (req_ctx->async_op == OP_UPDATE) +			break; +		req_ctx->async_op = OP_FINAL; +		fallthrough; +	case OP_FINAL:  		rc = phmac_kmac_final(req, true);  		if (rc == -EKEYEXPIRED) {  			/* @@ -897,10 +909,14 @@ static int phmac_do_one_request(struct crypto_engine *engine, void *areq)  			cond_resched();  			return -ENOSPC;  		} +		break; +	default: +		/* unknown/unsupported/unimplemented asynch op */ +		return -EOPNOTSUPP;  	}  out: -	if (rc || req_ctx->final) +	if (rc || req_ctx->async_op == OP_FINAL)  		memzero_explicit(kmac_ctx, sizeof(*kmac_ctx));  	pr_debug("request complete with rc=%d\n", rc);  	local_bh_disable(); diff --git a/arch/s390/include/asm/pci.h b/arch/s390/include/asm/pci.h index 6890925d5587..a32f465ecf73 100644 --- a/arch/s390/include/asm/pci.h +++ b/arch/s390/include/asm/pci.h @@ -145,7 +145,6 @@ struct zpci_dev {  	u8		has_resources	: 1;  	u8		is_physfn	: 1;  	u8		util_str_avail	: 1; -	u8		irqs_registered	: 1;  	u8		tid_avail	: 1;  	u8		rtr_avail	: 1; /* Relaxed translation allowed */  	unsigned int	devfn;		/* DEVFN part of the RID*/ diff --git a/arch/s390/mm/dump_pagetables.c b/arch/s390/mm/dump_pagetables.c index 9af2aae0a515..528d7c70979f 100644 --- a/arch/s390/mm/dump_pagetables.c +++ b/arch/s390/mm/dump_pagetables.c @@ -291,16 +291,14 @@ static int ptdump_cmp(const void *a, const void *b)  static int add_marker(unsigned long start, unsigned long end, const char *name)  { -	size_t oldsize, newsize; - -	oldsize = markers_cnt * sizeof(*markers); -	newsize = oldsize + 2 * sizeof(*markers); -	if (!oldsize) -		markers = kvmalloc(newsize, GFP_KERNEL); -	else -		markers = kvrealloc(markers, newsize, GFP_KERNEL); -	if (!markers) -		goto error; +	struct addr_marker *new; +	size_t newsize; + +	newsize = (markers_cnt + 2) * sizeof(*markers); +	new = kvrealloc(markers, newsize, GFP_KERNEL); +	if (!new) +		return -ENOMEM; +	markers = new;  	markers[markers_cnt].is_start = 1;  	markers[markers_cnt].start_address = start;  	markers[markers_cnt].size = end - start; @@ -312,9 +310,6 @@ static int add_marker(unsigned long start, unsigned long end, const char *name)  	markers[markers_cnt].name = name;  	markers_cnt++;  	return 0; -error: -	markers_cnt = 0; -	return -ENOMEM;  }  static int pt_dump_init(void) diff --git a/arch/s390/pci/pci_event.c b/arch/s390/pci/pci_event.c index b95376041501..27db1e72c623 100644 --- a/arch/s390/pci/pci_event.c +++ b/arch/s390/pci/pci_event.c @@ -188,7 +188,7 @@ static pci_ers_result_t zpci_event_attempt_error_recovery(struct pci_dev *pdev)  	 * is unbound or probed and that userspace can't access its  	 * configuration space while we perform recovery.  	 */ -	pci_dev_lock(pdev); +	device_lock(&pdev->dev);  	if (pdev->error_state == pci_channel_io_perm_failure) {  		ers_res = PCI_ERS_RESULT_DISCONNECT;  		goto out_unlock; @@ -257,7 +257,7 @@ static pci_ers_result_t zpci_event_attempt_error_recovery(struct pci_dev *pdev)  		driver->err_handler->resume(pdev);  	pci_uevent_ers(pdev, PCI_ERS_RESULT_RECOVERED);  out_unlock: -	pci_dev_unlock(pdev); +	device_unlock(&pdev->dev);  	zpci_report_status(zdev, "recovery", status_str);  	return ers_res; diff --git a/arch/s390/pci/pci_irq.c b/arch/s390/pci/pci_irq.c index 84482a921332..e73be96ce5fe 100644 --- a/arch/s390/pci/pci_irq.c +++ b/arch/s390/pci/pci_irq.c @@ -107,9 +107,6 @@ static int zpci_set_irq(struct zpci_dev *zdev)  	else  		rc = zpci_set_airq(zdev); -	if (!rc) -		zdev->irqs_registered = 1; -  	return rc;  } @@ -123,9 +120,6 @@ static int zpci_clear_irq(struct zpci_dev *zdev)  	else  		rc = zpci_clear_airq(zdev); -	if (!rc) -		zdev->irqs_registered = 0; -  	return rc;  } @@ -427,8 +421,7 @@ bool arch_restore_msi_irqs(struct pci_dev *pdev)  {  	struct zpci_dev *zdev = to_zpci(pdev); -	if (!zdev->irqs_registered) -		zpci_set_irq(zdev); +	zpci_set_irq(zdev);  	return true;  } diff --git a/arch/x86/Makefile b/arch/x86/Makefile index 4db7e4bf69f5..8fbff3106c56 100644 --- a/arch/x86/Makefile +++ b/arch/x86/Makefile @@ -75,7 +75,7 @@ export BITS  #  #    https://gcc.gnu.org/bugzilla/show_bug.cgi?id=53383  # -KBUILD_CFLAGS += -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -mno-avx +KBUILD_CFLAGS += -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -mno-avx -mno-sse4a  KBUILD_RUSTFLAGS += --target=$(objtree)/scripts/target.json  KBUILD_RUSTFLAGS += -Ctarget-feature=-sse,-sse2,-sse3,-ssse3,-sse4.1,-sse4.2,-avx,-avx2 diff --git a/arch/x86/events/intel/core.c b/arch/x86/events/intel/core.c index 28f5468a6ea3..fe65be0b9d9c 100644 --- a/arch/x86/events/intel/core.c +++ b/arch/x86/events/intel/core.c @@ -7596,6 +7596,7 @@ __init int intel_pmu_init(void)  		break;  	case INTEL_PANTHERLAKE_L: +	case INTEL_WILDCATLAKE_L:  		pr_cont("Pantherlake Hybrid events, ");  		name = "pantherlake_hybrid";  		goto lnl_common; diff --git a/arch/x86/events/intel/ds.c b/arch/x86/events/intel/ds.c index c0b7ac1c7594..01bc59e9286c 100644 --- a/arch/x86/events/intel/ds.c +++ b/arch/x86/events/intel/ds.c @@ -317,7 +317,8 @@ static u64 __grt_latency_data(struct perf_event *event, u64 status,  {  	u64 val; -	WARN_ON_ONCE(hybrid_pmu(event->pmu)->pmu_type == hybrid_big); +	WARN_ON_ONCE(is_hybrid() && +		     hybrid_pmu(event->pmu)->pmu_type == hybrid_big);  	dse &= PERF_PEBS_DATA_SOURCE_GRT_MASK;  	val = hybrid_var(event->pmu, pebs_data_source)[dse]; diff --git a/arch/x86/events/intel/uncore.c b/arch/x86/events/intel/uncore.c index a762f7f5b161..d6c945cc5d07 100644 --- a/arch/x86/events/intel/uncore.c +++ b/arch/x86/events/intel/uncore.c @@ -1895,6 +1895,7 @@ static const struct x86_cpu_id intel_uncore_match[] __initconst = {  	X86_MATCH_VFM(INTEL_ARROWLAKE_H,	&mtl_uncore_init),  	X86_MATCH_VFM(INTEL_LUNARLAKE_M,	&lnl_uncore_init),  	X86_MATCH_VFM(INTEL_PANTHERLAKE_L,	&ptl_uncore_init), +	X86_MATCH_VFM(INTEL_WILDCATLAKE_L,	&ptl_uncore_init),  	X86_MATCH_VFM(INTEL_SAPPHIRERAPIDS_X,	&spr_uncore_init),  	X86_MATCH_VFM(INTEL_EMERALDRAPIDS_X,	&spr_uncore_init),  	X86_MATCH_VFM(INTEL_GRANITERAPIDS_X,	&gnr_uncore_init), diff --git a/arch/x86/include/asm/intel-family.h b/arch/x86/include/asm/intel-family.h index f32a0eca2ae5..950bfd006905 100644 --- a/arch/x86/include/asm/intel-family.h +++ b/arch/x86/include/asm/intel-family.h @@ -150,12 +150,12 @@  #define INTEL_LUNARLAKE_M		IFM(6, 0xBD) /* Lion Cove / Skymont */ -#define INTEL_PANTHERLAKE_L		IFM(6, 0xCC) /* Cougar Cove / Crestmont */ +#define INTEL_PANTHERLAKE_L		IFM(6, 0xCC) /* Cougar Cove / Darkmont */  #define INTEL_WILDCATLAKE_L		IFM(6, 0xD5) -#define INTEL_NOVALAKE			IFM(18, 0x01) -#define INTEL_NOVALAKE_L		IFM(18, 0x03) +#define INTEL_NOVALAKE			IFM(18, 0x01) /* Coyote Cove / Arctic Wolf */ +#define INTEL_NOVALAKE_L		IFM(18, 0x03) /* Coyote Cove / Arctic Wolf */  /* "Small Core" Processors (Atom/E-Core) */ diff --git a/arch/x86/include/asm/page_64.h b/arch/x86/include/asm/page_64.h index 015d23f3e01f..53f4089333f2 100644 --- a/arch/x86/include/asm/page_64.h +++ b/arch/x86/include/asm/page_64.h @@ -43,6 +43,9 @@ extern unsigned long __phys_addr_symbol(unsigned long);  void clear_page_orig(void *page);  void clear_page_rep(void *page);  void clear_page_erms(void *page); +KCFI_REFERENCE(clear_page_orig); +KCFI_REFERENCE(clear_page_rep); +KCFI_REFERENCE(clear_page_erms);  static inline void clear_page(void *page)  { diff --git a/arch/x86/kernel/cpu/amd.c b/arch/x86/kernel/cpu/amd.c index ccaa51ce63f6..8e36964a7721 100644 --- a/arch/x86/kernel/cpu/amd.c +++ b/arch/x86/kernel/cpu/amd.c @@ -516,7 +516,7 @@ static void bsp_init_amd(struct cpuinfo_x86 *c)  			setup_force_cpu_cap(X86_FEATURE_ZEN5);  			break;  		case 0x50 ... 0x5f: -		case 0x90 ... 0xaf: +		case 0x80 ... 0xaf:  		case 0xc0 ... 0xcf:  			setup_force_cpu_cap(X86_FEATURE_ZEN6);  			break; @@ -1035,8 +1035,18 @@ static void init_amd_zen4(struct cpuinfo_x86 *c)  	}  } +static const struct x86_cpu_id zen5_rdseed_microcode[] = { +	ZEN_MODEL_STEP_UCODE(0x1a, 0x02, 0x1, 0x0b00215a), +	ZEN_MODEL_STEP_UCODE(0x1a, 0x11, 0x0, 0x0b101054), +}; +  static void init_amd_zen5(struct cpuinfo_x86 *c)  { +	if (!x86_match_min_microcode_rev(zen5_rdseed_microcode)) { +		clear_cpu_cap(c, X86_FEATURE_RDSEED); +		msr_clear_bit(MSR_AMD64_CPUID_FN_7, 18); +		pr_emerg_once("RDSEED32 is broken. Disabling the corresponding CPUID bit.\n"); +	}  }  static void init_amd(struct cpuinfo_x86 *c) diff --git a/arch/x86/kernel/cpu/microcode/amd.c b/arch/x86/kernel/cpu/microcode/amd.c index 28ed8c089024..b7c797dc94f4 100644 --- a/arch/x86/kernel/cpu/microcode/amd.c +++ b/arch/x86/kernel/cpu/microcode/amd.c @@ -233,13 +233,31 @@ static bool need_sha_check(u32 cur_rev)  	return true;  } +static bool cpu_has_entrysign(void) +{ +	unsigned int fam   = x86_family(bsp_cpuid_1_eax); +	unsigned int model = x86_model(bsp_cpuid_1_eax); + +	if (fam == 0x17 || fam == 0x19) +		return true; + +	if (fam == 0x1a) { +		if (model <= 0x2f || +		    (0x40 <= model && model <= 0x4f) || +		    (0x60 <= model && model <= 0x6f)) +			return true; +	} + +	return false; +} +  static bool verify_sha256_digest(u32 patch_id, u32 cur_rev, const u8 *data, unsigned int len)  {  	struct patch_digest *pd = NULL;  	u8 digest[SHA256_DIGEST_SIZE];  	int i; -	if (x86_family(bsp_cpuid_1_eax) < 0x17) +	if (!cpu_has_entrysign())  		return true;  	if (!need_sha_check(cur_rev)) diff --git a/arch/x86/kernel/fpu/core.c b/arch/x86/kernel/fpu/core.c index 1f71cc135e9a..e88eacb1b5bb 100644 --- a/arch/x86/kernel/fpu/core.c +++ b/arch/x86/kernel/fpu/core.c @@ -825,6 +825,9 @@ void fpu__clear_user_states(struct fpu *fpu)  	    !fpregs_state_valid(fpu, smp_processor_id()))  		os_xrstor_supervisor(fpu->fpstate); +	/* Ensure XFD state is in sync before reloading XSTATE */ +	xfd_update_state(fpu->fpstate); +  	/* Reset user states in registers. */  	restore_fpregs_from_init_fpstate(XFEATURE_MASK_USER_RESTORE); diff --git a/arch/x86/net/bpf_jit_comp.c b/arch/x86/net/bpf_jit_comp.c index d4c93d9e73e4..de5083cb1d37 100644 --- a/arch/x86/net/bpf_jit_comp.c +++ b/arch/x86/net/bpf_jit_comp.c @@ -2701,7 +2701,7 @@ emit_jmp:  			/* Update cleanup_addr */  			ctx->cleanup_addr = proglen;  			if (bpf_prog_was_classic(bpf_prog) && -			    !capable(CAP_SYS_ADMIN)) { +			    !ns_capable_noaudit(&init_user_ns, CAP_SYS_ADMIN)) {  				u8 *ip = image + addrs[i - 1];  				if (emit_spectre_bhb_barrier(&prog, ip, bpf_prog))  | 
