Loading...
src/nano_zone.h /dev/null libmalloc-657.80.3
--- /dev/null
+++ libmalloc/libmalloc-657.80.3/src/nano_zone.h
@@ -0,0 +1,142 @@
+/*
+ * Copyright (c) 2015 Apple Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ *
+ * This file contains Original Code and/or Modifications of Original Code
+ * as defined in and that are subject to the Apple Public Source License
+ * Version 2.0 (the 'License'). You may not use this file except in
+ * compliance with the License. Please obtain a copy of the License at
+ * http://www.opensource.apple.com/apsl/ and read it before using this
+ * file.
+ *
+ * The Original Code and all software distributed under the License are
+ * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
+ * Please see the License for the specific language governing rights and
+ * limitations under the License.
+ *
+ * @APPLE_LICENSE_HEADER_END@
+ */
+
+
+#ifndef __NANO_ZONE_H
+#define __NANO_ZONE_H
+
+#if CONFIG_NANOZONE
+
+/*********************	DEFINITIONS	************************/
+
+#define MAX_RECORDER_BUFFER		256
+
+/*************          nanozone address field layout        ******************/
+
+#if defined(__x86_64)
+#define NANO_MAG_BITS			6
+#define NANO_BAND_BITS			17
+#define NANO_SLOT_BITS			4
+#define NANO_OFFSET_BITS		17
+
+#else
+#error Unknown Architecture
+#endif
+
+// clang-format really dislikes the bitfields here
+// clang-format off
+#if defined(__BIG_ENDIAN__)
+struct nano_blk_addr_s {
+    uint64_t
+	nano_signature:NANOZONE_SIGNATURE_BITS,	// the address range devoted to us.
+	nano_mag_index:NANO_MAG_BITS,		// the core that allocated this block
+	nano_band:NANO_BAND_BITS,
+	nano_slot:NANO_SLOT_BITS,		// bucket of homogenous quanta-multiple blocks
+	nano_offset:NANO_OFFSET_BITS;		// locates the block
+};
+#else
+// least significant bits declared first
+struct nano_blk_addr_s {
+    uint64_t
+	nano_offset:NANO_OFFSET_BITS,		// locates the block
+	nano_slot:NANO_SLOT_BITS,		// bucket of homogenous quanta-multiple blocks
+	nano_band:NANO_BAND_BITS,
+	nano_mag_index:NANO_MAG_BITS,		// the core that allocated this block
+	nano_signature:NANOZONE_SIGNATURE_BITS;	// the address range devoted to us.
+};
+#endif
+// clang-format on
+
+typedef union  {
+    uint64_t			addr;
+    struct nano_blk_addr_s	fields;
+} nano_blk_addr_t;
+
+#define SLOT_IN_BAND_SIZE 	(1 << NANO_OFFSET_BITS)
+#define SLOT_KEY_LIMIT 		(1 << NANO_SLOT_BITS) /* Must track nano_slot width */
+#define BAND_SIZE 		(1 << (NANO_SLOT_BITS + NANO_OFFSET_BITS)) /*  == Number of bytes covered by a page table entry */
+#define NANO_MAG_SIZE 		(1 << NANO_MAG_BITS)
+#define NANO_SLOT_SIZE 		(1 << NANO_SLOT_BITS)
+
+#ifdef __INTERNAL_H
+
+/****************************** zone itself ***********************************/
+
+/*
+ * Note that objects whose adddress are held in pointers here must be pursued
+ * individually in the nano_in_use_enumeration() routines.
+ */
+
+typedef struct chained_block_s {
+    uintptr_t			double_free_guard;
+    struct chained_block_s	*next;
+} *chained_block_t;
+
+typedef struct nano_meta_s {
+    OSQueueHead			slot_LIFO MALLOC_NANO_CACHE_ALIGN;
+    unsigned int		slot_madvised_log_page_count;
+    volatile uintptr_t		slot_current_base_addr;
+    volatile uintptr_t		slot_limit_addr;
+    volatile size_t		slot_objects_mapped;
+    volatile size_t		slot_objects_skipped;
+    bitarray_t			slot_madvised_pages;
+    // position on cache line distinct from that of slot_LIFO
+    volatile uintptr_t		slot_bump_addr MALLOC_NANO_CACHE_ALIGN;
+    volatile boolean_t		slot_exhausted;
+    unsigned int		slot_bytes;
+    unsigned int		slot_objects;
+} *nano_meta_admin_t;
+
+// vm_allocate()'d, so page-aligned to begin with.
+typedef struct nanozone_s {
+    // first page will be given read-only protection
+    malloc_zone_t		basic_zone;
+    uint8_t			pad[PAGE_MAX_SIZE - sizeof(malloc_zone_t)];
+
+    // remainder of structure is R/W (contains no function pointers)
+    // page-aligned
+    // max: NANO_MAG_SIZE cores x NANO_SLOT_SIZE slots for nano blocks {16 .. 256}
+    struct nano_meta_s		meta_data[NANO_MAG_SIZE][NANO_SLOT_SIZE];
+    _malloc_lock_s			band_resupply_lock[NANO_MAG_SIZE];
+    uintptr_t           band_max_mapped_baseaddr[NANO_MAG_SIZE];
+    size_t			core_mapped_size[NANO_MAG_SIZE];
+
+    unsigned			debug_flags;
+
+    /* security cookie */
+    uintptr_t			cookie;
+
+    /*
+     * The nano zone constructed by create_nano_zone() would like to hand off tiny, small, and large
+     * allocations to the default scalable zone. Record the latter as the "helper" zone here.
+     */
+    malloc_zone_t		*helper_zone;
+} nanozone_t;
+
+#define NANOZONE_PAGED_SIZE	((sizeof(nanozone_t) + vm_page_size - 1) & ~ (vm_page_size - 1))
+
+#endif // __INTERNAL_H
+
+#endif // CONFIG_NANOZONE
+
+#endif // __NANO_ZONE_H