The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/contrib/ncsw/inc/etc/mem_ext.h

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /* Copyright (c) 2008-2012 Freescale Semiconductor, Inc
    2  * All rights reserved.
    3  *
    4  * Redistribution and use in source and binary forms, with or without
    5  * modification, are permitted provided that the following conditions are met:
    6  *     * Redistributions of source code must retain the above copyright
    7  *       notice, this list of conditions and the following disclaimer.
    8  *     * Redistributions in binary form must reproduce the above copyright
    9  *       notice, this list of conditions and the following disclaimer in the
   10  *       documentation and/or other materials provided with the distribution.
   11  *     * Neither the name of Freescale Semiconductor nor the
   12  *       names of its contributors may be used to endorse or promote products
   13  *       derived from this software without specific prior written permission.
   14  *
   15  *
   16  * ALTERNATIVELY, this software may be distributed under the terms of the
   17  * GNU General Public License ("GPL") as published by the Free Software
   18  * Foundation, either version 2 of that License or (at your option) any
   19  * later version.
   20  *
   21  * THIS SOFTWARE IS PROVIDED BY Freescale Semiconductor ``AS IS'' AND ANY
   22  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
   23  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   24  * DISCLAIMED. IN NO EVENT SHALL Freescale Semiconductor BE LIABLE FOR ANY
   25  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
   26  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
   27  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   28  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
   29  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
   30  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
   31  */
   32 
   33 
   34 /**************************************************************************//**
   35 
   36  @File          mem_ext.h
   37 
   38  @Description   External prototypes for the memory manager object
   39 *//***************************************************************************/
   40 
   41 #ifndef __MEM_EXT_H
   42 #define __MEM_EXT_H
   43 
   44 #include "std_ext.h"
   45 #include "part_ext.h"
   46 
   47 
   48 /**************************************************************************//**
   49  @Group         etc_id   Utility Library Application Programming Interface
   50 
   51  @Description   External routines.
   52 
   53  @{
   54 *//***************************************************************************/
   55 
   56 /**************************************************************************//**
   57  @Group         mem_id   Slab Memory Manager
   58 
   59  @Description   Slab Memory Manager module functions, definitions and enums.
   60 
   61  @{
   62 *//***************************************************************************/
   63 
   64 /* Each block is of the following structure:
   65  *
   66  *
   67  *  +-----------+----------+---------------------------+-----------+-----------+
   68  *  | Alignment |  Prefix  | Data                      | Postfix   | Alignment |
   69  *  |  field    |   field  |  field                    |   field   | Padding   |
   70  *  |           |          |                           |           |           |
   71  *  +-----------+----------+---------------------------+-----------+-----------+
   72  *  and at the beginning of all bytes, an additional optional padding might reside
   73  *  to ensure that the first blocks data field is aligned as requested.
   74  */
   75 
   76 
   77 #define MEM_MAX_NAME_LENGTH     8
   78 
   79 /**************************************************************************//*
   80  @Description   Memory Segment structure
   81 *//***************************************************************************/
   82 
   83 typedef struct
   84 {
   85     char        name[MEM_MAX_NAME_LENGTH];
   86                                     /* The segment's name */
   87     uint8_t     **p_Bases;          /* Base addresses of the segments */
   88     uint8_t     **p_BlocksStack;    /* Array of pointers to blocks */
   89     t_Handle    h_Spinlock;
   90     uint16_t    dataSize;           /* Size of each data block */
   91     uint16_t    prefixSize;         /* How many bytes to reserve before the data */
   92     uint16_t    postfixSize;        /* How many bytes to reserve after the data */
   93     uint16_t    alignment;          /* Requested alignment for the data field */
   94     int         allocOwner;         /* Memory allocation owner */
   95     uint32_t    getFailures;        /* Number of times get failed */
   96     uint32_t    num;                /* Number of blocks in segment */
   97     uint32_t    current;            /* Current block */
   98     bool        consecutiveMem;     /* Allocate consecutive data blocks memory */
   99 #ifdef DEBUG_MEM_LEAKS
  100     void        *p_MemDbg;          /* MEM debug database (MEM leaks detection) */
  101     uint32_t    blockOffset;
  102     uint32_t    blockSize;
  103 #endif /* DEBUG_MEM_LEAKS */
  104 } t_MemorySegment;
  105 
  106 
  107 
  108 /**************************************************************************//**
  109  @Function      MEM_Init
  110 
  111  @Description   Create a new memory segment.
  112 
  113  @Param[in]     name        - Name of memory partition.
  114  @Param[in]     p_Handle    - Handle to new segment is returned through here.
  115  @Param[in]     num         - Number of blocks in new segment.
  116  @Param[in]     dataSize    - Size of blocks in segment.
  117  @Param[in]     prefixSize  - How many bytes to allocate before the data.
  118  @Param[in]     postfixSize - How many bytes to allocate after the data.
  119  @Param[in]     alignment   - Requested alignment for data field (in bytes).
  120 
  121  @Return        E_OK - success, E_NO_MEMORY - out of memory.
  122 *//***************************************************************************/
  123 t_Error MEM_Init(char     name[],
  124                  t_Handle *p_Handle,
  125                  uint32_t num,
  126                  uint16_t dataSize,
  127                  uint16_t prefixSize,
  128                  uint16_t postfixSize,
  129                  uint16_t alignment);
  130 
  131 /**************************************************************************//**
  132  @Function      MEM_InitSmart
  133 
  134  @Description   Create a new memory segment.
  135 
  136  @Param[in]     name            - Name of memory partition.
  137  @Param[in]     p_Handle        - Handle to new segment is returned through here.
  138  @Param[in]     num             - Number of blocks in new segment.
  139  @Param[in]     dataSize        - Size of blocks in segment.
  140  @Param[in]     prefixSize      - How many bytes to allocate before the data.
  141  @Param[in]     postfixSize     - How many bytes to allocate after the data.
  142  @Param[in]     alignment       - Requested alignment for data field (in bytes).
  143  @Param[in]     memPartitionId  - Memory partition ID for allocation.
  144  @Param[in]     consecutiveMem  - Whether to allocate the memory blocks
  145                                   continuously or not.
  146 
  147  @Return        E_OK - success, E_NO_MEMORY - out of memory.
  148 *//***************************************************************************/
  149 t_Error MEM_InitSmart(char      name[],
  150                       t_Handle  *p_Handle,
  151                       uint32_t  num,
  152                       uint16_t  dataSize,
  153                       uint16_t  prefixSize,
  154                       uint16_t  postfixSize,
  155                       uint16_t  alignment,
  156                       uint8_t   memPartitionId,
  157                       bool      consecutiveMem);
  158 
  159 /**************************************************************************//**
  160  @Function      MEM_InitByAddress
  161 
  162  @Description   Create a new memory segment with a specified base address.
  163 
  164  @Param[in]     name        - Name of memory partition.
  165  @Param[in]     p_Handle    - Handle to new segment is returned through here.
  166  @Param[in]     num         - Number of blocks in new segment.
  167  @Param[in]     dataSize    - Size of blocks in segment.
  168  @Param[in]     prefixSize  - How many bytes to allocate before the data.
  169  @Param[in]     postfixSize - How many bytes to allocate after the data.
  170  @Param[in]     alignment   - Requested alignment for data field (in bytes).
  171  @Param[in]     address     - The required base address.
  172 
  173  @Return        E_OK - success, E_NO_MEMORY - out of memory.
  174  *//***************************************************************************/
  175 t_Error MEM_InitByAddress(char        name[],
  176                           t_Handle    *p_Handle,
  177                           uint32_t    num,
  178                           uint16_t    dataSize,
  179                           uint16_t    prefixSize,
  180                           uint16_t    postfixSize,
  181                           uint16_t    alignment,
  182                           uint8_t     *address);
  183 
  184 /**************************************************************************//**
  185  @Function      MEM_Free
  186 
  187  @Description   Free a specific memory segment.
  188 
  189  @Param[in]     h_Mem - Handle to memory segment.
  190 
  191  @Return        None.
  192 *//***************************************************************************/
  193 void MEM_Free(t_Handle h_Mem);
  194 
  195 /**************************************************************************//**
  196  @Function      MEM_Get
  197 
  198  @Description   Get a block of memory from a segment.
  199 
  200  @Param[in]     h_Mem - Handle to memory segment.
  201 
  202  @Return        Pointer to new memory block on success,0 otherwise.
  203 *//***************************************************************************/
  204 void * MEM_Get(t_Handle h_Mem);
  205 
  206 /**************************************************************************//**
  207  @Function      MEM_GetN
  208 
  209  @Description   Get up to N blocks of memory from a segment.
  210 
  211                 The blocks are assumed to be of a fixed size (one size per segment).
  212 
  213  @Param[in]     h_Mem   - Handle to memory segment.
  214  @Param[in]     num     - Number of blocks to allocate.
  215  @Param[out]    array   - Array of at least num pointers to which the addresses
  216                           of the allocated blocks are written.
  217 
  218  @Return        The number of blocks actually allocated.
  219 
  220  @Cautions      Interrupts are disabled for all of the allocation loop.
  221                 Although this loop is very short for each block (several machine
  222                 instructions), you should not allocate a very large number
  223                 of blocks via this routine.
  224 *//***************************************************************************/
  225 uint16_t MEM_GetN(t_Handle h_Mem, uint32_t num, void *array[]);
  226 
  227 /**************************************************************************//**
  228  @Function      MEM_Put
  229 
  230  @Description   Put a block of memory back to a segment.
  231 
  232  @Param[in]     h_Mem   - Handle to memory segment.
  233  @Param[in]     p_Block - The block to return.
  234 
  235  @Return        Pointer to new memory block on success,0 otherwise.
  236 *//***************************************************************************/
  237 t_Error MEM_Put(t_Handle h_Mem, void *p_Block);
  238 
  239 /**************************************************************************//**
  240  @Function      MEM_ComputePartitionSize
  241 
  242  @Description   calculate a tight upper boundary of the size of a partition with
  243                 given attributes.
  244 
  245                 The returned value is suitable if one wants to use MEM_InitByAddress().
  246 
  247  @Param[in]     num         - The number of blocks in the segment.
  248  @Param[in]     dataSize    - Size of block to get.
  249  @Param[in]     prefixSize  - The prefix size
  250  @Param         postfixSize - The postfix size
  251  @Param[in]     alignment   - The requested alignment value (in bytes)
  252 
  253  @Return        The memory block size a segment with the given attributes needs.
  254 *//***************************************************************************/
  255 uint32_t MEM_ComputePartitionSize(uint32_t num,
  256                                   uint16_t dataSize,
  257                                   uint16_t prefixSize,
  258                                   uint16_t postfixSize,
  259                                   uint16_t alignment);
  260 
  261 #ifdef DEBUG_MEM_LEAKS
  262 #if !((defined(__MWERKS__) || defined(__GNUC__)) && (__dest_os == __ppc_eabi))
  263 #error  "Memory-Leaks-Debug option is supported only for freescale CodeWarrior"
  264 #endif /* !(defined(__MWERKS__) && ... */
  265 
  266 /**************************************************************************//**
  267  @Function      MEM_CheckLeaks
  268 
  269  @Description   Report MEM object leaks.
  270 
  271                 This routine is automatically called by the MEM_Free() routine,
  272                 but it can also be invoked while the MEM object is alive.
  273 
  274  @Param[in]     h_Mem - Handle to memory segment.
  275 
  276  @Return        None.
  277 *//***************************************************************************/
  278 void MEM_CheckLeaks(t_Handle h_Mem);
  279 
  280 #else  /* not DEBUG_MEM_LEAKS */
  281 #define MEM_CheckLeaks(h_Mem)
  282 #endif /* not DEBUG_MEM_LEAKS */
  283 
  284 /**************************************************************************//**
  285  @Description   Get base of MEM
  286 *//***************************************************************************/
  287 #define MEM_GetBase(h_Mem)             ((t_MemorySegment *)(h_Mem))->p_Bases[0]
  288 
  289 /**************************************************************************//**
  290  @Description   Get size of MEM block
  291 *//***************************************************************************/
  292 #define MEM_GetSize(h_Mem)             ((t_MemorySegment *)(h_Mem))->dataSize
  293 
  294 /**************************************************************************//**
  295  @Description   Get prefix size of MEM block
  296 *//***************************************************************************/
  297 #define MEM_GetPrefixSize(h_Mem)       ((t_MemorySegment *)(h_Mem))->prefixSize
  298 
  299 /**************************************************************************//**
  300  @Description   Get postfix size of MEM block
  301 *//***************************************************************************/
  302 #define MEM_GetPostfixSize(h_Mem)      ((t_MemorySegment *)(h_Mem))->postfixSize
  303 
  304 /**************************************************************************//**
  305  @Description   Get alignment of MEM block (in bytes)
  306 *//***************************************************************************/
  307 #define MEM_GetAlignment(h_Mem)        ((t_MemorySegment *)(h_Mem))->alignment
  308 
  309 /**************************************************************************//**
  310  @Description   Get the number of blocks in the segment
  311 *//***************************************************************************/
  312 #define MEM_GetNumOfBlocks(h_Mem)             ((t_MemorySegment *)(h_Mem))->num
  313 
  314 /** @} */ /* end of MEM group */
  315 /** @} */ /* end of etc_id group */
  316 
  317 
  318 #endif /* __MEM_EXT_H */

Cache object: 02b94eb45d3f305dee6edfcf25040551


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.