msm: ADSPRPC: Attributes to process creation on remote processor

Allow creating user process on remote processor with attributes
to be used during process creation for debugging purposes.

Change-Id: I63081f8ed44bd8e86392d82018ce4e632284c6ed
Acked-by: Viswanatham Paduchuri <vpaduchu@qti.qualcomm.com>
Signed-off-by: Sathish Ambley <sathishambley@codeaurora.org>
This commit is contained in:
Sathish Ambley 2017-01-18 09:50:43 -08:00
parent a51b7f6000
commit 4669c8d278
3 changed files with 78 additions and 27 deletions

View file

@ -1528,10 +1528,11 @@ static int fastrpc_internal_invoke(struct fastrpc_file *fl, uint32_t mode,
}
static int fastrpc_init_process(struct fastrpc_file *fl,
struct fastrpc_ioctl_init *init)
struct fastrpc_ioctl_init_attrs *uproc)
{
int err = 0;
struct fastrpc_ioctl_invoke_attrs ioctl;
struct fastrpc_ioctl_init *init = &uproc->init;
struct smq_phy_page pages[1];
struct fastrpc_mmap *file = 0, *mem = 0;
if (init->flags == FASTRPC_INIT_ATTACH) {
@ -1550,14 +1551,16 @@ static int fastrpc_init_process(struct fastrpc_file *fl,
if (err)
goto bail;
} else if (init->flags == FASTRPC_INIT_CREATE) {
remote_arg_t ra[4];
int fds[4];
remote_arg_t ra[6];
int fds[6];
int mflags = 0;
struct {
int pgid;
int namelen;
int filelen;
int pageslen;
int attrs;
int siglen;
} inbuf;
inbuf.pgid = current->tgid;
inbuf.namelen = strlen(current->comm) + 1;
@ -1593,8 +1596,20 @@ static int fastrpc_init_process(struct fastrpc_file *fl,
ra[3].buf.len = 1 * sizeof(*pages);
fds[3] = 0;
inbuf.attrs = uproc->attrs;
ra[4].buf.pv = (void *)&(inbuf.attrs);
ra[4].buf.len = sizeof(inbuf.attrs);
fds[4] = 0;
inbuf.siglen = uproc->siglen;
ra[5].buf.pv = (void *)&(inbuf.siglen);
ra[5].buf.len = sizeof(inbuf.siglen);
fds[5] = 0;
ioctl.inv.handle = 1;
ioctl.inv.sc = REMOTE_SCALARS_MAKE(6, 4, 0);
if (uproc->attrs)
ioctl.inv.sc = REMOTE_SCALARS_MAKE(7, 6, 0);
ioctl.inv.pra = ra;
ioctl.fds = fds;
ioctl.attrs = 0;
@ -2237,7 +2252,7 @@ static long fastrpc_device_ioctl(struct file *file, unsigned int ioctl_num,
struct fastrpc_ioctl_invoke_attrs inv;
struct fastrpc_ioctl_mmap mmap;
struct fastrpc_ioctl_munmap munmap;
struct fastrpc_ioctl_init init;
struct fastrpc_ioctl_init_attrs init;
struct fastrpc_ioctl_perf perf;
} p;
void *param = (char *)ioctl_param;
@ -2333,8 +2348,14 @@ static long fastrpc_device_ioctl(struct file *file, unsigned int ioctl_num,
goto bail;
break;
case FASTRPC_IOCTL_INIT:
VERIFY(err, 0 == copy_from_user(&p.init, param,
sizeof(p.init)));
p.init.attrs = 0;
p.init.siglen = 0;
size = sizeof(struct fastrpc_ioctl_init);
/* fall through */
case FASTRPC_IOCTL_INIT_ATTRS:
if (!size)
size = sizeof(struct fastrpc_ioctl_init_attrs);
VERIFY(err, 0 == copy_from_user(&p.init, param, size));
if (err)
goto bail;
VERIFY(err, 0 == fastrpc_init_process(fl, &p.init));

View file

@ -34,6 +34,8 @@
_IOWR('R', 7, struct compat_fastrpc_ioctl_invoke_attrs)
#define COMPAT_FASTRPC_IOCTL_GETPERF \
_IOWR('R', 9, struct compat_fastrpc_ioctl_perf)
#define COMPAT_FASTRPC_IOCTL_INIT_ATTRS \
_IOWR('R', 10, struct compat_fastrpc_ioctl_init_attrs)
struct compat_remote_buf {
compat_uptr_t pv; /* buffer pointer */
@ -85,6 +87,12 @@ struct compat_fastrpc_ioctl_init {
compat_int_t memfd; /* ION fd for the mem */
};
struct compat_fastrpc_ioctl_init_attrs {
struct compat_fastrpc_ioctl_init init;
compat_int_t attrs; /* attributes to init process */
compat_int_t siglen; /* test signature file length */
};
struct compat_fastrpc_ioctl_perf { /* kernel performance data */
compat_uptr_t data;
compat_int_t numkeys;
@ -246,28 +254,41 @@ static int compat_get_fastrpc_ioctl_perf(
}
static int compat_get_fastrpc_ioctl_init(
struct compat_fastrpc_ioctl_init __user *init32,
struct fastrpc_ioctl_init __user *init)
struct compat_fastrpc_ioctl_init_attrs __user *init32,
struct fastrpc_ioctl_init_attrs __user *init,
unsigned int cmd)
{
compat_uint_t u;
compat_uptr_t p;
compat_int_t i;
int err;
err = get_user(u, &init32->flags);
err |= put_user(u, &init->flags);
err |= get_user(p, &init32->file);
err |= put_user(p, &init->file);
err |= get_user(i, &init32->filelen);
err |= put_user(i, &init->filelen);
err |= get_user(i, &init32->filefd);
err |= put_user(i, &init->filefd);
err |= get_user(p, &init32->mem);
err |= put_user(p, &init->mem);
err |= get_user(i, &init32->memlen);
err |= put_user(i, &init->memlen);
err |= get_user(i, &init32->memfd);
err |= put_user(i, &init->memfd);
err = get_user(u, &init32->init.flags);
err |= put_user(u, &init->init.flags);
err |= get_user(p, &init32->init.file);
err |= put_user(p, &init->init.file);
err |= get_user(i, &init32->init.filelen);
err |= put_user(i, &init->init.filelen);
err |= get_user(i, &init32->init.filefd);
err |= put_user(i, &init->init.filefd);
err |= get_user(p, &init32->init.mem);
err |= put_user(p, &init->init.mem);
err |= get_user(i, &init32->init.memlen);
err |= put_user(i, &init->init.memlen);
err |= get_user(i, &init32->init.memfd);
err |= put_user(i, &init->init.memfd);
err |= put_user(0, &init->attrs);
if (cmd == COMPAT_FASTRPC_IOCTL_INIT_ATTRS) {
err |= get_user(i, &init32->attrs);
err |= put_user(i, (compat_uptr_t *)&init->attrs);
}
err |= put_user(0, &init->siglen);
if (cmd == COMPAT_FASTRPC_IOCTL_INIT_ATTRS) {
err |= get_user(i, &init32->siglen);
err |= put_user(i, (compat_uptr_t *)&init->siglen);
}
return err;
}
@ -340,9 +361,11 @@ long compat_fastrpc_device_ioctl(struct file *filp, unsigned int cmd,
(unsigned long)unmap);
}
case COMPAT_FASTRPC_IOCTL_INIT:
/* fall through */
case COMPAT_FASTRPC_IOCTL_INIT_ATTRS:
{
struct compat_fastrpc_ioctl_init __user *init32;
struct fastrpc_ioctl_init __user *init;
struct compat_fastrpc_ioctl_init_attrs __user *init32;
struct fastrpc_ioctl_init_attrs __user *init;
init32 = compat_ptr(arg);
VERIFY(err, NULL != (init = compat_alloc_user_space(
@ -350,11 +373,11 @@ long compat_fastrpc_device_ioctl(struct file *filp, unsigned int cmd,
if (err)
return -EFAULT;
VERIFY(err, 0 == compat_get_fastrpc_ioctl_init(init32,
init));
init, cmd));
if (err)
return err;
return filp->f_op->unlocked_ioctl(filp, FASTRPC_IOCTL_INIT,
(unsigned long)init);
return filp->f_op->unlocked_ioctl(filp,
FASTRPC_IOCTL_INIT_ATTRS, (unsigned long)init);
}
case FASTRPC_IOCTL_GETINFO:
{

View file

@ -26,6 +26,7 @@
_IOWR('R', 7, struct fastrpc_ioctl_invoke_attrs)
#define FASTRPC_IOCTL_GETINFO _IOWR('R', 8, uint32_t)
#define FASTRPC_IOCTL_GETPERF _IOWR('R', 9, struct fastrpc_ioctl_perf)
#define FASTRPC_IOCTL_INIT_ATTRS _IOWR('R', 10, struct fastrpc_ioctl_init_attrs)
#define FASTRPC_GLINK_GUID "fastrpcglink-apps-dsp"
#define FASTRPC_SMD_GUID "fastrpcsmd-apps-dsp"
@ -158,6 +159,12 @@ struct fastrpc_ioctl_init {
int32_t memfd; /* ION fd for the mem */
};
struct fastrpc_ioctl_init_attrs {
struct fastrpc_ioctl_init init;
int attrs;
int siglen;
};
struct fastrpc_ioctl_munmap {
uintptr_t vaddrout; /* address to unmap */
ssize_t size; /* size */