blob: f5abec87230b1cfa9538984fb087e1e370dd3c4d [file] [log] [blame]
Cody Schuffelen134ff032019-11-22 00:25:32 -08001#pragma once
2/*
3 * Copyright (C) 2017 The Android Open Source Project
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17
18#include <stdint.h>
19#include <type_traits>
20
21// Base macros for all layout structures.
22// ShmTypeValidator provides meaningful information about the type size
23// mismatch in compilation error messages, eg.
24//
25// error:
26// static_assert failed "Class size changed, update the layout_size field"
27// static_assert(Current == Expected,
28// note: in instantiation of template class
29// 'ShmTypeValidator<vsoc::layout::myclass::ClassName>'
30// requested here ASSERT_SHM_COMPATIBLE(ClassName);
31//
32template <typename Type, size_t expected_size = Type::layout_size>
33struct ShmTypeValidator {
34 static_assert(sizeof(Type) == expected_size,
35 "Class size changed, update the layout_size field");
36 static_assert(std::is_trivial<Type>(), "Class uses features that are unsafe");
37 static constexpr bool valid =
38 sizeof(Type) == expected_size && std::is_trivial<Type>();
39};
40
41#define ASSERT_SHM_COMPATIBLE(T) \
42 static_assert(ShmTypeValidator<T>::valid, \
43 "Compilation error. Please fix above errors and retry.")
44
45namespace vsoc {
46namespace layout {
47
48/**
49 * Memory is shared between Guest and Host kernels. In some cases we need
50 * flag to indicate which side we're on. In those cases we'll use this
51 * simple structure.
52 *
53 * These are carefully formatted to make Guest and Host a bitfield.
54 */
55enum Sides : uint32_t {
56 NoSides = 0,
57 Guest = 1,
58 Host = 2,
59 Both = 3,
60#ifdef CUTTLEFISH_HOST
61 OurSide = Host,
62 Peer = Guest
63#else
64 OurSide = Guest,
65 Peer = Host
66#endif
67};
68// Enums can't have static members, so can't use the macro here.
69 static_assert(ShmTypeValidator<Sides, 4>::valid,
70 "Compilation error. Please fix above errors and retry.");
71
72/**
73 * Base class for all region layout structures.
74 */
75class RegionLayout {
76public:
77 static constexpr size_t layout_size = 1;
78};
79ASSERT_SHM_COMPATIBLE(RegionLayout);
80
81} // namespace layout
82} // namespace vsoc