• Home
  • Raw
  • Download

Lines Matching full:sh

85  * These are the functions that must be implemented by a secure heap (sh).
277 * of "sh.minsize" units. The freelist and bitmaps are kept separately,
291 ((char*)(p) >= sh.arena && (char*)(p) < &sh.arena[sh.arena_size])
293 ((char*)(p) >= (char*)sh.freelist && (char*)(p) < (char*)&sh.freelist[sh.freelist_size])
314 } SH; typedef
316 static SH sh; variable
320 ossl_ssize_t list = sh.freelist_size - 1; in sh_getlist()
321 size_t bit = (sh.arena_size + ptr - sh.arena) / sh.minsize; in sh_getlist()
324 if (TESTBIT(sh.bittable, bit)) in sh_getlist()
337 OPENSSL_assert(list >= 0 && list < sh.freelist_size); in sh_testbit()
338 OPENSSL_assert(((ptr - sh.arena) & ((sh.arena_size >> list) - 1)) == 0); in sh_testbit()
339 bit = (ONE << list) + ((ptr - sh.arena) / (sh.arena_size >> list)); in sh_testbit()
340 OPENSSL_assert(bit > 0 && bit < sh.bittable_size); in sh_testbit()
348 OPENSSL_assert(list >= 0 && list < sh.freelist_size); in sh_clearbit()
349 OPENSSL_assert(((ptr - sh.arena) & ((sh.arena_size >> list) - 1)) == 0); in sh_clearbit()
350 bit = (ONE << list) + ((ptr - sh.arena) / (sh.arena_size >> list)); in sh_clearbit()
351 OPENSSL_assert(bit > 0 && bit < sh.bittable_size); in sh_clearbit()
360 OPENSSL_assert(list >= 0 && list < sh.freelist_size); in sh_setbit()
361 OPENSSL_assert(((ptr - sh.arena) & ((sh.arena_size >> list) - 1)) == 0); in sh_setbit()
362 bit = (ONE << list) + ((ptr - sh.arena) / (sh.arena_size >> list)); in sh_setbit()
363 OPENSSL_assert(bit > 0 && bit < sh.bittable_size); in sh_setbit()
415 memset(&sh, 0, sizeof(sh)); in sh_init()
445 sh.arena_size = size; in sh_init()
446 sh.minsize = minsize; in sh_init()
447 sh.bittable_size = (sh.arena_size / sh.minsize) * 2; in sh_init()
450 if (sh.bittable_size >> 3 == 0) in sh_init()
453 sh.freelist_size = -1; in sh_init()
454 for (i = sh.bittable_size; i; i >>= 1) in sh_init()
455 sh.freelist_size++; in sh_init()
457 sh.freelist = OPENSSL_zalloc(sh.freelist_size * sizeof(char *)); in sh_init()
458 OPENSSL_assert(sh.freelist != NULL); in sh_init()
459 if (sh.freelist == NULL) in sh_init()
462 sh.bittable = OPENSSL_zalloc(sh.bittable_size >> 3); in sh_init()
463 OPENSSL_assert(sh.bittable != NULL); in sh_init()
464 if (sh.bittable == NULL) in sh_init()
467 sh.bitmalloc = OPENSSL_zalloc(sh.bittable_size >> 3); in sh_init()
468 OPENSSL_assert(sh.bitmalloc != NULL); in sh_init()
469 if (sh.bitmalloc == NULL) in sh_init()
491 sh.map_size = pgsize + sh.arena_size + pgsize; in sh_init()
495 sh.map_result = mmap(NULL, sh.map_size, in sh_init()
501 sh.map_result = MAP_FAILED; in sh_init()
503 sh.map_result = mmap(NULL, sh.map_size, in sh_init()
509 if (sh.map_result == MAP_FAILED) in sh_init()
512 sh.map_result = VirtualAlloc(NULL, sh.map_size, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE); in sh_init()
514 if (sh.map_result == NULL) in sh_init()
518 sh.arena = (char *)(sh.map_result + pgsize); in sh_init()
519 sh_setbit(sh.arena, 0, sh.bittable); in sh_init()
520 sh_add_to_list(&sh.freelist[0], sh.arena); in sh_init()
527 if (mprotect(sh.map_result, pgsize, PROT_NONE) < 0) in sh_init()
530 if (VirtualProtect(sh.map_result, pgsize, PAGE_NOACCESS, &flOldProtect) == FALSE) in sh_init()
535 aligned = (pgsize + sh.arena_size + (pgsize - 1)) & ~(pgsize - 1); in sh_init()
537 if (mprotect(sh.map_result + aligned, pgsize, PROT_NONE) < 0) in sh_init()
540 if (VirtualProtect(sh.map_result + aligned, pgsize, PAGE_NOACCESS, &flOldProtect) == FALSE) in sh_init()
545 if (syscall(SYS_mlock2, sh.arena, sh.arena_size, MLOCK_ONFAULT) < 0) { in sh_init()
547 if (mlock(sh.arena, sh.arena_size) < 0) in sh_init()
554 if (VirtualLock(sh.arena, sh.arena_size) == FALSE) in sh_init()
557 if (mlock(sh.arena, sh.arena_size) < 0) in sh_init()
561 if (madvise(sh.arena, sh.arena_size, MADV_DONTDUMP) < 0) in sh_init()
574 OPENSSL_free(sh.freelist); in sh_done()
575 OPENSSL_free(sh.bittable); in sh_done()
576 OPENSSL_free(sh.bitmalloc); in sh_done()
578 if (sh.map_result != MAP_FAILED && sh.map_size) in sh_done()
579 munmap(sh.map_result, sh.map_size); in sh_done()
581 if (sh.map_result != NULL && sh.map_size) in sh_done()
582 VirtualFree(sh.map_result, 0, MEM_RELEASE); in sh_done()
584 memset(&sh, 0, sizeof(sh)); in sh_done()
597 bit = (ONE << list) + (ptr - sh.arena) / (sh.arena_size >> list); in sh_find_my_buddy()
600 if (TESTBIT(sh.bittable, bit) && !TESTBIT(sh.bitmalloc, bit)) in sh_find_my_buddy()
601 chunk = sh.arena + ((bit & ((ONE << list) - 1)) * (sh.arena_size >> list)); in sh_find_my_buddy()
612 if (size > sh.arena_size) in sh_malloc()
615 list = sh.freelist_size - 1; in sh_malloc()
616 for (i = sh.minsize; i < size; i <<= 1) in sh_malloc()
623 if (sh.freelist[slist] != NULL) in sh_malloc()
630 char *temp = sh.freelist[slist]; in sh_malloc()
633 OPENSSL_assert(!sh_testbit(temp, slist, sh.bitmalloc)); in sh_malloc()
634 sh_clearbit(temp, slist, sh.bittable); in sh_malloc()
636 OPENSSL_assert(temp != sh.freelist[slist]); in sh_malloc()
642 OPENSSL_assert(!sh_testbit(temp, slist, sh.bitmalloc)); in sh_malloc()
643 sh_setbit(temp, slist, sh.bittable); in sh_malloc()
644 sh_add_to_list(&sh.freelist[slist], temp); in sh_malloc()
645 OPENSSL_assert(sh.freelist[slist] == temp); in sh_malloc()
648 temp += sh.arena_size >> slist; in sh_malloc()
649 OPENSSL_assert(!sh_testbit(temp, slist, sh.bitmalloc)); in sh_malloc()
650 sh_setbit(temp, slist, sh.bittable); in sh_malloc()
651 sh_add_to_list(&sh.freelist[slist], temp); in sh_malloc()
652 OPENSSL_assert(sh.freelist[slist] == temp); in sh_malloc()
654 OPENSSL_assert(temp-(sh.arena_size >> slist) == sh_find_my_buddy(temp, slist)); in sh_malloc()
658 chunk = sh.freelist[list]; in sh_malloc()
659 OPENSSL_assert(sh_testbit(chunk, list, sh.bittable)); in sh_malloc()
660 sh_setbit(chunk, list, sh.bitmalloc); in sh_malloc()
683 OPENSSL_assert(sh_testbit(ptr, list, sh.bittable)); in sh_free()
684 sh_clearbit(ptr, list, sh.bitmalloc); in sh_free()
685 sh_add_to_list(&sh.freelist[list], ptr); in sh_free()
691 OPENSSL_assert(!sh_testbit(ptr, list, sh.bitmalloc)); in sh_free()
692 sh_clearbit(ptr, list, sh.bittable); in sh_free()
694 OPENSSL_assert(!sh_testbit(ptr, list, sh.bitmalloc)); in sh_free()
695 sh_clearbit(buddy, list, sh.bittable); in sh_free()
705 OPENSSL_assert(!sh_testbit(ptr, list, sh.bitmalloc)); in sh_free()
706 sh_setbit(ptr, list, sh.bittable); in sh_free()
707 sh_add_to_list(&sh.freelist[list], ptr); in sh_free()
708 OPENSSL_assert(sh.freelist[list] == ptr); in sh_free()
720 OPENSSL_assert(sh_testbit(ptr, list, sh.bittable)); in sh_actual_size()
721 return sh.arena_size / (ONE << list); in sh_actual_size()