#pragma once #include #include #include #include #define ZN_IPC_NUM(group, num) ((uint32_t)(group) << 24u) | ((uint32_t)(num) & 0xffffffu) #define ZN_IPC(name, group, num, num_handles) \ name##_inner; \ constexpr uint32_t name##_num = ZN_IPC_NUM(group, num); \ typedef struct { \ uint32_t id; \ zn_handle_t handles[num_handles]; \ name##_inner inner; \ } name #define zn_ipc_write(channel, obj) \ zn_channel_write(channel, (obj)->handles, &(obj)->inner, ARRAY_SIZE((obj)->handles), sizeof((obj)->inner)) #define zn_ipc_read(channel, obj) \ zn_channel_read( \ channel, \ (obj)->handles, \ &(obj)->inner, \ ARRAY_SIZE((obj)->handles), \ sizeof((obj)->inner), \ nullptr, \ nullptr \ ) #define zn_ipc_new(name) \ (zn_ipc_fw_rsdp) { \ .id = name##_num \ }