Back to home page

LXR

 
 

    


File indexing completed on 2025-05-11 08:24:09

0001 /*
0002  * Copyright (c) 2006 Jakub Jermar
0003  * All rights reserved.
0004  *
0005  * Redistribution and use in source and binary forms, with or without
0006  * modification, are permitted provided that the following conditions
0007  * are met:
0008  *
0009  * - Redistributions of source code must retain the above copyright
0010  *   notice, this list of conditions and the following disclaimer.
0011  * - Redistributions in binary form must reproduce the above copyright
0012  *   notice, this list of conditions and the following disclaimer in the
0013  *   documentation and/or other materials provided with the distribution.
0014  * - The name of the author may not be used to endorse or promote products
0015  *   derived from this software without specific prior written permission.
0016  *
0017  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
0018  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
0019  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
0020  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
0021  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
0022  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
0023  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
0024  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
0025  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
0026  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
0027  */
0028 
0029 /*
0030  * Modifications are made to compile for RTEMS. Removes asm.h and replaces 
0031  * the necessary defines in-line
0032  *
0033  */
0034 
0035 
0036 #include <boot/balloc.h>
0037 #if 0
0038 #include <asm.h>
0039 #endif
0040 #include <boot/types.h>
0041 #include <boot/align.h>
0042 
0043 static ballocs_t *ballocs;
0044 static uintptr_t phys_base;
0045 
0046 void balloc_init(ballocs_t *ball, uintptr_t base, uintptr_t kernel_base)
0047 {
0048     ballocs = ball;
0049     phys_base = base;
0050     ballocs->base = kernel_base;
0051     ballocs->size = 0;
0052 }
0053 
0054 void *balloc(size_t size, size_t alignment)
0055 {
0056     /* Enforce minimal alignment. */
0057     alignment = ALIGN_UP(alignment, 4);
0058     
0059     uintptr_t addr = phys_base + ALIGN_UP(ballocs->size, alignment);
0060     
0061     if (ALIGN_UP(ballocs->size, alignment) + size > BALLOC_MAX_SIZE)
0062         return NULL;
0063     
0064     ballocs->size = ALIGN_UP(ballocs->size, alignment) + size;
0065     
0066     return (void *) addr;
0067 }
0068 
0069 void *balloc_rebase(void *ptr)
0070 {
0071     return (void *) ((uintptr_t) ptr - phys_base + ballocs->base);
0072 }