> 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.