summaryrefslogtreecommitdiff
path: root/application/boottable/segment.h
blob: 6acaceea79f8e32bc2bd7e2ebf678164da1e461d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
/************************************************************/
/* Spidcom Technologies

FILE NAME : segment.h

DESCRIPTION : segment descriptions

HISTORY : 
--------------------------------------------------------------
DATE        | AUTHOR    | Version   | Description             
--------------------------------------------------------------
20/02/04    | Petillon  | 1.0       | Creation                
*/
/************************************************************/

#ifndef SEGMENT_H
#define SEGMENT_H

#include "stdtypes.h"

/*!\brief Memory segment (named). 
*/
typedef struct
{
  char *name;
  caddr_t address;
  size_t size;
} segment_t;

/*!\brief Memory segment list. 
*/
typedef struct
{
  segment_t *segments;
  int size;
  int capacity;
} segment_list_t;

/*!\brief Create and initialize a segment list.

\param segment_list list to be initialized
*/
extern void segment_list_init(segment_list_t *segment_list);

/*!\brief Destroy a segment list. 

\param segment_list list to be destroyed
*/
extern void segment_list_delete(segment_list_t *segment_list);

/*!\brief Add a segment to a segment list. 

\param segment      segment to be added
\param segment_list list 
*/
extern void add_segment(segment_t *segment, segment_list_t *segment_list);

/*!\brief Search an overlapping segment in a list. 

\param segment      overlapping segment
\param segment_list list 
\return index of the overlapping segment
        -1 if none
*/
extern int segment_overlap(segment_t *segment, const segment_list_t *segment_list);

/*!\brief Search a non overlapping segment in a memory region. 

Finds the first segment starting from address not overlapping with the segment list.
The size of the segment to be found has to be given in the segment argument.

\param address      start address of search region
\param size         size of search region
\param segment_list reserved segment list
\param segment      \b OUT returned segment
\return -1 if none found
*/
extern int find_segment(caddr_t address, size_t size, segment_list_t *segment_list, segment_t *segment);

#endif // SEGMENT_H