xen-devel.lists.xenproject.org archive mirror
 help / color / mirror / Atom feed
* Re: [PATCH v6 10/34] x86, x86/mm, x86/xen, olpc: Use __va() against just the physical address in cr3
       [not found] ` <20170607191453.28645.92256.stgit@tlendack-t1.amdoffice.net>
@ 2017-06-07 22:06   ` Boris Ostrovsky
       [not found]   ` <b15e8924-4069-b5fa-adb2-86c164b1dd36@oracle.com>
  1 sibling, 0 replies; 11+ messages in thread
From: Boris Ostrovsky @ 2017-06-07 22:06 UTC (permalink / raw)
  To: Tom Lendacky, linux-arch, linux-efi, kvm, linux-doc, x86, kexec,
	linux-kernel, kasan-dev, linux-mm, iommu
  Cc: Brijesh Singh, Toshimitsu Kani, Radim Krčmář,
	Matt Fleming, Alexander Potapenko, H. Peter Anvin, Larry Woodman,
	Jonathan Corbet, Joerg Roedel, Michael S. Tsirkin, Ingo Molnar,
	Andrey Ryabinin, Dave Young, Rik van Riel, Arnd Bergmann,
	Borislav Petkov, Andy Lutomirski, Thomas Gleixner, Dmitry Vyukov,
	Juergen Gross, xen-devel, Paolo Bonzini

On 06/07/2017 03:14 PM, Tom Lendacky wrote:
> The cr3 register entry can contain the SME encryption bit that indicates
> the PGD is encrypted.  The encryption bit should not be used when creating
> a virtual address for the PGD table.
>
> Create a new function, read_cr3_pa(), that will extract the physical
> address from the cr3 register. This function is then used where a virtual
> address of the PGD needs to be created/used from the cr3 register.
>
> Signed-off-by: Tom Lendacky <thomas.lendacky@amd.com>
> ---
>  arch/x86/include/asm/special_insns.h |    9 +++++++++
>  arch/x86/kernel/head64.c             |    2 +-
>  arch/x86/mm/fault.c                  |   10 +++++-----
>  arch/x86/mm/ioremap.c                |    2 +-
>  arch/x86/platform/olpc/olpc-xo1-pm.c |    2 +-
>  arch/x86/power/hibernate_64.c        |    2 +-
>  arch/x86/xen/mmu_pv.c                |    6 +++---
>  7 files changed, 21 insertions(+), 12 deletions(-)
>
> diff --git a/arch/x86/include/asm/special_insns.h b/arch/x86/include/asm/special_insns.h
> index 12af3e3..d8e8ace 100644
> --- a/arch/x86/include/asm/special_insns.h
> +++ b/arch/x86/include/asm/special_insns.h
> @@ -234,6 +234,15 @@ static inline void clwb(volatile void *__p)
>  
>  #define nop() asm volatile ("nop")
>  
> +static inline unsigned long native_read_cr3_pa(void)
> +{
> +	return (native_read_cr3() & PHYSICAL_PAGE_MASK);
> +}
> +
> +static inline unsigned long read_cr3_pa(void)
> +{
> +	return (read_cr3() & PHYSICAL_PAGE_MASK);
> +}
>  
>  #endif /* __KERNEL__ */
>  
> diff --git a/arch/x86/kernel/head64.c b/arch/x86/kernel/head64.c
> index 43b7002..dc03624 100644
> --- a/arch/x86/kernel/head64.c
> +++ b/arch/x86/kernel/head64.c
> @@ -55,7 +55,7 @@ int __init early_make_pgtable(unsigned long address)
>  	pmdval_t pmd, *pmd_p;
>  
>  	/* Invalid address or early pgt is done ?  */
> -	if (physaddr >= MAXMEM || read_cr3() != __pa_nodebug(early_level4_pgt))
> +	if (physaddr >= MAXMEM || read_cr3_pa() != __pa_nodebug(early_level4_pgt))
>  		return -1;
>  
>  again:
> diff --git a/arch/x86/mm/fault.c b/arch/x86/mm/fault.c
> index 8ad91a0..2a1fa10c 100644
> --- a/arch/x86/mm/fault.c
> +++ b/arch/x86/mm/fault.c
> @@ -346,7 +346,7 @@ static noinline int vmalloc_fault(unsigned long address)
>  	 * Do _not_ use "current" here. We might be inside
>  	 * an interrupt in the middle of a task switch..
>  	 */
> -	pgd_paddr = read_cr3();
> +	pgd_paddr = read_cr3_pa();
>  	pmd_k = vmalloc_sync_one(__va(pgd_paddr), address);
>  	if (!pmd_k)
>  		return -1;
> @@ -388,7 +388,7 @@ static bool low_pfn(unsigned long pfn)
>  
>  static void dump_pagetable(unsigned long address)
>  {
> -	pgd_t *base = __va(read_cr3());
> +	pgd_t *base = __va(read_cr3_pa());
>  	pgd_t *pgd = &base[pgd_index(address)];
>  	p4d_t *p4d;
>  	pud_t *pud;
> @@ -451,7 +451,7 @@ static noinline int vmalloc_fault(unsigned long address)
>  	 * happen within a race in page table update. In the later
>  	 * case just flush:
>  	 */
> -	pgd = (pgd_t *)__va(read_cr3()) + pgd_index(address);
> +	pgd = (pgd_t *)__va(read_cr3_pa()) + pgd_index(address);
>  	pgd_ref = pgd_offset_k(address);
>  	if (pgd_none(*pgd_ref))
>  		return -1;
> @@ -555,7 +555,7 @@ static int bad_address(void *p)
>  
>  static void dump_pagetable(unsigned long address)
>  {
> -	pgd_t *base = __va(read_cr3() & PHYSICAL_PAGE_MASK);
> +	pgd_t *base = __va(read_cr3_pa());
>  	pgd_t *pgd = base + pgd_index(address);
>  	p4d_t *p4d;
>  	pud_t *pud;
> @@ -700,7 +700,7 @@ static int is_f00f_bug(struct pt_regs *regs, unsigned long address)
>  		pgd_t *pgd;
>  		pte_t *pte;
>  
> -		pgd = __va(read_cr3() & PHYSICAL_PAGE_MASK);
> +		pgd = __va(read_cr3_pa());
>  		pgd += pgd_index(address);
>  
>  		pte = lookup_address_in_pgd(pgd, address, &level);
> diff --git a/arch/x86/mm/ioremap.c b/arch/x86/mm/ioremap.c
> index 2a0fa89..e6305dd 100644
> --- a/arch/x86/mm/ioremap.c
> +++ b/arch/x86/mm/ioremap.c
> @@ -427,7 +427,7 @@ void unxlate_dev_mem_ptr(phys_addr_t phys, void *addr)
>  static inline pmd_t * __init early_ioremap_pmd(unsigned long addr)
>  {
>  	/* Don't assume we're using swapper_pg_dir at this point */
> -	pgd_t *base = __va(read_cr3());
> +	pgd_t *base = __va(read_cr3_pa());
>  	pgd_t *pgd = &base[pgd_index(addr)];
>  	p4d_t *p4d = p4d_offset(pgd, addr);
>  	pud_t *pud = pud_offset(p4d, addr);
> diff --git a/arch/x86/platform/olpc/olpc-xo1-pm.c b/arch/x86/platform/olpc/olpc-xo1-pm.c
> index c5350fd..0668aaf 100644
> --- a/arch/x86/platform/olpc/olpc-xo1-pm.c
> +++ b/arch/x86/platform/olpc/olpc-xo1-pm.c
> @@ -77,7 +77,7 @@ static int xo1_power_state_enter(suspend_state_t pm_state)
>  
>  asmlinkage __visible int xo1_do_sleep(u8 sleep_state)
>  {
> -	void *pgd_addr = __va(read_cr3());
> +	void *pgd_addr = __va(read_cr3_pa());
>  
>  	/* Program wakeup mask (using dword access to CS5536_PM1_EN) */
>  	outl(wakeup_mask << 16, acpi_base + CS5536_PM1_STS);
> diff --git a/arch/x86/power/hibernate_64.c b/arch/x86/power/hibernate_64.c
> index a6e21fe..0a7650d 100644
> --- a/arch/x86/power/hibernate_64.c
> +++ b/arch/x86/power/hibernate_64.c
> @@ -150,7 +150,7 @@ static int relocate_restore_code(void)
>  	memcpy((void *)relocated_restore_code, &core_restore_code, PAGE_SIZE);
>  
>  	/* Make the page containing the relocated code executable */
> -	pgd = (pgd_t *)__va(read_cr3()) + pgd_index(relocated_restore_code);
> +	pgd = (pgd_t *)__va(read_cr3_pa()) + pgd_index(relocated_restore_code);
>  	p4d = p4d_offset(pgd, relocated_restore_code);
>  	if (p4d_large(*p4d)) {
>  		set_p4d(p4d, __p4d(p4d_val(*p4d) & ~_PAGE_NX));
> diff --git a/arch/x86/xen/mmu_pv.c b/arch/x86/xen/mmu_pv.c
> index 1f386d7..2dc5243 100644
> --- a/arch/x86/xen/mmu_pv.c
> +++ b/arch/x86/xen/mmu_pv.c
> @@ -2022,7 +2022,7 @@ static phys_addr_t __init xen_early_virt_to_phys(unsigned long vaddr)
>  	pmd_t pmd;
>  	pte_t pte;
>  
> -	pa = read_cr3();
> +	pa = read_cr3_pa();
>  	pgd = native_make_pgd(xen_read_phys_ulong(pa + pgd_index(vaddr) *
>  						       sizeof(pgd)));
>  	if (!pgd_present(pgd))
> @@ -2102,7 +2102,7 @@ void __init xen_relocate_p2m(void)
>  	pt_phys = pmd_phys + PFN_PHYS(n_pmd);
>  	p2m_pfn = PFN_DOWN(pt_phys) + n_pt;
>  
> -	pgd = __va(read_cr3());
> +	pgd = __va(read_cr3_pa());
>  	new_p2m = (unsigned long *)(2 * PGDIR_SIZE);
>  	idx_p4d = 0;
>  	save_pud = n_pud;
> @@ -2209,7 +2209,7 @@ static void __init xen_write_cr3_init(unsigned long cr3)
>  {
>  	unsigned long pfn = PFN_DOWN(__pa(swapper_pg_dir));
>  
> -	BUG_ON(read_cr3() != __pa(initial_page_table));
> +	BUG_ON(read_cr3_pa() != __pa(initial_page_table));
>  	BUG_ON(cr3 != __pa(swapper_pg_dir));
>  
>  	/*


(Please copy Xen maintainers when modifying xen-related files.)

Given that page tables for Xen PV guests are controlled by the
hypervisor I don't think this change (although harmless) is necessary.
What may be needed is making sure X86_FEATURE_SME is not set for PV guests.

-boris


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
https://lists.xen.org/xen-devel

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH v6 10/34] x86, x86/mm, x86/xen, olpc: Use __va() against just the physical address in cr3
       [not found]   ` <b15e8924-4069-b5fa-adb2-86c164b1dd36@oracle.com>
@ 2017-06-08 13:42     ` Tom Lendacky
       [not found]     ` <4a7376fb-abfc-8edd-42b7-38de461ac65e@amd.com>
  1 sibling, 0 replies; 11+ messages in thread
From: Tom Lendacky @ 2017-06-08 13:42 UTC (permalink / raw)
  To: Boris Ostrovsky, linux-arch, linux-efi, kvm, linux-doc, x86,
	kexec, linux-kernel, kasan-dev, linux-mm, iommu
  Cc: Brijesh Singh, Toshimitsu Kani, Radim Krčmář,
	Matt Fleming, Alexander Potapenko, H. Peter Anvin, Larry Woodman,
	Jonathan Corbet, Joerg Roedel, Michael S. Tsirkin, Ingo Molnar,
	Andrey Ryabinin, Dave Young, Rik van Riel, Arnd Bergmann,
	Borislav Petkov, Andy Lutomirski, Thomas Gleixner, Dmitry Vyukov,
	Juergen Gross, xen-devel, Paolo Bonzini

On 6/7/2017 5:06 PM, Boris Ostrovsky wrote:
> On 06/07/2017 03:14 PM, Tom Lendacky wrote:
>> The cr3 register entry can contain the SME encryption bit that indicates
>> the PGD is encrypted.  The encryption bit should not be used when creating
>> a virtual address for the PGD table.
>>
>> Create a new function, read_cr3_pa(), that will extract the physical
>> address from the cr3 register. This function is then used where a virtual
>> address of the PGD needs to be created/used from the cr3 register.
>>
>> Signed-off-by: Tom Lendacky <thomas.lendacky@amd.com>
>> ---
>>   arch/x86/include/asm/special_insns.h |    9 +++++++++
>>   arch/x86/kernel/head64.c             |    2 +-
>>   arch/x86/mm/fault.c                  |   10 +++++-----
>>   arch/x86/mm/ioremap.c                |    2 +-
>>   arch/x86/platform/olpc/olpc-xo1-pm.c |    2 +-
>>   arch/x86/power/hibernate_64.c        |    2 +-
>>   arch/x86/xen/mmu_pv.c                |    6 +++---
>>   7 files changed, 21 insertions(+), 12 deletions(-)
>>

...

>> diff --git a/arch/x86/xen/mmu_pv.c b/arch/x86/xen/mmu_pv.c
>> index 1f386d7..2dc5243 100644
>> --- a/arch/x86/xen/mmu_pv.c
>> +++ b/arch/x86/xen/mmu_pv.c
>> @@ -2022,7 +2022,7 @@ static phys_addr_t __init xen_early_virt_to_phys(unsigned long vaddr)
>>   	pmd_t pmd;
>>   	pte_t pte;
>>   
>> -	pa = read_cr3();
>> +	pa = read_cr3_pa();
>>   	pgd = native_make_pgd(xen_read_phys_ulong(pa + pgd_index(vaddr) *
>>   						       sizeof(pgd)));
>>   	if (!pgd_present(pgd))
>> @@ -2102,7 +2102,7 @@ void __init xen_relocate_p2m(void)
>>   	pt_phys = pmd_phys + PFN_PHYS(n_pmd);
>>   	p2m_pfn = PFN_DOWN(pt_phys) + n_pt;
>>   
>> -	pgd = __va(read_cr3());
>> +	pgd = __va(read_cr3_pa());
>>   	new_p2m = (unsigned long *)(2 * PGDIR_SIZE);
>>   	idx_p4d = 0;
>>   	save_pud = n_pud;
>> @@ -2209,7 +2209,7 @@ static void __init xen_write_cr3_init(unsigned long cr3)
>>   {
>>   	unsigned long pfn = PFN_DOWN(__pa(swapper_pg_dir));
>>   
>> -	BUG_ON(read_cr3() != __pa(initial_page_table));
>> +	BUG_ON(read_cr3_pa() != __pa(initial_page_table));
>>   	BUG_ON(cr3 != __pa(swapper_pg_dir));
>>   
>>   	/*
> 
> 
> (Please copy Xen maintainers when modifying xen-related files.)

Sorry about that, missed adding the Xen maintainers when I added this
change.

> 
> Given that page tables for Xen PV guests are controlled by the
> hypervisor I don't think this change (although harmless) is necessary.

I can back this change out if the Xen maintainers think that's best.

> What may be needed is making sure X86_FEATURE_SME is not set for PV guests.

And that may be something that Xen will need to control through either
CPUID or MSR support for the PV guests.

Thanks,
Tom

> 
> -boris
> 

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
https://lists.xen.org/xen-devel

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH v6 10/34] x86, x86/mm, x86/xen, olpc: Use __va() against just the physical address in cr3
       [not found]     ` <4a7376fb-abfc-8edd-42b7-38de461ac65e@amd.com>
@ 2017-06-08 20:51       ` Boris Ostrovsky
       [not found]       ` <67fe69ac-a213-8de3-db28-0e54bba95127@oracle.com>
  1 sibling, 0 replies; 11+ messages in thread
From: Boris Ostrovsky @ 2017-06-08 20:51 UTC (permalink / raw)
  To: Tom Lendacky, linux-arch, linux-efi, kvm, linux-doc, x86, kexec,
	linux-kernel, kasan-dev, linux-mm, iommu
  Cc: Brijesh Singh, Toshimitsu Kani, Radim Krčmář,
	Matt Fleming, Alexander Potapenko, H. Peter Anvin, Larry Woodman,
	Jonathan Corbet, Joerg Roedel, Michael S. Tsirkin, Ingo Molnar,
	Andrey Ryabinin, Dave Young, Rik van Riel, Arnd Bergmann,
	Borislav Petkov, Andy Lutomirski, Thomas Gleixner, Dmitry Vyukov,
	Juergen Gross, xen-devel, Paolo Bonzini


>
>> What may be needed is making sure X86_FEATURE_SME is not set for PV
>> guests.
>
> And that may be something that Xen will need to control through either
> CPUID or MSR support for the PV guests.


Only on newer versions of Xen. On earlier versions (2-3 years old) leaf
0x80000007 is passed to the guest unchanged. And so is MSR_K8_SYSCFG.

-boris

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
https://lists.xen.org/xen-devel

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH v6 10/34] x86, x86/mm, x86/xen, olpc: Use __va() against just the physical address in cr3
       [not found]       ` <67fe69ac-a213-8de3-db28-0e54bba95127@oracle.com>
@ 2017-06-08 21:02         ` Tom Lendacky
       [not found]         ` <fcb196c8-f1eb-a38c-336c-7bd3929b029e@amd.com>
  1 sibling, 0 replies; 11+ messages in thread
From: Tom Lendacky @ 2017-06-08 21:02 UTC (permalink / raw)
  To: Boris Ostrovsky, linux-arch, linux-efi, kvm, linux-doc, x86,
	kexec, linux-kernel, kasan-dev, linux-mm, iommu
  Cc: Brijesh Singh, Toshimitsu Kani, Radim Krčmář,
	Matt Fleming, Alexander Potapenko, H. Peter Anvin, Larry Woodman,
	Jonathan Corbet, Joerg Roedel, Michael S. Tsirkin, Ingo Molnar,
	Andrey Ryabinin, Dave Young, Rik van Riel, Arnd Bergmann,
	Borislav Petkov, Andy Lutomirski, Thomas Gleixner, Dmitry Vyukov,
	Juergen Gross, xen-devel, Paolo Bonzini

On 6/8/2017 3:51 PM, Boris Ostrovsky wrote:
> 
>>
>>> What may be needed is making sure X86_FEATURE_SME is not set for PV
>>> guests.
>>
>> And that may be something that Xen will need to control through either
>> CPUID or MSR support for the PV guests.
> 
> 
> Only on newer versions of Xen. On earlier versions (2-3 years old) leaf
> 0x80000007 is passed to the guest unchanged. And so is MSR_K8_SYSCFG.

The SME feature is in leaf 0x8000001f, is that leaf passed to the guest
unchanged?

Thanks,
Tom

> 
> -boris
> 

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
https://lists.xen.org/xen-devel

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH v6 10/34] x86, x86/mm, x86/xen, olpc: Use __va() against just the physical address in cr3
       [not found]         ` <fcb196c8-f1eb-a38c-336c-7bd3929b029e@amd.com>
@ 2017-06-08 21:17           ` Boris Ostrovsky
       [not found]           ` <12c7e511-996d-cf60-3a3b-0be7b41bd85b@oracle.com>
  1 sibling, 0 replies; 11+ messages in thread
From: Boris Ostrovsky @ 2017-06-08 21:17 UTC (permalink / raw)
  To: Tom Lendacky, linux-arch, linux-efi, kvm, linux-doc, x86, kexec,
	linux-kernel, kasan-dev, linux-mm, iommu
  Cc: Brijesh Singh, Toshimitsu Kani, Radim Krčmář,
	Matt Fleming, Alexander Potapenko, H. Peter Anvin, Larry Woodman,
	Jonathan Corbet, Joerg Roedel, Michael S. Tsirkin, Ingo Molnar,
	Andrey Ryabinin, Dave Young, Rik van Riel, Arnd Bergmann,
	Borislav Petkov, Andy Lutomirski, Thomas Gleixner, Dmitry Vyukov,
	Juergen Gross, xen-devel, Paolo Bonzini

On 06/08/2017 05:02 PM, Tom Lendacky wrote:
> On 6/8/2017 3:51 PM, Boris Ostrovsky wrote:
>>
>>>
>>>> What may be needed is making sure X86_FEATURE_SME is not set for PV
>>>> guests.
>>>
>>> And that may be something that Xen will need to control through either
>>> CPUID or MSR support for the PV guests.
>>
>>
>> Only on newer versions of Xen. On earlier versions (2-3 years old) leaf
>> 0x80000007 is passed to the guest unchanged. And so is MSR_K8_SYSCFG.
>
> The SME feature is in leaf 0x8000001f, is that leaf passed to the guest
> unchanged?

Oh, I misread the patch where X86_FEATURE_SME is defined. Then all
versions, including the current one, pass it unchanged.

All that's needed is setup_clear_cpu_cap(X86_FEATURE_SME) in
xen_init_capabilities().


-boris

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
https://lists.xen.org/xen-devel

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH v6 10/34] x86, x86/mm, x86/xen, olpc: Use __va() against just the physical address in cr3
       [not found]           ` <12c7e511-996d-cf60-3a3b-0be7b41bd85b@oracle.com>
@ 2017-06-08 22:01             ` Andrew Cooper
       [not found]             ` <d37917b1-8e49-e8a8-b9ac-59491331640f@citrix.com>
  1 sibling, 0 replies; 11+ messages in thread
From: Andrew Cooper @ 2017-06-08 22:01 UTC (permalink / raw)
  To: Boris Ostrovsky, Tom Lendacky, linux-arch, linux-efi, kvm,
	linux-doc, x86, kexec, linux-kernel, kasan-dev, linux-mm, iommu
  Cc: Brijesh Singh, Toshimitsu Kani, Michael S. Tsirkin, Matt Fleming,
	Alexander Potapenko, H. Peter Anvin, Larry Woodman,
	Jonathan Corbet, Joerg Roedel, Radim Krčmář,
	Ingo Molnar, Andrey Ryabinin, Dave Young, Rik van Riel,
	Arnd Bergmann, Borislav Petkov, Andy Lutomirski, Thomas Gleixner,
	Dmitry Vyukov, Juergen Gross, xen-devel, Paolo Bonzini

On 08/06/2017 22:17, Boris Ostrovsky wrote:
> On 06/08/2017 05:02 PM, Tom Lendacky wrote:
>> On 6/8/2017 3:51 PM, Boris Ostrovsky wrote:
>>>>> What may be needed is making sure X86_FEATURE_SME is not set for PV
>>>>> guests.
>>>> And that may be something that Xen will need to control through either
>>>> CPUID or MSR support for the PV guests.
>>>
>>> Only on newer versions of Xen. On earlier versions (2-3 years old) leaf
>>> 0x80000007 is passed to the guest unchanged. And so is MSR_K8_SYSCFG.
>> The SME feature is in leaf 0x8000001f, is that leaf passed to the guest
>> unchanged?
> Oh, I misread the patch where X86_FEATURE_SME is defined. Then all
> versions, including the current one, pass it unchanged.
>
> All that's needed is setup_clear_cpu_cap(X86_FEATURE_SME) in
> xen_init_capabilities().

AMD processors still don't support CPUID Faulting (or at least, I
couldn't find any reference to it in the latest docs), so we cannot
actually hide SME from a guest which goes looking at native CPUID. 
Furthermore, I'm not aware of any CPUID masking support covering that leaf.

However, if Linux is using the paravirtual cpuid hook, things are
slightly better.

On Xen 4.9 and later, no guests will see the feature.  On earlier
versions of Xen (before I fixed the logic), plain domUs will not see the
feature, while dom0 will.

For safely, I'd recommend unilaterally clobbering the feature as Boris
suggested.  There is no way SME will be supportable on a per-PV guest
basis, although (as far as I am aware) Xen as a whole would be able to
encompass itself and all of its PV guests inside one single SME instance.

~Andrew

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
https://lists.xen.org/xen-devel

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH v6 10/34] x86, x86/mm, x86/xen, olpc: Use __va() against just the physical address in cr3
       [not found]             ` <d37917b1-8e49-e8a8-b9ac-59491331640f@citrix.com>
@ 2017-06-09 18:36               ` Tom Lendacky
       [not found]               ` <9725c503-2e33-2365-87f5-f017e1cbe9b6@amd.com>
  1 sibling, 0 replies; 11+ messages in thread
From: Tom Lendacky @ 2017-06-09 18:36 UTC (permalink / raw)
  To: Andrew Cooper, Boris Ostrovsky, linux-arch, linux-efi, kvm,
	linux-doc, x86, kexec, linux-kernel, kasan-dev, linux-mm, iommu
  Cc: Brijesh Singh, Toshimitsu Kani, Michael S. Tsirkin, Matt Fleming,
	Alexander Potapenko, H. Peter Anvin, Larry Woodman,
	Jonathan Corbet, Joerg Roedel, Radim Krčmář,
	Ingo Molnar, Andrey Ryabinin, Dave Young, Rik van Riel,
	Arnd Bergmann, Borislav Petkov, Andy Lutomirski, Thomas Gleixner,
	Dmitry Vyukov, Juergen Gross, xen-devel, Paolo Bonzini

On 6/8/2017 5:01 PM, Andrew Cooper wrote:
> On 08/06/2017 22:17, Boris Ostrovsky wrote:
>> On 06/08/2017 05:02 PM, Tom Lendacky wrote:
>>> On 6/8/2017 3:51 PM, Boris Ostrovsky wrote:
>>>>>> What may be needed is making sure X86_FEATURE_SME is not set for PV
>>>>>> guests.
>>>>> And that may be something that Xen will need to control through either
>>>>> CPUID or MSR support for the PV guests.
>>>>
>>>> Only on newer versions of Xen. On earlier versions (2-3 years old) leaf
>>>> 0x80000007 is passed to the guest unchanged. And so is MSR_K8_SYSCFG.
>>> The SME feature is in leaf 0x8000001f, is that leaf passed to the guest
>>> unchanged?
>> Oh, I misread the patch where X86_FEATURE_SME is defined. Then all
>> versions, including the current one, pass it unchanged.
>>
>> All that's needed is setup_clear_cpu_cap(X86_FEATURE_SME) in
>> xen_init_capabilities().
> 
> AMD processors still don't support CPUID Faulting (or at least, I
> couldn't find any reference to it in the latest docs), so we cannot
> actually hide SME from a guest which goes looking at native CPUID.
> Furthermore, I'm not aware of any CPUID masking support covering that leaf.
> 
> However, if Linux is using the paravirtual cpuid hook, things are
> slightly better.
> 
> On Xen 4.9 and later, no guests will see the feature.  On earlier
> versions of Xen (before I fixed the logic), plain domUs will not see the
> feature, while dom0 will.
> 
> For safely, I'd recommend unilaterally clobbering the feature as Boris
> suggested.  There is no way SME will be supportable on a per-PV guest

That may be too late. Early boot support in head_64.S will make calls to
check for the feature (through CPUID and MSR), set the sme_me_mask and
encrypt the kernel in place. Is there another way to approach this?

> basis, although (as far as I am aware) Xen as a whole would be able to
> encompass itself and all of its PV guests inside one single SME instance.

Yes, that is correct.

Thanks,
Tom

> 
> ~Andrew
> 

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
https://lists.xen.org/xen-devel

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH v6 10/34] x86, x86/mm, x86/xen, olpc: Use __va() against just the physical address in cr3
       [not found]               ` <9725c503-2e33-2365-87f5-f017e1cbe9b6@amd.com>
@ 2017-06-09 18:43                 ` Boris Ostrovsky
       [not found]                 ` <8e8eac45-95be-f1b5-6f44-f131d275f7bc@oracle.com>
  1 sibling, 0 replies; 11+ messages in thread
From: Boris Ostrovsky @ 2017-06-09 18:43 UTC (permalink / raw)
  To: Tom Lendacky, Andrew Cooper, linux-arch, linux-efi, kvm,
	linux-doc, x86, kexec, linux-kernel, kasan-dev, linux-mm, iommu
  Cc: Brijesh Singh, Toshimitsu Kani, Michael S. Tsirkin, Matt Fleming,
	Alexander Potapenko, H. Peter Anvin, Larry Woodman,
	Jonathan Corbet, Joerg Roedel, Radim Krčmář,
	Ingo Molnar, Andrey Ryabinin, Dave Young, Rik van Riel,
	Arnd Bergmann, Borislav Petkov, Andy Lutomirski, Thomas Gleixner,
	Dmitry Vyukov, Juergen Gross, xen-devel, Paolo Bonzini

On 06/09/2017 02:36 PM, Tom Lendacky wrote:
> On 6/8/2017 5:01 PM, Andrew Cooper wrote:
>> On 08/06/2017 22:17, Boris Ostrovsky wrote:
>>> On 06/08/2017 05:02 PM, Tom Lendacky wrote:
>>>> On 6/8/2017 3:51 PM, Boris Ostrovsky wrote:
>>>>>>> What may be needed is making sure X86_FEATURE_SME is not set for PV
>>>>>>> guests.
>>>>>> And that may be something that Xen will need to control through
>>>>>> either
>>>>>> CPUID or MSR support for the PV guests.
>>>>>
>>>>> Only on newer versions of Xen. On earlier versions (2-3 years old)
>>>>> leaf
>>>>> 0x80000007 is passed to the guest unchanged. And so is MSR_K8_SYSCFG.
>>>> The SME feature is in leaf 0x8000001f, is that leaf passed to the
>>>> guest
>>>> unchanged?
>>> Oh, I misread the patch where X86_FEATURE_SME is defined. Then all
>>> versions, including the current one, pass it unchanged.
>>>
>>> All that's needed is setup_clear_cpu_cap(X86_FEATURE_SME) in
>>> xen_init_capabilities().
>>
>> AMD processors still don't support CPUID Faulting (or at least, I
>> couldn't find any reference to it in the latest docs), so we cannot
>> actually hide SME from a guest which goes looking at native CPUID.
>> Furthermore, I'm not aware of any CPUID masking support covering that
>> leaf.
>>
>> However, if Linux is using the paravirtual cpuid hook, things are
>> slightly better.
>>
>> On Xen 4.9 and later, no guests will see the feature.  On earlier
>> versions of Xen (before I fixed the logic), plain domUs will not see the
>> feature, while dom0 will.
>>
>> For safely, I'd recommend unilaterally clobbering the feature as Boris
>> suggested.  There is no way SME will be supportable on a per-PV guest
>
> That may be too late. Early boot support in head_64.S will make calls to
> check for the feature (through CPUID and MSR), set the sme_me_mask and
> encrypt the kernel in place. Is there another way to approach this?


PV guests don't go through Linux x86 early boot code. They start at
xen_start_kernel() (well, xen-head.S:startup_xen(), really) and  merge
with baremetal path at x86_64_start_reservations() (for 64-bit).


-boris

>
>> basis, although (as far as I am aware) Xen as a whole would be able to
>> encompass itself and all of its PV guests inside one single SME
>> instance.
>
> Yes, that is correct.
>
> Thanks,
> Tom
>
>>
>> ~Andrew
>>


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
https://lists.xen.org/xen-devel

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH v6 10/34] x86, x86/mm, x86/xen, olpc: Use __va() against just the physical address in cr3
       [not found]                 ` <8e8eac45-95be-f1b5-6f44-f131d275f7bc@oracle.com>
@ 2017-06-09 18:54                   ` Andrew Cooper
  2017-06-09 18:59                   ` Tom Lendacky
       [not found]                   ` <33f20df0-bf71-bd9d-7a7e-4fb5e8793400@amd.com>
  2 siblings, 0 replies; 11+ messages in thread
From: Andrew Cooper @ 2017-06-09 18:54 UTC (permalink / raw)
  To: Boris Ostrovsky, Tom Lendacky, linux-arch, linux-efi, kvm,
	linux-doc, x86, kexec, linux-kernel, kasan-dev, linux-mm, iommu
  Cc: Brijesh Singh, Toshimitsu Kani, Michael S. Tsirkin, Matt Fleming,
	Alexander Potapenko, H. Peter Anvin, Larry Woodman,
	Jonathan Corbet, Joerg Roedel, Radim Krčmář,
	Ingo Molnar, Andrey Ryabinin, Dave Young, Rik van Riel,
	Arnd Bergmann, Borislav Petkov, Andy Lutomirski, Thomas Gleixner,
	Dmitry Vyukov, Juergen Gross, xen-devel, Paolo Bonzini

On 09/06/17 19:43, Boris Ostrovsky wrote:
> On 06/09/2017 02:36 PM, Tom Lendacky wrote:
>>> basis, although (as far as I am aware) Xen as a whole would be able to
>>> encompass itself and all of its PV guests inside one single SME
>>> instance.
>> Yes, that is correct.

Thinking more about this, it would only be possible if all the PV guests
were SME-aware and understood not to choke when it finds a frame with a
high address bit set.

I expect the only viable way to implement this (should we wish) is to
have PV guests explicitly signal support (probably via an ELF note),
after which it needs to know about the existence of SME, the meaning of
the encrypted bit in PTEs, and to defer all configuration responsibility
to Xen.

~Andrew

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
https://lists.xen.org/xen-devel

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH v6 10/34] x86, x86/mm, x86/xen, olpc: Use __va() against just the physical address in cr3
       [not found]                 ` <8e8eac45-95be-f1b5-6f44-f131d275f7bc@oracle.com>
  2017-06-09 18:54                   ` Andrew Cooper
@ 2017-06-09 18:59                   ` Tom Lendacky
       [not found]                   ` <33f20df0-bf71-bd9d-7a7e-4fb5e8793400@amd.com>
  2 siblings, 0 replies; 11+ messages in thread
From: Tom Lendacky @ 2017-06-09 18:59 UTC (permalink / raw)
  To: Boris Ostrovsky, Andrew Cooper, linux-arch, linux-efi, kvm,
	linux-doc, x86, kexec, linux-kernel, kasan-dev, linux-mm, iommu
  Cc: Brijesh Singh, Toshimitsu Kani, Michael S. Tsirkin, Matt Fleming,
	Alexander Potapenko, H. Peter Anvin, Larry Woodman,
	Jonathan Corbet, Joerg Roedel, Radim Krčmář,
	Ingo Molnar, Andrey Ryabinin, Dave Young, Rik van Riel,
	Arnd Bergmann, Borislav Petkov, Andy Lutomirski, Thomas Gleixner,
	Dmitry Vyukov, Juergen Gross, xen-devel, Paolo Bonzini

On 6/9/2017 1:43 PM, Boris Ostrovsky wrote:
> On 06/09/2017 02:36 PM, Tom Lendacky wrote:
>> On 6/8/2017 5:01 PM, Andrew Cooper wrote:
>>> On 08/06/2017 22:17, Boris Ostrovsky wrote:
>>>> On 06/08/2017 05:02 PM, Tom Lendacky wrote:
>>>>> On 6/8/2017 3:51 PM, Boris Ostrovsky wrote:
>>>>>>>> What may be needed is making sure X86_FEATURE_SME is not set for PV
>>>>>>>> guests.
>>>>>>> And that may be something that Xen will need to control through
>>>>>>> either
>>>>>>> CPUID or MSR support for the PV guests.
>>>>>>
>>>>>> Only on newer versions of Xen. On earlier versions (2-3 years old)
>>>>>> leaf
>>>>>> 0x80000007 is passed to the guest unchanged. And so is MSR_K8_SYSCFG.
>>>>> The SME feature is in leaf 0x8000001f, is that leaf passed to the
>>>>> guest
>>>>> unchanged?
>>>> Oh, I misread the patch where X86_FEATURE_SME is defined. Then all
>>>> versions, including the current one, pass it unchanged.
>>>>
>>>> All that's needed is setup_clear_cpu_cap(X86_FEATURE_SME) in
>>>> xen_init_capabilities().
>>>
>>> AMD processors still don't support CPUID Faulting (or at least, I
>>> couldn't find any reference to it in the latest docs), so we cannot
>>> actually hide SME from a guest which goes looking at native CPUID.
>>> Furthermore, I'm not aware of any CPUID masking support covering that
>>> leaf.
>>>
>>> However, if Linux is using the paravirtual cpuid hook, things are
>>> slightly better.
>>>
>>> On Xen 4.9 and later, no guests will see the feature.  On earlier
>>> versions of Xen (before I fixed the logic), plain domUs will not see the
>>> feature, while dom0 will.
>>>
>>> For safely, I'd recommend unilaterally clobbering the feature as Boris
>>> suggested.  There is no way SME will be supportable on a per-PV guest
>>
>> That may be too late. Early boot support in head_64.S will make calls to
>> check for the feature (through CPUID and MSR), set the sme_me_mask and
>> encrypt the kernel in place. Is there another way to approach this?
> 
> 
> PV guests don't go through Linux x86 early boot code. They start at
> xen_start_kernel() (well, xen-head.S:startup_xen(), really) and  merge
> with baremetal path at x86_64_start_reservations() (for 64-bit).
> 

Ok, I don't think anything needs to be done then. The sme_me_mask is set
in sme_enable() which is only called from head_64.S. If the sme_me_mask
isn't set then SME won't be active. The feature will just report the
capability of the processor, but that doesn't mean it is active. If you
still want the feature to be clobbered we can do that, though.

Thanks,
Tom

> 
> -boris
> 
>>
>>> basis, although (as far as I am aware) Xen as a whole would be able to
>>> encompass itself and all of its PV guests inside one single SME
>>> instance.
>>
>> Yes, that is correct.
>>
>> Thanks,
>> Tom
>>
>>>
>>> ~Andrew
>>>
> 

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
https://lists.xen.org/xen-devel

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH v6 10/34] x86, x86/mm, x86/xen, olpc: Use __va() against just the physical address in cr3
       [not found]                   ` <33f20df0-bf71-bd9d-7a7e-4fb5e8793400@amd.com>
@ 2017-06-09 19:42                     ` Boris Ostrovsky
  0 siblings, 0 replies; 11+ messages in thread
From: Boris Ostrovsky @ 2017-06-09 19:42 UTC (permalink / raw)
  To: Tom Lendacky, Andrew Cooper, linux-arch, linux-efi, kvm,
	linux-doc, x86, kexec, linux-kernel, kasan-dev, linux-mm, iommu
  Cc: Brijesh Singh, Toshimitsu Kani, Michael S. Tsirkin, Matt Fleming,
	Alexander Potapenko, H. Peter Anvin, Larry Woodman,
	Jonathan Corbet, Joerg Roedel, Radim Krčmář,
	Ingo Molnar, Andrey Ryabinin, Dave Young, Rik van Riel,
	Arnd Bergmann, Borislav Petkov, Andy Lutomirski, Thomas Gleixner,
	Dmitry Vyukov, Juergen Gross, xen-devel, Paolo Bonzini


>>
>> PV guests don't go through Linux x86 early boot code. They start at
>> xen_start_kernel() (well, xen-head.S:startup_xen(), really) and  merge
>> with baremetal path at x86_64_start_reservations() (for 64-bit).
>>
>
> Ok, I don't think anything needs to be done then. The sme_me_mask is set
> in sme_enable() which is only called from head_64.S. If the sme_me_mask
> isn't set then SME won't be active. The feature will just report the
> capability of the processor, but that doesn't mean it is active. If you
> still want the feature to be clobbered we can do that, though.

I'd prefer to explicitly clear to avoid any ambiguity.

-boris

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
https://lists.xen.org/xen-devel

^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2017-06-09 19:42 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
     [not found] <20170607191309.28645.15241.stgit@tlendack-t1.amdoffice.net>
     [not found] ` <20170607191453.28645.92256.stgit@tlendack-t1.amdoffice.net>
2017-06-07 22:06   ` [PATCH v6 10/34] x86, x86/mm, x86/xen, olpc: Use __va() against just the physical address in cr3 Boris Ostrovsky
     [not found]   ` <b15e8924-4069-b5fa-adb2-86c164b1dd36@oracle.com>
2017-06-08 13:42     ` Tom Lendacky
     [not found]     ` <4a7376fb-abfc-8edd-42b7-38de461ac65e@amd.com>
2017-06-08 20:51       ` Boris Ostrovsky
     [not found]       ` <67fe69ac-a213-8de3-db28-0e54bba95127@oracle.com>
2017-06-08 21:02         ` Tom Lendacky
     [not found]         ` <fcb196c8-f1eb-a38c-336c-7bd3929b029e@amd.com>
2017-06-08 21:17           ` Boris Ostrovsky
     [not found]           ` <12c7e511-996d-cf60-3a3b-0be7b41bd85b@oracle.com>
2017-06-08 22:01             ` Andrew Cooper
     [not found]             ` <d37917b1-8e49-e8a8-b9ac-59491331640f@citrix.com>
2017-06-09 18:36               ` Tom Lendacky
     [not found]               ` <9725c503-2e33-2365-87f5-f017e1cbe9b6@amd.com>
2017-06-09 18:43                 ` Boris Ostrovsky
     [not found]                 ` <8e8eac45-95be-f1b5-6f44-f131d275f7bc@oracle.com>
2017-06-09 18:54                   ` Andrew Cooper
2017-06-09 18:59                   ` Tom Lendacky
     [not found]                   ` <33f20df0-bf71-bd9d-7a7e-4fb5e8793400@amd.com>
2017-06-09 19:42                     ` Boris Ostrovsky

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).