hc
2024-11-01 2f529f9b558ca1c1bd74be7437a84e4711743404
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
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
/*
 * Copyright (C) 2011 Philippe Gerum <rpm@xenomai.org>.
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA.
 */
#ifndef _COPPERPLATE_INTERNAL_H
#define _COPPERPLATE_INTERNAL_H
 
#include <sys/types.h>
#include <stdarg.h>
#include <time.h>
#include <pthread.h>
#include <semaphore.h>
#include <xeno_config.h>
#include <boilerplate/list.h>
#include <boilerplate/ancillaries.h>
#include <boilerplate/limits.h>
#include <boilerplate/sched.h>
#include <boilerplate/setup.h>
#include <copperplate/heapobj.h>
#include <copperplate/tunables.h>
 
#ifdef CONFIG_XENO_PSHARED
 
#include <boilerplate/shavl.h>
 
#define SHEAPMEM_PAGE_SHIFT    9 /* 2^9 => 512 bytes */
#define SHEAPMEM_PAGE_SIZE    (1UL << SHEAPMEM_PAGE_SHIFT)
#define SHEAPMEM_PAGE_MASK    (~(SHEAPMEM_PAGE_SIZE - 1))
#define SHEAPMEM_MIN_LOG2    4 /* 16 bytes */
/*
 * Use bucketed memory for sizes between 2^SHEAPMEM_MIN_LOG2 and
 * 2^(SHEAPMEM_PAGE_SHIFT-1).
 */
#define SHEAPMEM_MAX        (SHEAPMEM_PAGE_SHIFT - SHEAPMEM_MIN_LOG2)
#define SHEAPMEM_MIN_ALIGN    (1U << SHEAPMEM_MIN_LOG2)
/* Max size of an extent (4Gb - SHEAPMEM_PAGE_SIZE). */
#define SHEAPMEM_MAX_EXTSZ    (4294967295U - SHEAPMEM_PAGE_SIZE + 1)
/* Bits we need for encoding a page # */
#define SHEAPMEM_PGENT_BITS      (32 - SHEAPMEM_PAGE_SHIFT)
 
/* Each page is represented by a page map entry. */
#define SHEAPMEM_PGMAP_BYTES    sizeof(struct sheapmem_pgentry)
 
struct sheapmem_pgentry {
   /* Linkage in bucket list. */
   unsigned int prev : SHEAPMEM_PGENT_BITS;
   unsigned int next : SHEAPMEM_PGENT_BITS;
   /*  page_list or log2. */
   unsigned int type : 6;
   /*
    * We hold either a spatial map of busy blocks within the page
    * for bucketed memory (up to 32 blocks per page), or the
    * overall size of the multi-page block if entry.type ==
    * page_list.
    */
   union {
       uint32_t map;
       uint32_t bsize;
   };
};
 
/*
 * A range descriptor is stored at the beginning of the first page of
 * a range of free pages. sheapmem_range.size is nrpages *
 * SHEAPMEM_PAGE_SIZE. Ranges are indexed by address and size in AVL
 * trees.
 */
struct sheapmem_range {
   struct shavlh addr_node;
   struct shavlh size_node;
   size_t size;
};
 
struct sheapmem_extent {
   struct holder next;
   memoff_t membase;    /* Base offset of page array */
   memoff_t memlim;    /* Offset limit of page array */
   struct shavl addr_tree;
   struct shavl size_tree;
   struct sheapmem_pgentry pagemap[0]; /* Start of page entries[] */
};
 
#define __SHEAPMEM_MAP_SIZE(__nrpages)                    \
   ((__nrpages) * SHEAPMEM_PGMAP_BYTES)
 
#define __SHEAPMEM_ARENA_SIZE(__size)                    \
   (__size +                            \
    __align_to(sizeof(struct sheapmem_extent) +            \
           __SHEAPMEM_MAP_SIZE((__size) >> SHEAPMEM_PAGE_SHIFT),    \
           SHEAPMEM_MIN_ALIGN))
 
/*
 * Calculate the minimal size of the memory arena needed to contain a
 * heap of __user_size bytes, including our meta data for managing it.
 * Usable at build time if __user_size is constant.
 */
#define SHEAPMEM_ARENA_SIZE(__user_size)                    \
   __SHEAPMEM_ARENA_SIZE(__align_to(__user_size, SHEAPMEM_PAGE_SIZE))
 
/*
 * The struct below has to live in shared memory; no direct reference
 * to process local memory in there.
 */
struct shared_heap_memory {
   char name[XNOBJECT_NAME_LEN];
   pthread_mutex_t lock;
   struct listobj extents;
   size_t arena_size;
   size_t usable_size;
   size_t used_size;
   /* Heads of page lists for log2-sized blocks. */
   uint32_t buckets[SHEAPMEM_MAX];
   struct sysgroup_memspec memspec;
};
 
ssize_t sheapmem_check(struct shared_heap_memory *heap, void *block);
 
#endif /* CONFIG_XENO_PSHARED */
 
#ifdef CONFIG_XENO_REGISTRY
#define DEFAULT_REGISTRY_ROOT        CONFIG_XENO_REGISTRY_ROOT
#else
#define DEFAULT_REGISTRY_ROOT        NULL
#endif
 
struct corethread_attributes {
   size_t stacksize;
   int detachstate;
   int policy;
   struct sched_param_ex param_ex;
   int (*prologue)(void *arg);
   void *(*run)(void *arg);
   void *arg;
   struct {
       int status;
       sem_t warm;
       sem_t *released;
   } __reserved;
};
 
#ifdef __cplusplus
extern "C" {
#endif
 
void copperplate_set_current_name(const char *name);
 
int copperplate_get_current_name(char *name, size_t maxlen);
 
int copperplate_kill_tid(pid_t tid, int sig);
 
int copperplate_probe_tid(pid_t tid);
  
int copperplate_create_thread(struct corethread_attributes *cta,
                 pthread_t *ptid);
 
int copperplate_renice_local_thread(pthread_t ptid, int policy,
                   const struct sched_param_ex *param_ex);
 
void copperplate_bootstrap_internal(const char *arg0,
                   char *mountpt, int regflags);
 
#ifdef __cplusplus
}
#endif
 
#endif /* _COPPERPLATE_INTERNAL_H */