hc
2023-02-13 e440ec23c5a540cdd3f7464e8779219be6fd3d95
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
/*
 * This file is subject to the terms and conditions of the GNU General Public
 * License.  See the file "COPYING" in the main directory of this archive
 * for more details.
 *
 * KVM/MIPS: Hypercall handling.
 *
 * Copyright (C) 2015  Imagination Technologies Ltd.
 */
 
#include <linux/kernel.h>
#include <linux/kvm_host.h>
#include <linux/kvm_para.h>
 
#define MAX_HYPCALL_ARGS    4
 
enum emulation_result kvm_mips_emul_hypcall(struct kvm_vcpu *vcpu,
                       union mips_instruction inst)
{
   unsigned int code = (inst.co_format.code >> 5) & 0x3ff;
 
   kvm_debug("[%#lx] HYPCALL %#03x\n", vcpu->arch.pc, code);
 
   switch (code) {
   case 0:
       return EMULATE_HYPERCALL;
   default:
       return EMULATE_FAIL;
   };
}
 
static int kvm_mips_hypercall(struct kvm_vcpu *vcpu, unsigned long num,
                 const unsigned long *args, unsigned long *hret)
{
   /* Report unimplemented hypercall to guest */
   *hret = -KVM_ENOSYS;
   return RESUME_GUEST;
}
 
int kvm_mips_handle_hypcall(struct kvm_vcpu *vcpu)
{
   unsigned long num, args[MAX_HYPCALL_ARGS];
 
   /* read hypcall number and arguments */
   num = vcpu->arch.gprs[2];    /* v0 */
   args[0] = vcpu->arch.gprs[4];    /* a0 */
   args[1] = vcpu->arch.gprs[5];    /* a1 */
   args[2] = vcpu->arch.gprs[6];    /* a2 */
   args[3] = vcpu->arch.gprs[7];    /* a3 */
 
   return kvm_mips_hypercall(vcpu, num,
                 args, &vcpu->arch.gprs[2] /* v0 */);
}