1 // Copyright 2023 The Chromium Authors 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef PARTITION_ALLOC_THREAD_ISOLATION_ALIGNMENT_H_ 6 #define PARTITION_ALLOC_THREAD_ISOLATION_ALIGNMENT_H_ 7 8 #include "partition_alloc/partition_alloc_buildflags.h" 9 10 #if BUILDFLAG(ENABLE_THREAD_ISOLATION) 11 12 #include "partition_alloc/page_allocator_constants.h" 13 14 #define PA_THREAD_ISOLATED_ALIGN_SZ partition_alloc::internal::SystemPageSize() 15 #define PA_THREAD_ISOLATED_ALIGN_OFFSET_MASK (PA_THREAD_ISOLATED_ALIGN_SZ - 1) 16 #define PA_THREAD_ISOLATED_ALIGN_BASE_MASK \ 17 (~PA_THREAD_ISOLATED_ALIGN_OFFSET_MASK) 18 #define PA_THREAD_ISOLATED_ALIGN alignas(PA_THREAD_ISOLATED_ALIGN_SZ) 19 20 #define PA_THREAD_ISOLATED_FILL_PAGE_SZ(size) \ 21 ((PA_THREAD_ISOLATED_ALIGN_SZ - \ 22 ((size) & PA_THREAD_ISOLATED_ALIGN_OFFSET_MASK)) % \ 23 PA_THREAD_ISOLATED_ALIGN_SZ) 24 // Calculate the required padding so that the last element of a page-aligned 25 // array lands on a page boundary. In other words, calculate that padding so 26 // that (count-1) elements are a multiple of page size. 27 // The offset parameter additionally skips bytes in the object, e.g. 28 // object+offset will be page aligned. 29 #define PA_THREAD_ISOLATED_ARRAY_PAD_SZ_WITH_OFFSET(Type, count, offset) \ 30 PA_THREAD_ISOLATED_FILL_PAGE_SZ(sizeof(Type) * (count - 1) + offset) 31 32 #define PA_THREAD_ISOLATED_ARRAY_PAD_SZ(Type, count) \ 33 PA_THREAD_ISOLATED_ARRAY_PAD_SZ_WITH_OFFSET(Type, count, 0) 34 35 #else // BUILDFLAG(ENABLE_THREAD_ISOLATION) 36 37 #define PA_THREAD_ISOLATED_ALIGN 38 #define PA_THREAD_ISOLATED_FILL_PAGE_SZ(size) 0 39 #define PA_THREAD_ISOLATED_ARRAY_PAD_SZ(Type, size) 0 40 #define PA_THREAD_ISOLATED_ARRAY_PAD_SZ_WITH_OFFSET(Type, size, offset) 0 41 42 #endif // BUILDFLAG(ENABLE_THREAD_ISOLATION) 43 44 #endif // PARTITION_ALLOC_THREAD_ISOLATION_ALIGNMENT_H_ 45