1 /* 2 * Base types used by various other types. 3 * 4 * Copyright (C) 2019, 2021, 2022, 2023, 2024 Paul Boddie <paul@boddie.org.uk> 5 * 6 * This program is free software; you can redistribute it and/or 7 * modify it under the terms of the GNU General Public License as 8 * published by the Free Software Foundation; either version 2 of 9 * the License, or (at your option) any later version. 10 * 11 * This program is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 * GNU General Public License for more details. 15 * 16 * You should have received a copy of the GNU General Public License 17 * along with this program; if not, write to the Free Software 18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, 19 * Boston, MA 02110-1301, USA 20 */ 21 22 #pragma once 23 24 #include <l4/sys/compiler.h> 25 #include <l4/sys/types.h> 26 27 28 29 EXTERN_C_BEGIN 30 31 /* Types for file access (access flags, offsets) and IPC operations. */ 32 33 typedef l4_uint64_t flags_t; /* see systypes/fcntl.h */ 34 typedef l4_uint64_t offset_t; 35 typedef l4_addr_t address_t; /* unsigned long */ 36 37 /* Region mapper types. 38 See: pkg/l4re-core/l4re_c/include/rm.h */ 39 40 typedef l4_uint32_t rm_flags_t; 41 typedef l4_uint64_t rm_offset_t; 42 43 /* Dataspace mapping flags. 44 See: pkg/l4re-core/l4re_c/include/dataspace.h */ 45 46 typedef l4_uint64_t map_address_t; 47 typedef unsigned long map_flags_t; 48 49 /* Dataspace types. 50 See: pkg/l4re-core/l4re_c/include/dataspace.h */ 51 52 typedef unsigned long ds_flags_t; 53 54 typedef struct 55 { 56 offset_t size; 57 ds_flags_t flags; 58 59 } ds_stats_t; 60 61 /* Conversions. */ 62 63 map_flags_t map_flags_for_fault(l4_umword_t flags); 64 65 /* Types and values for notification. */ 66 67 typedef l4_uint64_t notify_flags_t; 68 69 typedef struct 70 { 71 unsigned long sig; /* signal number */ 72 long val; /* signal-specific value */ 73 74 } notify_values_t; 75 76 #define NOTIFY_VALUES_NULL ((notify_values_t) {0, 0}) 77 78 enum notify_flags 79 { 80 NOTIFY_CONTENT_AVAILABLE = 0x001, /* reading files and pipes */ 81 NOTIFY_SPACE_AVAILABLE = 0x002, /* writing pipes */ 82 NOTIFY_PEER_CLOSED = 0x004, /* closing files and pipes */ 83 NOTIFY_FILE_OPENED = 0x008, /* opening files in directories */ 84 NOTIFY_TASK_SIGNAL = 0x100, /* signal from task */ 85 NOTIFY_TASK_ERROR = 0x200, /* error when creating task */ 86 87 /* Combinations of flags. */ 88 89 NOTIFY_TASK_ALL = 0x300, 90 }; 91 92 /* Notifiable object types. */ 93 94 /* Forward reference. */ 95 96 typedef struct notifiable_base notifiable_base_t; 97 98 /* Structure maintaining notification state for a specific object. */ 99 100 typedef struct notifiable 101 { 102 notifiable_base_t *base; /* access to the specific object */ 103 notify_flags_t notifications; /* essential notifications */ 104 notify_flags_t pending_notifications; 105 notify_values_t values; /* signal-specific values */ 106 notify_values_t pending_values; 107 void *handler; /* associated notification handler */ 108 109 } notifiable_t; 110 111 /* A base structure extended by notifiable object structures like files and 112 processes. */ 113 114 typedef struct notifiable_base 115 { 116 l4_cap_idx_t ref; 117 notifiable_t notifiable; 118 119 } notifiable_base_t; 120 121 /* Filesystem object properties. */ 122 123 typedef unsigned long object_flags_t; 124 125 enum object_flags 126 { 127 OBJECT_SUPPORTS_MMAP = 1, 128 OBJECT_HAS_SIZE = 2 129 }; 130 131 /* Memory mapping protection flags compatible with sys/mman.h (and incompatible 132 with comparable L4Re flags). */ 133 134 typedef unsigned long prot_t; 135 136 enum prot_flags 137 { 138 PROT_NONE = 0, 139 PROT_READ = 1, 140 PROT_WRITE = 2, 141 PROT_EXEC = 4 142 }; 143 144 /* Equivalent types are defined in sys/types.h typically. In newlib, they are 145 defined in sys/_types.h if not defined elsewhere (such as in 146 machine/_types.h). In uclibc, the following file is informative: 147 148 pkg/l4re-core/uclibc/lib/contrib/uclibc/libc/sysdeps/linux/common/bits/types.h 149 150 These types are intended for IPC, permitting different parties to employ 151 different library implementations where these types may be different. 152 */ 153 154 typedef l4_uint64_t sys_dev_t; /* device number */ 155 typedef unsigned long int sys_ino_t; /* inode number */ 156 typedef unsigned int sys_mode_t; /* file permissions */ 157 typedef unsigned long int sys_nlink_t; /* link count */ 158 typedef unsigned int sys_uid_t; /* user identifier */ 159 typedef unsigned int sys_gid_t; /* group identifier */ 160 typedef long sys_off_t; /* file offset/position */ 161 typedef long sys_blksize_t; /* input/output block size */ 162 typedef long sys_blkcnt_t; /* number of 512-byte blocks */ 163 164 /* Conversions. */ 165 166 #define systypes_from_sys_mode(mode) \ 167 ((mode_t) mode) 168 169 #define systypes_to_sys_mode(mode) \ 170 ((sys_mode_t) mode) 171 172 EXTERN_C_END 173 174 // vim: tabstop=2 expandtab shiftwidth=2