malloc32.h

Go to the documentation of this file.
00001 /*
00002  * Copyright (c) 2010 Jan Vesely
00003  * All rights reserved.
00004  *
00005  * Redistribution and use in source and binary forms, with or without
00006  * modification, are permitted provided that the following conditions
00007  * are met:
00008  *
00009  * - Redistributions of source code must retain the above copyright
00010  *   notice, this list of conditions and the following disclaimer.
00011  * - Redistributions in binary form must reproduce the above copyright
00012  *   notice, this list of conditions and the following disclaimer in the
00013  *   documentation and/or other materials provided with the distribution.
00014  * - The name of the author may not be used to endorse or promote products
00015  *   derived from this software without specific prior written permission.
00016  *
00017  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
00018  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
00019  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
00020  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
00021  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
00022  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
00023  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
00024  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
00025  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
00026  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00027  */
00034 #ifndef DRV_UHCI_UTILS_MALLOC32_H
00035 #define DRV_UHCI_UTILS_MALLOC32_H
00036 
00037 #include <assert.h>
00038 #include <errno.h>
00039 #include <malloc.h>
00040 #include <mem.h>
00041 #include <as.h>
00042 
00043 #define UHCI_STRCUTURES_ALIGNMENT 16
00044 #define UHCI_REQUIRED_PAGE_SIZE 4096
00045 
00046 
00052 static inline uintptr_t addr_to_phys(void *addr)
00053 {
00054         if (addr == NULL)
00055                 return 0;
00056 
00057         uintptr_t result;
00058         const int ret = as_get_physical_mapping(addr, &result);
00059         if (ret != EOK)
00060                 return 0;
00061         return (result | ((uintptr_t)addr & 0xfff));
00062 }
00063 /*----------------------------------------------------------------------------*/
00069 static inline void * malloc32(size_t size) {
00070         /* This works only when the host has less than 4GB of memory as
00071          * physical address needs to fit into 32 bits */
00072 
00073         /* If we need more than one page there is no guarantee that the
00074          * memory will be continuous */
00075         if (size > PAGE_SIZE)
00076                 return NULL;
00077         /* Calculate alignment to make sure the block won't cross page
00078          * boundary */
00079         size_t alignment = UHCI_STRCUTURES_ALIGNMENT;
00080         while (alignment < size)
00081                 alignment *= 2;
00082         return memalign(alignment, size);
00083 }
00084 /*----------------------------------------------------------------------------*/
00089 static inline void free32(void *addr) {
00090         if (!addr)
00091                 return;
00092         free(addr);
00093 }
00094 /*----------------------------------------------------------------------------*/
00099 static inline void * get_page(void)
00100 {
00101         void *free_address = as_get_mappable_page(UHCI_REQUIRED_PAGE_SIZE);
00102         if (free_address == 0)
00103                 return NULL;
00104         void *ret = as_area_create(free_address, UHCI_REQUIRED_PAGE_SIZE,
00105                   AS_AREA_READ | AS_AREA_WRITE);
00106         if (ret != free_address)
00107                 return NULL;
00108         return ret;
00109 }
00110 
00111 #endif
00112 

Generated on Thu Jun 2 07:45:44 2011 for HelenOS/USB by  doxygen 1.4.7