ANDROID: virt: geniezone: Refactoring vm capability to align with upstream v6

- Move the vm capability's definitions to uapi header file `gzvm.h`
- Move the definitions of GZVM_CAP_ARM_PROTECTED_VM's subcommands to
  uapi header file `gzvm.h`
- Rename, remove the substring containing `ARM`, and change "IPA" to
  "GPA"

Change-Id: I89dd810d4bc3cd31ae7ff76e731ff62d7412fa9a
Signed-off-by: kevenny hsieh <kevenny.hsieh@mediatek.com>
Signed-off-by: Yingshiuan Pan <yingshiuan.pan@mediatek.com>
Signed-off-by: Liju-Clr Chen <liju-clr.chen@mediatek.com>
Signed-off-by: Yi-De Wu <yi-de.wu@mediatek.com>
Bug: 301179926
Link: https://lore.kernel.org/all/20230919111210.19615-7-yi-de.wu@mediatek.com/
This commit is contained in:
Yi-De Wu
2023-08-21 14:32:35 +08:00
committed by Todd Kjos
parent fb3444af07
commit e348fe6d2d
4 changed files with 41 additions and 43 deletions

View File

@@ -45,7 +45,7 @@ int gzvm_arch_set_memregion(u16 vm_id, size_t buf_size,
buf_size, region, 0, 0, 0, 0, &res); buf_size, region, 0, 0, 0, 0, &res);
} }
static int gzvm_cap_arm_vm_ipa_size(void __user *argp) static int gzvm_cap_vm_gpa_size(void __user *argp)
{ {
__u64 value = CONFIG_ARM64_PA_BITS; __u64 value = CONFIG_ARM64_PA_BITS;
@@ -57,26 +57,26 @@ static int gzvm_cap_arm_vm_ipa_size(void __user *argp)
int gzvm_arch_check_extension(struct gzvm *gzvm, __u64 cap, void __user *argp) int gzvm_arch_check_extension(struct gzvm *gzvm, __u64 cap, void __user *argp)
{ {
int ret = -EOPNOTSUPP; int ret;
switch (cap) { switch (cap) {
case GZVM_CAP_ARM_PROTECTED_VM: { case GZVM_CAP_PROTECTED_VM: {
__u64 success = 1; __u64 success = 1;
if (copy_to_user(argp, &success, sizeof(__u64))) if (copy_to_user(argp, &success, sizeof(__u64)))
return -EFAULT; return -EFAULT;
ret = 0;
break; return 0;
} }
case GZVM_CAP_ARM_VM_IPA_SIZE: { case GZVM_CAP_VM_GPA_SIZE: {
ret = gzvm_cap_arm_vm_ipa_size(argp); ret = gzvm_cap_vm_gpa_size(argp);
break; return ret;
} }
default: default:
ret = -EOPNOTSUPP; break;
} }
return ret; return -EOPNOTSUPP;
} }
/** /**
@@ -167,7 +167,7 @@ static int gzvm_vm_ioctl_get_pvmfw_size(struct gzvm *gzvm,
} }
/** /**
* gzvm_vm_ioctl_cap_pvm() - Proceed GZVM_CAP_ARM_PROTECTED_VM's subcommands * gzvm_vm_ioctl_cap_pvm() - Proceed GZVM_CAP_PROTECTED_VM's subcommands
* @gzvm: Pointer to struct gzvm. * @gzvm: Pointer to struct gzvm.
* @cap: Pointer to struct gzvm_enable_cap. * @cap: Pointer to struct gzvm_enable_cap.
* @argp: Pointer to struct gzvm_enable_cap in user space. * @argp: Pointer to struct gzvm_enable_cap in user space.
@@ -180,24 +180,23 @@ static int gzvm_vm_ioctl_cap_pvm(struct gzvm *gzvm,
struct gzvm_enable_cap *cap, struct gzvm_enable_cap *cap,
void __user *argp) void __user *argp)
{ {
int ret = -EINVAL;
struct arm_smccc_res res = {0}; struct arm_smccc_res res = {0};
int ret;
switch (cap->args[0]) { switch (cap->args[0]) {
case GZVM_CAP_ARM_PVM_SET_PVMFW_IPA: case GZVM_CAP_PVM_SET_PVMFW_GPA:
fallthrough; fallthrough;
case GZVM_CAP_ARM_PVM_SET_PROTECTED_VM: case GZVM_CAP_PVM_SET_PROTECTED_VM:
ret = gzvm_vm_arch_enable_cap(gzvm, cap, &res); ret = gzvm_vm_arch_enable_cap(gzvm, cap, &res);
break; return ret;
case GZVM_CAP_ARM_PVM_GET_PVMFW_SIZE: case GZVM_CAP_PVM_GET_PVMFW_SIZE:
ret = gzvm_vm_ioctl_get_pvmfw_size(gzvm, cap, argp); ret = gzvm_vm_ioctl_get_pvmfw_size(gzvm, cap, argp);
break; return ret;
default: default:
ret = -EINVAL;
break; break;
} }
return ret; return -EINVAL;
} }
int gzvm_vm_ioctl_arch_enable_cap(struct gzvm *gzvm, int gzvm_vm_ioctl_arch_enable_cap(struct gzvm *gzvm,
@@ -207,7 +206,7 @@ int gzvm_vm_ioctl_arch_enable_cap(struct gzvm *gzvm,
int ret = -EINVAL; int ret = -EINVAL;
switch (cap->cap) { switch (cap->cap) {
case GZVM_CAP_ARM_PROTECTED_VM: case GZVM_CAP_PROTECTED_VM:
ret = gzvm_vm_ioctl_cap_pvm(gzvm, cap, argp); ret = gzvm_vm_ioctl_cap_pvm(gzvm, cap, argp);
break; break;
default: default:

View File

@@ -8,15 +8,6 @@
#include <linux/types.h> #include <linux/types.h>
#define GZVM_CAP_ARM_VM_IPA_SIZE 165
#define GZVM_CAP_ARM_PROTECTED_VM 0xffbadab1
/* sub-commands put in args[0] for GZVM_CAP_ARM_PROTECTED_VM */
#define GZVM_CAP_ARM_PVM_SET_PVMFW_IPA 0
#define GZVM_CAP_ARM_PVM_GET_PVMFW_SIZE 1
/* GZVM_CAP_ARM_PVM_SET_PROTECTED_VM only sets protected but not load pvmfw */
#define GZVM_CAP_ARM_PVM_SET_PROTECTED_VM 2
/* /*
* Architecture specific registers are to be defined in arch headers and * Architecture specific registers are to be defined in arch headers and
* ORed with the arch identifier. * ORed with the arch identifier.

View File

@@ -50,8 +50,8 @@ int gzvm_err_to_errno(unsigned long err)
* @args: Pointer in u64 from userspace * @args: Pointer in u64 from userspace
* *
* Return: * Return:
* * 0 - Support, no error * * 0 - Supported, no error
* * -EOPNOTSUPP - Not support * * -EOPNOTSUPP - Unsupported
* * -EFAULT - Failed to get data from userspace * * -EFAULT - Failed to get data from userspace
*/ */
long gzvm_dev_ioctl_check_extension(struct gzvm *gzvm, unsigned long args) long gzvm_dev_ioctl_check_extension(struct gzvm *gzvm, unsigned long args)
@@ -67,22 +67,22 @@ long gzvm_dev_ioctl_check_extension(struct gzvm *gzvm, unsigned long args)
static long gzvm_dev_ioctl(struct file *filp, unsigned int cmd, static long gzvm_dev_ioctl(struct file *filp, unsigned int cmd,
unsigned long user_args) unsigned long user_args)
{ {
long ret = -ENOTTY; long ret;
switch (cmd) { switch (cmd) {
case GZVM_CREATE_VM: case GZVM_CREATE_VM:
ret = gzvm_dev_ioctl_create_vm(user_args); ret = gzvm_dev_ioctl_create_vm(user_args);
break; return ret;
case GZVM_CHECK_EXTENSION: case GZVM_CHECK_EXTENSION:
if (!user_args) if (!user_args)
return -EINVAL; return -EINVAL;
ret = gzvm_dev_ioctl_check_extension(NULL, user_args); ret = gzvm_dev_ioctl_check_extension(NULL, user_args);
break; return ret;
default: default:
ret = -ENOTTY; break;
} }
return ret; return -ENOTTY;
} }
static const struct file_operations gzvm_chardev_ops = { static const struct file_operations gzvm_chardev_ops = {

View File

@@ -18,6 +18,15 @@
#include <asm/gzvm_arch.h> #include <asm/gzvm_arch.h>
#define GZVM_CAP_VM_GPA_SIZE 0xa5
#define GZVM_CAP_PROTECTED_VM 0xffbadab1
/* sub-commands put in args[0] for GZVM_CAP_PROTECTED_VM */
#define GZVM_CAP_PVM_SET_PVMFW_GPA 0
#define GZVM_CAP_PVM_GET_PVMFW_SIZE 1
/* GZVM_CAP_PVM_SET_PROTECTED_VM only sets protected but not load pvmfw */
#define GZVM_CAP_PVM_SET_PROTECTED_VM 2
/* GZVM ioctls */ /* GZVM ioctls */
#define GZVM_IOC_MAGIC 0x92 /* gz */ #define GZVM_IOC_MAGIC 0x92 /* gz */
@@ -26,7 +35,7 @@
/* /*
* Check if the given capability is supported or not. * Check if the given capability is supported or not.
* The argument is capability. Ex. GZVM_CAP_ARM_PROTECTED_VM or GZVM_CAP_ARM_VM_IPA_SIZE * The argument is capability. Ex. GZVM_CAP_PROTECTED_VM or GZVM_CAP_VM_GPA_SIZE
* return is 0 (supported, no error) * return is 0 (supported, no error)
* return is -EOPNOTSUPP (unsupported) * return is -EOPNOTSUPP (unsupported)
* return is -EFAULT (failed to get the argument from userspace) * return is -EFAULT (failed to get the argument from userspace)
@@ -248,14 +257,13 @@ struct gzvm_vcpu_run {
}; };
}; };
/* for GZVM_ENABLE_CAP */ /**
* struct gzvm_enable_cap: The `capability support` on GenieZone hypervisor
* @cap: `GZVM_CAP_ARM_PROTECTED_VM` or `GZVM_CAP_ARM_VM_IPA_SIZE`
* @args: x3-x7 registers can be used for additional args
*/
struct gzvm_enable_cap { struct gzvm_enable_cap {
/* in */
__u64 cap; __u64 cap;
/**
* we have total 5 (8 - 3) registers can be used for
* additional args
*/
__u64 args[5]; __u64 args[5];
}; };