Hi,
On 21/04/2020 18:30, Roger Pau Monné wrote:
On Tue, Apr 21, 2020 at 11:13:23AM +0200, Jan Beulich wrote:
First of all avoid excessive conversions. copy_{from,to}_guest(), for
example, work fine with all of XEN_GUEST_HANDLE{,_64,_PARAM}().
I'm not sure I understand the difference between those two, as they
are both placeholders for linear guest addresses?
AFAICT XEN_GUEST_HANDLE should be used for guest pointers inside of an
hypercall struct, while XEN_GUEST_HANDLE_PARAM is for guest pointers
as hypercall arguments. But those are both just guest pointers,
whether they are a parameter to the hypercall or a field in a
struct, and hence could use the same type?
I assume there's some reason for not doing so, and I see the comment
about other arches, but again a linear guest address is just that in
all arches, regardless of it's placement.
On Arm:
* XEN_GUEST_HANDLE() will always be 64-bit on both 32-bit and 64-bit
hypervisor.
* XEN_GUEST_HANDLE_PARAM() will be 32-bit for 32-bit hypervisor. For
64-bit hypervisor, it will be 64-bit.
Per the ABI, each argument only fit a register. So you could not use
XEN_GUEST_HANDLE() as now an argument will be held in 2 registers on 32-bit.
We also want the structure layout to be the same for 32-bit and 64-bit.
So using XEN_GUEST_HANDLE_PARAM() everywhere is not the solution as the
virtual address is not the same.
We could possibly convert internally XEN_GUEST_HANDLE_PARAM() to
XEN_GUEST_HANDLE(), but I am not sure how this would be beneficial. We
would have to use 2 registers for arm 32-bit everytime.
Cheers,
--
Julien Grall