OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [rtems-20020807/] [cpukit/] [rtems/] [src/] [regioncreate.c] - Blame information for rev 1765

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 1026 ivang
/*
2
 *  Region 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
 *  regioncreate.c,v 1.3 2002/07/01 22:32:31 joel Exp
13
 */
14
 
15
#include <rtems/system.h>
16
#include <rtems/rtems/status.h>
17
#include <rtems/rtems/support.h>
18
#include <rtems/score/object.h>
19
#include <rtems/rtems/options.h>
20
#include <rtems/rtems/region.h>
21
#include <rtems/score/states.h>
22
#include <rtems/score/thread.h>
23
#include <rtems/score/apimutex.h>
24
 
25
/*PAGE
26
 *
27
 *  rtems_region_create
28
 *
29
 *  This directive creates a region of physical contiguous memory area
30
 *  from which variable sized segments can be allocated.
31
 *
32
 *  Input parameters:
33
 *    name             - user defined region name
34
 *    starting_address - physical start address of region
35
 *    length           - physical length in bytes
36
 *    page_size        - page size in bytes
37
 *    attribute_set    - region attributes
38
 *    id               - address of region id to set
39
 *
40
 *  Output parameters:
41
 *    id       - region id
42
 *    RTEMS_SUCCESSFUL - if successful
43
 *    error code - if unsuccessful
44
 */
45
 
46
rtems_status_code rtems_region_create(
47
  rtems_name          name,
48
  void               *starting_address,
49
  unsigned32          length,
50
  unsigned32          page_size,
51
  rtems_attribute  attribute_set,
52
  Objects_Id         *id
53
)
54
{
55
  Region_Control *the_region;
56
 
57
  if ( !rtems_is_name_valid( name ) )
58
    return RTEMS_INVALID_NAME;
59
 
60
  if ( !_Addresses_Is_aligned( starting_address ) )
61
    return RTEMS_INVALID_ADDRESS;
62
 
63
  _RTEMS_Lock_allocator();                      /* to prevent deletion */
64
 
65
  the_region = _Region_Allocate();
66
 
67
  if ( !the_region ) {
68
    _RTEMS_Unlock_allocator();
69
    return RTEMS_TOO_MANY;
70
  }
71
 
72
  the_region->maximum_segment_size =
73
    _Heap_Initialize(&the_region->Memory, starting_address, length, page_size);
74
 
75
  if ( !the_region->maximum_segment_size ) {
76
    _Region_Free( the_region );
77
    _RTEMS_Unlock_allocator();
78
    return RTEMS_INVALID_SIZE;
79
  }
80
 
81
  the_region->starting_address      = starting_address;
82
  the_region->length                = length;
83
  the_region->page_size             = page_size;
84
  the_region->attribute_set         = attribute_set;
85
  the_region->number_of_used_blocks = 0;
86
 
87
  _Thread_queue_Initialize(
88
    &the_region->Wait_queue,
89
    _Attributes_Is_priority( attribute_set ) ?
90
       THREAD_QUEUE_DISCIPLINE_PRIORITY : THREAD_QUEUE_DISCIPLINE_FIFO,
91
    STATES_WAITING_FOR_SEGMENT,
92
    RTEMS_TIMEOUT
93
  );
94
 
95
  _Objects_Open( &_Region_Information, &the_region->Object, name );
96
 
97
  *id = the_region->Object.id;
98
  _RTEMS_Unlock_allocator();
99
  return RTEMS_SUCCESSFUL;
100
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.