162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 262306a36Sopenharmony_ci// 362306a36Sopenharmony_ci// uapi_test.c - An application of Kunit to check layout of structures exposed to user space for 462306a36Sopenharmony_ci// FireWire subsystem. 562306a36Sopenharmony_ci// 662306a36Sopenharmony_ci// Copyright (c) 2023 Takashi Sakamoto 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci#include <kunit/test.h> 962306a36Sopenharmony_ci#include <linux/firewire-cdev.h> 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci// Known issue added at v2.6.27 kernel. 1262306a36Sopenharmony_cistatic void structure_layout_event_response(struct kunit *test) 1362306a36Sopenharmony_ci{ 1462306a36Sopenharmony_ci#if defined(CONFIG_X86_32) 1562306a36Sopenharmony_ci // 4 bytes alignment for aggregate type including 8 bytes storage types. 1662306a36Sopenharmony_ci KUNIT_EXPECT_EQ(test, 20, sizeof(struct fw_cdev_event_response)); 1762306a36Sopenharmony_ci#else 1862306a36Sopenharmony_ci // 8 bytes alignment for aggregate type including 8 bytes storage types. 1962306a36Sopenharmony_ci KUNIT_EXPECT_EQ(test, 24, sizeof(struct fw_cdev_event_response)); 2062306a36Sopenharmony_ci#endif 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_ci KUNIT_EXPECT_EQ(test, 0, offsetof(struct fw_cdev_event_response, closure)); 2362306a36Sopenharmony_ci KUNIT_EXPECT_EQ(test, 8, offsetof(struct fw_cdev_event_response, type)); 2462306a36Sopenharmony_ci KUNIT_EXPECT_EQ(test, 12, offsetof(struct fw_cdev_event_response, rcode)); 2562306a36Sopenharmony_ci KUNIT_EXPECT_EQ(test, 16, offsetof(struct fw_cdev_event_response, length)); 2662306a36Sopenharmony_ci KUNIT_EXPECT_EQ(test, 20, offsetof(struct fw_cdev_event_response, data)); 2762306a36Sopenharmony_ci} 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_ci// Added at v6.5. 3062306a36Sopenharmony_cistatic void structure_layout_event_request3(struct kunit *test) 3162306a36Sopenharmony_ci{ 3262306a36Sopenharmony_ci KUNIT_EXPECT_EQ(test, 56, sizeof(struct fw_cdev_event_request3)); 3362306a36Sopenharmony_ci 3462306a36Sopenharmony_ci KUNIT_EXPECT_EQ(test, 0, offsetof(struct fw_cdev_event_request3, closure)); 3562306a36Sopenharmony_ci KUNIT_EXPECT_EQ(test, 8, offsetof(struct fw_cdev_event_request3, type)); 3662306a36Sopenharmony_ci KUNIT_EXPECT_EQ(test, 12, offsetof(struct fw_cdev_event_request3, tcode)); 3762306a36Sopenharmony_ci KUNIT_EXPECT_EQ(test, 16, offsetof(struct fw_cdev_event_request3, offset)); 3862306a36Sopenharmony_ci KUNIT_EXPECT_EQ(test, 24, offsetof(struct fw_cdev_event_request3, source_node_id)); 3962306a36Sopenharmony_ci KUNIT_EXPECT_EQ(test, 28, offsetof(struct fw_cdev_event_request3, destination_node_id)); 4062306a36Sopenharmony_ci KUNIT_EXPECT_EQ(test, 32, offsetof(struct fw_cdev_event_request3, card)); 4162306a36Sopenharmony_ci KUNIT_EXPECT_EQ(test, 36, offsetof(struct fw_cdev_event_request3, generation)); 4262306a36Sopenharmony_ci KUNIT_EXPECT_EQ(test, 40, offsetof(struct fw_cdev_event_request3, handle)); 4362306a36Sopenharmony_ci KUNIT_EXPECT_EQ(test, 44, offsetof(struct fw_cdev_event_request3, length)); 4462306a36Sopenharmony_ci KUNIT_EXPECT_EQ(test, 48, offsetof(struct fw_cdev_event_request3, tstamp)); 4562306a36Sopenharmony_ci KUNIT_EXPECT_EQ(test, 56, offsetof(struct fw_cdev_event_request3, data)); 4662306a36Sopenharmony_ci} 4762306a36Sopenharmony_ci 4862306a36Sopenharmony_ci// Added at v6.5. 4962306a36Sopenharmony_cistatic void structure_layout_event_response2(struct kunit *test) 5062306a36Sopenharmony_ci{ 5162306a36Sopenharmony_ci KUNIT_EXPECT_EQ(test, 32, sizeof(struct fw_cdev_event_response2)); 5262306a36Sopenharmony_ci 5362306a36Sopenharmony_ci KUNIT_EXPECT_EQ(test, 0, offsetof(struct fw_cdev_event_response2, closure)); 5462306a36Sopenharmony_ci KUNIT_EXPECT_EQ(test, 8, offsetof(struct fw_cdev_event_response2, type)); 5562306a36Sopenharmony_ci KUNIT_EXPECT_EQ(test, 12, offsetof(struct fw_cdev_event_response2, rcode)); 5662306a36Sopenharmony_ci KUNIT_EXPECT_EQ(test, 16, offsetof(struct fw_cdev_event_response2, length)); 5762306a36Sopenharmony_ci KUNIT_EXPECT_EQ(test, 20, offsetof(struct fw_cdev_event_response2, request_tstamp)); 5862306a36Sopenharmony_ci KUNIT_EXPECT_EQ(test, 24, offsetof(struct fw_cdev_event_response2, response_tstamp)); 5962306a36Sopenharmony_ci KUNIT_EXPECT_EQ(test, 32, offsetof(struct fw_cdev_event_response2, data)); 6062306a36Sopenharmony_ci} 6162306a36Sopenharmony_ci 6262306a36Sopenharmony_ci// Added at v6.5. 6362306a36Sopenharmony_cistatic void structure_layout_event_phy_packet2(struct kunit *test) 6462306a36Sopenharmony_ci{ 6562306a36Sopenharmony_ci KUNIT_EXPECT_EQ(test, 24, sizeof(struct fw_cdev_event_phy_packet2)); 6662306a36Sopenharmony_ci 6762306a36Sopenharmony_ci KUNIT_EXPECT_EQ(test, 0, offsetof(struct fw_cdev_event_phy_packet2, closure)); 6862306a36Sopenharmony_ci KUNIT_EXPECT_EQ(test, 8, offsetof(struct fw_cdev_event_phy_packet2, type)); 6962306a36Sopenharmony_ci KUNIT_EXPECT_EQ(test, 12, offsetof(struct fw_cdev_event_phy_packet2, rcode)); 7062306a36Sopenharmony_ci KUNIT_EXPECT_EQ(test, 16, offsetof(struct fw_cdev_event_phy_packet2, length)); 7162306a36Sopenharmony_ci KUNIT_EXPECT_EQ(test, 20, offsetof(struct fw_cdev_event_phy_packet2, tstamp)); 7262306a36Sopenharmony_ci KUNIT_EXPECT_EQ(test, 24, offsetof(struct fw_cdev_event_phy_packet2, data)); 7362306a36Sopenharmony_ci} 7462306a36Sopenharmony_ci 7562306a36Sopenharmony_cistatic struct kunit_case structure_layout_test_cases[] = { 7662306a36Sopenharmony_ci KUNIT_CASE(structure_layout_event_response), 7762306a36Sopenharmony_ci KUNIT_CASE(structure_layout_event_request3), 7862306a36Sopenharmony_ci KUNIT_CASE(structure_layout_event_response2), 7962306a36Sopenharmony_ci KUNIT_CASE(structure_layout_event_phy_packet2), 8062306a36Sopenharmony_ci {} 8162306a36Sopenharmony_ci}; 8262306a36Sopenharmony_ci 8362306a36Sopenharmony_cistatic struct kunit_suite structure_layout_test_suite = { 8462306a36Sopenharmony_ci .name = "firewire-uapi-structure-layout", 8562306a36Sopenharmony_ci .test_cases = structure_layout_test_cases, 8662306a36Sopenharmony_ci}; 8762306a36Sopenharmony_cikunit_test_suite(structure_layout_test_suite); 8862306a36Sopenharmony_ci 8962306a36Sopenharmony_ciMODULE_LICENSE("GPL"); 90