FROMLIST: virt: geniezone: Add dtb config support
Hypervisor might need to know the accurate address and size of dtb passed from userspace. And then hypervisor would parse the dtb and get vm information. Change-Id: I23194d45f5c60555ba7fde9dd8d393443fd41310 Signed-off-by: Jerry Wang <ze-yu.wang@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: 280363874 Link: https://lore.kernel.org/lkml/20230727080005.14474-10-yi-de.wu@mediatek.com/
This commit is contained in:
parent
39bd65ec1d
commit
3e079b7691
@ -23,6 +23,7 @@ enum {
|
||||
GZVM_FUNC_ENABLE_CAP = 13,
|
||||
GZVM_FUNC_INFORM_EXIT = 14,
|
||||
GZVM_FUNC_MEMREGION_PURPOSE = 15,
|
||||
GZVM_FUNC_SET_DTB_CONFIG = 16,
|
||||
NR_GZVM_FUNC,
|
||||
};
|
||||
|
||||
@ -46,6 +47,7 @@ enum {
|
||||
#define MT_HVC_GZVM_ENABLE_CAP GZVM_HCALL_ID(GZVM_FUNC_ENABLE_CAP)
|
||||
#define MT_HVC_GZVM_INFORM_EXIT GZVM_HCALL_ID(GZVM_FUNC_INFORM_EXIT)
|
||||
#define MT_HVC_GZVM_MEMREGION_PURPOSE GZVM_HCALL_ID(GZVM_FUNC_MEMREGION_PURPOSE)
|
||||
#define MT_HVC_GZVM_SET_DTB_CONFIG GZVM_HCALL_ID(GZVM_FUNC_SET_DTB_CONFIG)
|
||||
|
||||
#define GIC_V3_NR_LRS 16
|
||||
|
||||
|
@ -119,6 +119,15 @@ int gzvm_arch_memregion_purpose(struct gzvm *gzvm,
|
||||
mem->flags, 0, 0, 0, &res);
|
||||
}
|
||||
|
||||
int gzvm_arch_set_dtb_config(struct gzvm *gzvm, struct gzvm_dtb_config *cfg)
|
||||
{
|
||||
struct arm_smccc_res res;
|
||||
|
||||
return gzvm_hypcall_wrapper(MT_HVC_GZVM_SET_DTB_CONFIG, gzvm->vm_id,
|
||||
cfg->dtb_addr, cfg->dtb_size, 0, 0, 0, 0,
|
||||
&res);
|
||||
}
|
||||
|
||||
static int gzvm_vm_arch_enable_cap(struct gzvm *gzvm,
|
||||
struct gzvm_enable_cap *cap,
|
||||
struct arm_smccc_res *res)
|
||||
|
@ -413,6 +413,16 @@ static long gzvm_vm_ioctl(struct file *filp, unsigned int ioctl,
|
||||
ret = gzvm_vm_ioctl_enable_cap(gzvm, &cap, argp);
|
||||
break;
|
||||
}
|
||||
case GZVM_SET_DTB_CONFIG: {
|
||||
struct gzvm_dtb_config cfg;
|
||||
|
||||
if (copy_from_user(&cfg, argp, sizeof(cfg))) {
|
||||
ret = -EFAULT;
|
||||
goto out;
|
||||
}
|
||||
ret = gzvm_arch_set_dtb_config(gzvm, &cfg);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
ret = -ENOTTY;
|
||||
}
|
||||
|
@ -144,6 +144,7 @@ void gzvm_vm_irqfd_release(struct gzvm *gzvm);
|
||||
|
||||
int gzvm_arch_memregion_purpose(struct gzvm *gzvm,
|
||||
struct gzvm_userspace_memory_region *mem);
|
||||
int gzvm_arch_set_dtb_config(struct gzvm *gzvm, struct gzvm_dtb_config *args);
|
||||
|
||||
int gzvm_init_ioeventfd(struct gzvm *gzvm);
|
||||
int gzvm_ioeventfd(struct gzvm *gzvm, struct gzvm_ioeventfd *args);
|
||||
|
@ -326,4 +326,18 @@ struct gzvm_ioeventfd {
|
||||
|
||||
#define GZVM_IOEVENTFD _IOW(GZVM_IOC_MAGIC, 0x79, struct gzvm_ioeventfd)
|
||||
|
||||
/**
|
||||
* struct gzvm_dtb_config: store address and size of dtb passed from userspace
|
||||
*
|
||||
* @dtb_addr: dtb address set by VMM (guset memory)
|
||||
* @dtb_size: dtb size
|
||||
*/
|
||||
struct gzvm_dtb_config {
|
||||
__u64 dtb_addr;
|
||||
__u64 dtb_size;
|
||||
};
|
||||
|
||||
#define GZVM_SET_DTB_CONFIG _IOW(GZVM_IOC_MAGIC, 0xff, \
|
||||
struct gzvm_dtb_config)
|
||||
|
||||
#endif /* __GZVM_H__ */
|
||||
|
Loading…
Reference in New Issue
Block a user