RE: [PATCH 5/6] x86/hyperv: Support hypercalls for TDX guests
From: Dexuan Cui
Date: Mon Nov 28 2022 - 15:36:47 EST
> From: Dave Hansen <dave.hansen@xxxxxxxxx>
> Sent: Monday, November 28, 2022 11:48 AM
>
> On 11/28/22 11:37, Dexuan Cui wrote:
> >> From: Dave Hansen <dave.hansen@xxxxxxxxx>
> ...
> >> How do we know, for instance, that no hypercall using this interface
> >> will *ever* take the 0x0 physical address as an argument?
> >
> > A 0x0 physical address as an argument still works: the 0 is passed
> > to the hypervisor using GHCI. I believe Hyper-V interprets the 0 as
> > an error (if the param is needed), and returns an "invalid parameter"
> > error code to the guest.
>
> I don't see any data in the public documentation to support the claim
> that 0x0 is a special argument for either the input or output GPA
> parameters.
Sorry, I didn't make it clear. I meant: for some hypercalls, Hyper-V
doesn't really need an "input" param or an "output" param, so Linux
passes 0 for such a "not needed" param. Maybe Linux can pass any
value for such a "not needed" param, if Hyper-V just ignores the
"not needed" param. Some examples:
arch/x86/hyperv/hv_init.c: hv_get_partition_id():
status = hv_do_hypercall(HVCALL_GET_PARTITION_ID, NULL, output_page);
drivers/pci/controller/pci-hyperv.c:
res = hv_do_hypercall(HVCALL_RETARGET_INTERRUPT | (var_size << 17),
params, NULL);
If a param is needed and is supposed to be a non-zero memory address,
Linux running as a TDX guest must pass "cc_mkdec(address)" rather than
"address", otherwise I suspect the result is undefined, e.g. Hyper-V might
return an error to the guest, or Hyper-V might just terminate the guest,
especially if Linux passes 0 or cc_mkdec(0).
Currently all the users of hv_do_hypercall() pass valid arguments.
> This is despite some actual discussion on things like their alignment
> requirements[1] and interactions with overlay pages.
>
> So, either you are mistaken about that behavior, or it looks like the
> documentation needs updating.
The above is just my conjecture. I don't know how exactly Hyper-V works.