Commit b7c90e3e authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Merge tag 'x86-urgent-2025-03-08' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip

Pull more x86 fixes from Ingo Molnar:

 - Add more model IDs to the AMD microcode version check, more people
   are hitting these checks

 - Fix a Xen guest boot warning related to AMD northbridge setup

 - Fix SEV guest bugs related to a recent changes in its locking logic

 - Fix a missing definition of PTRS_PER_PMD that assembly builds can hit

* tag 'x86-urgent-2025-03-08' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
  x86/microcode/AMD: Add some forgotten models to the SHA check
  x86/mm: Define PTRS_PER_PMD for assembly code too
  virt: sev-guest: Move SNP Guest Request data pages handling under snp_cmd_mutex
  virt: sev-guest: Allocate request data dynamically
  x86/amd_nb: Use rdmsr_safe() in amd_get_mmconfig_range()
parents 2e51e0ac 058a6bec
Loading
Loading
Loading
Loading
+8 −15
Original line number Diff line number Diff line
@@ -2853,19 +2853,8 @@ struct snp_msg_desc *snp_msg_alloc(void)
	if (!mdesc->response)
		goto e_free_request;

	mdesc->certs_data = alloc_shared_pages(SEV_FW_BLOB_MAX_SIZE);
	if (!mdesc->certs_data)
		goto e_free_response;

	/* initial the input address for guest request */
	mdesc->input.req_gpa = __pa(mdesc->request);
	mdesc->input.resp_gpa = __pa(mdesc->response);
	mdesc->input.data_gpa = __pa(mdesc->certs_data);

	return mdesc;

e_free_response:
	free_shared_pages(mdesc->response, sizeof(struct snp_guest_msg));
e_free_request:
	free_shared_pages(mdesc->request, sizeof(struct snp_guest_msg));
e_unmap:
@@ -2885,7 +2874,6 @@ void snp_msg_free(struct snp_msg_desc *mdesc)
	kfree(mdesc->ctx);
	free_shared_pages(mdesc->response, sizeof(struct snp_guest_msg));
	free_shared_pages(mdesc->request, sizeof(struct snp_guest_msg));
	free_shared_pages(mdesc->certs_data, SEV_FW_BLOB_MAX_SIZE);
	iounmap((__force void __iomem *)mdesc->secrets);

	memset(mdesc, 0, sizeof(*mdesc));
@@ -3054,7 +3042,7 @@ static int __handle_guest_request(struct snp_msg_desc *mdesc, struct snp_guest_r
	 * sequence number must be incremented or the VMPCK must be deleted to
	 * prevent reuse of the IV.
	 */
	rc = snp_issue_guest_request(req, &mdesc->input, rio);
	rc = snp_issue_guest_request(req, &req->input, rio);
	switch (rc) {
	case -ENOSPC:
		/*
@@ -3064,7 +3052,7 @@ static int __handle_guest_request(struct snp_msg_desc *mdesc, struct snp_guest_r
		 * order to increment the sequence number and thus avoid
		 * IV reuse.
		 */
		override_npages = mdesc->input.data_npages;
		override_npages = req->input.data_npages;
		req->exit_code	= SVM_VMGEXIT_GUEST_REQUEST;

		/*
@@ -3120,7 +3108,7 @@ static int __handle_guest_request(struct snp_msg_desc *mdesc, struct snp_guest_r
	}

	if (override_npages)
		mdesc->input.data_npages = override_npages;
		req->input.data_npages = override_npages;

	return rc;
}
@@ -3158,6 +3146,11 @@ int snp_send_guest_request(struct snp_msg_desc *mdesc, struct snp_guest_req *req
	 */
	memcpy(mdesc->request, &mdesc->secret_request, sizeof(mdesc->secret_request));

	/* Initialize the input address for guest request */
	req->input.req_gpa = __pa(mdesc->request);
	req->input.resp_gpa = __pa(mdesc->response);
	req->input.data_gpa = req->certs_data ? __pa(req->certs_data) : 0;

	rc = __handle_guest_request(mdesc, req, rio);
	if (rc) {
		if (rc == -EIO &&
+4 −4
Original line number Diff line number Diff line
@@ -23,17 +23,17 @@ typedef union {
#define ARCH_PAGE_TABLE_SYNC_MASK	PGTBL_PMD_MODIFIED

/*
 * traditional i386 two-level paging structure:
 * Traditional i386 two-level paging structure:
 */

#define PGDIR_SHIFT	22
#define PTRS_PER_PGD	1024


/*
 * the i386 is two-level, so we don't really have any
 * PMD directory physically.
 * The i386 is two-level, so we don't really have any
 * PMD directory physically:
 */
#define PTRS_PER_PMD	1

#define PTRS_PER_PTE	1024

+3 −3
Original line number Diff line number Diff line
@@ -203,6 +203,9 @@ struct snp_guest_req {
	unsigned int vmpck_id;
	u8 msg_version;
	u8 msg_type;

	struct snp_req_data input;
	void *certs_data;
};

/*
@@ -263,9 +266,6 @@ struct snp_msg_desc {
	struct snp_guest_msg secret_request, secret_response;

	struct snp_secrets_page *secrets;
	struct snp_req_data input;

	void *certs_data;

	struct aesgcm_ctx *ctx;

+3 −6
Original line number Diff line number Diff line
@@ -143,7 +143,6 @@ bool __init early_is_amd_nb(u32 device)

struct resource *amd_get_mmconfig_range(struct resource *res)
{
	u32 address;
	u64 base, msr;
	unsigned int segn_busn_bits;

@@ -151,13 +150,11 @@ struct resource *amd_get_mmconfig_range(struct resource *res)
	    boot_cpu_data.x86_vendor != X86_VENDOR_HYGON)
		return NULL;

	/* assume all cpus from fam10h have mmconfig */
	if (boot_cpu_data.x86 < 0x10)
	/* Assume CPUs from Fam10h have mmconfig, although not all VMs do */
	if (boot_cpu_data.x86 < 0x10 ||
	    rdmsrl_safe(MSR_FAM10H_MMIO_CONF_BASE, &msr))
		return NULL;

	address = MSR_FAM10H_MMIO_CONF_BASE;
	rdmsrl(address, msr);

	/* mmconfig is not enabled */
	if (!(msr & FAM10H_MMIO_CONF_ENABLE))
		return NULL;
+6 −0
Original line number Diff line number Diff line
@@ -175,23 +175,29 @@ static bool need_sha_check(u32 cur_rev)
{
	switch (cur_rev >> 8) {
	case 0x80012: return cur_rev <= 0x800126f; break;
	case 0x80082: return cur_rev <= 0x800820f; break;
	case 0x83010: return cur_rev <= 0x830107c; break;
	case 0x86001: return cur_rev <= 0x860010e; break;
	case 0x86081: return cur_rev <= 0x8608108; break;
	case 0x87010: return cur_rev <= 0x8701034; break;
	case 0x8a000: return cur_rev <= 0x8a0000a; break;
	case 0xa0010: return cur_rev <= 0xa00107a; break;
	case 0xa0011: return cur_rev <= 0xa0011da; break;
	case 0xa0012: return cur_rev <= 0xa001243; break;
	case 0xa0082: return cur_rev <= 0xa00820e; break;
	case 0xa1011: return cur_rev <= 0xa101153; break;
	case 0xa1012: return cur_rev <= 0xa10124e; break;
	case 0xa1081: return cur_rev <= 0xa108109; break;
	case 0xa2010: return cur_rev <= 0xa20102f; break;
	case 0xa2012: return cur_rev <= 0xa201212; break;
	case 0xa4041: return cur_rev <= 0xa404109; break;
	case 0xa5000: return cur_rev <= 0xa500013; break;
	case 0xa6012: return cur_rev <= 0xa60120a; break;
	case 0xa7041: return cur_rev <= 0xa704109; break;
	case 0xa7052: return cur_rev <= 0xa705208; break;
	case 0xa7080: return cur_rev <= 0xa708009; break;
	case 0xa70c0: return cur_rev <= 0xa70C009; break;
	case 0xaa001: return cur_rev <= 0xaa00116; break;
	case 0xaa002: return cur_rev <= 0xaa00218; break;
	default: break;
	}
Loading