unsigned long SLOF_bm_allocator_init(unsigned long start, unsigned long size, unsigned long blocksize) { struct bitmap *bm; unsigned long alloc_size, bm_size, n_bits; dprintf("enter start %x, size %d, block-size %d\n", start, size, blocksize); if (!size) return 0; if (!blocksize) blocksize = DEFAULT_BLOCK_SIZE; n_bits = BM_NUM_BITS(size, blocksize); bm_size = (n_bits / BM_WORD_BITS) + ((n_bits % BM_WORD_BITS)? 1 : 0); alloc_size = sizeof(struct bitmap) + bm_size * BM_WORD_SIZE; dprintf("Size %ld, blocksize %ld, bm_size %ld, alloc_size %ld\n", size, blocksize, bm_size, alloc_size); bm = (struct bitmap *) SLOF_alloc_mem(alloc_size); if (!bm) return 0; bm->start = start; bm->size = size; bm->bm_size = bm_size; bm->block_size = blocksize; bm->free_blocks = n_bits; memset(bm->bmw, 0xFF, bm_size*BM_WORD_SIZE); return (unsigned long)bm; }
void *SLOF_alloc_mem_aligned(long align, long size) { unsigned long addr = (unsigned long)SLOF_alloc_mem(size + align - 1); addr = addr + align - 1; addr = addr & ~(align - 1); return (void *)addr; }