[PATCH] bsps/sparc: Add grlib_malloc(), grlib_calloc()

Daniel Hellstrom daniel at gaisler.com
Fri Dec 21 13:42:54 UTC 2018


Hi Sebastian,

Sorry for my very late response! I have reviewed the code but not 
executed it, it looks okay with me. I'm guessing it is also a positive 
thing to remove malloc for another approach to allocate memory when it 
comes to validation of the SW.

Another aspect of the same subject could be to use the RTEMS memalign() 
instead of custom alignment within the driver for descriptor tables etc. 
The history there is that memalign() did not exist when writing most of 
the drivers.

Merry Christmas and a happy new year!
Daniel


On 2018-11-27 08:11, Sebastian Huber wrote:

> This avoids a dependency to errno in device driver code.
> ---
>   bsps/sparc/include/bsp/gr1553rt.h           |  2 +-
>   bsps/sparc/include/grlib_impl.h             | 27 +++++++++++++++++++++++++++
>   bsps/sparc/shared/1553/b1553brm.c           | 11 ++++++-----
>   bsps/sparc/shared/1553/b1553rt.c            |  9 +++++----
>   bsps/sparc/shared/1553/gr1553b.c            | 10 ++++++----
>   bsps/sparc/shared/1553/gr1553bc.c           | 23 +++++++++++------------
>   bsps/sparc/shared/1553/gr1553bm.c           |  5 ++---
>   bsps/sparc/shared/1553/gr1553rt.c           | 21 +++++++++++----------
>   bsps/sparc/shared/amba/ambapp.c             |  4 +++-
>   bsps/sparc/shared/analog/gradcdac.c         |  5 +++--
>   bsps/sparc/shared/ascs/grascs.c             |  6 ++++--
>   bsps/sparc/shared/btimer/gptimer.c          |  5 +++--
>   bsps/sparc/shared/can/canmux.c              |  4 +++-
>   bsps/sparc/shared/can/grcan.c               |  7 +++----
>   bsps/sparc/shared/can/occan.c               | 13 ++++---------
>   bsps/sparc/shared/can/satcan.c              |  8 +++++---
>   bsps/sparc/shared/drvmgr/ambapp_bus_grlib.c |  4 +++-
>   bsps/sparc/shared/gpio/gpiolib.c            |  5 +++--
>   bsps/sparc/shared/gpio/grgpio.c             |  4 ++--
>   bsps/sparc/shared/i2c/i2cmst.c              |  5 +++--
>   bsps/sparc/shared/iommu/griommu.c           |  4 +++-
>   bsps/sparc/shared/irq/genirq.c              | 15 ++++++++-------
>   bsps/sparc/shared/mem/mctrl.c               |  5 +++--
>   bsps/sparc/shared/net/greth.c               | 18 ++++++++----------
>   bsps/sparc/shared/pci/gr_701.c              |  3 +--
>   bsps/sparc/shared/pci/gr_rasta_adcdac.c     |  3 +--
>   bsps/sparc/shared/pci/gr_rasta_io.c         |  3 +--
>   bsps/sparc/shared/pci/gr_tmtc_1553.c        |  3 +--
>   bsps/sparc/shared/pci/grpci2dma.c           |  9 +++------
>   bsps/sparc/shared/pwm/grpwm.c               |  7 ++++---
>   bsps/sparc/shared/slink/grslink.c           | 12 +++++++-----
>   bsps/sparc/shared/spi/spictrl.c             |  5 +++--
>   bsps/sparc/shared/spw/grspw.c               | 15 +++++++++------
>   bsps/sparc/shared/spw/grspw_pkt.c           | 11 ++++-------
>   bsps/sparc/shared/time/grctm.c              |  5 +++--
>   bsps/sparc/shared/time/spwcuc.c             |  7 ++++---
>   bsps/sparc/shared/tmtc/grtc.c               |  5 ++---
>   bsps/sparc/shared/tmtc/grtm.c               |  8 +++-----
>   38 files changed, 176 insertions(+), 140 deletions(-)
>
> diff --git a/bsps/sparc/include/bsp/gr1553rt.h b/bsps/sparc/include/bsp/gr1553rt.h
> index 55237b5dfd..5d52e84c11 100644
> --- a/bsps/sparc/include/bsp/gr1553rt.h
> +++ b/bsps/sparc/include/bsp/gr1553rt.h
> @@ -74,7 +74,7 @@ struct gr1553rt_list {
>   	/* !!Must be last in data structure!!
>   	 * !!Array must at least be of length bd_cnt!!
>   	 */
> -	unsigned short bds[1];		/* Array of BDIDs, -1 unused/end */
> +	unsigned short bds[0];		/* Array of BDIDs */
>   };
>   
>   /* GR1553B-RT Driver configuration options used when calling gr1553rt_config().
> diff --git a/bsps/sparc/include/grlib_impl.h b/bsps/sparc/include/grlib_impl.h
> index 2760c68626..755f635911 100644
> --- a/bsps/sparc/include/grlib_impl.h
> +++ b/bsps/sparc/include/grlib_impl.h
> @@ -10,6 +10,7 @@
>   #define GRLIB_IMPL_H
>   
>   #include <rtems/score/basedefs.h>
> +#include <rtems/malloc.h>
>   
>   /*
>    * Use interrupt lock primitives compatible with SMP defined in RTEMS 4.11.99
> @@ -63,6 +64,32 @@
>   extern "C" {
>   #endif
>   
> +#if (((__RTEMS_MAJOR__ << 16) | (__RTEMS_MINOR__ << 8) | __RTEMS_REVISION__) >= 0x050000)
> +
> +RTEMS_INLINE_ROUTINE void *grlib_malloc(size_t size)
> +{
> + return rtems_malloc(size);
> +}
> +
> +RTEMS_INLINE_ROUTINE void *grlib_calloc(size_t nelem, size_t elsize)
> +{
> + return rtems_calloc(nelem, elsize);
> +}
> +
> +#else
> +
> +RTEMS_INLINE_ROUTINE void *grlib_malloc(size_t size)
> +{
> + return malloc(size);
> +}
> +
> +RTEMS_INLINE_ROUTINE void *grlib_calloc(size_t nelem, size_t elsize)
> +{
> + return calloc(nelem, elsize);
> +}
> +
> +#endif
> +
>   #ifdef __cplusplus
>   }
>   #endif
> diff --git a/bsps/sparc/shared/1553/b1553brm.c b/bsps/sparc/shared/1553/b1553brm.c
> index 8a5efaf9df..216397b334 100644
> --- a/bsps/sparc/shared/1553/b1553brm.c
> +++ b/bsps/sparc/shared/1553/b1553brm.c
> @@ -31,6 +31,8 @@
>   #include <ambapp.h>
>   #include <drvmgr/ambapp_bus.h>
>   
> +#include <grlib_impl.h>
> +
>   /* Uncomment for debug output */
>   /*#define DEBUG 1
>   #define FUNCDEBUG 1*/
> @@ -309,10 +311,9 @@ int b1553brm_init2(struct drvmgr_dev *dev)
>   	brm_priv *priv;
>   
>   	DBG("B1553BRM[%d] on bus %s\n", dev->minor_drv, dev->parent->dev->name);
> -	priv = dev->priv = malloc(sizeof(brm_priv));
> +	priv = dev->priv = grlib_calloc(1, sizeof(*priv));
>   	if ( !priv )
>   		return DRVMGR_NOMEM;
> -	memset(priv, 0, sizeof(*priv));
>   	priv->dev = dev;
>   
>   	/* This core will not find other cores, so we wait for init2() */
> @@ -472,7 +473,7 @@ int b1553brm_device_init(brm_priv *pDev)
>   			/* Use dynamically allocated memory + 128k for
>   			 * alignment
>   			 */
> -			mem = (unsigned int)malloc(size + 128 * 1024);
> +			mem = (unsigned int)grlib_malloc(size + 128 * 1024);
>   			if (!mem){
>   				printk("BRM: Failed to allocate HW memory\n\r");
>   				return -1;
> @@ -631,7 +632,7 @@ static rtems_device_driver rt_init(brm_priv *brm) {
>   	brm->bcmem = NULL;
>   	brm->rtmem = (void *)brm->mem;
>   
> -	brm->rt_event = (struct rt_msg *) malloc(EVENT_QUEUE_SIZE*sizeof(struct rt_msg));
> +	brm->rt_event = grlib_malloc(EVENT_QUEUE_SIZE*sizeof(*brm->rt_event));
>     
>   	if (brm->rt_event == NULL) {
>   		DBG("BRM driver failed to allocated memory.");
> @@ -759,7 +760,7 @@ static rtems_device_driver bm_init(brm_priv *brm) {
>   	brm->bcmem = NULL;
>   	brm->rtmem = NULL;
>   	
> -	brm->bm_event	 = (struct bm_msg *) malloc(EVENT_QUEUE_SIZE*sizeof(struct bm_msg));
> +	brm->bm_event	 = grlib_malloc(EVENT_QUEUE_SIZE*sizeof(*brm->bm_event));
>    
>   	if (brm->bm_event == NULL) {
>   		DBG("BRM driver failed to allocated memory.");
> diff --git a/bsps/sparc/shared/1553/b1553rt.c b/bsps/sparc/shared/1553/b1553rt.c
> index b076abdc5d..9d2a22d70b 100644
> --- a/bsps/sparc/shared/1553/b1553rt.c
> +++ b/bsps/sparc/shared/1553/b1553rt.c
> @@ -23,6 +23,8 @@
>   #include <ambapp.h>
>   #include <drvmgr/ambapp_bus.h>
>   
> +#include <grlib_impl.h>
> +
>   /* Uncomment for debug output */
>   /*#define DEBUG 1*/
>   
> @@ -167,10 +169,9 @@ int b1553rt_init2(struct drvmgr_dev *dev)
>       rt_priv *priv;
>   
>       DBG("B1553RT[%d] on bus %s\n", dev->minor_drv, dev->parent->dev->name);
> -    priv = dev->priv = malloc(sizeof(rt_priv));
> +    priv = dev->priv = grlib_calloc(1, sizeof(*priv));
>       if ( !priv )
>           return DRVMGR_NOMEM;
> -    memset(priv, 0, sizeof(*priv));
>       priv->dev = dev;
>   
>       /* This core will not find other cores, so we wait for init2() */
> @@ -318,7 +319,7 @@ int b1553rt_device_init(rt_priv *pDev)
>               /* Use dynamically allocated memory,
>                * 4k DMA memory + 4k for alignment
>                */
> -            mem = (unsigned int)malloc(4 * 1024 * 2);
> +            mem = (unsigned int)grlib_malloc(4 * 1024 * 2);
>               if ( !mem ){
>                   printk("RT: Failed to allocate HW memory\n\r");
>                   return -1;
> @@ -458,7 +459,7 @@ static rtems_device_driver rt_init(rt_priv *rt)
>           free(rt->rt_event);
>       rt->rt_event = NULL;
>   
> -    rt->rt_event = (struct rt_msg *) malloc(EVENT_QUEUE_SIZE*sizeof(struct rt_msg));
> +    rt->rt_event = grlib_malloc(EVENT_QUEUE_SIZE*sizeof(*rt->rt_event));
>   
>       if (rt->rt_event == NULL) {
>           DBG("RT driver failed to allocated memory.");
> diff --git a/bsps/sparc/shared/1553/gr1553b.c b/bsps/sparc/shared/1553/gr1553b.c
> index c05d53a4f9..ba75398f63 100644
> --- a/bsps/sparc/shared/1553/gr1553b.c
> +++ b/bsps/sparc/shared/1553/gr1553b.c
> @@ -13,6 +13,8 @@
>   
>   #include <bsp/gr1553b.h>
>   
> +#include <grlib_impl.h>
> +
>   /* Driver Manager interface for BC, RT, BM, BRM, BC-BM and RT-BM */
>   
>   #define GR1553B_WRITE_REG(adr, val) *(volatile uint32_t *)(adr) = (val)
> @@ -219,7 +221,7 @@ static int gr1553_init3(struct drvmgr_dev *dev)
>   	struct gr1553_device_feature *feat;
>   	struct gr1553b_regs *regs;
>   
> -	priv = malloc(sizeof(struct gr1553_device));
> +	priv = grlib_malloc(sizeof(*priv));
>   	if ( priv == NULL )
>   		return DRVMGR_NOMEM;
>   	priv->dev = dev;
> @@ -234,7 +236,7 @@ static int gr1553_init3(struct drvmgr_dev *dev)
>   
>   	if ( GR1553B_READ_REG(&regs->bm_stat) & GR1553B_BM_STAT_BMSUP ) {
>   		priv->features |= FEAT_BM;
> -		feat = malloc(sizeof(struct gr1553_device_feature));
> +		feat = grlib_malloc(sizeof(*feat));
>   		feat->dev = priv;
>   		/* Init Minor and Next */
>   		gr1553_list_add(&gr1553_bm_root, feat);
> @@ -242,7 +244,7 @@ static int gr1553_init3(struct drvmgr_dev *dev)
>   
>   	if ( GR1553B_READ_REG(&regs->bc_stat) & GR1553B_BC_STAT_BCSUP ) {
>   		priv->features |= FEAT_BC;
> -		feat = malloc(sizeof(struct gr1553_device_feature));
> +		feat = grlib_malloc(sizeof(*feat));
>   		feat->dev = priv;
>   		/* Init Minor and Next */
>   		gr1553_list_add(&gr1553_bc_root, feat);
> @@ -250,7 +252,7 @@ static int gr1553_init3(struct drvmgr_dev *dev)
>   
>   	if ( GR1553B_READ_REG(&regs->rt_stat) & GR1553B_RT_STAT_RTSUP ) {
>   		priv->features |= FEAT_RT;
> -		feat = malloc(sizeof(struct gr1553_device_feature));
> +		feat = grlib_malloc(sizeof(*feat));
>   		feat->dev = priv;
>   		/* Init Minor and Next */
>   		gr1553_list_add(&gr1553_rt_root, feat);
> diff --git a/bsps/sparc/shared/1553/gr1553bc.c b/bsps/sparc/shared/1553/gr1553bc.c
> index 099976f958..c7faba436d 100644
> --- a/bsps/sparc/shared/1553/gr1553bc.c
> +++ b/bsps/sparc/shared/1553/gr1553bc.c
> @@ -90,14 +90,13 @@ struct gr1553bc_list_cfg gr1553bc_def_cfg =
>   
>   int gr1553bc_list_alloc(struct gr1553bc_list **list, int max_major)
>   {
> -	int size;
> +	size_t size;
>   	struct gr1553bc_list *l;
>   
> -	size = sizeof(struct gr1553bc_list) + max_major * sizeof(void *);
> -	l = malloc(size);
> +	size = sizeof(*l) + max_major * sizeof(void *);
> +	l = grlib_calloc(1, size);
>   	if ( l == NULL )
>   		return -1;
> -	memset(l, 0, size);
>   
>   	l->major_cnt = max_major;
>   	*list = l;
> @@ -310,7 +309,7 @@ int gr1553bc_list_table_alloc
>   	} else {
>   		if (bdtab_custom == NULL) {
>   			/* Allocate descriptors */
> -			list->_table = malloc(size + (GR1553BC_BD_ALIGN-1));
> +			list->_table = grlib_malloc(size + (GR1553BC_BD_ALIGN-1));
>   			if ( list->_table == NULL )
>   				return -1;
>   		} else {
> @@ -508,15 +507,16 @@ int gr1553bc_major_alloc_skel
>   {
>   	struct gr1553bc_major *maj;
>   	struct gr1553bc_minor *minor;
> -	int size, i;
> +	size_t size;
> +	int i;
>   
>   	if ( (cfg == NULL) || (major == NULL) || (cfg->minor_cnt <= 0) )
>   		return -1;
>   
>   	/* Allocate Major Frame description, but no descriptors */
> -	size = sizeof(struct gr1553bc_major) + cfg->minor_cnt *
> -		(sizeof(struct gr1553bc_minor) + sizeof(void *));
> -	maj = (struct gr1553bc_major *)malloc(size);
> +	size = sizeof(*maj) + cfg->minor_cnt *
> +		(sizeof(*minor) + sizeof(void *));
> +	maj = grlib_malloc(size);
>   	if ( maj == NULL )
>   		return -1;
>   
> @@ -1248,14 +1248,13 @@ void *gr1553bc_open(int minor)
>   	if ( pdev == NULL )
>   		goto fail;
>   
> -	irq_log_p = malloc(GR1553BC_IRQLOG_SIZE*2);
> +	irq_log_p = grlib_malloc(GR1553BC_IRQLOG_SIZE*2);
>   	if ( irq_log_p == NULL )
>   		goto fail;
>   
> -	priv = malloc(sizeof(struct gr1553bc_priv));
> +	priv = grlib_calloc(1, sizeof(*priv));
>   	if ( priv == NULL )
>   		goto fail;
> -	memset(priv, 0, sizeof(struct gr1553bc_priv));
>   
>   	/* Init BC device */
>   	priv->pdev = pdev;
> diff --git a/bsps/sparc/shared/1553/gr1553bm.c b/bsps/sparc/shared/1553/gr1553bm.c
> index 040dbf0d92..1897a16f79 100644
> --- a/bsps/sparc/shared/1553/gr1553bm.c
> +++ b/bsps/sparc/shared/1553/gr1553bm.c
> @@ -129,10 +129,9 @@ void *gr1553bm_open(int minor)
>   	if ( pdev == NULL )
>   		goto fail;
>   
> -	priv = malloc(sizeof(struct gr1553bm_priv));
> +	priv = grlib_calloc(1, sizeof(*priv));
>   	if ( priv == NULL )
>   		goto fail;
> -	memset(priv, 0, sizeof(struct gr1553bm_priv));
>   
>   	/* Init BC device */
>   	priv->pdev = pdev;
> @@ -209,7 +208,7 @@ int gr1553bm_config(void *bm, struct gr1553bm_config *cfg)
>   	} else {
>   		if (cfg->buffer_custom == NULL) {
>   			/* Allocate new buffer dynamically */
> -			priv->buffer = malloc(priv->buffer_size + 8);
> +			priv->buffer = grlib_malloc(priv->buffer_size + 8);
>   			if (priv->buffer == NULL)
>   				return -1;
>   		} else {
> diff --git a/bsps/sparc/shared/1553/gr1553rt.c b/bsps/sparc/shared/1553/gr1553rt.c
> index 7f2e75af3e..8a869c9152 100644
> --- a/bsps/sparc/shared/1553/gr1553rt.c
> +++ b/bsps/sparc/shared/1553/gr1553rt.c
> @@ -239,7 +239,8 @@ int gr1553rt_list_init
>   	)
>   {
>   	struct gr1553rt_priv *priv = rt;
> -	int i, size;
> +	size_t size;
> +	int i;
>   	struct gr1553rt_sw_bd *swbd;
>   	unsigned short index;
>   	struct gr1553rt_list *list;
> @@ -253,9 +254,9 @@ int gr1553rt_list_init
>   	list = *plist;
>   	if ( list == NULL ) {
>   		/* Dynamically allocate LIST */
> -		size = offsetof(struct gr1553rt_list, bds) +
> -			(cfg->bd_cnt * sizeof(unsigned short));
> -		list = (struct gr1553rt_list *)malloc(size);
> +		size = sizeof(*list) +
> +			(cfg->bd_cnt * sizeof(list->bds[0]));
> +		list = grlib_malloc(size);
>   		if ( list == NULL )
>   			return -1;
>   		*plist = list;
> @@ -661,10 +662,9 @@ void *gr1553rt_open(int minor)
>   	if ( pdev == NULL )
>   		goto fail;
>   
> -	priv = malloc(sizeof(struct gr1553rt_priv));
> +	priv = grlib_calloc(1, sizeof(*priv));
>   	if ( priv == NULL )
>   		goto fail;
> -	memset(priv, 0, sizeof(struct gr1553rt_priv));
>   
>   	/* Assign a device private to RT device */
>   	priv->pdev = pdev;
> @@ -786,7 +786,8 @@ static int gr1553rt_sw_alloc(struct gr1553rt_priv *priv)
>   			);
>   	} else {
>   		if (priv->cfg.evlog_buffer == NULL) {
> -			priv->evlog_buffer = malloc(priv->cfg.evlog_size * 2);
> +			priv->evlog_buffer = grlib_malloc(
> +				priv->cfg.evlog_size * 2);
>   			if (priv->evlog_buffer == NULL)
>   				return -1;
>   		} else {
> @@ -826,7 +827,7 @@ static int gr1553rt_sw_alloc(struct gr1553rt_priv *priv)
>   			);
>   	} else {
>   		if ( priv->cfg.bd_buffer == NULL ) {
> -			priv->bd_buffer = malloc(size + 0xf);
> +			priv->bd_buffer = grlib_malloc(size + 0xf);
>   			if (priv->bd_buffer == NULL)
>   				return -1;
>   		} else {
> @@ -849,7 +850,7 @@ static int gr1553rt_sw_alloc(struct gr1553rt_priv *priv)
>   
>   #if (RTBD_MAX == 0)
>   	/* Allocate software description of */
> -	priv->swbds = malloc(priv->cfg.bd_count * sizeof(struct gr1553rt_sw_bd));
> +	priv->swbds = grlib_malloc(priv->cfg.bd_count * sizeof(*priv->swbds));
>   	if ( priv->swbds == NULL ) {
>   		return -1;
>   	}
> @@ -869,7 +870,7 @@ static int gr1553rt_sw_alloc(struct gr1553rt_priv *priv)
>   			16 * 32);
>   	} else {
>   		if (priv->cfg.satab_buffer == NULL) {
> -			priv->satab_buffer = malloc((16 * 32) * 2);
> +			priv->satab_buffer = grlib_malloc((16 * 32) * 2);
>   			if (priv->satab_buffer == NULL)
>   				return -1;
>   		} else {
> diff --git a/bsps/sparc/shared/amba/ambapp.c b/bsps/sparc/shared/amba/ambapp.c
> index e3c777a5f5..4fb8405103 100644
> --- a/bsps/sparc/shared/amba/ambapp.c
> +++ b/bsps/sparc/shared/amba/ambapp.c
> @@ -16,6 +16,8 @@
>   #include <ambapp.h>
>   #include <bsp.h>
>   
> +#include <grlib_impl.h>
> +
>   #define AMBA_CONF_AREA 0xff000
>   #define AMBA_AHB_SLAVE_CONF_AREA (1 << 11)
>   #define AMBA_APB_SLAVES 16
> @@ -30,7 +32,7 @@ static struct ambapp_dev *ambapp_alloc_dev_struct(int dev_type)
>       size += sizeof(struct ambapp_apb_info);
>     else
>       size += sizeof(struct ambapp_ahb_info); /* AHB */
> -  dev = (struct ambapp_dev *)calloc(1, size);
> +  dev = grlib_calloc(1, size);
>     if (dev != NULL)
>       dev->dev_type = dev_type;
>     return dev;
> diff --git a/bsps/sparc/shared/analog/gradcdac.c b/bsps/sparc/shared/analog/gradcdac.c
> index 07fb2ee9dd..bbe6620060 100644
> --- a/bsps/sparc/shared/analog/gradcdac.c
> +++ b/bsps/sparc/shared/analog/gradcdac.c
> @@ -29,6 +29,8 @@
>   */
>   #include <bsp/debug_defs.h>
>   
> +#include <grlib_impl.h>
> +
>   struct gradcdac_priv {
>   	struct gradcdac_regs *regs;	/* Must be first */
>   	struct drvmgr_dev *dev;
> @@ -99,10 +101,9 @@ int gradcdac_init2(struct drvmgr_dev *dev)
>   
>   	DBG("GRADCDAC[%d] on bus %s\n", dev->minor_drv, dev->parent->dev->name);
>   
> -	priv = dev->priv = malloc(sizeof(struct gradcdac_priv));
> +	priv = dev->priv = grlib_calloc(1, sizeof(*priv));
>   	if ( !priv )
>   		return DRVMGR_NOMEM;
> -	memset(priv, 0, sizeof(*priv));
>   	priv->dev = dev;
>   
>   	/* This core will not find other cores, so we wait for init2() */
> diff --git a/bsps/sparc/shared/ascs/grascs.c b/bsps/sparc/shared/ascs/grascs.c
> index 11663b2ccc..1c7599575e 100644
> --- a/bsps/sparc/shared/ascs/grascs.c
> +++ b/bsps/sparc/shared/ascs/grascs.c
> @@ -13,6 +13,8 @@
>   #include <ambapp.h>
>   #include <bsp/grascs.h>
>   
> +#include <grlib_impl.h>
> +
>   #ifndef GAISLER_ASCS
>   #define GAISLER_ASCS 0x043
>   #endif
> @@ -196,12 +198,12 @@ int ASCS_init(void) {
>     DBG("ASCS_init: Starting initialization of ASCS core\n");
>     
>     /* Allocate memory for config, status and capability struct */
> -  if((cfg = (GRASCS_cfg*)malloc(sizeof(GRASCS_cfg))) == NULL) {
> +  if((cfg = grlib_malloc(sizeof(*cfg))) == NULL) {
>       DBG("ASCS_init: Could not allocate memory for cfg struc\n");
>       return -1;
>     }
>     
> -  if((cfg->caps = (GRASCS_caps*)calloc(1,sizeof(GRASCS_caps))) == NULL) {
> +  if((cfg->caps = grlib_calloc(1,sizeof(*cfg->caps))) == NULL) {
>       DBG("ASCS_init: Could not allocate memory for caps struc\n");
>       goto init_error1;
>     }
> diff --git a/bsps/sparc/shared/btimer/gptimer.c b/bsps/sparc/shared/btimer/gptimer.c
> index 08e498178e..6174acc007 100644
> --- a/bsps/sparc/shared/btimer/gptimer.c
> +++ b/bsps/sparc/shared/btimer/gptimer.c
> @@ -54,6 +54,8 @@
>   #include <rtems/score/smpimpl.h>
>   #endif
>   
> +#include <grlib_impl.h>
> +
>   /* GPTIMER Core Configuration Register (READ-ONLY) */
>   #define GPTIMER_CFG_TIMERS_BIT	0
>   #define GPTIMER_CFG_IRQ_BIT	3
> @@ -231,10 +233,9 @@ int gptimer_init1(struct drvmgr_dev *dev)
>   	 */
>   	size = sizeof(struct gptimer_priv) +
>   		timer_cnt*sizeof(struct gptimer_timer);
> -	priv = dev->priv = (struct gptimer_priv *)malloc(size);
> +	priv = dev->priv = grlib_calloc(1, size);
>   	if ( !priv )
>   		return DRVMGR_NOMEM;
> -	memset(priv, 0, size);
>   	priv->dev = dev;
>   	priv->regs = regs;
>   
> diff --git a/bsps/sparc/shared/can/canmux.c b/bsps/sparc/shared/can/canmux.c
> index 1d9d371157..ca2125aefd 100644
> --- a/bsps/sparc/shared/can/canmux.c
> +++ b/bsps/sparc/shared/can/canmux.c
> @@ -19,6 +19,8 @@
>   #include <bsp/canmux.h>
>   #include <ambapp.h>
>   
> +#include <grlib_impl.h>
> +
>   #ifndef GAISLER_CANMUX
>   #define GAISLER_CANMUX 0x081
>   #endif
> @@ -140,7 +142,7 @@ static rtems_device_driver canmux_initialize(rtems_device_major_number major, rt
>   		rtems_fatal_error_occurred(status);
>   
>   	/* Create private structure */
> -	if ((priv = malloc(sizeof(struct canmux_priv))) == NULL) {
> +	if ((priv = grlib_malloc(sizeof(*priv))) == NULL) {
>   		printk("CAN_MUX driver could not allocate memory for priv structure\n\r");
>   		return -1;
>   	}
> diff --git a/bsps/sparc/shared/can/grcan.c b/bsps/sparc/shared/can/grcan.c
> index 6762c96b44..03faec915c 100644
> --- a/bsps/sparc/shared/can/grcan.c
> +++ b/bsps/sparc/shared/can/grcan.c
> @@ -256,10 +256,9 @@ int grcan_init2(struct drvmgr_dev *dev)
>   	DBG("GRCAN[%d] on bus %s\n", dev->minor_drv, dev->parent->dev->name);
>   	if (GRCAN_COUNT_MAX <= grcan_count)
>   		return DRVMGR_ENORES;
> -	priv = dev->priv = malloc(sizeof(struct grcan_priv));
> +	priv = dev->priv = grlib_calloc(1, sizeof(*priv));
>   	if ( !priv )
>   		return DRVMGR_NOMEM;
> -	memset(priv, 0, sizeof(*priv));
>   	priv->dev = dev;
>   
>   	/* This core will not find other cores, so we wait for init2() */
> @@ -1113,7 +1112,7 @@ static int grcan_alloc_buffers(struct grcan_priv *pDev, int rx, int tx)
>   			pDev->tx = (struct grcan_msg *)pDev->_tx;
>   		} else {
>   			if (adr == 0) {
> -				pDev->_tx = malloc(pDev->txbuf_size +
> +				pDev->_tx = grlib_malloc(pDev->txbuf_size +
>   				                   BUFFER_ALIGNMENT_NEEDS);
>   				if (!pDev->_tx)
>   					return -1;
> @@ -1157,7 +1156,7 @@ static int grcan_alloc_buffers(struct grcan_priv *pDev, int rx, int tx)
>   			pDev->rx = (struct grcan_msg *)pDev->_rx;
>   		} else {
>   			if (adr == 0) {
> -				pDev->_rx = malloc(pDev->rxbuf_size +
> +				pDev->_rx = grlib_malloc(pDev->rxbuf_size +
>   				                   BUFFER_ALIGNMENT_NEEDS);
>   				if (!pDev->_rx)
>   					return -1;
> diff --git a/bsps/sparc/shared/can/occan.c b/bsps/sparc/shared/can/occan.c
> index b45b11dc72..c0bc315db1 100644
> --- a/bsps/sparc/shared/can/occan.c
> +++ b/bsps/sparc/shared/can/occan.c
> @@ -80,7 +80,7 @@ typedef struct {
>   	int full; /* 1 = base contain cnt CANMsgs, tail==head */
>   	CANMsg *tail, *head;
>   	CANMsg *base;
> -	char fifoarea[0];
> +	CANMsg fifoarea[0];
>   } occan_fifo;
>   
>   /* PELICAN */
> @@ -448,10 +448,9 @@ int occan_init2(struct drvmgr_dev *dev)
>   	occan_priv *priv;
>   
>   	DBG("OCCAN[%d] on bus %s\n", dev->minor_drv, dev->parent->dev->name);
> -	priv = dev->priv = malloc(sizeof(occan_priv));
> +	priv = dev->priv = grlib_calloc(1, sizeof(*priv));
>   	if ( !priv )
>   		return DRVMGR_NOMEM;
> -	memset(priv, 0, sizeof(*priv));
>   	priv->dev = dev;
>   
>   	return DRVMGR_OK;
> @@ -1881,15 +1880,11 @@ void occan_interrupt(void *arg)
>   static occan_fifo *occan_fifo_create(int cnt)
>   {
>   	occan_fifo *fifo;
> -	fifo = malloc(sizeof(occan_fifo)+cnt*sizeof(CANMsg));
> +	fifo = grlib_calloc(1, sizeof(*fifo)+cnt*sizeof(CANMsg));
>   	if ( fifo ){
>   		fifo->cnt = cnt;
> -		fifo->full = 0;
> -		fifo->ovcnt = 0;
> -		fifo->base = (CANMsg *)&fifo->fifoarea[0];
> +		fifo->base = &fifo->fifoarea[0];
>   		fifo->tail = fifo->head = fifo->base;
> -		/* clear CAN Messages */
> -		memset(fifo->base,0,cnt * sizeof(CANMsg));
>   	}
>   	return fifo;
>   }
> diff --git a/bsps/sparc/shared/can/satcan.c b/bsps/sparc/shared/can/satcan.c
> index 1655a36e36..9cc27fc0dc 100644
> --- a/bsps/sparc/shared/can/satcan.c
> +++ b/bsps/sparc/shared/can/satcan.c
> @@ -19,6 +19,8 @@
>   #include <bsp/satcan.h>
>   #include <ambapp.h>
>   
> +#include <grlib_impl.h>
> +
>   #ifndef GAISLER_SATCAN
>   #define GAISLER_SATCAN 0x080
>   #endif
> @@ -146,7 +148,7 @@ static rtems_device_driver satcan_initialize(rtems_device_major_number major, rt
>    */
>   static void almalloc(unsigned char **alptr, void **ptr, int sz)
>   {
> -  *ptr = calloc(1,2*sz);
> +  *ptr = rtems_calloc(1,2*sz);
>     *alptr = (unsigned char *) (((int)*ptr+sz) & ~(sz-1));
>   }
>   
> @@ -682,13 +684,13 @@ int satcan_register(satcan_config *conf)
>   	DBG("SatCAN: satcan_register called\n\r");
>   
>   	/* Create private structure */
> -	if ((priv = malloc(sizeof(struct satcan_priv))) == NULL) {
> +	if ((priv = grlib_malloc(sizeof(*priv))) == NULL) {
>   		printk("SatCAN driver could not allocate memory for priv structure\n\r");
>   		return -1;
>   	}
>   
>   	DBG("SatCAN: Creating local copy of config structure\n\r");
> -	if ((priv->cfg = malloc(sizeof(satcan_config))) == NULL) {
> +	if ((priv->cfg = grlib_malloc(sizeof(*priv->cfg))) == NULL) {
>   		printk("SatCAN driver could not allocate memory for cfg structure\n\r");
>   		return 1;
>   	}
> diff --git a/bsps/sparc/shared/drvmgr/ambapp_bus_grlib.c b/bsps/sparc/shared/drvmgr/ambapp_bus_grlib.c
> index 73fd465aec..1db0d06aeb 100644
> --- a/bsps/sparc/shared/drvmgr/ambapp_bus_grlib.c
> +++ b/bsps/sparc/shared/drvmgr/ambapp_bus_grlib.c
> @@ -24,6 +24,8 @@
>   #include <bsp.h>
>   #include <bsp/irq.h>
>   
> +#include <grlib_impl.h>
> +
>   #define DBG(args...)
>   /*#define DBG(args...) printk(args)*/
>   
> @@ -151,7 +153,7 @@ static int ambapp_grlib_init1(struct drvmgr_dev *dev)
>   
>   	DBG("AMBAPP GRLIB: intializing\n");
>   
> -	config = malloc(sizeof(struct ambapp_config));
> +	config = grlib_malloc(sizeof(*config));
>   	if ( !config )
>   		return RTEMS_NO_MEMORY;
>   
> diff --git a/bsps/sparc/shared/gpio/gpiolib.c b/bsps/sparc/shared/gpio/gpiolib.c
> index 38bc9633d0..700f27a266 100644
> --- a/bsps/sparc/shared/gpio/gpiolib.c
> +++ b/bsps/sparc/shared/gpio/gpiolib.c
> @@ -14,6 +14,8 @@
>   
>   #include <bsp/gpiolib.h>
>   
> +#include <grlib_impl.h>
> +
>   struct gpiolib_port;
>   
>   struct gpiolib_port {
> @@ -78,11 +80,10 @@ int gpiolib_drv_register(struct gpiolib_drv *drv, void *handle)
>   	if ( !drv || !drv->ops )
>   		return -1;
>   
> -	port = malloc(sizeof(*port));
> +	port = grlib_calloc(1, sizeof(*port));
>   	if ( port == NULL )
>   		return -1;
>   
> -	memset(port, 0, sizeof(*port));
>   	port->handle = handle;
>   	port->minor = port_nr++;
>   	port->drv = drv;
> diff --git a/bsps/sparc/shared/gpio/grgpio.c b/bsps/sparc/shared/gpio/grgpio.c
> index 7b02298fa4..b235ba273d 100644
> --- a/bsps/sparc/shared/gpio/grgpio.c
> +++ b/bsps/sparc/shared/gpio/grgpio.c
> @@ -22,6 +22,7 @@
>   #include <bsp/gpiolib.h>
>   #include <ambapp.h>
>   #include <grlib.h>
> +#include <grlib_impl.h>
>   
>   /*#define DEBUG 1*/
>   
> @@ -117,10 +118,9 @@ int grgpio_init1(struct drvmgr_dev *dev)
>   	if ( status < 0 )
>   		return DRVMGR_FAIL;
>   
> -	priv = dev->priv = malloc(sizeof(struct grgpio_priv));
> +	priv = dev->priv = grlib_calloc(1, sizeof(*priv));
>   	if ( !priv )
>   		return DRVMGR_NOMEM;
> -	memset(priv, 0, sizeof(*priv));
>   	priv->dev = dev;
>   
>   	if ( grgpio_device_init(priv) ) {
> diff --git a/bsps/sparc/shared/i2c/i2cmst.c b/bsps/sparc/shared/i2c/i2cmst.c
> index 9e386f7cb6..3f11d879aa 100644
> --- a/bsps/sparc/shared/i2c/i2cmst.c
> +++ b/bsps/sparc/shared/i2c/i2cmst.c
> @@ -22,6 +22,8 @@
>   
>   #include <bsp/i2cmst.h>
>   
> +#include <grlib_impl.h>
> +
>   /* Enable debug printks? */
>   /*#define DEBUG*/
>   
> @@ -339,10 +341,9 @@ int i2cmst_init2(struct drvmgr_dev *dev)
>   
>   	DBG("I2CMST[%d] on bus %s\n", dev->minor_drv, dev->parent->dev->name);
>   
> -	priv = dev->priv = malloc(sizeof(gr_i2cmst_prv_t));
> +	priv = dev->priv = grlib_calloc(1, sizeof(*priv));
>   	if ( !priv )
>   		return DRVMGR_NOMEM;
> -	memset(priv, 0, sizeof(*priv));
>   	priv->dev = dev;
>   
>   	/* This core will not find other cores, so we wait for init2() */
> diff --git a/bsps/sparc/shared/iommu/griommu.c b/bsps/sparc/shared/iommu/griommu.c
> index c6c87df6d6..69d8672057 100644
> --- a/bsps/sparc/shared/iommu/griommu.c
> +++ b/bsps/sparc/shared/iommu/griommu.c
> @@ -19,6 +19,8 @@
>   #include <bsp.h>
>   #include <bsp/griommu.h>
>   
> +#include <grlib_impl.h>
> +
>   /*#define STATIC*/
>   #define STATIC static
>   
> @@ -1027,7 +1029,7 @@ void * griommu_apv_new(void)
>   	}
>   
>   	/* Allocate APV */
> -	unsigned int * orig_ptr = (unsigned int *) malloc(
> +	unsigned int * orig_ptr = grlib_malloc(
>   			(GRIOMMU_APV_SIZE/priv->pagesize) + GRIOMMU_APV_ALIGN);
>   	if (orig_ptr == NULL) return NULL;
>   
> diff --git a/bsps/sparc/shared/irq/genirq.c b/bsps/sparc/shared/irq/genirq.c
> index bba642e701..6ddd442f73 100644
> --- a/bsps/sparc/shared/irq/genirq.c
> +++ b/bsps/sparc/shared/irq/genirq.c
> @@ -15,6 +15,8 @@
>   #include <string.h>
>   #include <bsp/genirq.h>
>   
> +#include <grlib_impl.h>
> +
>   struct genirq_handler_entry {
>   	struct genirq_handler_entry	*next;		/* Next ISR entry for this IRQ number */
>   	genirq_handler			isr;		/* ISR function called upon IRQ */
> @@ -31,21 +33,20 @@ struct genirq_priv {
>   	/* Maximum number of interrupt */
>   	int				genirq_max;
>   	/* IRQ Table index N reflect IRQ number N */
> -	struct genirq_irq_entry		genirq_table[1]; /* Length depends on */
> +	struct genirq_irq_entry		genirq_table[0]; /* Length depends on */
>   };
>   
>   genirq_t genirq_init(int number_of_irqs)
>   {
> -	int size;
> +	size_t size;
>   	struct genirq_priv *priv;
>   
> -	size = sizeof(int) +
> -	       number_of_irqs * sizeof(struct genirq_irq_entry);
> +	size = sizeof(*priv) +
> +	       number_of_irqs * sizeof(priv->genirq_table[0]);
>   
> -	priv = (struct genirq_priv *)malloc(size);
> +	priv = grlib_calloc(1, size);
>   	if ( !priv )
>   		return NULL;
> -	memset(priv, 0, size);
>   	priv->genirq_max = number_of_irqs - 1;
>   
>   	return priv;
> @@ -86,7 +87,7 @@ void *genirq_alloc_handler(genirq_handler isr, void *arg)
>   {
>   	struct genirq_handler_entry *newentry;
>   
> -	newentry = malloc(sizeof(struct genirq_handler_entry));
> +	newentry = grlib_malloc(sizeof(*newentry));
>   	if ( newentry ) {
>   		/* Initialize ISR entry */
>   		newentry->isr     = isr;
> diff --git a/bsps/sparc/shared/mem/mctrl.c b/bsps/sparc/shared/mem/mctrl.c
> index 42c81c45cc..47422a7ee2 100644
> --- a/bsps/sparc/shared/mem/mctrl.c
> +++ b/bsps/sparc/shared/mem/mctrl.c
> @@ -22,6 +22,8 @@
>   
>   #include <bsp/mctrl.h>
>   
> +#include <grlib_impl.h>
> +
>   #define MEMSET(priv, start, c, length) memset((void *)start, c, length)
>   
>   #define DBG(args...)
> @@ -105,10 +107,9 @@ static int mctrl_init1(struct drvmgr_dev *dev)
>   	unsigned int start, length;
>   
>   	DBG("MCTRL[%d] on bus %s\n", dev->minor_drv, dev->parent->dev->name);
> -	priv = dev->priv = malloc(sizeof(struct mctrl_priv));
> +	priv = dev->priv = grlib_calloc(1, sizeof(*priv));
>   	if ( !priv )
>   		return DRVMGR_NOMEM;
> -	memset(priv, 0, sizeof(*priv));
>   	priv->dev = dev;
>   
>   	/* Get device information from AMBA PnP information */
> diff --git a/bsps/sparc/shared/net/greth.c b/bsps/sparc/shared/net/greth.c
> index 830d6b2475..a1e038842c 100644
> --- a/bsps/sparc/shared/net/greth.c
> +++ b/bsps/sparc/shared/net/greth.c
> @@ -43,8 +43,6 @@
>   #include <netinet/in.h>
>   #include <netinet/if_ether.h>
>   
> -#include <grlib_impl.h>
> -
>   #ifdef malloc
>   #undef malloc
>   #endif
> @@ -52,6 +50,8 @@
>   #undef free
>   #endif
>   
> +#include <grlib_impl.h>
> +
>   #if defined(__m68k__)
>   extern m68k_isr_entry set_vector( rtems_isr_entry, rtems_vector_number, int );
>   #else
> @@ -216,7 +216,7 @@ int greth_process_tx(struct greth_softc *sc);
>   static char *almalloc(int sz, int alignment)
>   {
>           char *tmp;
> -        tmp = calloc(1, sz + (alignment-1));
> +        tmp = grlib_calloc(1, sz + (alignment-1));
>           tmp = (char *) (((int)tmp+alignment) & ~(alignment -1));
>           return(tmp);
>   }
> @@ -635,8 +635,8 @@ auto_neg_done:
>       regs->txdesc = (int) sc->txdesc_remote;
>       regs->rxdesc = (int) sc->rxdesc_remote;
>   
> -    sc->rxmbuf = calloc(sc->rxbufs, sizeof(*sc->rxmbuf));
> -    sc->txmbuf = calloc(sc->txbufs, sizeof(*sc->txmbuf));
> +    sc->rxmbuf = grlib_calloc(sc->rxbufs, sizeof(*sc->rxmbuf));
> +    sc->txmbuf = grlib_calloc(sc->txbufs, sizeof(*sc->txmbuf));
>   
>       for (i = 0; i < sc->txbufs; i++)
>         {
> @@ -645,7 +645,7 @@ auto_neg_done:
>               drvmgr_translate_check(
>                   sc->dev,
>                   CPUMEM_TO_DMA,
> -                (void *)malloc(GRETH_MAXBUF_LEN),
> +                (void *)grlib_malloc(GRETH_MAXBUF_LEN),
>                   (void **)&sc->txdesc[i].addr,
>                   GRETH_MAXBUF_LEN);
>           }
> @@ -1503,10 +1503,9 @@ int greth_init2(struct drvmgr_dev *dev)
>   	struct greth_softc *priv;
>   
>   	DBG("GRETH[%d] on bus %s\n", dev->minor_drv, dev->parent->dev->name);
> -	priv = dev->priv = malloc(sizeof(struct greth_softc));
> +	priv = dev->priv = grlib_calloc(1, sizeof(*priv));
>   	if ( !priv )
>   		return DRVMGR_NOMEM;
> -	memset(priv, 0, sizeof(*priv));
>   	priv->dev = dev;
>   
>   	/* This core will not find other cores, so we wait for init3() */
> @@ -1535,8 +1534,7 @@ int greth_init3(struct drvmgr_dev *dev)
>       SPIN_INIT(&sc->devlock, sc->devName);
>   
>       /* Register GRETH device as an Network interface */
> -    ifp = malloc(sizeof(struct rtems_bsdnet_ifconfig));
> -    memset(ifp, 0, sizeof(*ifp));
> +    ifp = grlib_cmalloc(1, sizeof(*ifp));
>   
>       ifp->name = sc->devName;
>       ifp->drv_ctrl = sc;
> diff --git a/bsps/sparc/shared/pci/gr_701.c b/bsps/sparc/shared/pci/gr_701.c
> index 3e2109fbf5..03f3020db0 100644
> --- a/bsps/sparc/shared/pci/gr_701.c
> +++ b/bsps/sparc/shared/pci/gr_701.c
> @@ -316,11 +316,10 @@ int gr701_init1(struct drvmgr_dev *dev)
>   	uint32_t bar0, bar1, bar0_size, bar1_size;
>   	int resources_cnt;
>   
> -	priv = malloc(sizeof(struct gr701_priv));
> +	priv = grlib_calloc(1, sizeof(*priv));
>   	if ( !priv )
>   		return DRVMGR_NOMEM;
>   
> -	memset(priv, 0, sizeof(*priv));
>   	dev->priv = priv;
>   	priv->dev = dev;
>   
> diff --git a/bsps/sparc/shared/pci/gr_rasta_adcdac.c b/bsps/sparc/shared/pci/gr_rasta_adcdac.c
> index 8a58438287..1c46510772 100644
> --- a/bsps/sparc/shared/pci/gr_rasta_adcdac.c
> +++ b/bsps/sparc/shared/pci/gr_rasta_adcdac.c
> @@ -380,11 +380,10 @@ int gr_rasta_adcdac_init1(struct drvmgr_dev *dev)
>   	union drvmgr_key_value *value;
>   	int resources_cnt;
>   
> -	priv = malloc(sizeof(struct gr_rasta_adcdac_priv));
> +	priv = grlib_calloc(1, sizeof(*priv));
>   	if ( !priv )
>   		return DRVMGR_NOMEM;
>   
> -	memset(priv, 0, sizeof(*priv));
>   	dev->priv = priv;
>   	priv->dev = dev;
>   
> diff --git a/bsps/sparc/shared/pci/gr_rasta_io.c b/bsps/sparc/shared/pci/gr_rasta_io.c
> index 78f6eefa20..fed4b368ac 100644
> --- a/bsps/sparc/shared/pci/gr_rasta_io.c
> +++ b/bsps/sparc/shared/pci/gr_rasta_io.c
> @@ -559,11 +559,10 @@ int gr_rasta_io_init1(struct drvmgr_dev *dev)
>   	union drvmgr_key_value *value;
>   	int resources_cnt;
>   
> -	priv = malloc(sizeof(struct gr_rasta_io_priv));
> +	priv = grlib_calloc(1, sizeof(*priv));
>   	if ( !priv )
>   		return DRVMGR_NOMEM;
>   
> -	memset(priv, 0, sizeof(*priv));
>   	dev->priv = priv;
>   	priv->dev = dev;
>   
> diff --git a/bsps/sparc/shared/pci/gr_tmtc_1553.c b/bsps/sparc/shared/pci/gr_tmtc_1553.c
> index f68188bc9e..a8181b6429 100644
> --- a/bsps/sparc/shared/pci/gr_tmtc_1553.c
> +++ b/bsps/sparc/shared/pci/gr_tmtc_1553.c
> @@ -299,11 +299,10 @@ int gr_tmtc_1553_init1(struct drvmgr_dev *dev)
>   	 */
>   	((struct pci_dev_info *)dev->businfo)->irq = ((struct amba_dev_info *)dev->parent->dev->businfo)->info.irq;
>   
> -	priv = malloc(sizeof(struct gr_tmtc_1553_priv));
> +	priv = grlib_calloc(1, sizeof(*priv));
>   	if ( !priv )
>   		return DRVMGR_NOMEM;
>   
> -	memset(priv, 0, sizeof(*priv));
>   	dev->priv = priv;
>   	priv->dev = dev;
>   
> diff --git a/bsps/sparc/shared/pci/grpci2dma.c b/bsps/sparc/shared/pci/grpci2dma.c
> index 92c2038de0..0bc06ff50d 100644
> --- a/bsps/sparc/shared/pci/grpci2dma.c
> +++ b/bsps/sparc/shared/pci/grpci2dma.c
> @@ -1285,7 +1285,7 @@ STATIC int grpci2dma_data_print(struct grpci2_bd_data * data)
>   void * grpci2dma_channel_new(int number)
>   {
>   	/* Allocate memory */
> -	unsigned int * orig_ptr = (unsigned int *) malloc(
> +	unsigned int * orig_ptr = (unsigned int *) grlib_malloc(
>   			(GRPCI2DMA_BD_CHAN_SIZE)*number + GRPCI2DMA_BD_CHAN_ALIGN);
>   	if (orig_ptr == NULL) return NULL;
>   
> @@ -1317,7 +1317,7 @@ void grpci2dma_channel_delete(void * chan)
>   void * grpci2dma_data_new(int number)
>   {
>   	/* Allocate memory */
> -	unsigned int * orig_ptr = (unsigned int *) malloc(
> +	unsigned int * orig_ptr = (unsigned int *) grlib_malloc(
>   			(GRPCI2DMA_BD_DATA_SIZE)*number + GRPCI2DMA_BD_DATA_ALIGN);
>   	if (orig_ptr == NULL) return NULL;
>   
> @@ -1375,13 +1375,10 @@ int grpci2dma_init(
>   		return -1;
>   
>   	/* Allocate and init Memory for DMA */
> -	int size = sizeof(struct grpci2dma_priv);
> -	priv = (struct grpci2dma_priv *) malloc(size);
> +	priv = grlib_calloc(1, sizeof(*priv));
>   	if (priv == NULL)
>   		return DRVMGR_NOMEM;
>   
> -	/* Initialize all fields */
> -	memset(priv, 0, size);
>   	priv->regs = regs;
>   	strncpy(&priv->devname[0], "grpci2dma0", DEVNAME_LEN);
>   
> diff --git a/bsps/sparc/shared/pwm/grpwm.c b/bsps/sparc/shared/pwm/grpwm.c
> index 302df73e83..87e40663c5 100644
> --- a/bsps/sparc/shared/pwm/grpwm.c
> +++ b/bsps/sparc/shared/pwm/grpwm.c
> @@ -22,6 +22,8 @@
>   #include <bsp/grpwm.h>
>   #include <ambapp.h>
>   
> +#include <grlib_impl.h>
> +
>   /* #define DEBUG 1 */
>   
>   #ifdef DEBUG
> @@ -222,7 +224,7 @@ int grpwm_init2(struct drvmgr_dev *dev)
>   
>   	DBG("GRPWM[%d] on bus %s\n", dev->minor_drv, dev->parent->dev->name);
>   
> -	priv = dev->priv = malloc(sizeof(struct grpwm_priv));
> +	priv = dev->priv = grlib_malloc(sizeof(*priv));
>   	if ( !priv )
>   		return DRVMGR_NOMEM;
>   	memset(priv, 0, sizeof(*priv));
> @@ -789,10 +791,9 @@ int grpwm_device_init(struct grpwm_priv *priv)
>   
>   	/* Find the number of PWM channels */
>   	priv->channel_cnt = 1 + ((regs->cap1 & GRPWM_CAP_NPWM) >> GRPWM_CAP_NPWM_BIT);
> -	pwm = malloc(sizeof(*pwm)*priv->channel_cnt);
> +	pwm = grlib_calloc(priv->channel_cnt, sizeof(*pwm));
>   	if ( !pwm )
>   		return -1;
> -	memset(pwm, 0, sizeof(*pwm)*priv->channel_cnt);
>   
>   	/* Init all PWM channels */
>   	sepirq = ((regs->cap1 & GRPWM_CAP_SEP) >> GRPWM_CAP_SEP_BIT);
> diff --git a/bsps/sparc/shared/slink/grslink.c b/bsps/sparc/shared/slink/grslink.c
> index 22a29546d0..07335786e5 100644
> --- a/bsps/sparc/shared/slink/grslink.c
> +++ b/bsps/sparc/shared/slink/grslink.c
> @@ -26,6 +26,8 @@
>   #include <bsp/grslink.h>
>   #include <ambapp.h>
>   
> +#include <grlib_impl.h>
> +
>   #ifndef GAISLER_SLINK
>   #define GAISLER_SLINK 0x02F
>   #endif
> @@ -101,12 +103,12 @@ static int SLINK_createqueues(int size)
>   	SLINK_queue *q;
>   	int i, j;
>   
> -	if ((q = malloc(SLINK_NUMQUEUES*sizeof(SLINK_queue))) == NULL)
> +	if ((q = grlib_malloc(SLINK_NUMQUEUES*sizeof(*q))) == NULL)
>   		goto slink_qiniterr1;
>   		
>   	for (i = 0; i < SLINK_NUMQUEUES; i++) {
>   		q[i].size = size;
> -		if ((q[i].buf = malloc(size*sizeof(int))) == NULL)
> +		if ((q[i].buf = grlib_malloc(size*sizeof(int))) == NULL)
>   			goto slink_qiniterr2;
>   		q[i].first = q[i].last = q[i].buf;
>   		q[i].max = q[i].buf + (size-1);
> @@ -345,7 +347,7 @@ int SLINK_init(unsigned int nullwrd, int parity, int qsize,
>   	rtems_status_code st;
>   
>   	/* Allocate private config structure */
> -	if (cfg == NULL && (cfg = malloc(sizeof(SLINK_cfg))) == NULL) {
> +	if (cfg == NULL && (cfg = grlib_malloc(sizeof(*cfg))) == NULL) {
>   		DBG("SLINK_init: Could not allocate cfg structure\n");
>   		goto slink_initerr1;
>   	}
> @@ -369,7 +371,7 @@ int SLINK_init(unsigned int nullwrd, int parity, int qsize,
>   	cfg->reg = (SLINK_regs*)base;
>   
>   	/* Allocate status structure and initialize members */
> -	if ((cfg->status = calloc(1, sizeof(SLINK_status))) == NULL) {
> +	if ((cfg->status = grlib_calloc(1, sizeof(*cfg->status))) == NULL) {
>   		DBG("SLINK_init: Could not allocate status structure\n");
>   		goto slink_initerr2;
>   	}
> @@ -378,7 +380,7 @@ int SLINK_init(unsigned int nullwrd, int parity, int qsize,
>   
>   #ifdef SLINK_COLLECT_STATISTICS
>   	/* Allocate statistics structure and initialize members */
> -	if ((cfg->stats = calloc(1, sizeof(SLINK_stats))) == NULL) {
> +	if ((cfg->stats = grlib_calloc(1, sizeof(*cfg->stats))) == NULL) {
>   		DBG("SLINK_init: Could not allocate statistics structure\n");
>   		goto slink_initerr3;
>   	}
> diff --git a/bsps/sparc/shared/spi/spictrl.c b/bsps/sparc/shared/spi/spictrl.c
> index 0c940d3374..6f5ffefe25 100644
> --- a/bsps/sparc/shared/spi/spictrl.c
> +++ b/bsps/sparc/shared/spi/spictrl.c
> @@ -24,6 +24,8 @@
>   
>   #include <rtems/libi2c.h>
>   
> +#include <grlib_impl.h>
> +
>   /*#define DEBUG 1*/
>   
>   #ifdef DEBUG
> @@ -216,10 +218,9 @@ int spictrl_init2(struct drvmgr_dev *dev)
>   
>   	DBG("SPICTRL[%d] on bus %s\n", dev->minor_drv, dev->parent->dev->name);
>   
> -	priv = dev->priv = malloc(sizeof(struct spictrl_priv));
> +	priv = dev->priv = grlib_calloc(1, sizeof(*priv));
>   	if ( !priv )
>   		return DRVMGR_NOMEM;
> -	memset(priv, 0, sizeof(*priv));
>   	priv->dev = dev;
>   
>   	/* This core will not find other cores, so we wait for init2() */
> diff --git a/bsps/sparc/shared/spw/grspw.c b/bsps/sparc/shared/spw/grspw.c
> index 661ec6c01d..846af8c6b5 100644
> --- a/bsps/sparc/shared/spw/grspw.c
> +++ b/bsps/sparc/shared/spw/grspw.c
> @@ -17,13 +17,14 @@
>   #include <assert.h>
>   #include <ctype.h>
>   #include <rtems/bspIo.h>
> -#include <rtems/malloc.h>
>   #include <ambapp.h>
>   
>   #include <drvmgr/drvmgr.h>
>   #include <drvmgr/ambapp_bus.h>
>   #include <bsp/grspw.h>
>   
> +#include <grlib_impl.h>
> +
>   #define DBGSPW_IOCALLS 1
>   #define DBGSPW_TX 2
>   #define DBGSPW_RX 4
> @@ -385,10 +386,9 @@ int grspw_init2(struct drvmgr_dev *dev)
>   
>   	SPACEWIRE_DBG("GRSPW[%d] on bus %s\n", dev->minor_drv,
>   		dev->parent->dev->name);
> -	priv = dev->priv = malloc(sizeof(GRSPW_DEV));
> +	priv = dev->priv = grlib_calloc(1, sizeof(*priv));
>   	if ( !priv )
>   		return DRVMGR_NOMEM;
> -	memset(priv, 0, sizeof(*priv));
>   	priv->dev = dev;
>   
>   	/* This core will not find other cores, so we wait for init2() */
> @@ -628,7 +628,8 @@ static int grspw_buffer_alloc(GRSPW_DEV *pDev)
>   		if (pDev->rx_dma_area == 0) {
>   			if (pDev->_ptr_rxbuf0)
>   				free((void *)pDev->_ptr_rxbuf0);
> -			pDev->_ptr_rxbuf0 = (unsigned int) malloc(pDev->rxbufsize * pDev->rxbufcnt+4);
> +			pDev->_ptr_rxbuf0 = (unsigned int) grlib_malloc(
> +				pDev->rxbufsize * pDev->rxbufcnt+4);
>   			pDev->ptr_rxbuf0 = (char *)((pDev->_ptr_rxbuf0+7)&~7);
>   			if ( !pDev->ptr_rxbuf0 )
>   				return 1;
> @@ -657,7 +658,8 @@ static int grspw_buffer_alloc(GRSPW_DEV *pDev)
>   		if (pDev->tx_data_dma_area == 0) {
>   			if (pDev->ptr_txdbuf0)
>   				free(pDev->ptr_txdbuf0);
> -			pDev->ptr_txdbuf0 = (char *) malloc(pDev->txdbufsize * pDev->txbufcnt);
> +			pDev->ptr_txdbuf0 = (char *) grlib_malloc(
> +				pDev->txdbufsize * pDev->txbufcnt);
>   			if (!pDev->ptr_txdbuf0)
>   				return 1;
>   		} else {
> @@ -685,7 +687,8 @@ static int grspw_buffer_alloc(GRSPW_DEV *pDev)
>   		if (pDev->tx_hdr_dma_area == 0) {
>   			if (pDev->ptr_txhbuf0)
>   				free(pDev->ptr_txhbuf0);
> -			pDev->ptr_txhbuf0 = (char *) malloc(pDev->txhbufsize * pDev->txbufcnt);
> +			pDev->ptr_txhbuf0 = (char *) grlib_malloc(
> +				pDev->txhbufsize * pDev->txbufcnt);
>   			if (!pDev->ptr_txhbuf0)
>   				return 1;
>   		} else {
> diff --git a/bsps/sparc/shared/spw/grspw_pkt.c b/bsps/sparc/shared/spw/grspw_pkt.c
> index 113684b1fe..ce8478de65 100644
> --- a/bsps/sparc/shared/spw/grspw_pkt.c
> +++ b/bsps/sparc/shared/spw/grspw_pkt.c
> @@ -20,7 +20,6 @@
>   #include <string.h>
>   #include <assert.h>
>   #include <ctype.h>
> -#include <malloc.h>
>   #include <rtems/bspIo.h>
>   
>   #include <drvmgr/drvmgr.h>
> @@ -549,7 +548,7 @@ void *grspw_open(int dev_no)
>   			goto out;
>   		}
>   	} else {
> -		priv->bd_mem_alloced = (unsigned int)malloc(bdtabsize + BDTAB_ALIGN - 1);
> +		priv->bd_mem_alloced = (unsigned int)grlib_malloc(bdtabsize + BDTAB_ALIGN - 1);
>   		if (priv->bd_mem_alloced == 0) {
>   			priv = NULL;
>   			goto out;
> @@ -1685,7 +1684,7 @@ void *grspw_dma_open(void *d, int chan_no)
>   
>   	/* Allocate memory for the two descriptor rings */
>   	size = sizeof(struct grspw_ring) * (GRSPW_RXBD_NR + GRSPW_TXBD_NR);
> -	dma->rx_ring_base = (struct grspw_rxring *)malloc(size);
> +	dma->rx_ring_base = grlib_malloc(size);
>   	dma->tx_ring_base = (struct grspw_txring *)&dma->rx_ring_base[GRSPW_RXBD_NR];
>   	if (dma->rx_ring_base == NULL)
>   		goto err;
> @@ -3056,7 +3055,7 @@ static int grspw2_init3(struct drvmgr_dev *dev)
>   	struct grspw_priv *priv;
>   	struct amba_dev_info *ambadev;
>   	struct ambapp_core *pnpinfo;
> -	int i, size;
> +	int i;
>   	unsigned int ctrl, icctrl, numi;
>   	union drvmgr_key_value *value;
>   
> @@ -3144,11 +3143,9 @@ static int grspw2_init3(struct drvmgr_dev *dev)
>   		priv->hwsup.ndma_chans = value->i;
>   
>   	/* Allocate and init Memory for all DMA channels */
> -	size = sizeof(struct grspw_dma_priv) * priv->hwsup.ndma_chans;
> -	priv->dma = (struct grspw_dma_priv *) malloc(size);
> +	priv->dma = grlib_calloc(priv->hwsup.ndma_chans, sizeof(*priv->dma));
>   	if (priv->dma == NULL)
>   		return DRVMGR_NOMEM;
> -	memset(priv->dma, 0, size);
>   	for (i=0; i<priv->hwsup.ndma_chans; i++) {
>   		priv->dma[i].core = priv;
>   		priv->dma[i].index = i;
> diff --git a/bsps/sparc/shared/time/grctm.c b/bsps/sparc/shared/time/grctm.c
> index 39fc972bb9..e740f7a7d5 100644
> --- a/bsps/sparc/shared/time/grctm.c
> +++ b/bsps/sparc/shared/time/grctm.c
> @@ -15,6 +15,8 @@
>   
>   #include <bsp/grctm.h>
>   
> +#include <grlib_impl.h>
> +
>   /* Private structure of GRCTM driver */
>   struct grctm_priv {
>   	struct drvmgr_dev *dev;
> @@ -351,10 +353,9 @@ static int grctm_init2(struct drvmgr_dev *dev)
>   	struct grctm_priv *priv;
>   	struct grctm_regs *regs;
>   
> -	priv = (struct grctm_priv *)malloc(sizeof(*priv));
> +	priv = grlib_calloc(1, sizeof(*priv));
>   	if ( priv == NULL )
>   		return -1;
> -	memset(priv, 0, sizeof(*priv));
>   	priv->dev = dev;
>   	dev->priv = priv;
>   
> diff --git a/bsps/sparc/shared/time/spwcuc.c b/bsps/sparc/shared/time/spwcuc.c
> index 082ced0772..354322910e 100644
> --- a/bsps/sparc/shared/time/spwcuc.c
> +++ b/bsps/sparc/shared/time/spwcuc.c
> @@ -13,9 +13,11 @@
>   #include <drvmgr/ambapp_bus.h>
>   #include <stdlib.h>
>   #include <string.h>
> -
> +
>   #include <bsp/spwcuc.h>
>   
> +#include <grlib_impl.h>
> +
>   /* Private structure of SPWCUC driver. */
>   struct spwcuc_priv {
>   	struct drvmgr_dev *dev;
> @@ -311,10 +313,9 @@ static int spwcuc_init2(struct drvmgr_dev *dev)
>   	struct spwcuc_priv *priv;
>   	struct spwcuc_regs *regs;
>   
> -	priv = (struct spwcuc_priv *)malloc(sizeof(*priv));
> +	priv = grlib_calloc(1, sizeof(*priv));
>   	if ( priv == NULL )
>   		return -1;
> -	memset(priv, 0, sizeof(*priv));
>   	priv->dev = dev;
>   	dev->priv = priv;
>   
> diff --git a/bsps/sparc/shared/tmtc/grtc.c b/bsps/sparc/shared/tmtc/grtc.c
> index 4e877465ab..35f67f6a4c 100644
> --- a/bsps/sparc/shared/tmtc/grtc.c
> +++ b/bsps/sparc/shared/tmtc/grtc.c
> @@ -15,7 +15,6 @@
>   #include <string.h>
>   #include <assert.h>
>   #include <ctype.h>
> -#include <malloc.h>
>   #include <rtems/bspIo.h>
>   
>   #include <drvmgr/drvmgr.h>
> @@ -617,7 +616,7 @@ static int grtc_data_avail(struct grtc_priv *pDev)
>   
>   static void *grtc_memalign(unsigned int boundary, unsigned int length, void *realbuf)
>   {
> -	*(int *)realbuf = (int)malloc(length+(~GRTC_ASR_BUFST)+1);
> +	*(int *)realbuf = (int)grlib_malloc(length+(~GRTC_ASR_BUFST)+1);
>   	DBG("GRTC: Alloced %d (0x%x) bytes, requested: %d\n",length+(~GRTC_ASR_BUFST)+1,length+(~GRTC_ASR_BUFST)+1,length);
>   	return (void *)(((*(unsigned int *)realbuf)+(~GRTC_ASR_BUFST)+1) & ~(boundary-1));
>   }
> @@ -1779,7 +1778,7 @@ static rtems_device_driver grtc_ioctl(rtems_device_major_number major, rtems_dev
>   		if ( pDev->pools ) {
>   			free(pDev->pools);
>   		}
> -		pDev->pools = malloc(pocfg->pool_cnt * sizeof(struct grtc_frame_pool));
> +		pDev->pools = grlib_malloc(pocfg->pool_cnt * sizeof(*pDev->pools));
>   		if ( !pDev->pools ) {
>   			pDev->pool_cnt = 0;
>   			return RTEMS_NO_MEMORY;
> diff --git a/bsps/sparc/shared/tmtc/grtm.c b/bsps/sparc/shared/tmtc/grtm.c
> index 10a4f6eb00..a7f7889dc5 100644
> --- a/bsps/sparc/shared/tmtc/grtm.c
> +++ b/bsps/sparc/shared/tmtc/grtm.c
> @@ -15,7 +15,6 @@
>   #include <string.h>
>   #include <assert.h>
>   #include <ctype.h>
> -#include <malloc.h>
>   #include <rtems/bspIo.h>
>   
>   #include <drvmgr/drvmgr.h>
> @@ -449,10 +448,9 @@ static int grtm_init2(struct drvmgr_dev *dev)
>   	struct grtm_priv *priv;
>   
>   	DBG("GRTM[%d] on bus %s\n", dev->minor_drv, dev->parent->dev->name);
> -	priv = dev->priv = malloc(sizeof(struct grtm_priv));
> +	priv = dev->priv = grlib_calloc(1, sizeof(*priv));
>   	if ( !priv )
>   		return DRVMGR_NOMEM;
> -	memset(priv, 0, sizeof(*priv));
>   	priv->dev = dev;
>   
>   	/* This core will not find other cores, so we wait for init2() */
> @@ -584,7 +582,7 @@ static int grtm_device_init(struct grtm_priv *pDev)
>   	}
>   	memset(pDev->bds, 0, 0x400);
>   
> -	pDev->_ring = malloc(sizeof(struct grtm_ring) * 128);
> +	pDev->_ring = grlib_malloc(sizeof(*pDev->_ring) * 128);
>   	if ( !pDev->_ring ) {
>   		return -1;
>   	}
> @@ -692,7 +690,7 @@ static void grtm_hw_get_default_modes(struct grtm_ioc_config *cfg, struct grtm_i
>   
>   static void *grtm_memalign(unsigned int boundary, unsigned int length, void *realbuf)
>   {
> -	*(int *)realbuf = (int)malloc(length+boundary);
> +	*(int *)realbuf = (int)grlib_malloc(length+boundary);
>   	DBG("GRTM: Alloced %d (0x%x) bytes, requested: %d\n",length+boundary,length+boundary,length);
>   	return (void *)(((*(unsigned int *)realbuf)+boundary) & ~(boundary-1));
>   }



More information about the devel mailing list