source: rtems/cpukit/rtems/src/partcreate.c @ 4bf1801

4.104.114.84.95
Last change on this file since 4bf1801 was 08311cc3, checked in by Joel Sherrill <joel.sherrill@…>, on 11/17/99 at 17:51:34

Updated copyright notice.

  • Property mode set to 100644
File size: 3.2 KB
Line 
1/*
2 *  Partition Manager
3 *
4 *
5 *  COPYRIGHT (c) 1989-1999.
6 *  On-Line Applications Research Corporation (OAR).
7 *
8 *  The license and distribution terms for this file may be
9 *  found in the file LICENSE in this distribution or at
10 *  http://www.OARcorp.com/rtems/license.html.
11 *
12 *  $Id$
13 */
14
15#include <rtems/system.h>
16#include <rtems/rtems/status.h>
17#include <rtems/rtems/support.h>
18#include <rtems/score/address.h>
19#include <rtems/score/object.h>
20#include <rtems/rtems/part.h>
21#include <rtems/score/thread.h>
22#include <rtems/score/sysstate.h>
23
24/*PAGE
25 *
26 *  rtems_partition_create
27 *
28 *  This directive creates a partiton of fixed sized buffers from the
29 *  given contiguous memory area.
30 *
31 *  Input parameters:
32 *    name             - user defined partition name
33 *    starting_address - physical start address of partition
34 *    length           - physical length in bytes
35 *    buffer_size      - size of buffers in bytes
36 *    attribute_set    - partition attributes
37 *    id               - pointer to partition id
38 *
39 *  Output parameters:
40 *    id                - partition id
41 *    RTEMS_SUCCESSFUL - if successful
42 *    error code        - if unsuccessful
43 */
44
45rtems_status_code rtems_partition_create(
46  rtems_name          name,
47  void               *starting_address,
48  unsigned32          length,
49  unsigned32          buffer_size,
50  rtems_attribute  attribute_set,
51  Objects_Id         *id
52)
53{
54  register Partition_Control *the_partition;
55
56  if ( !rtems_is_name_valid( name ) )
57    return RTEMS_INVALID_NAME;
58
59  if ( length == 0 || buffer_size == 0 || length < buffer_size ||
60         !_Partition_Is_buffer_size_aligned( buffer_size ) )
61    return RTEMS_INVALID_SIZE;
62
63  if ( !_Addresses_Is_aligned( starting_address ) )
64     return RTEMS_INVALID_ADDRESS;
65
66#if defined(RTEMS_MULTIPROCESSING)
67  if ( _Attributes_Is_global( attribute_set ) &&
68       !_System_state_Is_multiprocessing )
69    return RTEMS_MP_NOT_CONFIGURED;
70#endif
71
72  _Thread_Disable_dispatch();               /* prevents deletion */
73
74  the_partition = _Partition_Allocate();
75
76  if ( !the_partition ) {
77    _Thread_Enable_dispatch();
78    return RTEMS_TOO_MANY;
79  }
80
81#if defined(RTEMS_MULTIPROCESSING)
82  if ( _Attributes_Is_global( attribute_set ) &&
83       !( _Objects_MP_Allocate_and_open( &_Partition_Information, name,
84                            the_partition->Object.id, FALSE ) ) ) {
85    _Partition_Free( the_partition );
86    _Thread_Enable_dispatch();
87    return RTEMS_TOO_MANY;
88  }
89#endif
90
91  the_partition->starting_address      = starting_address;
92  the_partition->length                = length;
93  the_partition->buffer_size           = buffer_size;
94  the_partition->attribute_set         = attribute_set;
95  the_partition->number_of_used_blocks = 0;
96
97  _Chain_Initialize( &the_partition->Memory, starting_address,
98                        length / buffer_size, buffer_size );
99
100  _Objects_Open( &_Partition_Information, &the_partition->Object, &name );
101
102  *id = the_partition->Object.id;
103#if defined(RTEMS_MULTIPROCESSING)
104  if ( _Attributes_Is_global( attribute_set ) )
105    _Partition_MP_Send_process_packet(
106      PARTITION_MP_ANNOUNCE_CREATE,
107      the_partition->Object.id,
108      name,
109      0                  /* Not used */
110    );
111#endif
112
113  _Thread_Enable_dispatch();
114  return RTEMS_SUCCESSFUL;
115}
Note: See TracBrowser for help on using the repository browser.