Displaying 20 results from an estimated 25 matches for "vc_slow_virt_to_phys".
2020 May 20
2
[PATCH v3 59/75] x86/sev-es: Handle MONITOR/MONITORX Events
...(struct ghcb *ghcb, struct es_em_ctxt *ctxt
> return ES_OK;
> }
>
> +static enum es_result vc_handle_monitor(struct ghcb *ghcb,
> + struct es_em_ctxt *ctxt)
> +{
> + phys_addr_t monitor_pa;
> + pgd_t *pgd;
> +
> + pgd = __va(read_cr3_pa());
> + monitor_pa = vc_slow_virt_to_phys(ghcb, ctxt->regs->ax);
> +
> + ghcb_set_rax(ghcb, monitor_pa);
> + ghcb_set_rcx(ghcb, ctxt->regs->cx);
> + ghcb_set_rdx(ghcb, ctxt->regs->dx);
> +
> + return sev_es_ghcb_hv_call(ghcb, ctxt, SVM_EXIT_MONITOR, 0, 0);
Why? If SVM has the same behavior as VMX, the...
2020 May 20
2
[PATCH v3 59/75] x86/sev-es: Handle MONITOR/MONITORX Events
...(struct ghcb *ghcb, struct es_em_ctxt *ctxt
> return ES_OK;
> }
>
> +static enum es_result vc_handle_monitor(struct ghcb *ghcb,
> + struct es_em_ctxt *ctxt)
> +{
> + phys_addr_t monitor_pa;
> + pgd_t *pgd;
> +
> + pgd = __va(read_cr3_pa());
> + monitor_pa = vc_slow_virt_to_phys(ghcb, ctxt->regs->ax);
> +
> + ghcb_set_rax(ghcb, monitor_pa);
> + ghcb_set_rcx(ghcb, ctxt->regs->cx);
> + ghcb_set_rdx(ghcb, ctxt->regs->dx);
> +
> + return sev_es_ghcb_hv_call(ghcb, ctxt, SVM_EXIT_MONITOR, 0, 0);
Why? If SVM has the same behavior as VMX, the...
2020 May 20
1
[PATCH v3 51/75] x86/sev-es: Handle MMIO events
....c b/arch/x86/kernel/sev-es.c
> index f4ce3b475464..e3662723ed76 100644
> --- a/arch/x86/kernel/sev-es.c
> +++ b/arch/x86/kernel/sev-es.c
> @@ -294,6 +294,25 @@ static enum es_result vc_read_mem(struct es_em_ctxt *ctxt,
> return ES_EXCEPTION;
> }
>
> +static phys_addr_t vc_slow_virt_to_phys(struct ghcb *ghcb, unsigned long vaddr)
> +{
> + unsigned long va = (unsigned long)vaddr;
> + unsigned int level;
> + phys_addr_t pa;
> + pgd_t *pgd;
> + pte_t *pte;
> +
> + pgd = pgd_offset(current->active_mm, va);
> + pte = lookup_address_in_pgd(pgd, va, &level);...
2020 Jun 11
2
[PATCH v3 59/75] x86/sev-es: Handle MONITOR/MONITORX Events
...> > > +static enum es_result vc_handle_monitor(struct ghcb *ghcb,
> > > + struct es_em_ctxt *ctxt)
> > > +{
> > > + phys_addr_t monitor_pa;
> > > + pgd_t *pgd;
> > > +
> > > + pgd = __va(read_cr3_pa());
> > > + monitor_pa = vc_slow_virt_to_phys(ghcb, ctxt->regs->ax);
> > > +
> > > + ghcb_set_rax(ghcb, monitor_pa);
> > > + ghcb_set_rcx(ghcb, ctxt->regs->cx);
> > > + ghcb_set_rdx(ghcb, ctxt->regs->dx);
> > > +
> > > + return sev_es_ghcb_hv_call(ghcb, ctxt, SVM_EXIT_MONI...
2020 Jun 11
2
[PATCH v3 59/75] x86/sev-es: Handle MONITOR/MONITORX Events
...> > > +static enum es_result vc_handle_monitor(struct ghcb *ghcb,
> > > + struct es_em_ctxt *ctxt)
> > > +{
> > > + phys_addr_t monitor_pa;
> > > + pgd_t *pgd;
> > > +
> > > + pgd = __va(read_cr3_pa());
> > > + monitor_pa = vc_slow_virt_to_phys(ghcb, ctxt->regs->ax);
> > > +
> > > + ghcb_set_rax(ghcb, monitor_pa);
> > > + ghcb_set_rcx(ghcb, ctxt->regs->cx);
> > > + ghcb_set_rdx(ghcb, ctxt->regs->dx);
> > > +
> > > + return sev_es_ghcb_hv_call(ghcb, ctxt, SVM_EXIT_MONI...
2020 Apr 28
0
[PATCH v3 51/75] x86/sev-es: Handle MMIO events
...NS \
diff --git a/arch/x86/kernel/sev-es.c b/arch/x86/kernel/sev-es.c
index f4ce3b475464..e3662723ed76 100644
--- a/arch/x86/kernel/sev-es.c
+++ b/arch/x86/kernel/sev-es.c
@@ -294,6 +294,25 @@ static enum es_result vc_read_mem(struct es_em_ctxt *ctxt,
return ES_EXCEPTION;
}
+static phys_addr_t vc_slow_virt_to_phys(struct ghcb *ghcb, unsigned long vaddr)
+{
+ unsigned long va = (unsigned long)vaddr;
+ unsigned int level;
+ phys_addr_t pa;
+ pgd_t *pgd;
+ pte_t *pte;
+
+ pgd = pgd_offset(current->active_mm, va);
+ pte = lookup_address_in_pgd(pgd, va, &level);
+ if (!pte)
+ return 0;
+
+ pa = (phys_addr...
2020 Aug 24
0
[PATCH v6 52/76] x86/sev-es: Handle MMIO events
...T_REASONS \
diff --git a/arch/x86/kernel/sev-es.c b/arch/x86/kernel/sev-es.c
index 1493e8cf14f2..fa1fa55fd8e3 100644
--- a/arch/x86/kernel/sev-es.c
+++ b/arch/x86/kernel/sev-es.c
@@ -364,6 +364,37 @@ static enum es_result vc_read_mem(struct es_em_ctxt *ctxt,
return ES_EXCEPTION;
}
+static bool vc_slow_virt_to_phys(struct ghcb *ghcb, struct es_em_ctxt *ctxt,
+ unsigned long vaddr, phys_addr_t *paddr)
+{
+ unsigned long va = (unsigned long)vaddr;
+ unsigned int level;
+ phys_addr_t pa;
+ pgd_t *pgd;
+ pte_t *pte;
+
+ pgd = __va(read_cr3_pa());
+ pgd = &pgd[pgd_index(va)];
+ pte = lookup_address_in_pgd(...
2020 Apr 28
0
[PATCH v3 59/75] x86/sev-es: Handle MONITOR/MONITORX Events
...-824,6 +824,22 @@ static enum es_result vc_handle_rdpmc(struct ghcb *ghcb, struct es_em_ctxt *ctxt
return ES_OK;
}
+static enum es_result vc_handle_monitor(struct ghcb *ghcb,
+ struct es_em_ctxt *ctxt)
+{
+ phys_addr_t monitor_pa;
+ pgd_t *pgd;
+
+ pgd = __va(read_cr3_pa());
+ monitor_pa = vc_slow_virt_to_phys(ghcb, ctxt->regs->ax);
+
+ ghcb_set_rax(ghcb, monitor_pa);
+ ghcb_set_rcx(ghcb, ctxt->regs->cx);
+ ghcb_set_rdx(ghcb, ctxt->regs->dx);
+
+ return sev_es_ghcb_hv_call(ghcb, ctxt, SVM_EXIT_MONITOR, 0, 0);
+}
+
static enum es_result vc_handle_exitcode(struct es_em_ctxt *ctxt,...
2020 Apr 28
0
[PATCH v3 53/75] x86/sev-es: Handle MSR events
...rch/x86/kernel/sev-es.c | 28 ++++++++++++++++++++++++++++
1 file changed, 28 insertions(+)
diff --git a/arch/x86/kernel/sev-es.c b/arch/x86/kernel/sev-es.c
index 84958a82f8e0..e43bba4c7d79 100644
--- a/arch/x86/kernel/sev-es.c
+++ b/arch/x86/kernel/sev-es.c
@@ -316,6 +316,31 @@ static phys_addr_t vc_slow_virt_to_phys(struct ghcb *ghcb, unsigned long vaddr)
/* Include code shared with pre-decompression boot stage */
#include "sev-es-shared.c"
+static enum es_result vc_handle_msr(struct ghcb *ghcb, struct es_em_ctxt *ctxt)
+{
+ struct pt_regs *regs = ctxt->regs;
+ enum es_result ret;
+ u64 exit_i...
2020 Jun 11
0
[PATCH v3 59/75] x86/sev-es: Handle MONITOR/MONITORX Events
...t 05:17:09PM +0200, Joerg Roedel wrote:
> > +static enum es_result vc_handle_monitor(struct ghcb *ghcb,
> > + struct es_em_ctxt *ctxt)
> > +{
> > + phys_addr_t monitor_pa;
> > + pgd_t *pgd;
> > +
> > + pgd = __va(read_cr3_pa());
> > + monitor_pa = vc_slow_virt_to_phys(ghcb, ctxt->regs->ax);
> > +
> > + ghcb_set_rax(ghcb, monitor_pa);
> > + ghcb_set_rcx(ghcb, ctxt->regs->cx);
> > + ghcb_set_rdx(ghcb, ctxt->regs->dx);
> > +
> > + return sev_es_ghcb_hv_call(ghcb, ctxt, SVM_EXIT_MONITOR, 0, 0);
>
> Why? I...
2020 Jun 11
0
[PATCH v3 59/75] x86/sev-es: Handle MONITOR/MONITORX Events
...+static enum es_result vc_handle_monitor(struct ghcb *ghcb,
>>>> + struct es_em_ctxt *ctxt)
>>>> +{
>>>> + phys_addr_t monitor_pa;
>>>> + pgd_t *pgd;
>>>> +
>>>> + pgd = __va(read_cr3_pa());
>>>> + monitor_pa = vc_slow_virt_to_phys(ghcb, ctxt->regs->ax);
>>>> +
>>>> + ghcb_set_rax(ghcb, monitor_pa);
>>>> + ghcb_set_rcx(ghcb, ctxt->regs->cx);
>>>> + ghcb_set_rdx(ghcb, ctxt->regs->dx);
>>>> +
>>>> + return sev_es_ghcb_hv_call(ghcb, ctxt, S...
2020 Jul 22
0
[PATCH v4 51/75] x86/sev-es: Handle MMIO events
...ideo-ROM-backed to being
> unbacked by anything.
>
> With SEV-ES enabled, our platform handles reads and writes to unbacked
> memory by treating them as MMIO. So, the read from 0xffff8880000c4000
> causes a #VC, which is handled by do_early_exception.
>
> In handling the #VC, vc_slow_virt_to_phys fails for that address. My
> understanding is that the #VC handler should then add an entry to the
> page tables and retry the faulting access. Somehow, that isn?t
> happening. From the hypervisor side, it looks like the guest is
> looping somehow. (I think the VCPU is mostly unhalted a...
2020 Jul 22
0
[PATCH v4 51/75] x86/sev-es: Handle MMIO events
...r tests I should run or data that I can collect. Thanks!
... can you please try the attached diff?
diff --git a/arch/x86/kernel/sev-es.c b/arch/x86/kernel/sev-es.c
index 251d0aabc55a..e1fea7a38019 100644
--- a/arch/x86/kernel/sev-es.c
+++ b/arch/x86/kernel/sev-es.c
@@ -389,7 +389,8 @@ static bool vc_slow_virt_to_phys(struct ghcb *ghcb, struct es_em_ctxt *ctxt,
pgd_t *pgd;
pte_t *pte;
- pgd = pgd_offset(current->active_mm, va);
+ pgd = __va(read_cr3_pa());
+ pgd = &pgd[pgd_index(va)];
pte = lookup_address_in_pgd(pgd, va, &level);
if (!pte) {
ctxt->fi.vector = X86_TRAP_PF;
2020 Apr 28
0
[PATCH v3 74/75] x86/sev-es: Handle NMI State
...;
+
if (IS_ENABLED(CONFIG_SMP) && cpu_is_offline(smp_processor_id()))
return;
diff --git a/arch/x86/kernel/sev-es.c b/arch/x86/kernel/sev-es.c
index 00a5d0483730..eef6e2196ef4 100644
--- a/arch/x86/kernel/sev-es.c
+++ b/arch/x86/kernel/sev-es.c
@@ -341,6 +341,24 @@ static phys_addr_t vc_slow_virt_to_phys(struct ghcb *ghcb, unsigned long vaddr)
/* Include code shared with pre-decompression boot stage */
#include "sev-es-shared.c"
+void sev_es_nmi_complete(void)
+{
+ struct ghcb_state state;
+ struct ghcb *ghcb;
+
+ ghcb = sev_es_get_ghcb(&state);
+
+ vc_ghcb_invalidate(ghcb);
+ ghc...
2020 Aug 31
1
[PATCH v6 69/76] x86/realmode: Setup AP jump table
...+/* Needed in vc_early_vc_forward_exception */
vc_early_forward_exception()
> +void do_early_exception(struct pt_regs *regs, int trapnr);
> +
> static inline u64 sev_es_rd_ghcb_msr(void)
> {
> return native_read_msr(MSR_AMD64_SEV_ES_GHCB);
> @@ -407,6 +412,69 @@ static bool vc_slow_virt_to_phys(struct ghcb *ghcb, struct es_em_ctxt *ctxt,
> /* Include code shared with pre-decompression boot stage */
> #include "sev-es-shared.c"
>
> +static u64 sev_es_get_jump_table_addr(void)
Static and used here only once - you can drop the previx "sev_es".
> +{
&g...
2020 Apr 28
0
[PATCH v3 69/75] x86/realmode: Setup AP jump table
...*state)
/* Needed in vc_early_vc_forward_exception */
void do_early_exception(struct pt_regs *regs, int trapnr);
+static inline u64 sev_es_rd_ghcb_msr(void);
+
static inline u64 sev_es_rd_ghcb_msr(void)
{
return native_read_msr(MSR_AMD64_SEV_ES_GHCB);
@@ -336,6 +339,69 @@ static phys_addr_t vc_slow_virt_to_phys(struct ghcb *ghcb, unsigned long vaddr)
/* Include code shared with pre-decompression boot stage */
#include "sev-es-shared.c"
+static u64 sev_es_get_jump_table_addr(void)
+{
+ struct ghcb_state state;
+ unsigned long flags;
+ struct ghcb *ghcb;
+ u64 ret;
+
+ local_irq_save(flags);
+...
2020 Aug 24
0
[PATCH v6 69/76] x86/realmode: Setup AP jump table
...nline void sev_es_put_ghcb(struct ghcb_state *state)
}
}
+/* Needed in vc_early_vc_forward_exception */
+void do_early_exception(struct pt_regs *regs, int trapnr);
+
static inline u64 sev_es_rd_ghcb_msr(void)
{
return native_read_msr(MSR_AMD64_SEV_ES_GHCB);
@@ -407,6 +412,69 @@ static bool vc_slow_virt_to_phys(struct ghcb *ghcb, struct es_em_ctxt *ctxt,
/* Include code shared with pre-decompression boot stage */
#include "sev-es-shared.c"
+static u64 sev_es_get_jump_table_addr(void)
+{
+ struct ghcb_state state;
+ unsigned long flags;
+ struct ghcb *ghcb;
+ u64 ret;
+
+ local_irq_save(flags...
2020 Jul 14
92
[PATCH v4 00/75] x86: SEV-ES Guest Support
From: Joerg Roedel <jroedel at suse.de>
Hi,
here is the fourth version of the SEV-ES Guest Support patches. I
addressed the review comments sent to me for the previous version and
rebased the code v5.8-rc5.
The biggest change in this version is the IST handling code for the
#VC handler. I adapted the entry code for the #VC handler to the big
pile of entry code changes merged into
2020 Jul 14
92
[PATCH v4 00/75] x86: SEV-ES Guest Support
From: Joerg Roedel <jroedel at suse.de>
Hi,
here is the fourth version of the SEV-ES Guest Support patches. I
addressed the review comments sent to me for the previous version and
rebased the code v5.8-rc5.
The biggest change in this version is the IST handling code for the
#VC handler. I adapted the entry code for the #VC handler to the big
pile of entry code changes merged into
2020 Apr 28
116
[PATCH v3 00/75] x86: SEV-ES Guest Support
Hi,
here is the next version of changes to enable Linux to run as an SEV-ES
guest. The code was rebased to v5.7-rc3 and got a fair number of changes
since the last version.
What is SEV-ES
==============
SEV-ES is an acronym for 'Secure Encrypted Virtualization - Encrypted
State' and means a hardware feature of AMD processors which hides the
register state of VCPUs to the hypervisor by