Ejemplo n.º 1
0
int 
memmgr_info(resmgr_context_t *ctp, PROCESS *prp, mem_info_t *msg) {
	OBJECT		*obp;
	int			r;
	unsigned	flags;
	paddr_t		size;

	if(msg->i.fd != NOFD) {
		r = memmgr_find_object(ctp, prp, msg->i.fd, NULL, &obp);
		switch(r) {
		case EOK:	
			if(obp != NULL) break;
			// fall through
		case ENOTSUP:
			r = ENODEV;
			// fall through
		default:
			return r;
		}
		switch(obp->hdr.type) {
		case OBJECT_MEM_TYPED:	
			flags = get_flags(ctp, msg->i.fd);
			if(flags & IMAP_TYMEM_ALLOCATE) {
				tymem_free_info(obp, &size, NULL);
			} else if(flags & IMAP_TYMEM_ALLOCATE_CONTIG) {
				tymem_free_info(obp, NULL, &size);
			} else {
				size = 0;
			}
			memset(&msg->o, 0x00, sizeof msg->o);
			msg->o.info.posix_tmi_length = size;
			memobj_unlock(obp);
			return _RESMGR_PTR(ctp, &msg->o, sizeof msg->o);
		default:
			break;
		}
		
		memobj_unlock(obp);
		return ENODEV;
	}
	if(!(msg->i.flags & MAP_ANON)) {
		switch(msg->i.flags & MAP_TYPE) {
		case MAP_PRIVATEANON:
		case MAP_PRIVATE:
			break;
		case MAP_SHARED:
			return EINVAL;
		default:
			break;
		}
	}
	if(msg->i.flags & MAP_PHYS) {
		/* @@@ Don't support returning largest chuck yet */
		return EINVAL;
	}

	memset(&msg->o, 0x00, sizeof msg->o);
	msg->o.info.posix_tmi_length = mem_free_size;
	return _RESMGR_PTR(ctp, &msg->o, sizeof msg->o);
}
Ejemplo n.º 2
0
/*
 *  ======== syslink_heapbufmp_create ========
 */
int syslink_heapbufmp_create(
    resmgr_context_t *  ctp,
    io_devctl_t *       msg,
    syslink_ocb_t *     ocb)
{
    HeapBufMPDrv_CmdArgs *      cargs;
    HeapBufMP_Params *          params;
    SharedRegion_SRPtr          srptr;
    Ptr                         gateAttrs;
    HeapBufMP_Handle            handle;
    Int                         status;

    status = 0;
    handle = NULL;

    /* extract input data */
    cargs = (HeapBufMPDrv_CmdArgs *)(_DEVCTL_DATA(msg->i));
    params = (HeapBufMP_Params *)(cargs+1);
    params->name = (String)(params+1);

    /* compute shared region address */
    srptr = cargs->args.create.sharedAddrSrPtr;
    if (srptr != SharedRegion_INVALIDSRPTR) {
        params->sharedAddr = SharedRegion_getPtr(srptr);
    }
    else {
        params->sharedAddr = NULL;
    }

    /* open the gate instance to get a handle */
    srptr = cargs->args.create.gateAttrs;
    if (srptr != SharedRegion_INVALIDSRPTR) {
        gateAttrs = SharedRegion_getPtr(srptr);
        status = GateMP_openByAddr(gateAttrs, &params->gate);
    }
    else {
        params->gate = NULL;
    }

    /* invoke the requested api */
    if (status >= 0) {
        handle = HeapBufMP_create(params);
    }

    /* clear the return message, setup return values */
    memset(&msg->o, 0, sizeof(msg->o));
    msg->o.nbytes = sizeof(HeapBufMPDrv_CmdArgs);
    cargs->args.create.handle = handle;

    if (handle == NULL) {
        cargs->apiStatus = HeapBufMP_E_FAIL;
    }
    else {
        cargs->apiStatus = HeapBufMP_S_SUCCESS;
        /* add object to the cleanup list */
        add_ocb_res(ocb, DCMD_HEAPBUFMP_DELETE, (int)handle, NULL);
    }

    return(_RESMGR_PTR(ctp, &msg->o, sizeof(msg->o) + msg->o.nbytes));
}
Ejemplo n.º 3
0
/*
 *  ======== syslink_frameq_delete ========
 */
int syslink_frameq_delete(
    resmgr_context_t *  ctp,
    io_devctl_t *       msg,
    syslink_ocb_t *     ocb)
{
    FrameQDrv_CmdArgs * cargs;
    FrameQ_Handle *     handlePtr;
    GateMP_Handle       gate;

    cargs = (FrameQDrv_CmdArgs *)(_DEVCTL_DATA(msg->i));
    handlePtr = (FrameQ_Handle *)(&cargs->args.deleteInstance.handle);

    /* save gate handle, need to close it after delete */
    gate = FrameQ_getGate(*handlePtr);

    /* invoke the requested api */
    cargs->apiStatus = FrameQ_delete(handlePtr);

    GT_assert(curTrace, (cargs->apiStatus >= 0));

    /* close the gate instance if not the default gate */
    if (gate != GateMP_getDefaultRemote()) {
        GateMP_close(&gate);
    }

    /* clear the return message, setup return values */
    memset(&msg->o, 0, sizeof(msg->o));
    msg->o.nbytes = sizeof(FrameQDrv_CmdArgs);

    return(_RESMGR_PTR(ctp, &msg->o, sizeof(msg->o) + msg->o.nbytes));
}
Ejemplo n.º 4
0
static int 
mem_lseek(resmgr_context_t *ctp, io_lseek_t *msg, void *vocb) {
	struct mem_ocb			*ocb = vocb;
	unsigned				pos;
	unsigned				size;

	if(ocb == NULL) {
		return EOK;
	}
	pos = (off_t)msg->i.offset;
	switch(msg->i.whence) {
	case SEEK_SET:
		break;
	case SEEK_CUR:
		pos = ocb->pos + pos;
		break;
	case SEEK_END:
		size = ocb->object ? OBJECT_SIZE(ocb->object) : UINT_MAX;
		pos = size + pos;
		break;
	default:
		return EINVAL;
	}
	ocb->pos = pos;
	if(msg->i.combine_len & _IO_COMBINE_FLAG) {
		return EOK;
	}
	msg->o = ocb->pos;
	return _RESMGR_PTR(ctp, &msg->o, sizeof msg->o);
}
Ejemplo n.º 5
0
int syslink_frameq_put(resmgr_context_t *ctp, io_devctl_t *msg, syslink_ocb_t *ocb){

			FrameQDrv_CmdArgs *cargs = (FrameQDrv_CmdArgs *) (_DEVCTL_DATA (msg->i));
			FrameQDrv_CmdArgs *out = (FrameQDrv_CmdArgs *) (_DEVCTL_DATA (msg->o));

			FrameQ_Frame            frame;
            FrameQ_FrameBufInfo     *frameBufInfo;
            Ptr                     virtPtr;
            Ptr                     addr;
			int						i;

            /* Convert frame address and frame buffer address in to knl virtual
             		 * format.
             		 */
            frame = Memory_translate (cargs->args.put.frame,
                                      Memory_XltFlags_Phys2Virt);

            GT_assert(curTrace,(frame != NULL));

            frameBufInfo = (FrameQ_FrameBufInfo *)&(frame->frameBufInfo[0]);

            for(i = 0; i < frame->numFrameBuffers; i++) {
                addr = (Ptr)frameBufInfo[i].bufPtr;
                virtPtr = Memory_translate(addr, Memory_XltFlags_Phys2Virt);
                GT_assert(curTrace,(virtPtr != NULL));
                frameBufInfo[i].bufPtr = (UInt32)virtPtr;
            }
            out->apiStatus = FrameQ_put (cargs->args.put.handle, frame);
            GT_assert (curTrace, (out->apiStatus >= 0));

			return (_RESMGR_PTR (ctp, &msg->o, sizeof (msg->o) + sizeof(FrameQDrv_CmdArgs)));

}
Ejemplo n.º 6
0
/*
 *  ======== syslink_ipcmemmgr_acquire ========
 */
int syslink_ipcmemmgr_acquire(
    resmgr_context_t *  ctp,
    io_devctl_t *       msg,
    syslink_ocb_t *     ocb)
{
    IpcMemMgrDrv_CmdArgs *  cmdArgs;
    String                  name;
    SizeT                   size;
    Ptr                     addr;
    Bool                    newAlloc;
    Int                     status;

    /* extract input data */
    cmdArgs = (IpcMemMgrDrv_CmdArgs *)(_DEVCTL_DATA(msg->i));
    name = (String)(cmdArgs+1);
    size = cmdArgs->args.acquire.size;

    /* invoke the requested api */
    status = IpcMemMgr_acquire(name, size, &addr, &newAlloc);

    /* clear the return message, setup return values */
    memset(&msg->o, 0, sizeof(msg->o));
    msg->o.ret_val = status;
    msg->o.nbytes = sizeof(IpcMemMgrDrv_CmdArgs);

    cmdArgs->args.acquire.offset = IpcMemMgr_getOffset(addr);
    cmdArgs->args.acquire.newAlloc = newAlloc;

    return(_RESMGR_PTR(ctp, &msg->o, sizeof(msg->o) + msg->o.nbytes));
}
Ejemplo n.º 7
0
/*
 *  ======== syslink_ipcmemmgr_alloc ========
 */
int syslink_ipcmemmgr_alloc(
    resmgr_context_t *  ctp,
    io_devctl_t *       msg,
    syslink_ocb_t *     ocb)
{
    IpcMemMgrDrv_CmdArgs *  cmdArgs;
    SizeT                   size;
    Ptr                     addr;
    Int                     status;

    /* extract input data */
    cmdArgs = (IpcMemMgrDrv_CmdArgs *)(_DEVCTL_DATA(msg->i));
    size = cmdArgs->args.alloc.size;

    /* invoke the requested api */
    addr = IpcMemMgr_alloc(size);

    status = (addr == NULL ? IpcMemMgr_E_MEMORY : IpcMemMgr_S_SUCCESS);

    /* clear the return message, setup return values */
    memset(&msg->o, 0, sizeof(msg->o));
    msg->o.ret_val = status;
    msg->o.nbytes = sizeof(IpcMemMgrDrv_CmdArgs);
    cmdArgs->args.alloc.offset = IpcMemMgr_getOffset(addr);

    return(_RESMGR_PTR(ctp, &msg->o, sizeof(msg->o) + msg->o.nbytes));
}
Ejemplo n.º 8
0
/*
 *  ======== syslink_ipcmemmgr_setup ========
 */
int syslink_ipcmemmgr_setup(
    resmgr_context_t *  ctp,
    io_devctl_t *       msg,
    syslink_ocb_t *     ocb)
{
    IpcMemMgr_Config *  config;
    Int                 status;

    /* extract input data */
    config = (IpcMemMgr_Config *)(_DEVCTL_DATA(msg->i));

    /* invoke the requested api */
    status = IpcMemMgr_setup(config);

    if (status >= 0) {
        /* add object to the cleanup list */
        add_ocb_res(ocb, DCMD_IPCMEMMGR_DESTROY, (int)NULL, NULL);
    }

    /* clear the return message, setup return values */
    memset(&msg->o, 0, sizeof(msg->o));
    msg->o.ret_val = status;
    msg->o.nbytes = sizeof(IpcMemMgr_Config);

    return(_RESMGR_PTR(ctp, &msg->o, sizeof(msg->o) + msg->o.nbytes));
}
Ejemplo n.º 9
0
static int 
mem_stat(resmgr_context_t *ctp, io_stat_t *msg, void *vocb) {
	struct mem_ocb			*ocb = vocb;
	union object			*obp = ocb ? ocb->object : 0;
	size_t					size = ocb ? (obp ? OBJECT_SIZE(obp) : UINT_MAX) : 0;

	memset(&msg->o, 0x00, sizeof msg->o);
	msg->o.st_size = size;
	msg->o.st_nblocks = (size + (__PAGESIZE-1)) / __PAGESIZE;
	msg->o.st_blocksize = msg->o.st_blksize = __PAGESIZE;
	msg->o.st_ctime =
	msg->o.st_mtime =
	msg->o.st_atime =(obp ? obp->mem.pm.mtime : time(0));
	msg->o.st_ino = obp ? (uintptr_t)INODE_XOR(obp) : 1;
	if(ocb && obp) {
		msg->o.st_uid = obp->mem.pm.uid;
		msg->o.st_gid = obp->mem.pm.gid;
		msg->o.st_mode = (obp->mem.pm.mode != 0) ? obp->mem.pm.mode : S_IFNAM | S_IPERMS;
		msg->o.st_nlink = obp->hdr.refs;
		msg->o.st_dev = path_devno;
		msg->o.st_rdev = S_ISNAM(msg->o.st_mode) ? S_INSHD : 0;
	} else {
		//The /dev/mem device is set to rw root only, the /dev/shmem
		//device is set to rwx for all, since it is un-enforced. 
		msg->o.st_mode = ocb ? S_IFREG | 0600 : S_IFDIR | 0777;
		msg->o.st_nlink = ocb ? 1 : 2;
		msg->o.st_dev = mem_devno;
		msg->o.st_rdev = 0;
	}
	msg->o.st_dev |= (ctp->info.srcnd << ND_NODE_BITS);
	return _RESMGR_PTR(ctp, &msg->o, sizeof msg->o);
}
Ejemplo n.º 10
0
/*
 *  ======== syslink_heapbufmp_delete ========
 */
int syslink_heapbufmp_delete(
    resmgr_context_t *  ctp,
    io_devctl_t *       msg,
    syslink_ocb_t *     ocb)
{
    HeapBufMPDrv_CmdArgs *      cargs;
    HeapBufMP_Handle *          handlePtr;
    GateMP_Handle               gate;
    Int                         status;

    /* extract input data */
    cargs = (HeapBufMPDrv_CmdArgs *)(_DEVCTL_DATA(msg->i));
    handlePtr = (HeapBufMP_Handle *)(&cargs->args.deleteInstance.handle);

    /* save gate handle, need to close it after delete */
    gate = HeapBufMP_getGate(*handlePtr);

    /* remove object from cleanup list */
    remove_ocb_res(ocb, DCMD_HEAPBUFMP_DELETE, (int)(*handlePtr), NULL);

    /* invoke the requested api */
    status = HeapBufMP_delete(handlePtr);

    /* close the gate instance if not the default gate */
    if (gate != GateMP_getDefaultRemote()) {
        GateMP_close(&gate);
    }

    /* clear the return message, setup return values */
    memset(&msg->o, 0, sizeof(msg->o));
    msg->o.nbytes = sizeof(HeapBufMPDrv_CmdArgs);
    cargs->apiStatus = status;

    return(_RESMGR_PTR(ctp, &msg->o, sizeof(msg->o) + msg->o.nbytes));
}
/**
 * Handler for shared region clear reserved memory API.
 *
 * \param ctp	Thread's associated context information.
 * \param msg	The actual devctl() message.
 * \param ocb	OCB associated with client's session.
 *
 * \return POSIX errno value.
 *
 * \retval EOK		Success.
 * \retval ENOTSUP	Unsupported devctl().
 */
int syslink_sharedregion_clearreservedmemory(resmgr_context_t *ctp, io_devctl_t *msg, syslink_ocb_t *ocb) {
	SharedRegionDrv_CmdArgs *		cargs = (SharedRegionDrv_CmdArgs *) (_DEVCTL_DATA (msg->i));

	SharedRegion_clearReservedMemory ();
	cargs->apiStatus = SharedRegion_S_SUCCESS;

	return (_RESMGR_PTR (ctp, &msg->o, sizeof (msg->o) + sizeof(SharedRegionDrv_CmdArgs)));
}
Ejemplo n.º 12
0
int iofunc_stat_default(resmgr_context_t *ctp, io_stat_t *msg, iofunc_ocb_t *ocb) {
	int		status;

	(void)iofunc_time_update(ocb->attr);
	if ((status = iofunc_stat(ctp, ocb->attr, &msg->o)) != EOK)
		return(status);
	return _RESMGR_PTR(ctp, &msg->o, sizeof msg->o);
}
Ejemplo n.º 13
0
/**
 * Handler for messageq unblock API.
 *
 * \param ctp	Thread's associated context information.
 * \param msg	The actual devctl() message.
 * \param ocb	OCB associated with client's session.
 *
 * \return POSIX errno value.
 *
 * \retval EOK		Success.
 * \retval ENOTSUP	Unsupported devctl().
 */
int syslink_messageq_unblock(resmgr_context_t *ctp, io_devctl_t *msg, syslink_ocb_t *ocb) {

	MessageQDrv_CmdArgs *		cargs = (MessageQDrv_CmdArgs *) (_DEVCTL_DATA (msg->i));
	MessageQ_unblock (cargs->args.unblock.handle);
    cargs->apiStatus = MessageQ_S_SUCCESS;

	return (_RESMGR_PTR (ctp, &msg->o, sizeof (msg->o) + sizeof(MessageQDrv_CmdArgs)));

}
Ejemplo n.º 14
0
int syslink_frameq_unreg_notifier(resmgr_context_t *ctp, io_devctl_t *msg, syslink_ocb_t *ocb){

			FrameQDrv_CmdArgs *cargs = (FrameQDrv_CmdArgs *) (_DEVCTL_DATA (msg->i));
			FrameQDrv_CmdArgs *out = (FrameQDrv_CmdArgs *) (_DEVCTL_DATA (msg->o));

			out->apiStatus = FrameQ_unregisterNotifier (cargs->args.unregNotifier.handle);

			return (_RESMGR_PTR (ctp, &msg->o, sizeof (msg->o) + sizeof(FrameQDrv_CmdArgs)));
}
Ejemplo n.º 15
0
int syslink_frameq_reset_notifyid(resmgr_context_t *ctp, io_devctl_t *msg, syslink_ocb_t *ocb){

			FrameQDrv_CmdArgs *cargs = (FrameQDrv_CmdArgs *) (_DEVCTL_DATA (msg->i));
			FrameQDrv_CmdArgs *out = (FrameQDrv_CmdArgs *) (_DEVCTL_DATA (msg->o));

			out->apiStatus = _FrameQ_resetNotifyId (cargs->args.resetNotifyId.handle,cargs->args.resetNotifyId.notifyId);
            GT_assert (curTrace, (out->apiStatus >= 0));

			return (_RESMGR_PTR (ctp, &msg->o, sizeof (msg->o) + sizeof(FrameQDrv_CmdArgs)));
}
Ejemplo n.º 16
0
int syslink_frameq_params_init(resmgr_context_t *ctp, io_devctl_t *msg, syslink_ocb_t *ocb){

			//Linux side implementation commented out

			FrameQDrv_CmdArgs *out = (FrameQDrv_CmdArgs *) (_DEVCTL_DATA (msg->o));

			out->apiStatus = FrameQ_E_NOTIMPLEMENTED;

			return (_RESMGR_PTR (ctp, &msg->o, sizeof (msg->o) + sizeof(FrameQDrv_CmdArgs)));
}
Ejemplo n.º 17
0
int syslink_frameq_close(resmgr_context_t *ctp, io_devctl_t *msg, syslink_ocb_t *ocb){

			FrameQDrv_CmdArgs *cargs = (FrameQDrv_CmdArgs *) (_DEVCTL_DATA (msg->i));
			FrameQDrv_CmdArgs *out = (FrameQDrv_CmdArgs *) (_DEVCTL_DATA (msg->o));

			out->apiStatus = FrameQ_close ((FrameQ_Handle *)&(cargs->args.close.handle));
            GT_assert (curTrace, (out->apiStatus >= 0));

			return (_RESMGR_PTR (ctp, &msg->o, sizeof (msg->o) + sizeof(FrameQDrv_CmdArgs)));
}
/**
 * Handler for shared region stop API.
 *
 * \param ctp	Thread's associated context information.
 * \param msg	The actual devctl() message.
 * \param ocb	OCB associated with client's session.
 *
 * \return POSIX errno value.
 *
 * \retval EOK		Success.
 * \retval ENOTSUP	Unsupported devctl().
 */
int syslink_sharedregion_stop(resmgr_context_t *ctp, io_devctl_t *msg, syslink_ocb_t *ocb) {
	SharedRegionDrv_CmdArgs *		out = (SharedRegionDrv_CmdArgs *) (_DEVCTL_DATA (msg->o));

	out->apiStatus = SharedRegion_stop ();
	GT_assert (curTrace, (out->apiStatus >= 0));

	return (_RESMGR_PTR (ctp, &msg->o, sizeof (msg->o) + sizeof(SharedRegionDrv_CmdArgs)));


}
Ejemplo n.º 19
0
int syslink_frameq_reg_notifier(resmgr_context_t *ctp, io_devctl_t *msg, syslink_ocb_t *ocb){

			FrameQDrv_CmdArgs *cargs = (FrameQDrv_CmdArgs *) (_DEVCTL_DATA (msg->i));
			FrameQDrv_CmdArgs *out = (FrameQDrv_CmdArgs *) (_DEVCTL_DATA (msg->o));

			out->apiStatus = FrameQ_registerNotifier (cargs->args.regNotifier.handle,&cargs->args.regNotifier.notifyParams);
            GT_assert (curTrace, (out->apiStatus >= 0));

			return (_RESMGR_PTR (ctp, &msg->o, sizeof (msg->o) + sizeof(FrameQDrv_CmdArgs)));
}
Ejemplo n.º 20
0
/**
 * Handler for messageq destroy API.
 *
 * \param ctp	Thread's associated context information.
 * \param msg	The actual devctl() message.
 * \param ocb	OCB associated with client's session.
 *
 * \return POSIX errno value.
 *
 * \retval EOK		Success.
 * \retval ENOTSUP	Unsupported devctl().
 */
int syslink_messageq_destroy(resmgr_context_t *ctp, io_devctl_t *msg, syslink_ocb_t *ocb) {

	MessageQDrv_CmdArgs *		out  = (MessageQDrv_CmdArgs *) (_DEVCTL_DATA (msg->o));

	out->apiStatus = MessageQ_destroy ();
    GT_assert (curTrace, (	out->apiStatus  >= 0));
    if (out->apiStatus >= 0)
    	remove_ocb_res(ocb, DCMD_MESSAGEQ_DESTROY, NULL, NULL);

	return (_RESMGR_PTR (ctp, &msg->o, sizeof (msg->o) + sizeof(MessageQDrv_CmdArgs)));
}
Ejemplo n.º 21
0
/**
 * Handler for messageq unregisterheap API.
 *
 * \param ctp	Thread's associated context information.
 * \param msg	The actual devctl() message.
 * \param ocb	OCB associated with client's session.
 *
 * \return POSIX errno value.
 *
 * \retval EOK		Success.
 * \retval ENOTSUP	Unsupported devctl().
 */
int syslink_messageq_unregisterheap(resmgr_context_t *ctp, io_devctl_t *msg, syslink_ocb_t *ocb) {

	MessageQDrv_CmdArgs *		cargs = (MessageQDrv_CmdArgs *) (_DEVCTL_DATA (msg->i));
	MessageQDrv_CmdArgs *		out  = (MessageQDrv_CmdArgs *) (_DEVCTL_DATA (msg->o));

	out->apiStatus = MessageQ_unregisterHeap(cargs->args.unregisterHeap.heapId);
    if (out->apiStatus >= 0)
    	remove_ocb_res(ocb, DCMD_MESSAGEQ_UNREGISTERHEAP, (int)cargs->args.unregisterHeap.heapId, NULL);

	return (_RESMGR_PTR (ctp, &msg->o, sizeof (msg->o) + sizeof(MessageQDrv_CmdArgs)));
}
Ejemplo n.º 22
0
/**
 * Handler for messageq detach API.
 *
 * \param ctp	Thread's associated context information.
 * \param msg	The actual devctl() message.
 * \param ocb	OCB associated with client's session.
 *
 * \return POSIX errno value.
 *
 * \retval EOK		Success.
 * \retval ENOTSUP	Unsupported devctl().
 */
int syslink_messageq_detach(resmgr_context_t *ctp, io_devctl_t *msg, syslink_ocb_t *ocb) {

	MessageQDrv_CmdArgs *		cargs = (MessageQDrv_CmdArgs *) (_DEVCTL_DATA (msg->i));
	MessageQDrv_CmdArgs *		out  = (MessageQDrv_CmdArgs *) (_DEVCTL_DATA (msg->o));

	out->apiStatus = MessageQ_detach (cargs->args.attach.remoteProcId);
    if (out->apiStatus >= 0)
    	remove_ocb_res(ocb, DCMD_MESSAGEQ_DETACH, (int)cargs->args.attach.remoteProcId, NULL);

	return (_RESMGR_PTR (ctp, &msg->o, sizeof (msg->o) + sizeof(MessageQDrv_CmdArgs)));
}
Ejemplo n.º 23
0
int syslink_frameq_destroy(resmgr_context_t *ctp, io_devctl_t *msg, syslink_ocb_t *ocb){

			FrameQDrv_CmdArgs *out = (FrameQDrv_CmdArgs *) (_DEVCTL_DATA (msg->o));

			out->apiStatus = FrameQ_destroy ();

			GT_assert (curTrace, (	out->apiStatus  >= 0));

			return (_RESMGR_PTR (ctp, &msg->o, sizeof (msg->o) + sizeof(FrameQDrv_CmdArgs)));

}
/**
 * Handler for shared region detach API.
 *
 * \param ctp	Thread's associated context information.
 * \param msg	The actual devctl() message.
 * \param ocb	OCB associated with client's session.
 *
 * \return POSIX errno value.
 *
 * \retval EOK		Success.
 * \retval ENOTSUP	Unsupported devctl().
 */
int syslink_sharedregion_detach(resmgr_context_t *ctp, io_devctl_t *msg, syslink_ocb_t *ocb) {

	SharedRegionDrv_CmdArgs *		cargs = (SharedRegionDrv_CmdArgs *) (_DEVCTL_DATA (msg->i));
	SharedRegionDrv_CmdArgs *		out  = (SharedRegionDrv_CmdArgs *) (_DEVCTL_DATA (msg->o));

	out->apiStatus = SharedRegion_detach (cargs->args.attach.remoteProcId);
	GT_assert (curTrace, (out->apiStatus >= 0));

	return (_RESMGR_PTR (ctp, &msg->o, sizeof (msg->o) + sizeof(SharedRegionDrv_CmdArgs)));

}
Ejemplo n.º 25
0
int
_spi_read(resmgr_context_t *ctp, io_read_t *msg, spi_ocb_t *ocb)
{
	uint8_t		*buf;
	int			nbytes;
	int			nonblock = 0;
	int			status;
	SPIDEV		*drvhdl = (SPIDEV *)ocb->hdr.attr;
	spi_dev_t	*dev = drvhdl->hdl;

    if ((status = iofunc_read_verify(ctp, msg, &ocb->hdr, &nonblock)) != EOK)
        return status;

    if ((msg->i.xtype & _IO_XTYPE_MASK) != _IO_XTYPE_NONE)
        return ENOSYS;

	/*
	 * Check to see if the device is locked
	 */
	if ((status =_spi_lock_check(ctp, ocb->chip, ocb)) != EOK)
		return status;

    if (msg->i.nbytes <= 0) {
        _IO_SET_READ_NBYTES(ctp, 0);
        return _RESMGR_NPARTS(0);
    }

    /* check if message buffer is too short */
    nbytes = msg->i.nbytes;
    if (nbytes > ctp->msg_max_size) {
        if (dev->buflen < nbytes) {
            dev->buflen = nbytes;
			if (dev->buf)
            	free(dev->buf);
            if (NULL == (dev->buf = malloc(dev->buflen))) {
                dev->buflen = 0;
                return ENOMEM;
            }
        }
        buf = dev->buf;
    }
	else
        buf = (uint8_t *)msg;

	buf = dev->funcs->xfer(drvhdl, _SPI_DEV_READ(ocb->chip), buf, &nbytes);

	if (nbytes > 0) {
		_IO_SET_READ_NBYTES(ctp, nbytes);
		return _RESMGR_PTR(ctp, buf, nbytes);
	}

	return EIO;
}
Ejemplo n.º 26
0
int syslink_frameq_get_numframes(resmgr_context_t *ctp, io_devctl_t *msg, syslink_ocb_t *ocb) {

			FrameQDrv_CmdArgs *cargs = (FrameQDrv_CmdArgs *) (_DEVCTL_DATA (msg->i));
			FrameQDrv_CmdArgs *out = (FrameQDrv_CmdArgs *) (_DEVCTL_DATA (msg->o));

			UInt32  numFrames;

            out->apiStatus = FrameQ_getNumFrames(cargs->args.getNumFrames.handle,&numFrames);
            out->args.getNumFrames.numFrames = numFrames;

			return (_RESMGR_PTR (ctp, &msg->o, sizeof (msg->o) + sizeof(FrameQDrv_CmdArgs)));
}
Ejemplo n.º 27
0
/**
 * Handler for heap buf mp destroy API.
 *
 * \param ctp	Thread's associated context information.
 * \param msg	The actual devctl() message.
 * \param ocb	OCB associated with client's session.
 *
 * \return POSIX errno value.
 *
 * \retval EOK		Success.
 * \retval ENOTSUP	Unsupported devctl().
 */
int syslink_heapbufmp_destroy(resmgr_context_t *ctp, io_devctl_t *msg, syslink_ocb_t *ocb)
{
	HeapBufMPDrv_CmdArgs *		out  = (HeapBufMPDrv_CmdArgs *) (_DEVCTL_DATA (msg->o));

	out->apiStatus = HeapBufMP_destroy ();
	GT_assert (curTrace, (out->apiStatus >= 0));
    if (out->apiStatus >= 0) {
        /* Remove this call from the list to be cleaned-up */
        remove_ocb_res(ocb, DCMD_HEAPBUFMP_DESTROY, (int)NULL, NULL);
    }

	return (_RESMGR_PTR (ctp, &msg->o, sizeof (msg->o) + sizeof(HeapBufMPDrv_CmdArgs)));
}
Ejemplo n.º 28
0
/**
 * Handler for messageq setup API.
 *
 * \param ctp	Thread's associated context information.
 * \param msg	The actual devctl() message.
 * \param ocb	OCB associated with client's session.
 *
 * \return POSIX errno value.
 *
 * \retval EOK		Success.
 * \retval ENOTSUP	Unsupported devctl().
 */
int syslink_messageq_registerheap(resmgr_context_t *ctp, io_devctl_t *msg, syslink_ocb_t *ocb) {

	MessageQDrv_CmdArgs *		cargs = (MessageQDrv_CmdArgs *) (_DEVCTL_DATA (msg->i));
	MessageQDrv_CmdArgs *		out  = (MessageQDrv_CmdArgs *) (_DEVCTL_DATA (msg->o));

	out->apiStatus = MessageQ_registerHeap (cargs->args.registerHeap.heap,
											   cargs->args.registerHeap.heapId);
    if (out->apiStatus >= 0) {
        /* At this call to the list to be cleaned-up */
        add_ocb_res(ocb, DCMD_MESSAGEQ_UNREGISTERHEAP, (int)cargs->args.registerHeap.heapId, NULL);
    }
	return (_RESMGR_PTR (ctp, &msg->o, sizeof (msg->o) + sizeof(MessageQDrv_CmdArgs)));
}
Ejemplo n.º 29
0
/**
 * Handler for messageq shared mem request  API.
 *
 * \param ctp	Thread's associated context information.
 * \param msg	The actual devctl() message.
 * \param ocb	OCB associated with client's session.
 *
 * \return POSIX errno value.
 *
 * \retval EOK		Success.
 * \retval ENOTSUP	Unsupported devctl().
 */
int syslink_messageq_sharedmemreq(resmgr_context_t *ctp, io_devctl_t *msg, syslink_ocb_t *ocb) {

	MessageQDrv_CmdArgs *		cargs = (MessageQDrv_CmdArgs *) (_DEVCTL_DATA (msg->i));
	MessageQDrv_CmdArgs *		out  = (MessageQDrv_CmdArgs *) (_DEVCTL_DATA (msg->o));

	Ptr sharedAddr;
	sharedAddr = SharedRegion_getPtr (
							cargs->args.sharedMemReq.sharedAddrSrPtr);
	out->args.sharedMemReq.memReq = MessageQ_sharedMemReq (sharedAddr);
	out->apiStatus = MessageQ_S_SUCCESS;

	return (_RESMGR_PTR (ctp, &msg->o, sizeof (msg->o) + sizeof(MessageQDrv_CmdArgs)));
}
Ejemplo n.º 30
0
int syslink_frameq_setup(resmgr_context_t *ctp, io_devctl_t *msg, syslink_ocb_t *ocb){

			FrameQDrv_CmdArgs *cargs = (FrameQDrv_CmdArgs *) (_DEVCTL_DATA (msg->i));
			FrameQDrv_CmdArgs *out = (FrameQDrv_CmdArgs *) (_DEVCTL_DATA (msg->o));

			FrameQ_Config *config = (FrameQ_Config*)(cargs+1);

            out->apiStatus = FrameQ_setup (config);

			GT_assert (curTrace, (out->apiStatus >= 0));

			return (_RESMGR_PTR (ctp, &msg->o, sizeof (msg->o) + sizeof(FrameQDrv_CmdArgs)));
}