Lines Matching full:sh
64 * These are the functions that must be implemented by a secure heap (sh).
255 * of "sh.minsize" units. The freelist and bitmaps are kept separately,
269 ((char*)(p) >= sh.arena && (char*)(p) < &sh.arena[sh.arena_size])
271 ((char*)(p) >= (char*)sh.freelist && (char*)(p) < (char*)&sh.freelist[sh.freelist_size])
292 } SH; typedef
294 static SH sh; variable
298 ossl_ssize_t list = sh.freelist_size - 1; in sh_getlist()
299 size_t bit = (sh.arena_size + ptr - sh.arena) / sh.minsize; in sh_getlist()
302 if (TESTBIT(sh.bittable, bit)) in sh_getlist()
315 OPENSSL_assert(list >= 0 && list < sh.freelist_size); in sh_testbit()
316 OPENSSL_assert(((ptr - sh.arena) & ((sh.arena_size >> list) - 1)) == 0); in sh_testbit()
317 bit = (ONE << list) + ((ptr - sh.arena) / (sh.arena_size >> list)); in sh_testbit()
318 OPENSSL_assert(bit > 0 && bit < sh.bittable_size); in sh_testbit()
326 OPENSSL_assert(list >= 0 && list < sh.freelist_size); in sh_clearbit()
327 OPENSSL_assert(((ptr - sh.arena) & ((sh.arena_size >> list) - 1)) == 0); in sh_clearbit()
328 bit = (ONE << list) + ((ptr - sh.arena) / (sh.arena_size >> list)); in sh_clearbit()
329 OPENSSL_assert(bit > 0 && bit < sh.bittable_size); in sh_clearbit()
338 OPENSSL_assert(list >= 0 && list < sh.freelist_size); in sh_setbit()
339 OPENSSL_assert(((ptr - sh.arena) & ((sh.arena_size >> list) - 1)) == 0); in sh_setbit()
340 bit = (ONE << list) + ((ptr - sh.arena) / (sh.arena_size >> list)); in sh_setbit()
341 OPENSSL_assert(bit > 0 && bit < sh.bittable_size); in sh_setbit()
389 memset(&sh, 0, sizeof(sh)); in sh_init()
404 sh.arena_size = size; in sh_init()
405 sh.minsize = minsize; in sh_init()
406 sh.bittable_size = (sh.arena_size / sh.minsize) * 2; in sh_init()
409 if (sh.bittable_size >> 3 == 0) in sh_init()
412 sh.freelist_size = -1; in sh_init()
413 for (i = sh.bittable_size; i; i >>= 1) in sh_init()
414 sh.freelist_size++; in sh_init()
416 sh.freelist = OPENSSL_zalloc(sh.freelist_size * sizeof(char *)); in sh_init()
417 OPENSSL_assert(sh.freelist != NULL); in sh_init()
418 if (sh.freelist == NULL) in sh_init()
421 sh.bittable = OPENSSL_zalloc(sh.bittable_size >> 3); in sh_init()
422 OPENSSL_assert(sh.bittable != NULL); in sh_init()
423 if (sh.bittable == NULL) in sh_init()
426 sh.bitmalloc = OPENSSL_zalloc(sh.bittable_size >> 3); in sh_init()
427 OPENSSL_assert(sh.bitmalloc != NULL); in sh_init()
428 if (sh.bitmalloc == NULL) in sh_init()
447 sh.map_size = pgsize + sh.arena_size + pgsize; in sh_init()
450 sh.map_result = mmap(NULL, sh.map_size, in sh_init()
456 sh.map_result = MAP_FAILED; in sh_init()
458 sh.map_result = mmap(NULL, sh.map_size, in sh_init()
463 if (sh.map_result == MAP_FAILED) in sh_init()
465 sh.arena = (char *)(sh.map_result + pgsize); in sh_init()
466 sh_setbit(sh.arena, 0, sh.bittable); in sh_init()
467 sh_add_to_list(&sh.freelist[0], sh.arena); in sh_init()
473 if (mprotect(sh.map_result, pgsize, PROT_NONE) < 0) in sh_init()
477 aligned = (pgsize + sh.arena_size + (pgsize - 1)) & ~(pgsize - 1); in sh_init()
478 if (mprotect(sh.map_result + aligned, pgsize, PROT_NONE) < 0) in sh_init()
482 if (syscall(SYS_mlock2, sh.arena, sh.arena_size, MLOCK_ONFAULT) < 0) { in sh_init()
484 if (mlock(sh.arena, sh.arena_size) < 0) in sh_init()
491 if (mlock(sh.arena, sh.arena_size) < 0) in sh_init()
495 if (madvise(sh.arena, sh.arena_size, MADV_DONTDUMP) < 0) in sh_init()
508 OPENSSL_free(sh.freelist); in sh_done()
509 OPENSSL_free(sh.bittable); in sh_done()
510 OPENSSL_free(sh.bitmalloc); in sh_done()
511 if (sh.map_result != MAP_FAILED && sh.map_size) in sh_done()
512 munmap(sh.map_result, sh.map_size); in sh_done()
513 memset(&sh, 0, sizeof(sh)); in sh_done()
526 bit = (ONE << list) + (ptr - sh.arena) / (sh.arena_size >> list); in sh_find_my_buddy()
529 if (TESTBIT(sh.bittable, bit) && !TESTBIT(sh.bitmalloc, bit)) in sh_find_my_buddy()
530 chunk = sh.arena + ((bit & ((ONE << list) - 1)) * (sh.arena_size >> list)); in sh_find_my_buddy()
541 if (size > sh.arena_size) in sh_malloc()
544 list = sh.freelist_size - 1; in sh_malloc()
545 for (i = sh.minsize; i < size; i <<= 1) in sh_malloc()
552 if (sh.freelist[slist] != NULL) in sh_malloc()
559 char *temp = sh.freelist[slist]; in sh_malloc()
562 OPENSSL_assert(!sh_testbit(temp, slist, sh.bitmalloc)); in sh_malloc()
563 sh_clearbit(temp, slist, sh.bittable); in sh_malloc()
565 OPENSSL_assert(temp != sh.freelist[slist]); in sh_malloc()
571 OPENSSL_assert(!sh_testbit(temp, slist, sh.bitmalloc)); in sh_malloc()
572 sh_setbit(temp, slist, sh.bittable); in sh_malloc()
573 sh_add_to_list(&sh.freelist[slist], temp); in sh_malloc()
574 OPENSSL_assert(sh.freelist[slist] == temp); in sh_malloc()
577 temp += sh.arena_size >> slist; in sh_malloc()
578 OPENSSL_assert(!sh_testbit(temp, slist, sh.bitmalloc)); in sh_malloc()
579 sh_setbit(temp, slist, sh.bittable); in sh_malloc()
580 sh_add_to_list(&sh.freelist[slist], temp); in sh_malloc()
581 OPENSSL_assert(sh.freelist[slist] == temp); in sh_malloc()
583 OPENSSL_assert(temp-(sh.arena_size >> slist) == sh_find_my_buddy(temp, slist)); in sh_malloc()
587 chunk = sh.freelist[list]; in sh_malloc()
588 OPENSSL_assert(sh_testbit(chunk, list, sh.bittable)); in sh_malloc()
589 sh_setbit(chunk, list, sh.bitmalloc); in sh_malloc()
612 OPENSSL_assert(sh_testbit(ptr, list, sh.bittable)); in sh_free()
613 sh_clearbit(ptr, list, sh.bitmalloc); in sh_free()
614 sh_add_to_list(&sh.freelist[list], ptr); in sh_free()
620 OPENSSL_assert(!sh_testbit(ptr, list, sh.bitmalloc)); in sh_free()
621 sh_clearbit(ptr, list, sh.bittable); in sh_free()
623 OPENSSL_assert(!sh_testbit(ptr, list, sh.bitmalloc)); in sh_free()
624 sh_clearbit(buddy, list, sh.bittable); in sh_free()
634 OPENSSL_assert(!sh_testbit(ptr, list, sh.bitmalloc)); in sh_free()
635 sh_setbit(ptr, list, sh.bittable); in sh_free()
636 sh_add_to_list(&sh.freelist[list], ptr); in sh_free()
637 OPENSSL_assert(sh.freelist[list] == ptr); in sh_free()
649 OPENSSL_assert(sh_testbit(ptr, list, sh.bittable)); in sh_actual_size()
650 return sh.arena_size / (ONE << list); in sh_actual_size()