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