Re: [PATCH v4 04/17] x86/acrn: Introduce hypercall interfaces

From: Shuo A Liu
Date: Mon Oct 12 2020 - 04:49:23 EST


On Wed 30.Sep'20 at 12:54:08 +0200, Borislav Petkov wrote:
On Tue, Sep 22, 2020 at 07:42:58PM +0800, shuo.a.liu@xxxxxxxxx wrote:
From: Shuo Liu <shuo.a.liu@xxxxxxxxx>

The Service VM communicates with the hypervisor via conventional
hypercalls. VMCALL instruction is used to make the hypercalls.

ACRN hypercall ABI:
* Hypercall number is in R8 register.
* Up to 2 parameters are in RDI and RSI registers.
* Return value is in RAX register.

I'm assuming this is already cast in stone in the HV and it cannot be
changed?

Yes, it is.


Introduce the ACRN hypercall interfaces. Because GCC doesn't support R8
register as direct register constraints, here are two ways to use R8 in
extended asm:
1) use explicit register variable as input
2) use supported constraint as input with a explicit MOV to R8 in
beginning of asm

The number of instructions of above two ways are same.
Asm code from 1)
38: 41 b8 00 00 00 80 mov $0x80000000,%r8d
3e: 48 89 c7 mov %rax,%rdi
41: 0f 01 c1 vmcall
Here, writes to the lower dword (%r8d) clear the upper dword of %r8 when
the CPU is in 64-bit mode.

Asm code from 2)
38: 48 89 c7 mov %rax,%rdi
3b: 49 b8 00 00 00 80 00 movabs $0x80000000,%r8
42: 00 00 00
45: 0f 01 c1 vmcall

Choose 1) for code simplicity and a little bit of code size
optimization.

What?

How much "optimization" is this actually? A couple of bytes?

And all that for this

/* Nothing can come between the r8 assignment and the asm: */

restriction?

If it is only a couple of bytes, just do the explicit MOV to %r8 and
f'get about it.

Yes. Just a couple of bytes. Number of instructions is same.
sure, i can change to approach 2)
2) use supported constraint as input with a explicit MOV to R8
in beginning of asm

Thanks
shuo