FreeCalypso > hg > fc-tourmaline
comparison src/nucleus/pmce.c @ 0:4e78acac3d88
src/{condat,cs,gpf,nucleus}: import from Selenite
| author | Mychaela Falconia <falcon@freecalypso.org> |
|---|---|
| date | Fri, 16 Oct 2020 06:23:26 +0000 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| -1:000000000000 | 0:4e78acac3d88 |
|---|---|
| 1 /*************************************************************************/ | |
| 2 /* */ | |
| 3 /* Copyright Mentor Graphics Corporation 2002 */ | |
| 4 /* All Rights Reserved. */ | |
| 5 /* */ | |
| 6 /* THIS WORK CONTAINS TRADE SECRET AND PROPRIETARY INFORMATION WHICH IS */ | |
| 7 /* THE PROPERTY OF MENTOR GRAPHICS CORPORATION OR ITS LICENSORS AND IS */ | |
| 8 /* SUBJECT TO LICENSE TERMS. */ | |
| 9 /* */ | |
| 10 /*************************************************************************/ | |
| 11 | |
| 12 /*************************************************************************/ | |
| 13 /* */ | |
| 14 /* FILE NAME VERSION */ | |
| 15 /* */ | |
| 16 /* pmce.c Nucleus PLUS 1.14 */ | |
| 17 /* */ | |
| 18 /* COMPONENT */ | |
| 19 /* */ | |
| 20 /* PM - Partition Memory Management */ | |
| 21 /* */ | |
| 22 /* DESCRIPTION */ | |
| 23 /* */ | |
| 24 /* This file contains the error checking routines for the functions */ | |
| 25 /* in the Partition component. This permits easy removal of error */ | |
| 26 /* checking logic when it is not needed. */ | |
| 27 /* */ | |
| 28 /* DATA STRUCTURES */ | |
| 29 /* */ | |
| 30 /* None */ | |
| 31 /* */ | |
| 32 /* FUNCTIONS */ | |
| 33 /* */ | |
| 34 /* PMCE_Create_Partition_Pool Create a Partition Pool */ | |
| 35 /* PMCE_Delete_Partition_Pool Delete a Partition Pool */ | |
| 36 /* PMCE_Allocate_Partition Allocate a partition from a */ | |
| 37 /* pool */ | |
| 38 /* PMCE_Deallocate_Partition Deallocate a partition from */ | |
| 39 /* a pool */ | |
| 40 /* */ | |
| 41 /* DEPENDENCIES */ | |
| 42 /* */ | |
| 43 /* cs_extr.h Common Service functions */ | |
| 44 /* tc_extr.h Thread Control functions */ | |
| 45 /* pm_extr.h Partition functions */ | |
| 46 /* */ | |
| 47 /* HISTORY */ | |
| 48 /* */ | |
| 49 /* DATE REMARKS */ | |
| 50 /* */ | |
| 51 /* 03-01-1993 Created initial version 1.0 */ | |
| 52 /* 04-19-1993 Verified version 1.0 */ | |
| 53 /* 03-01-1994 Changed name original error */ | |
| 54 /* checking file and changed */ | |
| 55 /* function interfaces, resulting */ | |
| 56 /* in version 1.1 */ | |
| 57 /* */ | |
| 58 /* 03-18-1994 Verified version 1.1 */ | |
| 59 /* 04-17-1996 updated to version 1.2 */ | |
| 60 /* 03-24-1998 Released version 1.3 */ | |
| 61 /* 04-17-2002 Released version 1.13m */ | |
| 62 /* 11-07-2002 Released version 1.14 */ | |
| 63 /*************************************************************************/ | |
| 64 #define NU_SOURCE_FILE | |
| 65 | |
| 66 | |
| 67 #include "cs_extr.h" /* Common service functions */ | |
| 68 #include "tc_extr.h" /* Thread control functions */ | |
| 69 #include "pm_extr.h" /* Partition functions */ | |
| 70 | |
| 71 | |
| 72 /*************************************************************************/ | |
| 73 /* */ | |
| 74 /* FUNCTION */ | |
| 75 /* */ | |
| 76 /* PMCE_Create_Partition_Pool */ | |
| 77 /* */ | |
| 78 /* DESCRIPTION */ | |
| 79 /* */ | |
| 80 /* This function performs error checking on the parameters supplied */ | |
| 81 /* to the create partition pool function. */ | |
| 82 /* */ | |
| 83 /* CALLED BY */ | |
| 84 /* */ | |
| 85 /* Application */ | |
| 86 /* */ | |
| 87 /* CALLS */ | |
| 88 /* */ | |
| 89 /* PMC_Create_Partition_Pool Actual create partition pool */ | |
| 90 /* function */ | |
| 91 /* */ | |
| 92 /* INPUTS */ | |
| 93 /* */ | |
| 94 /* pool_ptr Partition pool control block */ | |
| 95 /* pointer */ | |
| 96 /* name Partition pool name */ | |
| 97 /* start_address Starting address of the pool */ | |
| 98 /* pool_size Number of bytes in the pool */ | |
| 99 /* partition_size Number of bytes in each */ | |
| 100 /* partition of the pool */ | |
| 101 /* suspend_type Suspension type */ | |
| 102 /* */ | |
| 103 /* OUTPUTS */ | |
| 104 /* */ | |
| 105 /* NU_INVALID_POOL Pool control block pointer */ | |
| 106 /* is NULL */ | |
| 107 /* NU_INVALID_MEMORY Pool starting address is NULL*/ | |
| 108 /* NU_INVALID_SIZE Partition size is 0 or it is */ | |
| 109 /* larger than the pool area */ | |
| 110 /* NU_INVALID_SUSPEND Suspension selection is not */ | |
| 111 /* valid */ | |
| 112 /* */ | |
| 113 /* HISTORY */ | |
| 114 /* */ | |
| 115 /* DATE REMARKS */ | |
| 116 /* */ | |
| 117 /* 03-01-1993 Created initial version 1.0 */ | |
| 118 /* 04-19-1993 Verified version 1.0 */ | |
| 119 /* 03-01-1994 Modified function interface, */ | |
| 120 /* resulting in version 1.1 */ | |
| 121 /* */ | |
| 122 /* 03-18-1994 Verified version 1.1 */ | |
| 123 /* */ | |
| 124 /*************************************************************************/ | |
| 125 STATUS PMCE_Create_Partition_Pool(NU_PARTITION_POOL *pool_ptr, CHAR *name, | |
| 126 VOID *start_address, UNSIGNED pool_size, | |
| 127 UNSIGNED partition_size, OPTION suspend_type) | |
| 128 { | |
| 129 | |
| 130 PM_PCB *pool; /* Pool control block ptr */ | |
| 131 STATUS status; /* Completion status */ | |
| 132 UNSIGNED size; /* Adjusted size of partition*/ | |
| 133 | |
| 134 | |
| 135 /* Move input pool pointer into internal pointer. */ | |
| 136 pool = (PM_PCB *) pool_ptr; | |
| 137 | |
| 138 /* Adjust the partition size to something that is evenly divisible by | |
| 139 the number of bytes in an UNSIGNED data type. */ | |
| 140 size = ((partition_size + sizeof(UNSIGNED) - 1)/sizeof(UNSIGNED)) * | |
| 141 sizeof(UNSIGNED); | |
| 142 | |
| 143 /* Check for a NULL partition pool control block pointer or a control | |
| 144 block that is already created. */ | |
| 145 if ((pool == NU_NULL) || (pool -> pm_id == PM_PARTITION_ID)) | |
| 146 | |
| 147 /* Invalid partition pool control block pointer. */ | |
| 148 status = NU_INVALID_POOL; | |
| 149 | |
| 150 else if (start_address == NU_NULL) | |
| 151 | |
| 152 /* Invalid memory pointer. */ | |
| 153 status = NU_INVALID_MEMORY; | |
| 154 | |
| 155 else if ((size == 0) || ((size + PM_OVERHEAD) > pool_size)) | |
| 156 | |
| 157 /* Pool could not even accommodate one partition. */ | |
| 158 status = NU_INVALID_SIZE; | |
| 159 | |
| 160 else if ((suspend_type != NU_FIFO) && (suspend_type != NU_PRIORITY)) | |
| 161 | |
| 162 /* Invalid suspension type. */ | |
| 163 status = NU_INVALID_SUSPEND; | |
| 164 | |
| 165 else | |
| 166 | |
| 167 /* Call the actual service to create the partition pool. */ | |
| 168 status = PMC_Create_Partition_Pool(pool_ptr, name, start_address, | |
| 169 pool_size, partition_size, suspend_type); | |
| 170 | |
| 171 /* Return completion status. */ | |
| 172 return(status); | |
| 173 } | |
| 174 | |
| 175 | |
| 176 /*************************************************************************/ | |
| 177 /* */ | |
| 178 /* FUNCTION */ | |
| 179 /* */ | |
| 180 /* PMCE_Delete_Partition_Pool */ | |
| 181 /* */ | |
| 182 /* DESCRIPTION */ | |
| 183 /* */ | |
| 184 /* This function performs error checking on the parameters supplied */ | |
| 185 /* to the delete partition pool function. */ | |
| 186 /* */ | |
| 187 /* CALLED BY */ | |
| 188 /* */ | |
| 189 /* Application */ | |
| 190 /* */ | |
| 191 /* CALLS */ | |
| 192 /* */ | |
| 193 /* PMC_Delete_Partition_Pool Actual function to delete a */ | |
| 194 /* partition pool */ | |
| 195 /* */ | |
| 196 /* INPUTS */ | |
| 197 /* */ | |
| 198 /* pool_ptr Partition pool control block */ | |
| 199 /* pointer */ | |
| 200 /* */ | |
| 201 /* OUTPUTS */ | |
| 202 /* */ | |
| 203 /* NU_INVALID_POOL Indicates the supplied pool */ | |
| 204 /* pointer is invalid */ | |
| 205 /* */ | |
| 206 /* HISTORY */ | |
| 207 /* */ | |
| 208 /* DATE REMARKS */ | |
| 209 /* */ | |
| 210 /* 03-01-1993 Created initial version 1.0 */ | |
| 211 /* 04-19-1993 Verified version 1.0 */ | |
| 212 /* 03-01-1994 Modified function interface, */ | |
| 213 /* resulting in version 1.1 */ | |
| 214 /* */ | |
| 215 /* 03-18-1994 Verified version 1.1 */ | |
| 216 /* */ | |
| 217 /*************************************************************************/ | |
| 218 STATUS PMCE_Delete_Partition_Pool(NU_PARTITION_POOL *pool_ptr) | |
| 219 { | |
| 220 | |
| 221 PM_PCB *pool; /* Pool control block ptr */ | |
| 222 STATUS status; /* Completion status */ | |
| 223 | |
| 224 | |
| 225 /* Move input pool pointer into internal pointer. */ | |
| 226 pool = (PM_PCB *) pool_ptr; | |
| 227 | |
| 228 /* Determine if the partition pool pointer is valid. */ | |
| 229 if ((pool) && (pool -> pm_id == PM_PARTITION_ID)) | |
| 230 | |
| 231 /* Partition pool pointer is valid, call function to delete it. */ | |
| 232 status = PMC_Delete_Partition_Pool(pool_ptr); | |
| 233 | |
| 234 else | |
| 235 | |
| 236 /* Partition pool pointer is invalid, indicate in completion status. */ | |
| 237 status = NU_INVALID_POOL; | |
| 238 | |
| 239 /* Return completion status. */ | |
| 240 return(status); | |
| 241 } | |
| 242 | |
| 243 | |
| 244 /*************************************************************************/ | |
| 245 /* */ | |
| 246 /* FUNCTION */ | |
| 247 /* */ | |
| 248 /* PMCE_Allocate_Partition */ | |
| 249 /* */ | |
| 250 /* DESCRIPTION */ | |
| 251 /* */ | |
| 252 /* This function performs error checking on the parameters supplied */ | |
| 253 /* to the allocate partition function. */ | |
| 254 /* */ | |
| 255 /* CALLED BY */ | |
| 256 /* */ | |
| 257 /* Application */ | |
| 258 /* */ | |
| 259 /* CALLS */ | |
| 260 /* */ | |
| 261 /* PMC_Allocate_Partition Actual partition allocate */ | |
| 262 /* function */ | |
| 263 /* TCCE_Suspend_Error Check for a task suspension */ | |
| 264 /* error */ | |
| 265 /* */ | |
| 266 /* INPUTS */ | |
| 267 /* */ | |
| 268 /* pool_ptr Memory partition pool pointer*/ | |
| 269 /* return_pointer Pointer to the destination */ | |
| 270 /* memory pointer */ | |
| 271 /* suspend Suspension option if full */ | |
| 272 /* */ | |
| 273 /* OUTPUTS */ | |
| 274 /* */ | |
| 275 /* NU_INVALID_POOL Indicates the pool pointer */ | |
| 276 /* is invalid */ | |
| 277 /* NU_INVALID_POINTER Indicates the return pointer */ | |
| 278 /* is NULL */ | |
| 279 /* NU_INVALID_SUSPEND Indicates the suspension is */ | |
| 280 /* invalid */ | |
| 281 /* */ | |
| 282 /* HISTORY */ | |
| 283 /* */ | |
| 284 /* DATE REMARKS */ | |
| 285 /* */ | |
| 286 /* 03-01-1993 Created initial version 1.0 */ | |
| 287 /* 04-19-1993 Verified version 1.0 */ | |
| 288 /* 03-01-1994 Modified function interface, */ | |
| 289 /* resulting in version 1.1 */ | |
| 290 /* */ | |
| 291 /* 03-18-1994 Verified version 1.1 */ | |
| 292 /* */ | |
| 293 /*************************************************************************/ | |
| 294 STATUS PMCE_Allocate_Partition(NU_PARTITION_POOL *pool_ptr, | |
| 295 VOID **return_pointer, UNSIGNED suspend) | |
| 296 { | |
| 297 | |
| 298 PM_PCB *pool; /* Pool control block ptr */ | |
| 299 STATUS status; /* Completion status */ | |
| 300 | |
| 301 | |
| 302 /* Move input pool pointer into internal pointer. */ | |
| 303 pool = (PM_PCB *) pool_ptr; | |
| 304 | |
| 305 /* Determine if partition pool pointer is invalid. */ | |
| 306 if (pool == NU_NULL) | |
| 307 | |
| 308 /* Partition pool pointer is invalid, indicate in completion status. */ | |
| 309 status = NU_INVALID_POOL; | |
| 310 | |
| 311 else if (pool -> pm_id != PM_PARTITION_ID) | |
| 312 | |
| 313 /* Partition pool pointer is invalid, indicate in completion status. */ | |
| 314 status = NU_INVALID_POOL; | |
| 315 | |
| 316 else if (return_pointer == NU_NULL) | |
| 317 | |
| 318 /* Return pointer is invalid. */ | |
| 319 status = NU_INVALID_POINTER; | |
| 320 | |
| 321 else if ((suspend) && (TCCE_Suspend_Error())) | |
| 322 | |
| 323 /* Suspension from a non-task thread. */ | |
| 324 status = NU_INVALID_SUSPEND; | |
| 325 | |
| 326 else | |
| 327 | |
| 328 /* Parameters are valid, call actual function. */ | |
| 329 status = PMC_Allocate_Partition(pool_ptr, return_pointer, suspend); | |
| 330 | |
| 331 /* Return the completion status. */ | |
| 332 return(status); | |
| 333 } | |
| 334 | |
| 335 | |
| 336 /*************************************************************************/ | |
| 337 /* */ | |
| 338 /* FUNCTION */ | |
| 339 /* */ | |
| 340 /* PMCE_Deallocate_Partition */ | |
| 341 /* */ | |
| 342 /* DESCRIPTION */ | |
| 343 /* */ | |
| 344 /* This function performs error checking on the parameters supplied */ | |
| 345 /* to the deallocate partition function. */ | |
| 346 /* */ | |
| 347 /* CALLED BY */ | |
| 348 /* */ | |
| 349 /* Application */ | |
| 350 /* */ | |
| 351 /* CALLS */ | |
| 352 /* */ | |
| 353 /* PMC_Deallocate_Partition Deallocate a partition */ | |
| 354 /* */ | |
| 355 /* INPUTS */ | |
| 356 /* */ | |
| 357 /* partition Pointer to partition memory */ | |
| 358 /* */ | |
| 359 /* OUTPUTS */ | |
| 360 /* */ | |
| 361 /* NU_INVALID_POINTER Indicates the supplied */ | |
| 362 /* partition pointer is NULL, */ | |
| 363 /* or otherwise invalid. */ | |
| 364 /* NU_SUCCESS */ | |
| 365 /* */ | |
| 366 /* HISTORY */ | |
| 367 /* */ | |
| 368 /* DATE REMARKS */ | |
| 369 /* */ | |
| 370 /* 03-01-1993 Created initial version 1.0 */ | |
| 371 /* 04-19-1993 Verified version 1.0 */ | |
| 372 /* 03-01-1994 Modified function interface, */ | |
| 373 /* resulting in version 1.1 */ | |
| 374 /* */ | |
| 375 /* 03-18-1994 Verified version 1.1 */ | |
| 376 /* */ | |
| 377 /*************************************************************************/ | |
| 378 STATUS PMCE_Deallocate_Partition(VOID *partition) | |
| 379 { | |
| 380 | |
| 381 PM_PCB *pool; /* Pool pointer */ | |
| 382 PM_HEADER *header_ptr; /* Pointer to partition hdr */ | |
| 383 STATUS status; /* Completion status */ | |
| 384 | |
| 385 | |
| 386 /* Pickup the associated pool's pointer. It is inside the header of | |
| 387 each partition. */ | |
| 388 header_ptr = (PM_HEADER *) (((BYTE_PTR) partition) - PM_OVERHEAD); | |
| 389 | |
| 390 /* Determine if the pointer(s) are NULL. */ | |
| 391 if ((header_ptr == NU_NULL) || (partition == NU_NULL)) | |
| 392 | |
| 393 /* Partition pointer is invalid. */ | |
| 394 status = NU_INVALID_POINTER; | |
| 395 | |
| 396 /* Determine if partition pool pointer is invalid. */ | |
| 397 else if ((pool = header_ptr -> pm_partition_pool) == NU_NULL) | |
| 398 | |
| 399 /* Partition pointer is invalid, indicate in completion status. */ | |
| 400 status = NU_INVALID_POINTER; | |
| 401 | |
| 402 else if (pool -> pm_id != PM_PARTITION_ID) | |
| 403 | |
| 404 /* Partition pool pointer is invalid, indicate in completion status. */ | |
| 405 status = NU_INVALID_POINTER; | |
| 406 | |
| 407 else if (header_ptr -> pm_next_available) | |
| 408 | |
| 409 /* Partition is still linked on the available list- must not be | |
| 410 allocated. */ | |
| 411 status = NU_INVALID_POINTER; | |
| 412 | |
| 413 else | |
| 414 | |
| 415 /* Parameters are valid, call actual function. */ | |
| 416 status = PMC_Deallocate_Partition(partition); | |
| 417 | |
| 418 /* Return the completion status. */ | |
| 419 return(status); | |
| 420 } | |
| 421 | |
| 422 | |
| 423 | |
| 424 | |
| 425 | |
| 426 |
