summaryrefslogtreecommitdiff
path: root/gdb/osf-share/cma_stack_int.h
blob: bf76f60756edf43533b40dc1b7254ad7fe99b2ee (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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
/* 
 * (c) Copyright 1990-1996 OPEN SOFTWARE FOUNDATION, INC.
 * (c) Copyright 1990-1996 HEWLETT-PACKARD COMPANY
 * (c) Copyright 1990-1996 DIGITAL EQUIPMENT CORPORATION
 * (c) Copyright 1991, 1992 Siemens-Nixdorf Information Systems
 * To anyone who acknowledges that this file is provided "AS IS" without
 * any express or implied warranty: permission to use, copy, modify, and
 * distribute this file for any purpose is hereby granted without fee,
 * provided that the above copyright notices and this notice appears in
 * all source code copies, and that none of the names listed above be used
 * in advertising or publicity pertaining to distribution of the software
 * without specific, written prior permission.  None of these organizations
 * makes any representations about the suitability of this software for
 * any purpose.
 */
/*
 *	Header file for stack management (internal to cma_stack.c, but
 *	separate for convenience, and unit testing).
 */

#ifndef CMA_STACK_INT
#define CMA_STACK_INT

/*
 *  INCLUDE FILES
 */

#include <cma.h>
#include <cma_queue.h>
#include <cma_list.h>
#include <cma_tcb_defs.h>

/*
 * CONSTANTS AND MACROS
 */

#define cma___c_first_free_chunk	0
#define cma___c_min_count	2	/* Smallest number of chunks to leave */
#define cma___c_end		(-1)	/* End of free list (flag) */
#define cma__c_yellow_size	0

/* 
 * Cluster types
 */
#define cma___c_cluster  0	/* Default cluster */
#define cma___c_bigstack 1	/* Looks like a cluster, but it's a stack */


#define cma___c_null_cluster	(cma___t_cluster *)cma_c_null_ptr


/*
 * TYPEDEFS
 */

#ifndef __STDC__
struct CMA__T_INT_STACK;
#endif

typedef cma_t_natural	cma___t_index;	/* Type for chunk index */

typedef struct CMA___T_CLU_DESC {
    cma__t_list		list;		/* Queue element for cluster list */
    cma_t_integer	type;		/* Type of cluster */
    cma_t_address	stacks;
    cma_t_address	limit;
    } cma___t_clu_desc;

typedef union CMA___T_MAP_ENTRY {
    struct {
	cma__t_int_tcb	*tcb;		/* TCB associated with stack chunk */
	struct CMA__T_INT_STACK	*stack;	/* Stack desc. ass. with stack chunk */
	} mapped;
    struct {
	cma___t_index		size;	/* Number of chunks in block */
	cma___t_index		next;	/* Next free block */
	} free;
    } cma___t_map_entry;

/*
 * NOTE: It is VERY IMPORTANT that both cma___t_cluster and cma___t_bigstack
 * begin with the cma___t_clu_desc structure, as there is some code in the
 * stack manager that relies on being able to treat both as equivalent!
 */
typedef struct CMA___T_CLUSTER {
    cma___t_clu_desc	desc;		/* Describe this cluster */
    cma___t_map_entry	map[cma__c_chunk_count];	/* thread map */
    cma___t_index	free;		/* First free chunk index */
    } cma___t_cluster;

/*
 * NOTE: It is VERY IMPORTANT that both cma___t_cluster and cma___t_bigstack
 * begin with the cma___t_clu_desc structure, as there is some code in the
 * stack manager that relies on being able to treat both as equivalent!
 */
typedef struct CMA___T_BIGSTACK {
    cma___t_clu_desc	desc;		/* Describe this cluster */
    cma__t_int_tcb	*tcb;		/* TCB associated with stack */
    struct CMA__T_INT_STACK	*stack;	/* Stack desc. ass. with stack */
    cma_t_natural	size;		/* Size of big stack */
    cma_t_boolean	in_use;		/* Set if allocated */
    } cma___t_bigstack;

#if _CMA_PROTECT_MEMORY_
typedef struct CMA___T_INT_HOLE {
    cma__t_queue	link;		/* Link holes together */
    cma_t_boolean	protected;	/* Set when pages are protected */
    cma_t_address	first;		/* First protected byte */
    cma_t_address	last;		/* Last protected byte */
    } cma___t_int_hole;
#endif

typedef struct CMA__T_INT_STACK {
    cma__t_object	header;		/* Common header (sequence, type info */
    cma__t_int_attr	*attributes;	/* Backpointer to attr obj */
    cma___t_cluster	*cluster;	/* Stack's cluster */
    cma_t_address	stack_base;	/* base address of stack */
    cma_t_address	yellow_zone;	/* first address of yellow zone */
    cma_t_address	last_guard;	/* last address of guard pages */
    cma_t_natural	first_chunk;	/* First chunk allocated */
    cma_t_natural	chunk_count;	/* Count of chunks allocated */
    cma__t_int_tcb	*tcb;		/* TCB backpointer */
#if _CMA_PROTECT_MEMORY_
    cma___t_int_hole	hole;		/* Description of hole */
#endif
    } cma__t_int_stack;

/*
 *  GLOBAL DATA
 */

/*
 * INTERNAL INTERFACES
 */

#endif