Message ID | 20240428100518.1642324-3-maobibo@loongson.cn (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | LoongArch: Add pv ipi support on LoongArch VM | expand |
Hi, Bibo, On Sun, Apr 28, 2024 at 6:05 PM Bibo Mao <maobibo@loongson.cn> wrote: > > On LoongArch system, there is hypercall instruction special for > virtualization. When system executes this instruction on host side, > there is illegal instruction exception reported, however it will > trap into host when it is executed in VM mode. > > When hypercall is emulated, A0 register is set with value > KVM_HCALL_INVALID_CODE, rather than inject EXCCODE_INE invalid > instruction exception. So VM can continue to executing the next code. > > Signed-off-by: Bibo Mao <maobibo@loongson.cn> > --- > arch/loongarch/include/asm/Kbuild | 1 - > arch/loongarch/include/asm/kvm_para.h | 26 ++++++++++++++++++++++++++ > arch/loongarch/include/uapi/asm/Kbuild | 2 -- > arch/loongarch/kvm/exit.c | 10 ++++++++++ > 4 files changed, 36 insertions(+), 3 deletions(-) > create mode 100644 arch/loongarch/include/asm/kvm_para.h > delete mode 100644 arch/loongarch/include/uapi/asm/Kbuild > > diff --git a/arch/loongarch/include/asm/Kbuild b/arch/loongarch/include/asm/Kbuild > index 2dbec7853ae8..c862672ed953 100644 > --- a/arch/loongarch/include/asm/Kbuild > +++ b/arch/loongarch/include/asm/Kbuild > @@ -26,4 +26,3 @@ generic-y += poll.h > generic-y += param.h > generic-y += posix_types.h > generic-y += resource.h > -generic-y += kvm_para.h > diff --git a/arch/loongarch/include/asm/kvm_para.h b/arch/loongarch/include/asm/kvm_para.h > new file mode 100644 > index 000000000000..d48f993ae206 > --- /dev/null > +++ b/arch/loongarch/include/asm/kvm_para.h > @@ -0,0 +1,26 @@ > +/* SPDX-License-Identifier: GPL-2.0 */ > +#ifndef _ASM_LOONGARCH_KVM_PARA_H > +#define _ASM_LOONGARCH_KVM_PARA_H > + > +/* > + * LoongArch hypercall return code > + */ > +#define KVM_HCALL_STATUS_SUCCESS 0 > +#define KVM_HCALL_INVALID_CODE -1UL > +#define KVM_HCALL_INVALID_PARAMETER -2UL > + > +static inline unsigned int kvm_arch_para_features(void) > +{ > + return 0; > +} > + > +static inline unsigned int kvm_arch_para_hints(void) > +{ > + return 0; > +} > + > +static inline bool kvm_check_and_clear_guest_paused(void) > +{ > + return false; > +} > +#endif /* _ASM_LOONGARCH_KVM_PARA_H */ > diff --git a/arch/loongarch/include/uapi/asm/Kbuild b/arch/loongarch/include/uapi/asm/Kbuild > deleted file mode 100644 > index 4aa680ca2e5f..000000000000 > --- a/arch/loongarch/include/uapi/asm/Kbuild > +++ /dev/null > @@ -1,2 +0,0 @@ > -# SPDX-License-Identifier: GPL-2.0 > -generic-y += kvm_para.h This file shouldn't be removed. Huacai > diff --git a/arch/loongarch/kvm/exit.c b/arch/loongarch/kvm/exit.c > index ed1d89d53e2e..923bbca9bd22 100644 > --- a/arch/loongarch/kvm/exit.c > +++ b/arch/loongarch/kvm/exit.c > @@ -685,6 +685,15 @@ static int kvm_handle_lasx_disabled(struct kvm_vcpu *vcpu) > return RESUME_GUEST; > } > > +static int kvm_handle_hypercall(struct kvm_vcpu *vcpu) > +{ > + update_pc(&vcpu->arch); > + > + /* Treat it as noop intruction, only set return value */ > + vcpu->arch.gprs[LOONGARCH_GPR_A0] = KVM_HCALL_INVALID_CODE; > + return RESUME_GUEST; > +} > + > /* > * LoongArch KVM callback handling for unimplemented guest exiting > */ > @@ -716,6 +725,7 @@ static exit_handle_fn kvm_fault_tables[EXCCODE_INT_START] = { > [EXCCODE_LSXDIS] = kvm_handle_lsx_disabled, > [EXCCODE_LASXDIS] = kvm_handle_lasx_disabled, > [EXCCODE_GSPR] = kvm_handle_gspr, > + [EXCCODE_HVC] = kvm_handle_hypercall, > }; > > int kvm_handle_fault(struct kvm_vcpu *vcpu, int fault) > -- > 2.39.3 > >
On 2024/5/6 上午9:54, Huacai Chen wrote: > Hi, Bibo, > > On Sun, Apr 28, 2024 at 6:05 PM Bibo Mao <maobibo@loongson.cn> wrote: >> >> On LoongArch system, there is hypercall instruction special for >> virtualization. When system executes this instruction on host side, >> there is illegal instruction exception reported, however it will >> trap into host when it is executed in VM mode. >> >> When hypercall is emulated, A0 register is set with value >> KVM_HCALL_INVALID_CODE, rather than inject EXCCODE_INE invalid >> instruction exception. So VM can continue to executing the next code. >> >> Signed-off-by: Bibo Mao <maobibo@loongson.cn> >> --- >> arch/loongarch/include/asm/Kbuild | 1 - >> arch/loongarch/include/asm/kvm_para.h | 26 ++++++++++++++++++++++++++ >> arch/loongarch/include/uapi/asm/Kbuild | 2 -- >> arch/loongarch/kvm/exit.c | 10 ++++++++++ >> 4 files changed, 36 insertions(+), 3 deletions(-) >> create mode 100644 arch/loongarch/include/asm/kvm_para.h >> delete mode 100644 arch/loongarch/include/uapi/asm/Kbuild >> >> diff --git a/arch/loongarch/include/asm/Kbuild b/arch/loongarch/include/asm/Kbuild >> index 2dbec7853ae8..c862672ed953 100644 >> --- a/arch/loongarch/include/asm/Kbuild >> +++ b/arch/loongarch/include/asm/Kbuild >> @@ -26,4 +26,3 @@ generic-y += poll.h >> generic-y += param.h >> generic-y += posix_types.h >> generic-y += resource.h >> -generic-y += kvm_para.h >> diff --git a/arch/loongarch/include/asm/kvm_para.h b/arch/loongarch/include/asm/kvm_para.h >> new file mode 100644 >> index 000000000000..d48f993ae206 >> --- /dev/null >> +++ b/arch/loongarch/include/asm/kvm_para.h >> @@ -0,0 +1,26 @@ >> +/* SPDX-License-Identifier: GPL-2.0 */ >> +#ifndef _ASM_LOONGARCH_KVM_PARA_H >> +#define _ASM_LOONGARCH_KVM_PARA_H >> + >> +/* >> + * LoongArch hypercall return code >> + */ >> +#define KVM_HCALL_STATUS_SUCCESS 0 >> +#define KVM_HCALL_INVALID_CODE -1UL >> +#define KVM_HCALL_INVALID_PARAMETER -2UL >> + >> +static inline unsigned int kvm_arch_para_features(void) >> +{ >> + return 0; >> +} >> + >> +static inline unsigned int kvm_arch_para_hints(void) >> +{ >> + return 0; >> +} >> + >> +static inline bool kvm_check_and_clear_guest_paused(void) >> +{ >> + return false; >> +} >> +#endif /* _ASM_LOONGARCH_KVM_PARA_H */ >> diff --git a/arch/loongarch/include/uapi/asm/Kbuild b/arch/loongarch/include/uapi/asm/Kbuild >> deleted file mode 100644 >> index 4aa680ca2e5f..000000000000 >> --- a/arch/loongarch/include/uapi/asm/Kbuild >> +++ /dev/null >> @@ -1,2 +0,0 @@ >> -# SPDX-License-Identifier: GPL-2.0 >> -generic-y += kvm_para.h > This file shouldn't be removed. yes, uapi kvm_param.h is needed for Loongarch, and there will be problem if it is removed. And it should kept unchanged. Regards Bibo Mao > > Huacai > >> diff --git a/arch/loongarch/kvm/exit.c b/arch/loongarch/kvm/exit.c >> index ed1d89d53e2e..923bbca9bd22 100644 >> --- a/arch/loongarch/kvm/exit.c >> +++ b/arch/loongarch/kvm/exit.c >> @@ -685,6 +685,15 @@ static int kvm_handle_lasx_disabled(struct kvm_vcpu *vcpu) >> return RESUME_GUEST; >> } >> >> +static int kvm_handle_hypercall(struct kvm_vcpu *vcpu) >> +{ >> + update_pc(&vcpu->arch); >> + >> + /* Treat it as noop intruction, only set return value */ >> + vcpu->arch.gprs[LOONGARCH_GPR_A0] = KVM_HCALL_INVALID_CODE; >> + return RESUME_GUEST; >> +} >> + >> /* >> * LoongArch KVM callback handling for unimplemented guest exiting >> */ >> @@ -716,6 +725,7 @@ static exit_handle_fn kvm_fault_tables[EXCCODE_INT_START] = { >> [EXCCODE_LSXDIS] = kvm_handle_lsx_disabled, >> [EXCCODE_LASXDIS] = kvm_handle_lasx_disabled, >> [EXCCODE_GSPR] = kvm_handle_gspr, >> + [EXCCODE_HVC] = kvm_handle_hypercall, >> }; >> >> int kvm_handle_fault(struct kvm_vcpu *vcpu, int fault) >> -- >> 2.39.3 >> >>
diff --git a/arch/loongarch/include/asm/Kbuild b/arch/loongarch/include/asm/Kbuild index 2dbec7853ae8..c862672ed953 100644 --- a/arch/loongarch/include/asm/Kbuild +++ b/arch/loongarch/include/asm/Kbuild @@ -26,4 +26,3 @@ generic-y += poll.h generic-y += param.h generic-y += posix_types.h generic-y += resource.h -generic-y += kvm_para.h diff --git a/arch/loongarch/include/asm/kvm_para.h b/arch/loongarch/include/asm/kvm_para.h new file mode 100644 index 000000000000..d48f993ae206 --- /dev/null +++ b/arch/loongarch/include/asm/kvm_para.h @@ -0,0 +1,26 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#ifndef _ASM_LOONGARCH_KVM_PARA_H +#define _ASM_LOONGARCH_KVM_PARA_H + +/* + * LoongArch hypercall return code + */ +#define KVM_HCALL_STATUS_SUCCESS 0 +#define KVM_HCALL_INVALID_CODE -1UL +#define KVM_HCALL_INVALID_PARAMETER -2UL + +static inline unsigned int kvm_arch_para_features(void) +{ + return 0; +} + +static inline unsigned int kvm_arch_para_hints(void) +{ + return 0; +} + +static inline bool kvm_check_and_clear_guest_paused(void) +{ + return false; +} +#endif /* _ASM_LOONGARCH_KVM_PARA_H */ diff --git a/arch/loongarch/include/uapi/asm/Kbuild b/arch/loongarch/include/uapi/asm/Kbuild deleted file mode 100644 index 4aa680ca2e5f..000000000000 --- a/arch/loongarch/include/uapi/asm/Kbuild +++ /dev/null @@ -1,2 +0,0 @@ -# SPDX-License-Identifier: GPL-2.0 -generic-y += kvm_para.h diff --git a/arch/loongarch/kvm/exit.c b/arch/loongarch/kvm/exit.c index ed1d89d53e2e..923bbca9bd22 100644 --- a/arch/loongarch/kvm/exit.c +++ b/arch/loongarch/kvm/exit.c @@ -685,6 +685,15 @@ static int kvm_handle_lasx_disabled(struct kvm_vcpu *vcpu) return RESUME_GUEST; } +static int kvm_handle_hypercall(struct kvm_vcpu *vcpu) +{ + update_pc(&vcpu->arch); + + /* Treat it as noop intruction, only set return value */ + vcpu->arch.gprs[LOONGARCH_GPR_A0] = KVM_HCALL_INVALID_CODE; + return RESUME_GUEST; +} + /* * LoongArch KVM callback handling for unimplemented guest exiting */ @@ -716,6 +725,7 @@ static exit_handle_fn kvm_fault_tables[EXCCODE_INT_START] = { [EXCCODE_LSXDIS] = kvm_handle_lsx_disabled, [EXCCODE_LASXDIS] = kvm_handle_lasx_disabled, [EXCCODE_GSPR] = kvm_handle_gspr, + [EXCCODE_HVC] = kvm_handle_hypercall, }; int kvm_handle_fault(struct kvm_vcpu *vcpu, int fault)
On LoongArch system, there is hypercall instruction special for virtualization. When system executes this instruction on host side, there is illegal instruction exception reported, however it will trap into host when it is executed in VM mode. When hypercall is emulated, A0 register is set with value KVM_HCALL_INVALID_CODE, rather than inject EXCCODE_INE invalid instruction exception. So VM can continue to executing the next code. Signed-off-by: Bibo Mao <maobibo@loongson.cn> --- arch/loongarch/include/asm/Kbuild | 1 - arch/loongarch/include/asm/kvm_para.h | 26 ++++++++++++++++++++++++++ arch/loongarch/include/uapi/asm/Kbuild | 2 -- arch/loongarch/kvm/exit.c | 10 ++++++++++ 4 files changed, 36 insertions(+), 3 deletions(-) create mode 100644 arch/loongarch/include/asm/kvm_para.h delete mode 100644 arch/loongarch/include/uapi/asm/Kbuild