2019-04-30 03:49:37

by Zhao, Yakui

[permalink] [raw]
Subject: [PATCH v6 4/4] x86/acrn: Add hypercall for ACRN guest

When the ACRN hypervisor is detected, the hypercall is needed so that the
ACRN guest can query/config some settings. For example: it can be used
to query the resources in hypervisor and manage the CPU/memory/device/
interrupt for guest operating system.

Add the hypercall so that the ACRN guest can communicate with the
low-level ACRN hypervisor. On x86 it is implemented with the VMCALL
instruction.

Co-developed-by: Jason Chen CJ <[email protected]>
Signed-off-by: Jason Chen CJ <[email protected]>
Signed-off-by: Zhao Yakui <[email protected]>
Reviewed-by: Thomas Gleixner <[email protected]>
---
V1->V2: Refine the comments for the function of acrn_hypercall0/1/2
v2->v3: Use the "vmcall" mnemonic to replace hard-code byte definition
v4->v5: Use _ASM_X86_ACRN_HYPERCALL_H instead of _ASM_X86_ACRNHYPERCALL_H.
Use the "VMCALL" mnemonic in comment/commit log.
Uppercase r8/rdi/rsi/rax for hypercall parameter register in comment.
v5->v6: Remove explicit local register variable for inline assembly
---
arch/x86/include/asm/acrn_hypercall.h | 84 +++++++++++++++++++++++++++++++++++
1 file changed, 84 insertions(+)
create mode 100644 arch/x86/include/asm/acrn_hypercall.h

diff --git a/arch/x86/include/asm/acrn_hypercall.h b/arch/x86/include/asm/acrn_hypercall.h
new file mode 100644
index 0000000..5cb438e
--- /dev/null
+++ b/arch/x86/include/asm/acrn_hypercall.h
@@ -0,0 +1,84 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+
+#ifndef _ASM_X86_ACRN_HYPERCALL_H
+#define _ASM_X86_ACRN_HYPERCALL_H
+
+#include <linux/errno.h>
+
+#ifdef CONFIG_ACRN_GUEST
+
+/*
+ * Hypercalls for ACRN guest
+ *
+ * Hypercall number is passed in R8 register.
+ * Up to 2 arguments are passed in RDI, RSI.
+ * Return value will be placed in RAX.
+ */
+
+static inline long acrn_hypercall0(unsigned long hcall_id)
+{
+ long result;
+
+ /* the hypercall is implemented with the VMCALL instruction.
+ * volatile qualifier is added to avoid that it is dropped
+ * because of compiler optimization.
+ */
+ asm volatile("movq %[hcall_id], %%r8\n\t"
+ "vmcall\n\t"
+ : "=a" (result)
+ : [hcall_id] "g" (hcall_id)
+ : "r8");
+
+ return result;
+}
+
+static inline long acrn_hypercall1(unsigned long hcall_id,
+ unsigned long param1)
+{
+ long result;
+
+ asm volatile("movq %[hcall_id], %%r8\n\t"
+ "vmcall\n\t"
+ : "=a" (result)
+ : [hcall_id] "g" (hcall_id), "D" (param1)
+ : "r8");
+
+ return result;
+}
+
+static inline long acrn_hypercall2(unsigned long hcall_id,
+ unsigned long param1,
+ unsigned long param2)
+{
+ long result;
+
+ asm volatile("movq %[hcall_id], %%r8\n\t"
+ "vmcall\n\t"
+ : "=a" (result)
+ : [hcall_id] "g" (hcall_id), "D" (param1), "S" (param2)
+ : "r8");
+
+ return result;
+}
+
+#else
+
+static inline long acrn_hypercall0(unsigned long hcall_id)
+{
+ return -ENOTSUPP;
+}
+
+static inline long acrn_hypercall1(unsigned long hcall_id,
+ unsigned long param1)
+{
+ return -ENOTSUPP;
+}
+
+static inline long acrn_hypercall2(unsigned long hcall_id,
+ unsigned long param1,
+ unsigned long param2)
+{
+ return -ENOTSUPP;
+}
+#endif /* CONFIG_ACRN_GUEST */
+#endif /* _ASM_X86_ACRN_HYPERCALL_H */
--
2.7.4


2019-05-15 07:38:59

by Borislav Petkov

[permalink] [raw]
Subject: Re: [PATCH v6 4/4] x86/acrn: Add hypercall for ACRN guest

On Tue, Apr 30, 2019 at 11:45:26AM +0800, Zhao Yakui wrote:
> When the ACRN hypervisor is detected, the hypercall is needed so that the
> ACRN guest can query/config some settings. For example: it can be used
> to query the resources in hypervisor and manage the CPU/memory/device/
> interrupt for guest operating system.
>
> Add the hypercall so that the ACRN guest can communicate with the
> low-level ACRN hypervisor. On x86 it is implemented with the VMCALL
> instruction.
>
> Co-developed-by: Jason Chen CJ <[email protected]>
> Signed-off-by: Jason Chen CJ <[email protected]>
> Signed-off-by: Zhao Yakui <[email protected]>
> Reviewed-by: Thomas Gleixner <[email protected]>
> ---
> V1->V2: Refine the comments for the function of acrn_hypercall0/1/2
> v2->v3: Use the "vmcall" mnemonic to replace hard-code byte definition
> v4->v5: Use _ASM_X86_ACRN_HYPERCALL_H instead of _ASM_X86_ACRNHYPERCALL_H.
> Use the "VMCALL" mnemonic in comment/commit log.
> Uppercase r8/rdi/rsi/rax for hypercall parameter register in comment.
> v5->v6: Remove explicit local register variable for inline assembly
> ---
> arch/x86/include/asm/acrn_hypercall.h | 84 +++++++++++++++++++++++++++++++++++
> 1 file changed, 84 insertions(+)
> create mode 100644 arch/x86/include/asm/acrn_hypercall.h
>
> diff --git a/arch/x86/include/asm/acrn_hypercall.h b/arch/x86/include/asm/acrn_hypercall.h
> new file mode 100644
> index 0000000..5cb438e
> --- /dev/null
> +++ b/arch/x86/include/asm/acrn_hypercall.h

Questions:

* why isn't this in acrn.h and needs to be a separate header?

* why aren't those functions used anywhere?

--
Regards/Gruss,
Boris.

Good mailing practices for 400: avoid top-posting and trim the reply.

2019-05-27 03:02:38

by Zhao, Yakui

[permalink] [raw]
Subject: Re: [PATCH v6 4/4] x86/acrn: Add hypercall for ACRN guest



On 2019年05月15日 15:37, Borislav Petkov wrote:
> On Tue, Apr 30, 2019 at 11:45:26AM +0800, Zhao Yakui wrote:
>> When the ACRN hypervisor is detected, the hypercall is needed so that the
>> ACRN guest can query/config some settings. For example: it can be used
>> to query the resources in hypervisor and manage the CPU/memory/device/
>> interrupt for guest operating system.
>>
>> Add the hypercall so that the ACRN guest can communicate with the
>> low-level ACRN hypervisor. On x86 it is implemented with the VMCALL
>> instruction.
>>
>> Co-developed-by: Jason Chen CJ <[email protected]>
>> Signed-off-by: Jason Chen CJ <[email protected]>
>> Signed-off-by: Zhao Yakui <[email protected]>
>> Reviewed-by: Thomas Gleixner <[email protected]>
>> ---
>> V1->V2: Refine the comments for the function of acrn_hypercall0/1/2
>> v2->v3: Use the "vmcall" mnemonic to replace hard-code byte definition
>> v4->v5: Use _ASM_X86_ACRN_HYPERCALL_H instead of _ASM_X86_ACRNHYPERCALL_H.
>> Use the "VMCALL" mnemonic in comment/commit log.
>> Uppercase r8/rdi/rsi/rax for hypercall parameter register in comment.
>> v5->v6: Remove explicit local register variable for inline assembly
>> ---
>> arch/x86/include/asm/acrn_hypercall.h | 84 +++++++++++++++++++++++++++++++++++
>> 1 file changed, 84 insertions(+)
>> create mode 100644 arch/x86/include/asm/acrn_hypercall.h
>>
>> diff --git a/arch/x86/include/asm/acrn_hypercall.h b/arch/x86/include/asm/acrn_hypercall.h
>> new file mode 100644
>> index 0000000..5cb438e
>> --- /dev/null
>> +++ b/arch/x86/include/asm/acrn_hypercall.h
>
> Questions:
>
> * why isn't this in acrn.h and needs to be a separate header?

I refer to the Xen/KVM hypercall to add the ACRN hypercall in one
separate header.

The ACRN hypercall is defined in one separate acrn_hypercall.h and can
be included explicitly by the *.c that needs the hypercall.


>
> * why aren't those functions used anywhere?

The hypercall will be used in driver part. Before the driver part is
added, it seems that the defined ACRN hypercall functions are not used.
Do I need to add these functions together with driver part?

Thanks
Yakui
>

2019-05-27 22:47:55

by Borislav Petkov

[permalink] [raw]
Subject: Re: [PATCH v6 4/4] x86/acrn: Add hypercall for ACRN guest

On Mon, May 27, 2019 at 10:57:09AM +0800, Zhao, Yakui wrote:
> I refer to the Xen/KVM hypercall to add the ACRN hypercall in one separate
> header.

And?

> The ACRN hypercall is defined in one separate acrn_hypercall.h and can be
> included explicitly by the *.c that needs the hypercall.

Sure but what else will need the hypercall definition except stuff which
already needs acrn.h? I.e., why is the separate header needed?

> The hypercall will be used in driver part. Before the driver part is added,
> it seems that the defined ACRN hypercall functions are not used.
> Do I need to add these functions together with driver part?

Yes, send functions together with the stuff which uses them pls.

Thx.

--
Regards/Gruss,
Boris.

ECO tip #101: Trim your mails when you reply. Srsly.

2019-05-28 01:13:24

by Zhao, Yakui

[permalink] [raw]
Subject: Re: [PATCH v6 4/4] x86/acrn: Add hypercall for ACRN guest



On 2019年05月28日 06:46, Borislav Petkov wrote:
> On Mon, May 27, 2019 at 10:57:09AM +0800, Zhao, Yakui wrote:
>> I refer to the Xen/KVM hypercall to add the ACRN hypercall in one separate
>> header.
>
> And?
>
>> The ACRN hypercall is defined in one separate acrn_hypercall.h and can be
>> included explicitly by the *.c that needs the hypercall.
>
> Sure but what else will need the hypercall definition except stuff which
> already needs acrn.h? I.e., why is the separate header needed?

In fact there is no much difference that it is defined in acrn.h or one
separate header file.
When it is sent with the driver stuff, I will add the hypercall into
acrn.h. If the further extension is needed, we can then consider whether
it is necessary to be moved into the separate header file.

My initial thought is that the acrn.h/acrn_hypercall.h defines the
different contents. Then the each source file in ACRN driver part can
include "acrn.h" or "acrn_hypercall.h" based on its requirement.
Of course it is also ok that they are added in one header file. Then it
is always included.

>
>> The hypercall will be used in driver part. Before the driver part is added,
>> it seems that the defined ACRN hypercall functions are not used.
>> Do I need to add these functions together with driver part?
>
> Yes, send functions together with the stuff which uses them pls.

Sure.

>
> Thx.
>