blob: a7498846603993ae2593a01368105236e4789330 [file] [log] [blame]
#include "bget.h"
#include <ti/drivers/dpl/HwiP.h>
#include <ti/drivers/dpl/SwiP.h>
typedef unsigned int dpl_CSState;
typedef union _dpl_cs_state_union_t
{
/** critical section variable as declared in the interface */
dpl_CSState state;
/** @internal field used to access internal data */
struct _dpl_cs_state_aggr_t
{
/** field to store Swi_disable() return value */
uint_least16_t swikey;
/** field to store Hwi_disable() return value */
uint_least16_t hwikey;
} each;
} dpl_CSStateUnion;
/* This is enter critical section for DPL supported devices */
dpl_CSState dpl_enterCSImpl(void)
{
dpl_CSStateUnion cu;
cu.each.swikey = (uint_least16_t) SwiP_disable();
cu.each.hwikey = (uint_least16_t) HwiP_disable();
return cu.state;
}
/* This is exit critical section for DPL supported devices */
void dpl_leaveCSImpl(dpl_CSState key)
{
dpl_CSStateUnion * cu = (dpl_CSStateUnion *) &key;
HwiP_restore((uint32_t) cu->each.hwikey);
SwiP_restore((uint32_t) cu->each.swikey);
}
/* Protected allocation */
void * pvPortMalloc(size_t xWantedSize)
{
void * retVal = NULL;
dpl_CSState state;
state = dpl_enterCSImpl();
retVal = bget(xWantedSize);
dpl_leaveCSImpl(state);
return retVal;
}
/* Protected Deallocation */
void vPortFree(void * pv)
{
dpl_CSState state;
state = dpl_enterCSImpl();
brel(pv);
dpl_leaveCSImpl(state);
}
void * pvPortRealloc(void * pv, size_t size)
{
void * retVal = NULL;
dpl_CSState state;
state = dpl_enterCSImpl();
retVal = bgetr(pv, size);
dpl_leaveCSImpl(state);
return retVal;
}