Message ID | 1740611284-27506-4-git-send-email-nunodasneves@linux.microsoft.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | Introduce /dev/mshv root partition driver | expand |
On Wed, Feb 26, 2025 at 03:07:57PM -0800, Nuno Das Neves wrote: > These non-nested msr and fast hypercall functions are present in x86, > but they must be available in both architetures for the root partition > driver code. > Reviewed-by: Stanislav Kinsburskii <skinsburskii@linux.microsoft.com>
On 2/26/2025 3:07 PM, Nuno Das Neves wrote: > These non-nested msr and fast hypercall functions are present in x86, > but they must be available in both architetures for the root partition nit: *architectures* > driver code. > > Signed-off-by: Nuno Das Neves <nunodasneves@linux.microsoft.com> > --- > arch/arm64/hyperv/hv_core.c | 17 +++++++++++++++++ > arch/arm64/include/asm/mshyperv.h | 12 ++++++++++++ > include/asm-generic/mshyperv.h | 2 ++ > 3 files changed, 31 insertions(+) > > diff --git a/arch/arm64/hyperv/hv_core.c b/arch/arm64/hyperv/hv_core.c > index 69004f619c57..e33a9e3c366a 100644 > --- a/arch/arm64/hyperv/hv_core.c > +++ b/arch/arm64/hyperv/hv_core.c > @@ -53,6 +53,23 @@ u64 hv_do_fast_hypercall8(u16 code, u64 input) > } > EXPORT_SYMBOL_GPL(hv_do_fast_hypercall8); > > +/* > + * hv_do_fast_hypercall16 -- Invoke the specified hypercall > + * with arguments in registers instead of physical memory. > + * Avoids the overhead of virt_to_phys for simple hypercalls. > + */ > +u64 hv_do_fast_hypercall16(u16 code, u64 input1, u64 input2) > +{ > + struct arm_smccc_res res; > + u64 control; > + > + control = (u64)code | HV_HYPERCALL_FAST_BIT; > + > + arm_smccc_1_1_hvc(HV_FUNC_ID, control, input1, input2, &res); > + return res.a0; > +} > +EXPORT_SYMBOL_GPL(hv_do_fast_hypercall16); > + I'd like this to have been in arch/arm64/include/asm/mshyperv.h like its x86 counterpart, but that's just my personal liking of symmetry. I see why it's here with its slow and 8-byte brethren. > /* > * Set a single VP register to a 64-bit value. > */ > diff --git a/arch/arm64/include/asm/mshyperv.h b/arch/arm64/include/asm/mshyperv.h > index 2e2f83bafcfb..2a900ba00622 100644 > --- a/arch/arm64/include/asm/mshyperv.h > +++ b/arch/arm64/include/asm/mshyperv.h > @@ -40,6 +40,18 @@ static inline u64 hv_get_msr(unsigned int reg) > return hv_get_vpreg(reg); > } > > +/* > + * Nested is not supported on arm64 > + */ > +static inline void hv_set_non_nested_msr(unsigned int reg, u64 value) > +{ > + hv_set_msr(reg, value); > +} empty line preferred here, also reported by checkpatch > +static inline u64 hv_get_non_nested_msr(unsigned int reg) > +{ > + return hv_get_msr(reg); > +} > + > /* SMCCC hypercall parameters */ > #define HV_SMCCC_FUNC_NUMBER 1 > #define HV_FUNC_ID ARM_SMCCC_CALL_VAL( \ > diff --git a/include/asm-generic/mshyperv.h b/include/asm-generic/mshyperv.h > index c020d5d0ec2a..258034dfd829 100644 > --- a/include/asm-generic/mshyperv.h > +++ b/include/asm-generic/mshyperv.h > @@ -72,6 +72,8 @@ extern void * __percpu *hyperv_pcpu_output_arg; > > extern u64 hv_do_hypercall(u64 control, void *inputaddr, void *outputaddr); > extern u64 hv_do_fast_hypercall8(u16 control, u64 input8); > +extern u64 hv_do_fast_hypercall16(u16 control, u64 input1, u64 input2); > + checkpatch warns against putting externs in header files, and FWIW, if hv_do_fast_hypercall16() for arm64 were in arch/arm64/include/asm/mshyperv.h like its x86 counterpart, you probably wouldn't need this? > bool hv_isolation_type_snp(void); > bool hv_isolation_type_tdx(void); >
diff --git a/arch/arm64/hyperv/hv_core.c b/arch/arm64/hyperv/hv_core.c index 69004f619c57..e33a9e3c366a 100644 --- a/arch/arm64/hyperv/hv_core.c +++ b/arch/arm64/hyperv/hv_core.c @@ -53,6 +53,23 @@ u64 hv_do_fast_hypercall8(u16 code, u64 input) } EXPORT_SYMBOL_GPL(hv_do_fast_hypercall8); +/* + * hv_do_fast_hypercall16 -- Invoke the specified hypercall + * with arguments in registers instead of physical memory. + * Avoids the overhead of virt_to_phys for simple hypercalls. + */ +u64 hv_do_fast_hypercall16(u16 code, u64 input1, u64 input2) +{ + struct arm_smccc_res res; + u64 control; + + control = (u64)code | HV_HYPERCALL_FAST_BIT; + + arm_smccc_1_1_hvc(HV_FUNC_ID, control, input1, input2, &res); + return res.a0; +} +EXPORT_SYMBOL_GPL(hv_do_fast_hypercall16); + /* * Set a single VP register to a 64-bit value. */ diff --git a/arch/arm64/include/asm/mshyperv.h b/arch/arm64/include/asm/mshyperv.h index 2e2f83bafcfb..2a900ba00622 100644 --- a/arch/arm64/include/asm/mshyperv.h +++ b/arch/arm64/include/asm/mshyperv.h @@ -40,6 +40,18 @@ static inline u64 hv_get_msr(unsigned int reg) return hv_get_vpreg(reg); } +/* + * Nested is not supported on arm64 + */ +static inline void hv_set_non_nested_msr(unsigned int reg, u64 value) +{ + hv_set_msr(reg, value); +} +static inline u64 hv_get_non_nested_msr(unsigned int reg) +{ + return hv_get_msr(reg); +} + /* SMCCC hypercall parameters */ #define HV_SMCCC_FUNC_NUMBER 1 #define HV_FUNC_ID ARM_SMCCC_CALL_VAL( \ diff --git a/include/asm-generic/mshyperv.h b/include/asm-generic/mshyperv.h index c020d5d0ec2a..258034dfd829 100644 --- a/include/asm-generic/mshyperv.h +++ b/include/asm-generic/mshyperv.h @@ -72,6 +72,8 @@ extern void * __percpu *hyperv_pcpu_output_arg; extern u64 hv_do_hypercall(u64 control, void *inputaddr, void *outputaddr); extern u64 hv_do_fast_hypercall8(u16 control, u64 input8); +extern u64 hv_do_fast_hypercall16(u16 control, u64 input1, u64 input2); + bool hv_isolation_type_snp(void); bool hv_isolation_type_tdx(void);
These non-nested msr and fast hypercall functions are present in x86, but they must be available in both architetures for the root partition driver code. Signed-off-by: Nuno Das Neves <nunodasneves@linux.microsoft.com> --- arch/arm64/hyperv/hv_core.c | 17 +++++++++++++++++ arch/arm64/include/asm/mshyperv.h | 12 ++++++++++++ include/asm-generic/mshyperv.h | 2 ++ 3 files changed, 31 insertions(+)