The TDX guest platform takes one bit from the physical address to
indicate if the page is shared (accessible by VMM). This bit is not part
of the physical_mask and is not preserved during mprotect(). As a
result, the 'shared' bit is lost during mprotect() on shared mappings.
_COMMON_PAGE_CHG_MASK specifies which PTE bits need to be preserved
during modification. AMD includes 'sme_me_mask' in the define to
preserve the 'encrypt' bit.
To cover both Intel and AMD cases, include 'cc_mask' in
_COMMON_PAGE_CHG_MASK instead of 'sme_me_mask'.
Reported-and-tested-by: Chris Oo <cho@microsoft.com>
Fixes: 41394e33f3
("x86/tdx: Extend the confidential computing API to support TDX guests")
Signed-off-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
Signed-off-by: Dave Hansen <dave.hansen@linux.intel.com>
Reviewed-by: Rick Edgecombe <rick.p.edgecombe@intel.com>
Reviewed-by: Kuppuswamy Sathyanarayanan <sathyanarayanan.kuppuswamy@linux.intel.com>
Reviewed-by: Tom Lendacky <thomas.lendacky@amd.com>
Cc: stable@vger.kernel.org
Link: https://lore.kernel.org/all/20240424082035.4092071-1-kirill.shutemov%40linux.intel.com
42 lines
703 B
C
42 lines
703 B
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
#ifndef _ASM_X86_COCO_H
|
|
#define _ASM_X86_COCO_H
|
|
|
|
#include <asm/asm.h>
|
|
#include <asm/types.h>
|
|
|
|
enum cc_vendor {
|
|
CC_VENDOR_NONE,
|
|
CC_VENDOR_AMD,
|
|
CC_VENDOR_INTEL,
|
|
};
|
|
|
|
#ifdef CONFIG_ARCH_HAS_CC_PLATFORM
|
|
extern enum cc_vendor cc_vendor;
|
|
extern u64 cc_mask;
|
|
|
|
static inline void cc_set_mask(u64 mask)
|
|
{
|
|
RIP_REL_REF(cc_mask) = mask;
|
|
}
|
|
|
|
u64 cc_mkenc(u64 val);
|
|
u64 cc_mkdec(u64 val);
|
|
void cc_random_init(void);
|
|
#else
|
|
#define cc_vendor (CC_VENDOR_NONE)
|
|
static const u64 cc_mask = 0;
|
|
|
|
static inline u64 cc_mkenc(u64 val)
|
|
{
|
|
return val;
|
|
}
|
|
|
|
static inline u64 cc_mkdec(u64 val)
|
|
{
|
|
return val;
|
|
}
|
|
static inline void cc_random_init(void) { }
|
|
#endif
|
|
|
|
#endif /* _ASM_X86_COCO_H */
|