zephyr/kernel/microkernel/k_move_data.c

94 lines
2.1 KiB
C
Raw Normal View History

/* k_move_data.c */
/*
* Copyright (c) 1997-2014 Wind River Systems, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <micro_private.h>
#include <string.h>
#include <toolchain.h>
#include <sections.h>
#include <misc/__assert.h>
/**
*
* mvdreq_docont -
*
* @return N/A
*/
static void mvdreq_docont(struct k_args *Cont)
{
struct k_args *next;
while (Cont) {
next = Cont;
Cont = Cont->next;
SENDARGS(next);
}
}
/**
*
* @brief Perform movedata request
*
* @return N/A
*/
static void mvdreq_copy(struct moved_req *ReqArgs)
{
memcpy(ReqArgs->destination, ReqArgs->source,
OCTET_TO_SIZEOFUNIT(ReqArgs->total_size));
if (ReqArgs->action & MVDACT_SNDACK)
mvdreq_docont(ReqArgs->extra.setup.continuation_send);
if (ReqArgs->action & MVDACT_RCVACK)
mvdreq_docont(ReqArgs->extra.setup.continuation_receive);
}
/**
*
* @brief Process a movedata request
*
* @return N/A
*/
void _k_movedata_request(struct k_args *Req)
{
struct moved_req *ReqArgs;
ReqArgs = &(Req->args.moved_req);
__ASSERT_NO_MSG(0 ==
(ReqArgs->total_size %
SIZEOFUNIT_TO_OCTET(1))); /* must be a multiple of size_t */
__ASSERT_NO_MSG(!(ReqArgs->action & MVDACT_INVALID));
/*
* If no data is to be transferred, just execute the continuation
* packet, if any, and get out:
*/
if (0 == ReqArgs->total_size) {
if (ReqArgs->action & MVDACT_SNDACK)
/* Send ack continuation */
mvdreq_docont(
ReqArgs->extra.setup.continuation_send);
if (ReqArgs->action & MVDACT_RCVACK)
/* Recv ack continuation */
mvdreq_docont(
ReqArgs->extra.setup.continuation_receive);
return;
}
mvdreq_copy(ReqArgs);
}