| // Copyright 2019 The Fuchsia Authors |
| // |
| // Use of this source code is governed by a MIT-style |
| // license that can be found in the LICENSE file or at |
| // https://opensource.org/licenses/MIT |
| |
| #ifndef ZIRCON_KERNEL_LIB_ABI_TYPE_VALIDATOR_INCLUDE_LIB_ABI_TYPE_VALIDATOR_H_ |
| #define ZIRCON_KERNEL_LIB_ABI_TYPE_VALIDATOR_INCLUDE_LIB_ABI_TYPE_VALIDATOR_H_ |
| |
| // This C++ header is used to validate kernel ABI types. |
| // |
| // It can and should be included by both kernel and usermode code to statically assert that both |
| // kernel and usermode agree on the size, alignment and field offsets of various types used in the |
| // ABI. |
| // |
| // If one of these static_asserts fire, it means that a kernel type has changed in a backwards |
| // incompatible way. In other words, the change breaks ABI compatibility. |
| |
| #ifndef __cplusplus |
| #error "Can only be included in C++." |
| #endif // __cplusplus |
| |
| #if defined(__aarch64__) |
| #include <lib/zircon-internal/device/cpu-trace/arm64-pm.h> |
| #elif defined(__x86_64__) |
| #include <lib/zircon-internal/device/cpu-trace/intel-pm.h> |
| #endif |
| |
| #include <zircon/syscalls/clock.h> |
| #include <zircon/syscalls/debug.h> |
| #include <zircon/syscalls/exception.h> |
| #include <zircon/syscalls/hypervisor.h> |
| #include <zircon/syscalls/object.h> |
| #include <zircon/syscalls/pci.h> |
| #include <zircon/syscalls/policy.h> |
| #include <zircon/syscalls/port.h> |
| #include <zircon/syscalls/profile.h> |
| #include <zircon/syscalls/scheduler.h> |
| #include <zircon/syscalls/smc.h> |
| #include <zircon/syscalls/system.h> |
| #include <zircon/types.h> |
| |
| #include <cstddef> |
| |
| // Statically asserts that type |name| has sizeof(|size|) and alignof(|alignment|). |
| #define VALIDATE_TYPE_SIZE_ALIGNMENT(name, size, alignment) \ |
| static_assert(sizeof(name) == (size), "size change to " #name " breaks ABI compatibility"); \ |
| static_assert(alignof(name) == (alignment), \ |
| "alignment change to " #name " breaks ABI compatibility") |
| |
| // Statically asserts that type |name| has field |field| at offset |offset| with size |size|. |
| #define VALIDATE_FIELD_OFFSET_SIZE(name, field, offset, size) \ |
| static_assert(offsetof(name, field) == (offset), \ |
| "offset change to " #name "::" #field " breaks ABI compatibility"); \ |
| static_assert(sizeof(name::field) == (size), \ |
| "size change to " #name "::" #field " breaks ABI compatibility") |
| |
| // TODO(maniscalco): Expand the set of types validated. Validate all the ABI types, not just those |
| // with implicit padding that are copied out to usermode. |
| |
| #if defined(__aarch64__) |
| VALIDATE_TYPE_SIZE_ALIGNMENT(perfmon::Arm64PmuConfig, 104, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(perfmon::Arm64PmuConfig, timebase_event, 0, 2); |
| VALIDATE_FIELD_OFFSET_SIZE(perfmon::Arm64PmuConfig, fixed_events, 2, 2); |
| VALIDATE_FIELD_OFFSET_SIZE(perfmon::Arm64PmuConfig, programmable_events, 4, 12); |
| VALIDATE_FIELD_OFFSET_SIZE(perfmon::Arm64PmuConfig, fixed_initial_value, 16, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(perfmon::Arm64PmuConfig, programmable_initial_value, 24, 24); |
| VALIDATE_FIELD_OFFSET_SIZE(perfmon::Arm64PmuConfig, fixed_flags, 48, 4); |
| VALIDATE_FIELD_OFFSET_SIZE(perfmon::Arm64PmuConfig, programmable_flags, 52, 24); |
| VALIDATE_FIELD_OFFSET_SIZE(perfmon::Arm64PmuConfig, programmable_hw_events, 76, 24); |
| #elif defined(__x86_64__) |
| VALIDATE_TYPE_SIZE_ALIGNMENT(perfmon::X86PmuConfig, 344, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(perfmon::X86PmuConfig, global_ctrl, 0, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(perfmon::X86PmuConfig, fixed_ctrl, 8, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(perfmon::X86PmuConfig, debug_ctrl, 16, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(perfmon::X86PmuConfig, timebase_event, 24, 2); |
| VALIDATE_FIELD_OFFSET_SIZE(perfmon::X86PmuConfig, fixed_events, 26, 6); |
| VALIDATE_FIELD_OFFSET_SIZE(perfmon::X86PmuConfig, programmable_events, 32, 16); |
| VALIDATE_FIELD_OFFSET_SIZE(perfmon::X86PmuConfig, misc_events, 48, 32); |
| VALIDATE_FIELD_OFFSET_SIZE(perfmon::X86PmuConfig, fixed_initial_value, 80, 24); |
| VALIDATE_FIELD_OFFSET_SIZE(perfmon::X86PmuConfig, programmable_initial_value, 104, 64); |
| VALIDATE_FIELD_OFFSET_SIZE(perfmon::X86PmuConfig, fixed_flags, 168, 12); |
| VALIDATE_FIELD_OFFSET_SIZE(perfmon::X86PmuConfig, programmable_flags, 180, 32); |
| VALIDATE_FIELD_OFFSET_SIZE(perfmon::X86PmuConfig, misc_flags, 212, 64); |
| VALIDATE_FIELD_OFFSET_SIZE(perfmon::X86PmuConfig, programmable_hw_events, 280, 64); |
| #endif |
| |
| VALIDATE_TYPE_SIZE_ALIGNMENT(perfmon::PmuCommonProperties, 14, 2); |
| VALIDATE_FIELD_OFFSET_SIZE(perfmon::PmuCommonProperties, pm_version, 0, 2); |
| VALIDATE_FIELD_OFFSET_SIZE(perfmon::PmuCommonProperties, pm_version, 0, 2); |
| VALIDATE_FIELD_OFFSET_SIZE(perfmon::PmuCommonProperties, max_num_fixed_events, 2, 2); |
| VALIDATE_FIELD_OFFSET_SIZE(perfmon::PmuCommonProperties, max_fixed_counter_width, 4, 2); |
| VALIDATE_FIELD_OFFSET_SIZE(perfmon::PmuCommonProperties, max_num_programmable_events, 6, 2); |
| VALIDATE_FIELD_OFFSET_SIZE(perfmon::PmuCommonProperties, max_programmable_counter_width, 8, 2); |
| VALIDATE_FIELD_OFFSET_SIZE(perfmon::PmuCommonProperties, max_num_misc_events, 10, 2); |
| VALIDATE_FIELD_OFFSET_SIZE(perfmon::PmuCommonProperties, max_misc_counter_width, 12, 2); |
| |
| #if defined(__aarch64__) |
| VALIDATE_TYPE_SIZE_ALIGNMENT(perfmon::Arm64PmuProperties, 14, 2); |
| VALIDATE_FIELD_OFFSET_SIZE(perfmon::Arm64PmuProperties, common, 0, 14); |
| #elif defined(__x86_64__) |
| VALIDATE_TYPE_SIZE_ALIGNMENT(perfmon::X86PmuProperties, 32, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(perfmon::X86PmuProperties, common, 0, 14); |
| VALIDATE_FIELD_OFFSET_SIZE(perfmon::X86PmuProperties, perf_capabilities, 16, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(perfmon::X86PmuProperties, lbr_stack_size, 24, 4); |
| #endif |
| |
| VALIDATE_TYPE_SIZE_ALIGNMENT(zx_clock_rate_t, 8, 4); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_clock_rate_t, synthetic_ticks, 0, 4); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_clock_rate_t, reference_ticks, 4, 4); |
| |
| VALIDATE_TYPE_SIZE_ALIGNMENT(zx_clock_transformation_t, 24, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_clock_transformation_t, reference_offset, 0, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_clock_transformation_t, synthetic_offset, 8, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_clock_transformation_t, rate, 16, 8); |
| |
| VALIDATE_TYPE_SIZE_ALIGNMENT(zx_clock_details_v1_t, 112, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_clock_details_v1_t, options, 0, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_clock_details_v1_t, backstop_time, 8, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_clock_details_v1_t, ticks_to_synthetic, 16, 24); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_clock_details_v1_t, mono_to_synthetic, 40, 24); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_clock_details_v1_t, error_bound, 64, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_clock_details_v1_t, query_ticks, 72, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_clock_details_v1_t, last_value_update_ticks, 80, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_clock_details_v1_t, last_rate_adjust_update_ticks, 88, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_clock_details_v1_t, last_error_bounds_update_ticks, 96, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_clock_details_v1_t, generation_counter, 104, 4); |
| |
| VALIDATE_TYPE_SIZE_ALIGNMENT(zx_clock_update_args_v1_t, 24, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_clock_update_args_v1_t, rate_adjust, 0, 4); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_clock_update_args_v1_t, value, 8, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_clock_update_args_v1_t, error_bound, 16, 8); |
| |
| VALIDATE_TYPE_SIZE_ALIGNMENT(zx_exception_info_t, 24, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_exception_info_t, pid, 0, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_exception_info_t, tid, 8, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_exception_info_t, type, 16, 4); |
| |
| VALIDATE_TYPE_SIZE_ALIGNMENT(zx_exception_report_v1_t, 32, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_exception_report_v1_t, header, 0, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_exception_report_v1_t, context, 8, 24); |
| |
| VALIDATE_TYPE_SIZE_ALIGNMENT(zx_exception_report_t, 40, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_exception_report_t, header, 0, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_exception_report_t, context, 8, 32); |
| |
| VALIDATE_TYPE_SIZE_ALIGNMENT(zx_exception_header_t, 8, 4); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_exception_header_t, size, 0, 4); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_exception_header_t, type, 4, 4); |
| |
| VALIDATE_TYPE_SIZE_ALIGNMENT(zx_exception_context_v1_t, 24, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_exception_context_v1_t, arch, 0, 24); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_exception_context_v1_t, arch.u, 0, 24); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_exception_context_v1_t, arch.u.x86_64, 0, 24); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_exception_context_v1_t, arch.u.arm_64, 0, 16); |
| |
| VALIDATE_TYPE_SIZE_ALIGNMENT(zx_exception_context_t, 32, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_exception_context_t, arch, 0, 24); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_exception_context_t, arch.u, 0, 24); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_exception_context_t, arch.u.x86_64, 0, 24); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_exception_context_t, arch.u.arm_64, 0, 24); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_exception_context_t, synth_code, 24, 4); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_exception_context_t, synth_data, 28, 4); |
| |
| VALIDATE_TYPE_SIZE_ALIGNMENT(zx_x86_64_exc_data_t, 24, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_x86_64_exc_data_t, vector, 0, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_x86_64_exc_data_t, err_code, 8, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_x86_64_exc_data_t, cr2, 16, 8); |
| |
| VALIDATE_TYPE_SIZE_ALIGNMENT(zx_arm64_exc_data_v1_t, 16, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_arm64_exc_data_v1_t, esr, 0, 4); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_arm64_exc_data_v1_t, far, 8, 8); |
| |
| VALIDATE_TYPE_SIZE_ALIGNMENT(zx_arm64_exc_data_t, 24, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_arm64_exc_data_v1_t, esr, 0, 4); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_arm64_exc_data_v1_t, far, 8, 8); |
| |
| static_assert(sizeof(zx_x86_64_exc_data_t) == sizeof(zx_arm64_exc_data_t), |
| "zx_exception_context_* need padding update"); |
| |
| VALIDATE_TYPE_SIZE_ALIGNMENT(zx_info_bti_t, 32, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_info_bti_t, minimum_contiguity, 0, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_info_bti_t, aspace_size, 8, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_info_bti_t, pmo_count, 16, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_info_bti_t, quarantine_count, 24, 8); |
| |
| VALIDATE_TYPE_SIZE_ALIGNMENT(zx_info_handle_basic_t, 32, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_info_handle_basic_t, koid, 0, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_info_handle_basic_t, rights, 8, 4); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_info_handle_basic_t, type, 12, 4); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_info_handle_basic_t, related_koid, 16, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_info_handle_basic_t, reserved, 24, 4); |
| |
| VALIDATE_TYPE_SIZE_ALIGNMENT(zx_info_job_t, 16, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_info_job_t, return_code, 0, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_info_job_t, exited, 8, 1); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_info_job_t, kill_on_oom, 9, 1); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_info_job_t, debugger_attached, 10, 1); |
| |
| VALIDATE_TYPE_SIZE_ALIGNMENT(zx_info_maps_mapping_t, 32, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_info_maps_mapping_t, mmu_flags, 0, 4); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_info_maps_mapping_t, vmo_koid, 8, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_info_maps_mapping_t, vmo_offset, 16, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_info_maps_mapping_t, committed_pages, 24, 8); |
| |
| VALIDATE_TYPE_SIZE_ALIGNMENT(zx_info_maps_t, 96, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_info_maps_t, name, 0, 32); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_info_maps_t, base, 32, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_info_maps_t, size, 40, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_info_maps_t, depth, 48, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_info_maps_t, type, 56, 4); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_info_maps_t, u, 64, 32); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_info_maps_t, u.mapping, 64, 32); |
| |
| VALIDATE_TYPE_SIZE_ALIGNMENT(zx_info_process_t, 16, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_info_process_t, return_code, 0, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_info_process_t, started, 8, 1); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_info_process_t, exited, 9, 1); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_info_process_t, debugger_attached, 10, 1); |
| |
| VALIDATE_TYPE_SIZE_ALIGNMENT(zx_info_socket_t, 48, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_info_socket_t, options, 0, 4); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_info_socket_t, rx_buf_max, 8, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_info_socket_t, rx_buf_size, 16, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_info_socket_t, rx_buf_available, 24, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_info_socket_t, tx_buf_max, 32, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_info_socket_t, tx_buf_size, 40, 8); |
| |
| VALIDATE_TYPE_SIZE_ALIGNMENT(zx_info_thread_stats_t, 16, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_info_thread_stats_t, total_runtime, 0, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_info_thread_stats_t, last_scheduled_cpu, 8, 4); |
| |
| VALIDATE_TYPE_SIZE_ALIGNMENT(zx_info_task_runtime_t, 16, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_info_task_runtime_t, cpu_time, 0, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_info_task_runtime_t, queue_time, 8, 8); |
| |
| VALIDATE_TYPE_SIZE_ALIGNMENT(zx_info_timer_t, 24, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_info_timer_t, options, 0, 4); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_info_timer_t, deadline, 8, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_info_timer_t, slack, 16, 8); |
| |
| VALIDATE_TYPE_SIZE_ALIGNMENT(zx_info_vmo_t, 120, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_info_vmo_t, koid, 0, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_info_vmo_t, name, 8, 32); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_info_vmo_t, size_bytes, 40, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_info_vmo_t, parent_koid, 48, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_info_vmo_t, num_children, 56, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_info_vmo_t, num_mappings, 64, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_info_vmo_t, share_count, 72, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_info_vmo_t, flags, 80, 4); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_info_vmo_t, committed_bytes, 88, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_info_vmo_t, handle_rights, 96, 4); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_info_vmo_t, cache_policy, 100, 4); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_info_vmo_t, metadata_bytes, 104, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_info_vmo_t, committed_change_events, 112, 8); |
| |
| VALIDATE_TYPE_SIZE_ALIGNMENT(zx_info_vmo_v1_t, 104, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_info_vmo_t, koid, 0, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_info_vmo_t, name, 8, 32); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_info_vmo_t, size_bytes, 40, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_info_vmo_t, parent_koid, 48, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_info_vmo_t, num_children, 56, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_info_vmo_t, num_mappings, 64, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_info_vmo_t, share_count, 72, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_info_vmo_t, flags, 80, 4); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_info_vmo_t, committed_bytes, 88, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_info_vmo_t, handle_rights, 96, 4); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_info_vmo_t, cache_policy, 100, 4); |
| |
| VALIDATE_TYPE_SIZE_ALIGNMENT(zx_pci_bar_t, 24, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_pci_bar_t, id, 0, 4); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_pci_bar_t, type, 4, 4); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_pci_bar_t, size, 8, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_pci_bar_t, addr, 16, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_pci_bar_t, handle, 16, 4); |
| |
| VALIDATE_TYPE_SIZE_ALIGNMENT(zx_pci_init_arg_t, 5896, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_pci_init_arg_t, dev_pin_to_global_irq, 0, 4096); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_pci_init_arg_t, num_irqs, 4096, 4); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_pci_init_arg_t, irqs, 4100, 1792); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_pci_init_arg_t, addr_window_count, 5892, 4); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_pci_init_arg_t, addr_windows[0], 5896, 24); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_pci_init_arg_t, addr_windows[0].base, 5896, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_pci_init_arg_t, addr_windows[0].size, 5904, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_pci_init_arg_t, addr_windows[0].bus_start, 5912, 1); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_pci_init_arg_t, addr_windows[0].bus_end, 5913, 1); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_pci_init_arg_t, addr_windows[0].cfg_space_type, 5914, 1); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_pci_init_arg_t, addr_windows[0].has_ecam, 5915, 1); |
| |
| VALIDATE_TYPE_SIZE_ALIGNMENT(zx_pcie_device_info_t, 12, 2); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_pcie_device_info_t, vendor_id, 0, 2); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_pcie_device_info_t, device_id, 2, 2); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_pcie_device_info_t, base_class, 4, 1); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_pcie_device_info_t, sub_class, 5, 1); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_pcie_device_info_t, program_interface, 6, 1); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_pcie_device_info_t, revision_id, 7, 1); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_pcie_device_info_t, bus_id, 8, 1); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_pcie_device_info_t, dev_id, 9, 1); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_pcie_device_info_t, func_id, 10, 1); |
| |
| VALIDATE_TYPE_SIZE_ALIGNMENT(zx_policy_timer_slack_t, 16, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_policy_timer_slack_t, min_slack, 0, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_policy_timer_slack_t, default_mode, 8, 4); |
| |
| VALIDATE_TYPE_SIZE_ALIGNMENT(zx_port_packet_t, 48, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_port_packet_t, key, 0, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_port_packet_t, type, 8, 4); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_port_packet_t, status, 12, 4); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_port_packet_t, user, 16, 32); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_port_packet_t, signal, 16, 32); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_port_packet_t, guest_bell, 16, 32); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_port_packet_t, guest_mem, 16, 32); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_port_packet_t, guest_io, 16, 32); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_port_packet_t, guest_vcpu, 16, 32); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_port_packet_t, interrupt, 16, 32); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_port_packet_t, page_request, 16, 32); |
| |
| VALIDATE_TYPE_SIZE_ALIGNMENT(zx_packet_user_t, 32, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_packet_user_t, u64, 0, 32); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_packet_user_t, u32, 0, 32); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_packet_user_t, u16, 0, 32); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_packet_user_t, c8, 0, 32); |
| |
| VALIDATE_TYPE_SIZE_ALIGNMENT(zx_packet_signal_t, 32, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_packet_signal_t, trigger, 0, 4); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_packet_signal_t, observed, 4, 4); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_packet_signal_t, count, 8, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_packet_signal_t, timestamp, 16, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_packet_signal_t, reserved1, 24, 8); |
| |
| VALIDATE_TYPE_SIZE_ALIGNMENT(zx_packet_guest_bell_t, 32, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_packet_guest_bell_t, addr, 0, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_packet_guest_bell_t, reserved0, 8, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_packet_guest_bell_t, reserved1, 16, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_packet_guest_bell_t, reserved2, 24, 8); |
| |
| VALIDATE_TYPE_SIZE_ALIGNMENT(zx_packet_guest_mem_t, 32, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_packet_guest_mem_t, addr, 0, 8); |
| #if defined(__aarch64__) |
| VALIDATE_FIELD_OFFSET_SIZE(zx_packet_guest_mem_t, access_size, 8, 1); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_packet_guest_mem_t, sign_extend, 9, 1); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_packet_guest_mem_t, xt, 10, 1); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_packet_guest_mem_t, read, 11, 1); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_packet_guest_mem_t, data, 16, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_packet_guest_mem_t, reserved, 24, 8); |
| #elif defined(__x86_64__) |
| VALIDATE_FIELD_OFFSET_SIZE(zx_packet_guest_mem_t, inst_len, 8, 1); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_packet_guest_mem_t, inst_buf, 9, 15); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_packet_guest_mem_t, default_operand_size, 24, 1); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_packet_guest_mem_t, reserved, 25, 7); |
| #endif |
| |
| VALIDATE_TYPE_SIZE_ALIGNMENT(zx_packet_guest_io_t, 32, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_packet_guest_io_t, port, 0, 2); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_packet_guest_io_t, access_size, 2, 1); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_packet_guest_io_t, input, 3, 1); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_packet_guest_io_t, u8, 4, 1); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_packet_guest_io_t, u16, 4, 2); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_packet_guest_io_t, u32, 4, 4); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_packet_guest_io_t, data, 4, 4); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_packet_guest_io_t, reserved0, 8, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_packet_guest_io_t, reserved1, 16, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_packet_guest_io_t, reserved2, 24, 8); |
| |
| VALIDATE_TYPE_SIZE_ALIGNMENT(zx_packet_guest_vcpu_t, 32, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_packet_guest_vcpu_t, interrupt, 0, 16); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_packet_guest_vcpu_t, interrupt.mask, 0, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_packet_guest_vcpu_t, interrupt.vector, 8, 1); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_packet_guest_vcpu_t, startup, 0, 16); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_packet_guest_vcpu_t, startup.id, 0, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_packet_guest_vcpu_t, startup.entry, 8, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_packet_guest_vcpu_t, type, 16, 1); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_packet_guest_vcpu_t, reserved, 24, 8); |
| |
| VALIDATE_TYPE_SIZE_ALIGNMENT(zx_packet_interrupt_t, 32, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_packet_interrupt_t, timestamp, 0, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_packet_interrupt_t, reserved0, 8, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_packet_interrupt_t, reserved1, 16, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_packet_interrupt_t, reserved2, 24, 8); |
| |
| VALIDATE_TYPE_SIZE_ALIGNMENT(zx_packet_page_request_t, 32, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_packet_page_request_t, command, 0, 2); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_packet_page_request_t, flags, 2, 2); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_packet_page_request_t, reserved0, 4, 4); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_packet_page_request_t, offset, 8, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_packet_page_request_t, length, 16, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_packet_page_request_t, reserved1, 24, 8); |
| |
| VALIDATE_TYPE_SIZE_ALIGNMENT(zx_sched_deadline_params_t, 24, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_sched_deadline_params_t, capacity, 0, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_sched_deadline_params_t, relative_deadline, 8, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_sched_deadline_params_t, period, 16, 8); |
| |
| VALIDATE_TYPE_SIZE_ALIGNMENT(zx_cpu_set_t, 64, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_cpu_set_t, mask, 0, 64); |
| |
| VALIDATE_TYPE_SIZE_ALIGNMENT(zx_profile_info_t, 96, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_profile_info_t, flags, 0, 4); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_profile_info_t, priority, 8, 4); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_profile_info_t, deadline_params, 8, 24); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_profile_info_t, cpu_affinity_mask, 32, 64); |
| |
| VALIDATE_TYPE_SIZE_ALIGNMENT(zx_smc_parameters_t, 64, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_smc_parameters_t, func_id, 0, 4); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_smc_parameters_t, arg1, 8, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_smc_parameters_t, arg2, 16, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_smc_parameters_t, arg3, 24, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_smc_parameters_t, arg4, 32, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_smc_parameters_t, arg5, 40, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_smc_parameters_t, arg6, 48, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_smc_parameters_t, client_id, 56, 2); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_smc_parameters_t, secure_os_id, 58, 2); |
| |
| VALIDATE_TYPE_SIZE_ALIGNMENT(zx_system_powerctl_arg_t, 12, 4); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_system_powerctl_arg_t, acpi_transition_s_state, 0, 3); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_system_powerctl_arg_t, acpi_transition_s_state.target_s_state, 0, 1); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_system_powerctl_arg_t, acpi_transition_s_state.sleep_type_a, 1, 1); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_system_powerctl_arg_t, acpi_transition_s_state.sleep_type_b, 2, 1); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_system_powerctl_arg_t, x86_power_limit, 0, 12); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_system_powerctl_arg_t, x86_power_limit.power_limit, 0, 4); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_system_powerctl_arg_t, x86_power_limit.time_window, 4, 4); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_system_powerctl_arg_t, x86_power_limit.clamp, 8, 1); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_system_powerctl_arg_t, x86_power_limit.enable, 9, 1); |
| |
| #if defined(__aarch64__) |
| VALIDATE_TYPE_SIZE_ALIGNMENT(zx_thread_state_debug_regs_t, 528, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_thread_state_debug_regs_t, hw_bps, 0, 256); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_thread_state_debug_regs_t, hw_bps[0].dbgbcr, 0, 4); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_thread_state_debug_regs_t, hw_bps[0].dbgbvr, 8, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_thread_state_debug_regs_t, hw_wps, 256, 256); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_thread_state_debug_regs_t, far, 512, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_thread_state_debug_regs_t, esr, 520, 4); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_thread_state_debug_regs_t, hw_bps_count, 524, 1); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_thread_state_debug_regs_t, hw_wps_count, 525, 1); |
| #elif defined(__x86_64__) |
| VALIDATE_TYPE_SIZE_ALIGNMENT(zx_thread_state_debug_regs_t, 48, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_thread_state_debug_regs_t, dr, 0, 32); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_thread_state_debug_regs_t, dr6, 32, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_thread_state_debug_regs_t, dr7, 40, 8); |
| #endif |
| |
| #if defined(__aarch64__) |
| VALIDATE_TYPE_SIZE_ALIGNMENT(zx_thread_state_fp_regs_t, 4, 4); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_thread_state_fp_regs_t, unused, 0, 4); |
| #elif defined(__x86_64__) |
| VALIDATE_TYPE_SIZE_ALIGNMENT(zx_thread_state_fp_regs_t, 160, 16); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_thread_state_fp_regs_t, fcw, 0, 2); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_thread_state_fp_regs_t, fsw, 2, 2); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_thread_state_fp_regs_t, ftw, 4, 1); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_thread_state_fp_regs_t, reserved, 5, 1); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_thread_state_fp_regs_t, fop, 6, 2); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_thread_state_fp_regs_t, fip, 8, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_thread_state_fp_regs_t, fdp, 16, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_thread_state_fp_regs_t, st, 32, 128); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_thread_state_fp_regs_t, st[0].low, 32, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_thread_state_fp_regs_t, st[0].high, 40, 8); |
| #endif |
| |
| #if defined(__aarch64__) |
| VALIDATE_TYPE_SIZE_ALIGNMENT(zx_thread_state_vector_regs_t, 520, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_thread_state_vector_regs_t, fpcr, 0, 4); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_thread_state_vector_regs_t, fpsr, 4, 4); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_thread_state_vector_regs_t, v, 8, 512); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_thread_state_vector_regs_t, v[0].low, 8, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_thread_state_vector_regs_t, v[0].high, 16, 8); |
| #elif defined(__x86_64__) |
| VALIDATE_TYPE_SIZE_ALIGNMENT(zx_thread_state_vector_regs_t, 2120, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_thread_state_vector_regs_t, zmm, 0, 2048); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_thread_state_vector_regs_t, zmm[0].v, 0, 64); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_thread_state_vector_regs_t, opmask, 2048, 64); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_thread_state_vector_regs_t, mxcsr, 2112, 4); |
| #endif |
| |
| VALIDATE_TYPE_SIZE_ALIGNMENT(zx_vcpu_io_t, 8, 4); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_vcpu_io_t, access_size, 0, 1); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_vcpu_io_t, u8, 4, 1); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_vcpu_io_t, u16, 4, 2); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_vcpu_io_t, u32, 4, 4); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_vcpu_io_t, data, 4, 4); |
| |
| #if defined(__aarch64__) |
| VALIDATE_TYPE_SIZE_ALIGNMENT(zx_vcpu_state_t, 264, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_vcpu_state_t, x, 0, 248); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_vcpu_state_t, sp, 248, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_vcpu_state_t, cpsr, 256, 4); |
| #elif defined(__x86_64__) |
| VALIDATE_TYPE_SIZE_ALIGNMENT(zx_vcpu_state_t, 136, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_vcpu_state_t, rax, 0, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_vcpu_state_t, rcx, 8, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_vcpu_state_t, rdx, 16, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_vcpu_state_t, rbx, 24, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_vcpu_state_t, rsp, 32, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_vcpu_state_t, rbp, 40, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_vcpu_state_t, rsi, 48, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_vcpu_state_t, rdi, 56, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_vcpu_state_t, r8, 64, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_vcpu_state_t, r9, 72, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_vcpu_state_t, r10, 80, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_vcpu_state_t, r11, 88, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_vcpu_state_t, r12, 96, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_vcpu_state_t, r13, 104, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_vcpu_state_t, r14, 112, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_vcpu_state_t, r15, 120, 8); |
| VALIDATE_FIELD_OFFSET_SIZE(zx_vcpu_state_t, rflags, 128, 8); |
| #endif |
| |
| #undef VALIDATE_TYPE_SIZE_ALIGNMENT |
| #undef VALIDATE_FIELD_OFFSET_SIZE |
| |
| #endif // ZIRCON_KERNEL_LIB_ABI_TYPE_VALIDATOR_INCLUDE_LIB_ABI_TYPE_VALIDATOR_H_ |