On Wed, Dec 18, 2024 at 12:54:20PM -0800, Roman Kisel wrote:Got it, thanks for the explanation!
Commit bc905fa8b633 ("hyperv: Switch from hyperv-tlfs.h to hyperv/hvhdk.h")
changed the type of the output pointer to `struct hv_register_assoc` from
`struct hv_get_vp_registers_output`. That leads to an incorrect computation,
and leaves the system broken.
Use the correct pointer type for the output of the GetVpRegisters hypercall.
Fixes: bc905fa8b633 ("hyperv: Switch from hyperv-tlfs.h to hyperv/hvhdk.h")
This commit is not in the mainline kernel yet, so this tag is not
needed.
That would be great and appreciated very much, thank you!
It will most likely to be wrong since I will need to rebase the
hyperv-next branch.
I can fold this patch into the original patch and leave your
Signed-off-by there.
Thank you,
Thanks,
Wei.
Signed-off-by: Roman Kisel <romank@xxxxxxxxxxxxxxxxxxx>
---
arch/x86/hyperv/hv_init.c | 6 +++---
include/hyperv/hvgdk_mini.h | 3 ---
2 files changed, 3 insertions(+), 6 deletions(-)
diff --git a/arch/x86/hyperv/hv_init.c b/arch/x86/hyperv/hv_init.c
index 3cf2a227d666..c7185c6a290b 100644
--- a/arch/x86/hyperv/hv_init.c
+++ b/arch/x86/hyperv/hv_init.c
@@ -416,13 +416,13 @@ static u8 __init get_vtl(void)
{
u64 control = HV_HYPERCALL_REP_COMP_1 | HVCALL_GET_VP_REGISTERS;
struct hv_input_get_vp_registers *input;
- struct hv_register_assoc *output;
+ struct hv_get_vp_registers_output *output;
unsigned long flags;
u64 ret;
local_irq_save(flags);
input = *this_cpu_ptr(hyperv_pcpu_input_arg);
- output = (struct hv_register_assoc *)input;
+ output = (struct hv_get_vp_registers_output *)input;
memset(input, 0, struct_size(input, names, 1));
input->partition_id = HV_PARTITION_ID_SELF;
@@ -432,7 +432,7 @@ static u8 __init get_vtl(void)
ret = hv_do_hypercall(control, input, output);
if (hv_result_success(ret)) {
- ret = output->value.reg8 & HV_X64_VTL_MASK;
+ ret = output->as64.low & HV_X64_VTL_MASK;
} else {
pr_err("Failed to get VTL(error: %lld) exiting...\n", ret);
BUG();
diff --git a/include/hyperv/hvgdk_mini.h b/include/hyperv/hvgdk_mini.h
index db3d1aaf7330..0b1a10828f33 100644
--- a/include/hyperv/hvgdk_mini.h
+++ b/include/hyperv/hvgdk_mini.h
@@ -1107,7 +1107,6 @@ union hv_register_value {
union hv_x64_pending_interruption_register pending_interruption;
};
-#if defined(CONFIG_ARM64)
/* HvGetVpRegisters returns an array of these output elements */
struct hv_get_vp_registers_output {
union {
@@ -1124,8 +1123,6 @@ struct hv_get_vp_registers_output {
};
};
-#endif /* CONFIG_ARM64 */
-
struct hv_register_assoc {
u32 name; /* enum hv_register_name */
u32 reserved1;
--
2.34.1