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
|
/* ==== machdep.h ============================================================
* Copyright (c) 1993 Chris Provenzano, proven@athena.mit.edu
*
*/
#include <unistd.h>
#include <setjmp.h>
#include <sys/time.h>
/*
* Stuff for compiling
*/
#if defined(__GNUC__)
#if defined(__cplusplus)
#define __BEGIN_DECLS extern "C" {
#define __END_DECLS };
#else
#define __BEGIN_DECLS
#define __END_DECLS
#if !defined(__STDC__)
#define const __const
#define inline __inline
#define signed __signed
#define volatile __volatile
#endif
#endif
#else /* !__GNUC__ */
#define __BEGIN_DECLS
#define __END_DECLS
#if !defined(__STDC__)
#define const
#endif
#define inline
#define signed
#define volatile
#endif
/*
* The first machine dependent functions are the SEMAPHORES
* needing the test and set instruction.
*
* Note: The set and clear defines are backwards.
*/
#define SEMAPHORE_CLEAR { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, \
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, \
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }
#define SEMAPHORE_SET 0
#define SEMAPHORE_TEST_AND_SET(lock) \
({ \
long real_addr; \
long temp; \
\
real_addr = ((long)((*lock) + 15) & ~15); \
\
__asm__ volatile("ldcwx %%r0(%2),%0" \
:"=r" (temp) \
:"0" (temp),"r" (real_addr)); \
temp ? 0 : 1; \
})
#define SEMAPHORE_RESET(lock) \
({ \
char *real_addr; \
\
real_addr = (char*)((long)((*lock) + 15) & ~15); \
*real_addr = 0xff; \
})
/*
* New types
* The semaphore is really 16 bytes but must be aligened on a 16 byte
* boundary. By specifing 31 bytes the macros can frob it correctly.
*/
typedef char semaphore[31];
/*
* Macros for sigset_t
*/
#define SIGMAX 30
/* see hpux-9.03/__signal.h for SIG_ANY */
/*
* New Strutures
*/
struct machdep_pthread {
void *(*start_routine)(void *);
void *start_argument;
void *machdep_stack;
struct itimerval machdep_timer;
jmp_buf machdep_state;
/* long machdep_state[_JBLEN]; */
};
/*
* Static machdep_pthread initialization values.
* For initial thread only.
*/
#define MACHDEP_PTHREAD_INIT \
{ NULL, NULL, NULL, { { 0, 0 }, { 0, 100000 } }, 0 }
/*
* Minimum stack size
*/
#define PTHREAD_STACK_MIN 4096
/*
* Some fd flag defines that are necessary to distinguish between posix
* behavior and bsd4.3 behavior.
*/
#define __FD_NONBLOCK O_NONBLOCK
/*
* page size
*/
#define getpagesize() 4096
/*
* New functions
*/
__BEGIN_DECLS
#if defined(PTHREAD_KERNEL)
#define __machdep_stack_get(x) (x)->machdep_stack
#define __machdep_stack_set(x, y) (x)->machdep_stack = y
#define __machdep_stack_repl(x, y) \
{ \
if (stack = __machdep_stack_get(x)) { \
__machdep_stack_free(stack); \
} \
__machdep_stack_set(x, y); \
}
void * __machdep_stack_alloc __P_((size_t));
void __machdep_stack_free __P_((void *));
int machdep_save_state __P_((void));
#endif
__END_DECLS
|