uti: Replace data types represented as arrays with C structures
Defining C structures for the following objects: (1) Remote and local context (2) Stack of system call arguments / return values Change-Id: Iafbb6c795bd765e3c78c54a255d8a1e4d4536288
This commit is contained in:
@@ -279,6 +279,14 @@ get_fs_ctx(void *ctx)
|
||||
return tctx->fs;
|
||||
}
|
||||
|
||||
unsigned long
|
||||
get_rsp_ctx(void *ctx)
|
||||
{
|
||||
struct trans_uctx *tctx = ctx;
|
||||
|
||||
return tctx->rsp;
|
||||
}
|
||||
|
||||
#ifdef POSTK_DEBUG_ARCH_DEP_83 /* arch depend translate_rva_to_rpa() move */
|
||||
int translate_rva_to_rpa(ihk_os_t os, unsigned long rpt, unsigned long rva,
|
||||
unsigned long *rpap, unsigned long *pgsizep)
|
||||
|
||||
@@ -1246,6 +1246,9 @@ int mcexec_syscall(struct mcctrl_usrdata *ud, struct ikc_scd_packet *packet)
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!wqhln) {
|
||||
dprintk("%s: uti: INFO: target worker (tid=%d) not found in wq_list\n", __FUNCTION__, packet->req.ttid);
|
||||
}
|
||||
} else {
|
||||
if (!wqhln) {
|
||||
printk("%s: WARNING: no target thread (tid=%d) found for exact request??\n",
|
||||
@@ -2386,76 +2389,76 @@ extern void set_user_sp(unsigned long);
|
||||
extern void restore_fs(unsigned long fs);
|
||||
extern void save_fs_ctx(void *);
|
||||
extern unsigned long get_fs_ctx(void *);
|
||||
extern unsigned long get_rsp_ctx(void *);
|
||||
|
||||
long
|
||||
mcexec_util_thread1(ihk_os_t os, unsigned long arg, struct file *file)
|
||||
long mcexec_uti_get_ctx(ihk_os_t os, struct uti_get_ctx_desc __user *udesc)
|
||||
{
|
||||
void **__user uparam = (void ** __user)arg;
|
||||
void *param[7];
|
||||
unsigned long p_rctx;
|
||||
struct uti_get_ctx_desc desc;
|
||||
unsigned long phys;
|
||||
void *__user u_rctx;
|
||||
void *rctx;
|
||||
struct uti_ctx *rctx;
|
||||
int rc = 0;
|
||||
unsigned long free_address;
|
||||
unsigned long free_size;
|
||||
unsigned long icurrent = (unsigned long)current;
|
||||
|
||||
if(copy_from_user(param, uparam, sizeof(void *) * 7)) {
|
||||
return -EFAULT;
|
||||
}
|
||||
p_rctx = (unsigned long)param[0];
|
||||
u_rctx = (void *__user)param[1];
|
||||
free_address = (unsigned long)param[4];
|
||||
free_size = (unsigned long)param[5];
|
||||
|
||||
phys = ihk_device_map_memory(ihk_os_to_dev(os), p_rctx, PAGE_SIZE);
|
||||
#ifdef CONFIG_MIC
|
||||
rctx = ioremap_wc(phys, PAGE_SIZE);
|
||||
#else
|
||||
rctx = ihk_device_map_virtual(ihk_os_to_dev(os), phys, PAGE_SIZE, NULL, 0);
|
||||
#endif
|
||||
if(copy_to_user(u_rctx, rctx, PAGE_SIZE) ||
|
||||
copy_to_user((unsigned long *)(uparam + 3), &icurrent,
|
||||
sizeof(unsigned long)))
|
||||
if(copy_from_user(&desc, udesc, sizeof(struct uti_get_ctx_desc))) {
|
||||
rc = -EFAULT;
|
||||
goto out;
|
||||
}
|
||||
|
||||
((unsigned long *)rctx)[0] = free_address;
|
||||
((unsigned long *)rctx)[1] = free_size;
|
||||
((unsigned long *)rctx)[2] = (unsigned long)param[6];
|
||||
phys = ihk_device_map_memory(ihk_os_to_dev(os), desc.rp_rctx, sizeof(struct uti_ctx));
|
||||
#ifdef CONFIG_MIC
|
||||
rctx = ioremap_wc(phys, sizeof(struct uti_ctx));
|
||||
#else
|
||||
rctx = ihk_device_map_virtual(ihk_os_to_dev(os), phys, sizeof(struct uti_ctx), NULL, 0);
|
||||
#endif
|
||||
if (copy_to_user(desc.rctx, rctx->ctx, sizeof(struct uti_ctx))) {
|
||||
rc = -EFAULT;
|
||||
goto unmap_and_out;
|
||||
}
|
||||
|
||||
if (copy_to_user(&udesc->key, &icurrent, sizeof(unsigned long))) {
|
||||
rc = -EFAULT;
|
||||
goto unmap_and_out;
|
||||
}
|
||||
|
||||
rctx->uti_refill_tid = desc.uti_refill_tid;
|
||||
|
||||
unmap_and_out:
|
||||
#ifdef CONFIG_MIC
|
||||
iounmap(rctx);
|
||||
#else
|
||||
ihk_device_unmap_virtual(ihk_os_to_dev(os), rctx, PAGE_SIZE);
|
||||
ihk_device_unmap_virtual(ihk_os_to_dev(os), rctx, sizeof(struct uti_ctx));
|
||||
#endif
|
||||
ihk_device_unmap_memory(ihk_os_to_dev(os), phys, PAGE_SIZE);
|
||||
|
||||
ihk_device_unmap_memory(ihk_os_to_dev(os), phys, sizeof(struct uti_ctx));
|
||||
out:
|
||||
return rc;
|
||||
}
|
||||
|
||||
long
|
||||
mcexec_util_thread2(ihk_os_t os, unsigned long arg, struct file *file)
|
||||
long mcexec_uti_save_fs(ihk_os_t os, struct uti_save_fs_desc __user *udesc, struct file *file)
|
||||
{
|
||||
int rc = 0;
|
||||
void *usp = get_user_sp();
|
||||
struct mcos_handler_info *info;
|
||||
struct host_thread *thread;
|
||||
unsigned long flags;
|
||||
void **__user param = (void **__user )arg;
|
||||
void *__user rctx = (void *__user)param[1];
|
||||
void *__user lctx = (void *__user)param[2];
|
||||
struct uti_save_fs_desc desc;
|
||||
struct mcctrl_usrdata *usrdata = ihk_host_os_get_usrdata(os);
|
||||
struct mcctrl_per_proc_data *ppd;
|
||||
|
||||
save_fs_ctx(lctx);
|
||||
if(copy_from_user(&desc, udesc, sizeof(struct uti_save_fs_desc))) {
|
||||
printk("%s: Error: copy_from_user failed\n", __FUNCTION__);
|
||||
rc = -EFAULT;
|
||||
goto out;
|
||||
}
|
||||
|
||||
save_fs_ctx(desc.lctx);
|
||||
info = ihk_os_get_mcos_private_data(file);
|
||||
thread = kmalloc(sizeof(struct host_thread), GFP_KERNEL);
|
||||
memset(thread, '\0', sizeof(struct host_thread));
|
||||
thread->pid = task_tgid_vnr(current);
|
||||
thread->tid = task_pid_vnr(current);
|
||||
thread->usp = (unsigned long)usp;
|
||||
thread->lfs = get_fs_ctx(lctx);
|
||||
thread->rfs = get_fs_ctx(rctx);
|
||||
thread->lfs = get_fs_ctx(desc.lctx);
|
||||
thread->rfs = get_fs_ctx(desc.rctx);
|
||||
thread->handler = info;
|
||||
|
||||
write_lock_irqsave(&host_thread_lock, flags);
|
||||
@@ -2477,7 +2480,8 @@ mcexec_util_thread2(ihk_os_t os, unsigned long arg, struct file *file)
|
||||
*/
|
||||
ppd = mcctrl_get_per_proc_data(usrdata, task_tgid_vnr(current));
|
||||
pr_ppd("get", task_pid_vnr(current), ppd);
|
||||
return 0;
|
||||
out:
|
||||
return rc;
|
||||
}
|
||||
|
||||
/* Return value: 0 if target is uti thread, -EINVAL if not */
|
||||
@@ -3118,11 +3122,11 @@ long __mcctrl_control(ihk_os_t os, unsigned int req, unsigned long arg,
|
||||
case MCEXEC_UP_SYS_UNSHARE:
|
||||
return mcexec_sys_unshare((struct sys_unshare_desc *)arg);
|
||||
|
||||
case MCEXEC_UP_UTIL_THREAD1:
|
||||
return mcexec_util_thread1(os, arg, file);
|
||||
case MCEXEC_UP_UTI_GET_CTX:
|
||||
return mcexec_uti_get_ctx(os, (struct uti_get_ctx_desc *)arg);
|
||||
|
||||
case MCEXEC_UP_UTIL_THREAD2:
|
||||
return mcexec_util_thread2(os, arg, file);
|
||||
case MCEXEC_UP_UTI_SAVE_FS:
|
||||
return mcexec_uti_save_fs(os, (struct uti_save_fs_desc *)arg, file);
|
||||
|
||||
case MCEXEC_UP_SIG_THREAD:
|
||||
return mcexec_sig_thread(os, arg, file);
|
||||
|
||||
@@ -83,8 +83,8 @@ static struct ihk_os_user_call_handler mcctrl_uchs[] = {
|
||||
{ .request = MCEXEC_UP_SYS_MOUNT, .func = mcctrl_ioctl },
|
||||
{ .request = MCEXEC_UP_SYS_UMOUNT, .func = mcctrl_ioctl },
|
||||
{ .request = MCEXEC_UP_SYS_UNSHARE, .func = mcctrl_ioctl },
|
||||
{ .request = MCEXEC_UP_UTIL_THREAD1, .func = mcctrl_ioctl },
|
||||
{ .request = MCEXEC_UP_UTIL_THREAD2, .func = mcctrl_ioctl },
|
||||
{ .request = MCEXEC_UP_UTI_GET_CTX, .func = mcctrl_ioctl },
|
||||
{ .request = MCEXEC_UP_UTI_SAVE_FS, .func = mcctrl_ioctl },
|
||||
{ .request = MCEXEC_UP_SIG_THREAD, .func = mcctrl_ioctl },
|
||||
{ .request = MCEXEC_UP_SYSCALL_THREAD, .func = mcctrl_ioctl },
|
||||
{ .request = MCEXEC_UP_TERMINATE_THREAD, .func = mcctrl_ioctl },
|
||||
|
||||
Reference in New Issue
Block a user