Annotation of OpenXM_contrib2/asir2000/gc/gcconfig.h, Revision 1.2
1.1 noro 1: /*
2: * Copyright 1988, 1989 Hans-J. Boehm, Alan J. Demers
3: * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved.
4: * Copyright (c) 1996 by Silicon Graphics. All rights reserved.
5: *
6: * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
7: * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
8: *
9: * Permission is hereby granted to use or copy this program
10: * for any purpose, provided the above notices are retained on all copies.
11: * Permission to modify the code and to distribute modified code is granted,
12: * provided the above notices are retained, and a notice that the code was
13: * modified is included with the above copyright notice.
14: */
15:
16: #ifndef CONFIG_H
17:
18: # define CONFIG_H
19:
20: /* Machine dependent parameters. Some tuning parameters can be found */
21: /* near the top of gc_private.h. */
22:
23: /* Machine specific parts contributed by various people. See README file. */
24:
25: /* First a unified test for Linux: */
26: # if defined(linux) || defined(__linux__)
27: # define LINUX
28: # endif
29:
30: /* Determine the machine type: */
31: # if defined(sun) && defined(mc68000)
32: # define M68K
33: # define SUNOS4
34: # define mach_type_known
35: # endif
36: # if defined(hp9000s300)
37: # define M68K
38: # define HP
39: # define mach_type_known
40: # endif
41: # if defined(__OpenBSD__) && defined(m68k)
42: # define M68K
43: # define OPENBSD
44: # define mach_type_known
45: # endif
46: # if defined(__OpenBSD__) && defined(__sparc__)
47: # define SPARC
48: # define OPENBSD
49: # define mach_type_known
50: # endif
51: # if defined(__NetBSD__) && defined(m68k)
52: # define M68K
53: # define NETBSD
54: # define mach_type_known
55: # endif
1.2 ! noro 56: # if defined(__NetBSD__) && defined(arm32)
! 57: # define ARM32
! 58: # define NETBSD
! 59: # define mach_type_known
! 60: # endif
1.1 noro 61: # if defined(vax)
62: # define VAX
63: # ifdef ultrix
64: # define ULTRIX
65: # else
66: # define BSD
67: # endif
68: # define mach_type_known
69: # endif
70: # if defined(mips) || defined(__mips)
71: # define MIPS
72: # if defined(ultrix) || defined(__ultrix) || defined(__NetBSD__)
73: # define ULTRIX
74: # else
75: # if defined(_SYSTYPE_SVR4) || defined(SYSTYPE_SVR4) || defined(__SYSTYPE_SVR4__)
76: # define IRIX5 /* or IRIX 6.X */
77: # else
78: # define RISCOS /* or IRIX 4.X */
79: # endif
80: # endif
81: # define mach_type_known
82: # endif
83: # if defined(sequent) && defined(i386)
84: # define I386
85: # define SEQUENT
86: # define mach_type_known
87: # endif
88: # if defined(sun) && defined(i386)
89: # define I386
90: # define SUNOS5
91: # define mach_type_known
92: # endif
93: # if (defined(__OS2__) || defined(__EMX__)) && defined(__32BIT__)
94: # define I386
95: # define OS2
96: # define mach_type_known
97: # endif
98: # if defined(ibm032)
99: # define RT
100: # define mach_type_known
101: # endif
102: # if defined(sun) && (defined(sparc) || defined(__sparc))
103: # define SPARC
104: /* Test for SunOS 5.x */
105: # include <errno.h>
106: # ifdef ECHRNG
107: # define SUNOS5
108: # else
109: # define SUNOS4
110: # endif
111: # define mach_type_known
112: # endif
113: # if defined(sparc) && defined(unix) && !defined(sun) && !defined(linux) \
114: && !defined(__OpenBSD__)
115: # define SPARC
116: # define DRSNX
117: # define mach_type_known
118: # endif
119: # if defined(_IBMR2)
120: # define RS6000
121: # define mach_type_known
122: # endif
123: # if defined(_M_XENIX) && defined(_M_SYSV) && defined(_M_I386)
124: /* The above test may need refinement */
125: # define I386
126: # if defined(_SCO_ELF)
127: # define SCO_ELF
128: # else
129: # define SCO
130: # endif
131: # define mach_type_known
132: # endif
133: # if defined(_AUX_SOURCE)
134: # define M68K
135: # define SYSV
136: # define mach_type_known
137: # endif
1.2 ! noro 138: # if defined(_PA_RISC1_0) || defined(_PA_RISC1_1) || defined(_PA_RISC2_0) \
1.1 noro 139: || defined(hppa) || defined(__hppa__)
140: # define HP_PA
1.2 ! noro 141: # ifndef LINUX
! 142: # define HPUX
! 143: # endif
1.1 noro 144: # define mach_type_known
145: # endif
146: # if defined(LINUX) && (defined(i386) || defined(__i386__))
147: # define I386
148: # define mach_type_known
149: # endif
1.2 ! noro 150: # if defined(LINUX) && (defined(__ia64__) || defined(__ia64))
! 151: # define IA64
! 152: # define mach_type_known
! 153: # endif
1.1 noro 154: # if defined(LINUX) && defined(powerpc)
155: # define POWERPC
156: # define mach_type_known
157: # endif
158: # if defined(LINUX) && defined(__mc68000__)
159: # define M68K
160: # define mach_type_known
161: # endif
1.2 ! noro 162: # if defined(LINUX) && defined(sparc)
1.1 noro 163: # define SPARC
164: # define mach_type_known
165: # endif
166: # if defined(__alpha) || defined(__alpha__)
167: # define ALPHA
168: # if !defined(LINUX)
169: # define OSF1 /* a.k.a Digital Unix */
170: # endif
171: # define mach_type_known
172: # endif
173: # if defined(_AMIGA) && !defined(AMIGA)
174: # define AMIGA
175: # endif
176: # ifdef AMIGA
177: # define M68K
178: # define mach_type_known
179: # endif
180: # if defined(THINK_C) || defined(__MWERKS__) && !defined(__powerc)
181: # define M68K
182: # define MACOS
183: # define mach_type_known
184: # endif
185: # if defined(__MWERKS__) && defined(__powerc)
186: # define POWERPC
187: # define MACOS
188: # define mach_type_known
189: # endif
190: # if defined(macosx)
191: # define MACOSX
192: # define POWERPC
193: # define mach_type_known
194: # endif
195: # if defined(NeXT) && defined(mc68000)
196: # define M68K
197: # define NEXT
198: # define mach_type_known
199: # endif
200: # if defined(NeXT) && defined(i386)
201: # define I386
202: # define NEXT
203: # define mach_type_known
204: # endif
205: # if defined(__OpenBSD__) && defined(i386)
206: # define I386
207: # define OPENBSD
208: # define mach_type_known
209: # endif
210: # if defined(__FreeBSD__) && defined(i386)
211: # define I386
212: # define FREEBSD
213: # define mach_type_known
214: # endif
215: # if defined(__NetBSD__) && defined(i386)
216: # define I386
217: # define NETBSD
218: # define mach_type_known
219: # endif
220: # if defined(bsdi) && defined(i386)
221: # define I386
222: # define BSDI
223: # define mach_type_known
224: # endif
225: # if !defined(mach_type_known) && defined(__386BSD__)
226: # define I386
227: # define THREE86BSD
228: # define mach_type_known
229: # endif
230: # if defined(_CX_UX) && defined(_M88K)
231: # define M88K
232: # define CX_UX
233: # define mach_type_known
234: # endif
235: # if defined(DGUX)
236: # define M88K
237: /* DGUX defined */
238: # define mach_type_known
239: # endif
240: # if (defined(_MSDOS) || defined(_MSC_VER)) && (_M_IX86 >= 300) \
241: || defined(_WIN32) && !defined(__CYGWIN32__) && !defined(__CYGWIN__)
242: # define I386
243: # define MSWIN32 /* or Win32s */
244: # define mach_type_known
245: # endif
246: # if defined(__DJGPP__)
247: # define I386
248: # ifndef DJGPP
249: # define DJGPP /* MSDOS running the DJGPP port of GCC */
250: # endif
251: # define mach_type_known
252: # endif
253: # if defined(__CYGWIN32__) || defined(__CYGWIN__)
254: # define I386
255: # define CYGWIN32
256: # define mach_type_known
257: # endif
258: # if defined(__BORLANDC__)
259: # define I386
260: # define MSWIN32
261: # define mach_type_known
262: # endif
263: # if defined(_UTS) && !defined(mach_type_known)
264: # define S370
265: # define UTS4
266: # define mach_type_known
267: # endif
1.2 ! noro 268: # if defined(__pj__)
! 269: # define PJ
! 270: # define mach_type_known
! 271: # endif
1.1 noro 272: /* Ivan Demakov */
273: # if defined(__WATCOMC__) && defined(__386__)
274: # define I386
275: # if !defined(OS2) && !defined(MSWIN32) && !defined(DOS4GW)
276: # if defined(__OS2__)
277: # define OS2
278: # else
279: # if defined(__WINDOWS_386__) || defined(__NT__)
280: # define MSWIN32
281: # else
282: # define DOS4GW
283: # endif
284: # endif
285: # endif
286: # define mach_type_known
287: # endif
288:
289: /* Feel free to add more clauses here */
290:
291: /* Or manually define the machine type here. A machine type is */
292: /* characterized by the architecture. Some */
293: /* machine types are further subdivided by OS. */
294: /* the macros ULTRIX, RISCOS, and BSD to distinguish. */
295: /* Note that SGI IRIX is treated identically to RISCOS. */
296: /* SYSV on an M68K actually means A/UX. */
297: /* The distinction in these cases is usually the stack starting address */
298: # ifndef mach_type_known
299: --> unknown machine type
300: # endif
301: /* Mapping is: M68K ==> Motorola 680X0 */
302: /* (SUNOS4,HP,NEXT, and SYSV (A/UX), */
303: /* MACOS and AMIGA variants) */
304: /* I386 ==> Intel 386 */
305: /* (SEQUENT, OS2, SCO, LINUX, NETBSD, */
306: /* FREEBSD, THREE86BSD, MSWIN32, */
307: /* BSDI,SUNOS5, NEXT, other variants) */
308: /* NS32K ==> Encore Multimax */
309: /* MIPS ==> R2000 or R3000 */
310: /* (RISCOS, ULTRIX variants) */
311: /* VAX ==> DEC VAX */
312: /* (BSD, ULTRIX variants) */
313: /* RS6000 ==> IBM RS/6000 AIX3.X */
314: /* RT ==> IBM PC/RT */
315: /* HP_PA ==> HP9000/700 & /800 */
316: /* HP/UX */
317: /* SPARC ==> SPARC under SunOS */
318: /* (SUNOS4, SUNOS5, */
319: /* DRSNX variants) */
320: /* ALPHA ==> DEC Alpha */
321: /* (OSF1 and LINUX variants) */
322: /* M88K ==> Motorola 88XX0 */
323: /* (CX_UX and DGUX) */
324: /* S370 ==> 370-like machine */
325: /* running Amdahl UTS4 */
326:
327:
328: /*
329: * For each architecture and OS, the following need to be defined:
330: *
331: * CPP_WORD_SZ is a simple integer constant representing the word size.
332: * in bits. We assume byte addressibility, where a byte has 8 bits.
333: * We also assume CPP_WORD_SZ is either 32 or 64.
334: * (We care about the length of pointers, not hardware
335: * bus widths. Thus a 64 bit processor with a C compiler that uses
336: * 32 bit pointers should use CPP_WORD_SZ of 32, not 64. Default is 32.)
337: *
338: * MACH_TYPE is a string representation of the machine type.
339: * OS_TYPE is analogous for the OS.
340: *
341: * ALIGNMENT is the largest N, such that
342: * all pointer are guaranteed to be aligned on N byte boundaries.
343: * defining it to be 1 will always work, but perform poorly.
344: *
345: * DATASTART is the beginning of the data segment.
346: * On UNIX systems, the collector will scan the area between DATASTART
347: * and DATAEND for root pointers.
348: *
349: * DATAEND, if not &end.
350: *
351: * ALIGN_DOUBLE of GC_malloc should return blocks aligned to twice
352: * the pointer size.
353: *
354: * STACKBOTTOM is the cool end of the stack, which is usually the
355: * highest address in the stack.
356: * Under PCR or OS/2, we have other ways of finding thread stacks.
357: * For each machine, the following should:
358: * 1) define STACK_GROWS_UP if the stack grows toward higher addresses, and
359: * 2) define exactly one of
360: * STACKBOTTOM (should be defined to be an expression)
361: * HEURISTIC1
362: * HEURISTIC2
363: * If either of the last two macros are defined, then STACKBOTTOM is computed
364: * during collector startup using one of the following two heuristics:
365: * HEURISTIC1: Take an address inside GC_init's frame, and round it up to
366: * the next multiple of STACK_GRAN.
367: * HEURISTIC2: Take an address inside GC_init's frame, increment it repeatedly
368: * in small steps (decrement if STACK_GROWS_UP), and read the value
369: * at each location. Remember the value when the first
370: * Segmentation violation or Bus error is signalled. Round that
371: * to the nearest plausible page boundary, and use that instead
372: * of STACKBOTTOM.
373: *
374: * If no expression for STACKBOTTOM can be found, and neither of the above
375: * heuristics are usable, the collector can still be used with all of the above
376: * undefined, provided one of the following is done:
377: * 1) GC_mark_roots can be changed to somehow mark from the correct stack(s)
378: * without reference to STACKBOTTOM. This is appropriate for use in
379: * conjunction with thread packages, since there will be multiple stacks.
380: * (Allocating thread stacks in the heap, and treating them as ordinary
381: * heap data objects is also possible as a last resort. However, this is
382: * likely to introduce significant amounts of excess storage retention
383: * unless the dead parts of the thread stacks are periodically cleared.)
384: * 2) Client code may set GC_stackbottom before calling any GC_ routines.
385: * If the author of the client code controls the main program, this is
386: * easily accomplished by introducing a new main program, setting
387: * GC_stackbottom to the address of a local variable, and then calling
388: * the original main program. The new main program would read something
389: * like:
390: *
391: * # include "gc_private.h"
392: *
393: * main(argc, argv, envp)
394: * int argc;
395: * char **argv, **envp;
396: * {
397: * int dummy;
398: *
399: * GC_stackbottom = (ptr_t)(&dummy);
400: * return(real_main(argc, argv, envp));
401: * }
402: *
403: *
404: * Each architecture may also define the style of virtual dirty bit
405: * implementation to be used:
406: * MPROTECT_VDB: Write protect the heap and catch faults.
407: * PROC_VDB: Use the SVR4 /proc primitives to read dirty bits.
408: *
409: * An architecture may define DYNAMIC_LOADING if dynamic_load.c
410: * defined GC_register_dynamic_libraries() for the architecture.
411: */
412:
413:
414: # define STACK_GRAN 0x1000000
415: # ifdef M68K
416: # define MACH_TYPE "M68K"
417: # define ALIGNMENT 2
418: # ifdef OPENBSD
419: # define OS_TYPE "OPENBSD"
420: # define HEURISTIC2
421: extern char etext;
422: # define DATASTART ((ptr_t)(&etext))
423: # endif
424: # ifdef NETBSD
425: # define OS_TYPE "NETBSD"
426: # define HEURISTIC2
427: extern char etext;
428: # define DATASTART ((ptr_t)(&etext))
429: # endif
430: # ifdef LINUX
431: # define OS_TYPE "LINUX"
432: # define STACKBOTTOM ((ptr_t)0xf0000000)
433: # define MPROTECT_VDB
434: # ifdef __ELF__
435: # define DYNAMIC_LOADING
436: extern char **__environ;
437: # define DATASTART ((ptr_t)(&__environ))
438: /* hideous kludge: __environ is the first */
439: /* word in crt0.o, and delimits the start */
440: /* of the data segment, no matter which */
441: /* ld options were passed through. */
442: /* We could use _etext instead, but that */
443: /* would include .rodata, which may */
444: /* contain large read-only data tables */
445: /* that we'd rather not scan. */
446: extern int _end;
447: # define DATAEND (&_end)
448: # else
449: extern int etext;
450: # define DATASTART ((ptr_t)((((word) (&etext)) + 0xfff) & ~0xfff))
451: # endif
452: # endif
453: # ifdef SUNOS4
454: # define OS_TYPE "SUNOS4"
455: extern char etext;
456: # define DATASTART ((ptr_t)((((word) (&etext)) + 0x1ffff) & ~0x1ffff))
457: # define HEURISTIC1 /* differs */
458: # define DYNAMIC_LOADING
459: # endif
460: # ifdef HP
461: # define OS_TYPE "HP"
462: extern char etext;
463: # define DATASTART ((ptr_t)((((word) (&etext)) + 0xfff) & ~0xfff))
464: # define STACKBOTTOM ((ptr_t) 0xffeffffc)
465: /* empirically determined. seems to work. */
466: # include <unistd.h>
467: # define GETPAGESIZE() sysconf(_SC_PAGE_SIZE)
468: # endif
469: # ifdef SYSV
470: # define OS_TYPE "SYSV"
471: extern etext;
472: # define DATASTART ((ptr_t)((((word) (&etext)) + 0x3fffff) \
473: & ~0x3fffff) \
474: +((word)&etext & 0x1fff))
475: /* This only works for shared-text binaries with magic number 0413.
476: The other sorts of SysV binaries put the data at the end of the text,
477: in which case the default of &etext would work. Unfortunately,
478: handling both would require having the magic-number available.
479: -- Parag
480: */
481: # define STACKBOTTOM ((ptr_t)0xFFFFFFFE)
482: /* The stack starts at the top of memory, but */
483: /* 0x0 cannot be used as setjump_test complains */
484: /* that the stack direction is incorrect. Two */
485: /* bytes down from 0x0 should be safe enough. */
486: /* --Parag */
487: # include <sys/mmu.h>
488: # define GETPAGESIZE() PAGESIZE /* Is this still right? */
489: # endif
490: # ifdef AMIGA
491: # define OS_TYPE "AMIGA"
492: /* STACKBOTTOM and DATASTART handled specially */
493: /* in os_dep.c */
494: # define DATAEND /* not needed */
495: # define GETPAGESIZE() 4096
496: # endif
497: # ifdef MACOS
498: # ifndef __LOWMEM__
499: # include <LowMem.h>
500: # endif
501: # define OS_TYPE "MACOS"
502: /* see os_dep.c for details of global data segments. */
503: # define STACKBOTTOM ((ptr_t) LMGetCurStackBase())
504: # define DATAEND /* not needed */
505: # define GETPAGESIZE() 4096
506: # endif
507: # ifdef NEXT
508: # define OS_TYPE "NEXT"
509: # define DATASTART ((ptr_t) get_etext())
510: # define STACKBOTTOM ((ptr_t) 0x4000000)
511: # define DATAEND /* not needed */
512: # endif
513: # endif
514:
515: # ifdef POWERPC
516: # define MACH_TYPE "POWERPC"
517: # ifdef MACOS
518: # define ALIGNMENT 2 /* Still necessary? Could it be 4? */
519: # ifndef __LOWMEM__
520: # include <LowMem.h>
521: # endif
522: # define OS_TYPE "MACOS"
523: /* see os_dep.c for details of global data segments. */
524: # define STACKBOTTOM ((ptr_t) LMGetCurStackBase())
525: # define DATAEND /* not needed */
526: # endif
527: # ifdef LINUX
528: # define ALIGNMENT 4 /* Guess. Can someone verify? */
529: /* This was 2, but that didn't sound right. */
530: # define OS_TYPE "LINUX"
531: # define HEURISTIC1
532: # undef STACK_GRAN
533: # define STACK_GRAN 0x10000000
534: /* Stack usually starts at 0x80000000 */
535: # define DATASTART GC_data_start
1.2 ! noro 536: /* Others have reported better success with */
! 537: /* extern int __data_start; */
! 538: /*# define DATASTART (&__data_start) */
! 539: /* and disabling the GC_data_start */
! 540: /* initialization code. */
1.1 noro 541: extern int _end;
542: # define DATAEND (&_end)
543: # endif
544: # ifdef MACOSX
545: # define ALIGNMENT 4
546: # define OS_TYPE "MACOSX"
547: # define DATASTART ((ptr_t) get_etext())
548: # define STACKBOTTOM ((ptr_t) 0xc0000000)
549: # define DATAEND /* not needed */
550: # endif
551: # endif
552:
553: # ifdef VAX
554: # define MACH_TYPE "VAX"
555: # define ALIGNMENT 4 /* Pointers are longword aligned by 4.2 C compiler */
556: extern char etext;
557: # define DATASTART ((ptr_t)(&etext))
558: # ifdef BSD
559: # define OS_TYPE "BSD"
560: # define HEURISTIC1
561: /* HEURISTIC2 may be OK, but it's hard to test. */
562: # endif
563: # ifdef ULTRIX
564: # define OS_TYPE "ULTRIX"
565: # define STACKBOTTOM ((ptr_t) 0x7fffc800)
566: # endif
567: # endif
568:
569: # ifdef RT
570: # define MACH_TYPE "RT"
571: # define ALIGNMENT 4
572: # define DATASTART ((ptr_t) 0x10000000)
573: # define STACKBOTTOM ((ptr_t) 0x1fffd800)
574: # endif
575:
576: # ifdef SPARC
577: # define MACH_TYPE "SPARC"
578: # define ALIGNMENT 4 /* Required by hardware */
579: # define ALIGN_DOUBLE
580: extern int etext;
581: # ifdef SUNOS5
582: # define OS_TYPE "SUNOS5"
583: extern int _etext;
584: extern int _end;
585: extern char * GC_SysVGetDataStart();
586: # define DATASTART (ptr_t)GC_SysVGetDataStart(0x10000, &_etext)
587: # define DATAEND (&_end)
588: # ifndef USE_MMAP
589: # define USE_MMAP
590: # endif
591: # ifdef USE_MMAP
592: # define HEAP_START (ptr_t)0x40000000
593: # else
594: # define HEAP_START DATAEND
595: # endif
596: # define PROC_VDB
597: /* HEURISTIC1 reportedly no longer works under 2.7. Thus we */
598: /* switched to HEURISTIC2, eventhough it creates some debugging */
599: /* issues. */
600: #if MPI
601: extern int *StackBottom;
602: # define STACKBOTTOM (ptr_t)(StackBottom)
603: #else
604: # define HEURISTIC2
605: #endif
606: # include <unistd.h>
607: # define GETPAGESIZE() sysconf(_SC_PAGESIZE)
608: /* getpagesize() appeared to be missing from at least one */
609: /* Solaris 5.4 installation. Weird. */
610: # define DYNAMIC_LOADING
611: # endif
612: # ifdef SUNOS4
613: # define OS_TYPE "SUNOS4"
614: /* [If you have a weak stomach, don't read this.] */
615: /* We would like to use: */
616: /* # define DATASTART ((ptr_t)((((word) (&etext)) + 0x1fff) & ~0x1fff)) */
617: /* This fails occasionally, due to an ancient, but very */
618: /* persistent ld bug. &etext is set 32 bytes too high. */
619: /* We instead read the text segment size from the a.out */
620: /* header, which happens to be mapped into our address space */
621: /* at the start of the text segment. The detective work here */
622: /* was done by Robert Ehrlich, Manuel Serrano, and Bernard */
623: /* Serpette of INRIA. */
624: /* This assumes ZMAGIC, i.e. demand-loadable executables. */
625: # define TEXTSTART 0x2000
626: # define DATASTART ((ptr_t)(*(int *)(TEXTSTART+0x4)+TEXTSTART))
627: # define MPROTECT_VDB
628: # define HEURISTIC1
629: # define DYNAMIC_LOADING
630: # endif
631: # ifdef DRSNX
632: # define CPP_WORDSZ 32
633: # define OS_TYPE "DRSNX"
634: extern char * GC_SysVGetDataStart();
635: extern int etext;
636: # define DATASTART (ptr_t)GC_SysVGetDataStart(0x10000, &etext)
637: # define MPROTECT_VDB
638: # define STACKBOTTOM ((ptr_t) 0xdfff0000)
639: # define DYNAMIC_LOADING
640: # endif
641: # ifdef LINUX
642: # define OS_TYPE "LINUX"
643: # ifdef __ELF__
644: # define DATASTART GC_data_start
645: # define DYNAMIC_LOADING
646: # else
647: Linux Sparc non elf ?
648: # endif
649: extern int _end;
650: # define DATAEND (&_end)
651: # define SVR4
652: # define STACKBOTTOM ((ptr_t) 0xf0000000)
653: # endif
654: # ifdef OPENBSD
655: # define OS_TYPE "OPENBSD"
656: # define STACKBOTTOM ((ptr_t) 0xf8000000)
657: # define DATASTART ((ptr_t)(&etext))
658: # endif
659: # endif
660:
661: # ifdef I386
662: # define MACH_TYPE "I386"
663: # define ALIGNMENT 4 /* Appears to hold for all "32 bit" compilers */
664: /* except Borland. The -a4 option fixes */
665: /* Borland. */
666: /* Ivan Demakov: For Watcom the option is -zp4. */
667: # ifndef SMALL_CONFIG
668: # define ALIGN_DOUBLE /* Not strictly necessary, but may give speed */
669: /* improvement on Pentiums. */
670: # endif
671: # ifdef SEQUENT
672: # define OS_TYPE "SEQUENT"
673: extern int etext;
674: # define DATASTART ((ptr_t)((((word) (&etext)) + 0xfff) & ~0xfff))
675: # define STACKBOTTOM ((ptr_t) 0x3ffff000)
676: # endif
677: # ifdef SUNOS5
678: # define OS_TYPE "SUNOS5"
679: extern int etext, _start;
680: extern char * GC_SysVGetDataStart();
681: # define DATASTART GC_SysVGetDataStart(0x1000, &etext)
682: # define STACKBOTTOM ((ptr_t)(&_start))
683: /** At least in Solaris 2.5, PROC_VDB gives wrong values for dirty bits. */
684: /*# define PROC_VDB*/
685: # define DYNAMIC_LOADING
686: # ifndef USE_MMAP
687: # define USE_MMAP
688: # endif
689: # ifdef USE_MMAP
690: # define HEAP_START (ptr_t)0x40000000
691: # else
692: # define HEAP_START DATAEND
693: # endif
694: # endif
695: # ifdef SCO
696: # define OS_TYPE "SCO"
697: extern int etext;
698: # define DATASTART ((ptr_t)((((word) (&etext)) + 0x3fffff) \
699: & ~0x3fffff) \
700: +((word)&etext & 0xfff))
701: # define STACKBOTTOM ((ptr_t) 0x7ffffffc)
702: # endif
703: # ifdef SCO_ELF
704: # define OS_TYPE "SCO_ELF"
705: extern int etext;
706: # define DATASTART ((ptr_t)(&etext))
707: # define STACKBOTTOM ((ptr_t) 0x08048000)
708: # define DYNAMIC_LOADING
709: # define ELF_CLASS ELFCLASS32
710: # endif
711: # ifdef LINUX
712: # define OS_TYPE "LINUX"
1.2 ! noro 713: # define HEURISTIC1
! 714: # undef STACK_GRAN
! 715: # define STACK_GRAN 0x10000000
! 716: /* STACKBOTTOM is usually 0xc0000000, but this changes with */
! 717: /* different kernel configurations. In particular, systems */
! 718: /* with 2GB physical memory will usually move the user */
! 719: /* address space limit, and hence initial SP to 0x80000000. */
1.1 noro 720: # if !defined(LINUX_THREADS) || !defined(REDIRECT_MALLOC)
721: # define MPROTECT_VDB
722: # else
723: /* We seem to get random errors in incremental mode, */
724: /* possibly because Linux threads is itself a malloc client */
725: /* and can't deal with the signals. */
726: # endif
727: # ifdef __ELF__
728: # define DYNAMIC_LOADING
729: # ifdef UNDEFINED /* includes ro data */
730: extern int _etext;
731: # define DATASTART ((ptr_t)((((word) (&_etext)) + 0xfff) & ~0xfff))
732: # endif
733: # include <features.h>
734: # if defined(__GLIBC__) && __GLIBC__ >= 2
735: extern int __data_start;
736: # define DATASTART ((ptr_t)(&__data_start))
737: # else
738: extern char **__environ;
739: # define DATASTART ((ptr_t)(&__environ))
740: /* hideous kludge: __environ is the first */
741: /* word in crt0.o, and delimits the start */
742: /* of the data segment, no matter which */
743: /* ld options were passed through. */
744: /* We could use _etext instead, but that */
745: /* would include .rodata, which may */
746: /* contain large read-only data tables */
747: /* that we'd rather not scan. */
748: # endif
749: extern int _end;
750: # define DATAEND (&_end)
751: # else
752: extern int etext;
753: # define DATASTART ((ptr_t)((((word) (&etext)) + 0xfff) & ~0xfff))
754: # endif
755: # endif
756: # ifdef CYGWIN32
757: # define OS_TYPE "CYGWIN32"
758: extern int _data_start__;
759: extern int _data_end__;
760: extern int _bss_start__;
761: extern int _bss_end__;
762: /* For binutils 2.9.1, we have */
763: /* DATASTART = _data_start__ */
764: /* DATAEND = _bss_end__ */
765: /* whereas for some earlier versions it was */
766: /* DATASTART = _bss_start__ */
767: /* DATAEND = _data_end__ */
768: /* To get it right for both, we take the */
769: /* minumum/maximum of the two. */
770: # define MAX(x,y) ((x) > (y) ? (x) : (y))
771: # define MIN(x,y) ((x) < (y) ? (x) : (y))
772: # define DATASTART ((ptr_t) MIN(&_data_start__, &_bss_start__))
773: # define DATAEND ((ptr_t) MAX(&_data_end__, &_bss_end__))
774: # undef STACK_GRAN
775: # define STACK_GRAN 0x10000
776: # define HEURISTIC1
777: # endif
778: # ifdef OS2
779: # define OS_TYPE "OS2"
780: /* STACKBOTTOM and DATASTART are handled specially in */
781: /* os_dep.c. OS2 actually has the right */
782: /* system call! */
783: # define DATAEND /* not needed */
784: # endif
785: # ifdef MSWIN32
786: # define OS_TYPE "MSWIN32"
787: /* STACKBOTTOM and DATASTART are handled specially in */
788: /* os_dep.c. */
789: # ifndef __WATCOMC__
790: # define MPROTECT_VDB
791: # endif
792: # define DATAEND /* not needed */
793: # endif
794: # ifdef DJGPP
795: # define OS_TYPE "DJGPP"
796: # include "stubinfo.h"
797: extern int etext;
798: extern int _stklen;
799: extern int __djgpp_stack_limit;
800: # define DATASTART ((ptr_t)((((word) (&etext)) + 0x1ff) & ~0x1ff))
801: /* # define STACKBOTTOM ((ptr_t)((word) _stubinfo + _stubinfo->size \
802: + _stklen)) */
803: # define STACKBOTTOM ((ptr_t)((word) __djgpp_stack_limit + _stklen))
804: /* This may not be right. */
805: # endif
806: # ifdef OPENBSD
807: # define OS_TYPE "OPENBSD"
808: # endif
809: # ifdef FREEBSD
810: # define OS_TYPE "FREEBSD"
811: # define MPROTECT_VDB
812: # endif
813: # ifdef NETBSD
814: # define OS_TYPE "NETBSD"
815: # endif
816: # ifdef THREE86BSD
817: # define OS_TYPE "THREE86BSD"
818: # endif
819: # ifdef BSDI
820: # define OS_TYPE "BSDI"
821: # endif
822: # if defined(OPENBSD) || defined(FREEBSD) || defined(NETBSD) \
823: || defined(THREE86BSD) || defined(BSDI)
824: # define HEURISTIC2
825: extern char etext;
826: # define DATASTART ((ptr_t)(&etext))
827: # endif
828: # ifdef NEXT
829: # define OS_TYPE "NEXT"
830: # define DATASTART ((ptr_t) get_etext())
831: # define STACKBOTTOM ((ptr_t)0xc0000000)
832: # define DATAEND /* not needed */
833: # endif
834: # ifdef DOS4GW
835: # define OS_TYPE "DOS4GW"
836: extern long __nullarea;
837: extern char _end;
838: extern char *_STACKTOP;
839: /* Depending on calling conventions Watcom C either precedes
840: or does not precedes with undescore names of C-variables.
841: Make sure startup code variables always have the same names. */
842: #pragma aux __nullarea "*";
843: #pragma aux _end "*";
844: # define STACKBOTTOM ((ptr_t) _STACKTOP)
845: /* confused? me too. */
846: # define DATASTART ((ptr_t) &__nullarea)
847: # define DATAEND ((ptr_t) &_end)
848: # endif
849: # endif
850:
851: # ifdef NS32K
852: # define MACH_TYPE "NS32K"
853: # define ALIGNMENT 4
854: extern char **environ;
855: # define DATASTART ((ptr_t)(&environ))
856: /* hideous kludge: environ is the first */
857: /* word in crt0.o, and delimits the start */
858: /* of the data segment, no matter which */
859: /* ld options were passed through. */
860: # define STACKBOTTOM ((ptr_t) 0xfffff000) /* for Encore */
861: # endif
862:
863: # ifdef MIPS
864: # define MACH_TYPE "MIPS"
865: # ifndef IRIX5
866: # define DATASTART (ptr_t)0x10000000
867: /* Could probably be slightly higher since */
868: /* startup code allocates lots of stuff. */
869: # else
870: extern int _fdata;
871: # define DATASTART ((ptr_t)(&_fdata))
872: # ifdef USE_MMAP
873: # define HEAP_START (ptr_t)0x30000000
874: # else
875: # define HEAP_START DATASTART
876: # endif
877: /* Lowest plausible heap address. */
878: /* In the MMAP case, we map there. */
879: /* In either case it is used to identify */
880: /* heap sections so they're not */
881: /* considered as roots. */
882: # endif /* IRIX5 */
883: # define HEURISTIC2
884: /* # define STACKBOTTOM ((ptr_t)0x7fff8000) sometimes also works. */
885: # ifdef ULTRIX
886: # define OS_TYPE "ULTRIX"
887: # define ALIGNMENT 4
888: # endif
889: # ifdef RISCOS
890: # define OS_TYPE "RISCOS"
891: # define ALIGNMENT 4 /* Required by hardware */
892: # endif
893: # ifdef IRIX5
894: # define OS_TYPE "IRIX5"
895: # define MPROTECT_VDB
896: # ifdef _MIPS_SZPTR
897: # define CPP_WORDSZ _MIPS_SZPTR
898: # define ALIGNMENT (_MIPS_SZPTR/8)
899: # if CPP_WORDSZ != 64
900: # define ALIGN_DOUBLE
901: # endif
902: # else
903: # define ALIGNMENT 4
904: # define ALIGN_DOUBLE
905: # endif
906: # define DYNAMIC_LOADING
907: # endif
908: # endif
909:
910: # ifdef RS6000
911: # define MACH_TYPE "RS6000"
912: # define ALIGNMENT 4
913: # define DATASTART ((ptr_t)0x20000000)
914: extern int errno;
915: # define STACKBOTTOM ((ptr_t)((ulong)&errno))
916: # define DYNAMIC_LOADING
917: /* For really old versions of AIX, this may have to be removed. */
918: # endif
919:
920: # ifdef HP_PA
1.2 ! noro 921: /* OS is assumed to be HP/UX */
1.1 noro 922: # define MACH_TYPE "HP_PA"
1.2 ! noro 923: # define OS_TYPE "HPUX"
! 924: # ifdef __LP64__
! 925: # define CPP_WORDSZ 64
! 926: # define ALIGNMENT 8
! 927: # else
! 928: # define CPP_WORDSZ 32
! 929: # define ALIGNMENT 4
! 930: # define ALIGN_DOUBLE
! 931: # endif
1.1 noro 932: extern int __data_start;
933: # define DATASTART ((ptr_t)(&__data_start))
934: # if 0
935: /* The following appears to work for 7xx systems running HP/UX */
936: /* 9.xx Furthermore, it might result in much faster */
937: /* collections than HEURISTIC2, which may involve scanning */
938: /* segments that directly precede the stack. It is not the */
939: /* default, since it may not work on older machine/OS */
940: /* combinations. (Thanks to Raymond X.T. Nijssen for uncovering */
941: /* this.) */
942: # define STACKBOTTOM ((ptr_t) 0x7b033000) /* from /etc/conf/h/param.h */
943: # else
944: # define HEURISTIC2
945: # endif
946: # define STACK_GROWS_UP
947: # define DYNAMIC_LOADING
1.2 ! noro 948: # ifndef HPUX_THREADS
! 949: # define MPROTECT_VDB
! 950: # endif
1.1 noro 951: # include <unistd.h>
952: # define GETPAGESIZE() sysconf(_SC_PAGE_SIZE)
953: /* They misspelled the Posix macro? */
954: # endif
955:
956: # ifdef ALPHA
957: # define MACH_TYPE "ALPHA"
958: # define ALIGNMENT 8
959: # ifdef OSF1
960: # define OS_TYPE "OSF1"
961: # define DATASTART ((ptr_t) 0x140000000)
962: extern _end;
963: # define DATAEND ((ptr_t) &_end)
964: # define HEURISTIC2
965: /* Normally HEURISTIC2 is too conervative, since */
966: /* the text segment immediately follows the stack. */
967: /* Hence we give an upper pound. */
968: extern int __start;
969: # define HEURISTIC2_LIMIT ((ptr_t)((word)(&__start) & ~(getpagesize()-1)))
970: # define CPP_WORDSZ 64
971: # define MPROTECT_VDB
972: # define DYNAMIC_LOADING
973: # endif
974: # ifdef LINUX
975: # define OS_TYPE "LINUX"
976: # define CPP_WORDSZ 64
977: # define STACKBOTTOM ((ptr_t) 0x120000000)
978: # ifdef __ELF__
979: # if 0
980: /* __data_start apparently disappeared in some recent releases. */
981: extern int __data_start;
982: # define DATASTART &__data_start
983: # endif
984: # define DATASTART GC_data_start
985: # define DYNAMIC_LOADING
986: # else
987: # define DATASTART ((ptr_t) 0x140000000)
988: # endif
989: extern int _end;
990: # define DATAEND (&_end)
991: # define MPROTECT_VDB
992: /* Has only been superficially tested. May not */
993: /* work on all versions. */
994: # endif
995: # endif
996:
1.2 ! noro 997: # ifdef IA64
! 998: # define MACH_TYPE "IA64"
! 999: # define ALIGN_DOUBLE
! 1000: /* Requires 16 byte alignment for malloc */
! 1001: # define ALIGNMENT 8
! 1002: # ifdef HPUX
! 1003: --> needs work
! 1004: # endif
! 1005: # ifdef LINUX
! 1006: # define OS_TYPE "LINUX"
! 1007: # define CPP_WORDSZ 64
! 1008: /* This should really be done through /proc, but that */
! 1009: /* requires we run on an IA64 kernel. */
! 1010: # define STACKBOTTOM ((ptr_t) 0xa000000000000000l)
! 1011: /* We also need the base address of the register stack */
! 1012: /* backing store. There is probably a better way to */
! 1013: /* get that, too ... */
! 1014: # define BACKING_STORE_BASE ((ptr_t) 0x9fffffff80000000l)
! 1015: # define DATASTART GC_data_start
! 1016: # define DYNAMIC_LOADING
! 1017: extern int _end;
! 1018: # define DATAEND (&_end)
! 1019: # endif
! 1020: # endif
! 1021:
1.1 noro 1022: # ifdef M88K
1023: # define MACH_TYPE "M88K"
1024: # define ALIGNMENT 4
1025: # define ALIGN_DOUBLE
1026: extern int etext;
1027: # ifdef CX_UX
1028: # define OS_TYPE "CX_UX"
1029: # define DATASTART ((((word)&etext + 0x3fffff) & ~0x3fffff) + 0x10000)
1030: # endif
1031: # ifdef DGUX
1032: # define OS_TYPE "DGUX"
1033: extern char * GC_SysVGetDataStart();
1034: # define DATASTART (ptr_t)GC_SysVGetDataStart(0x10000, &etext)
1035: # endif
1036: # define STACKBOTTOM ((char*)0xf0000000) /* determined empirically */
1037: # endif
1038:
1039: # ifdef S370
1040: # define MACH_TYPE "S370"
1041: # define OS_TYPE "UTS4"
1042: # define ALIGNMENT 4 /* Required by hardware */
1043: extern int etext;
1044: extern int _etext;
1045: extern int _end;
1046: extern char * GC_SysVGetDataStart();
1047: # define DATASTART (ptr_t)GC_SysVGetDataStart(0x10000, &_etext)
1048: # define DATAEND (&_end)
1049: # define HEURISTIC2
1050: # endif
1051:
1.2 ! noro 1052: # if defined(PJ)
! 1053: # define ALIGNMENT 4
! 1054: extern int _etext;
! 1055: # define DATASTART ((ptr_t)(&_etext))
! 1056: # define HEURISTIC1
! 1057: # endif
! 1058:
! 1059: # ifdef ARM32
! 1060: # define CPP_WORDSZ 32
! 1061: # define MACH_TYPE "ARM32"
! 1062: # define ALIGNMENT 4
! 1063: # ifdef NETBSD
! 1064: # define OS_TYPE "NETBSD"
! 1065: # define HEURISTIC2
! 1066: extern char etext;
! 1067: # define DATASTART ((ptr_t)(&etext))
! 1068: # define USE_GENERIC_PUSH_REGS
! 1069: # endif
! 1070: #endif
! 1071:
1.1 noro 1072: # ifndef STACK_GROWS_UP
1073: # define STACK_GROWS_DOWN
1074: # endif
1075:
1076: # ifndef CPP_WORDSZ
1077: # define CPP_WORDSZ 32
1078: # endif
1079:
1080: # ifndef OS_TYPE
1081: # define OS_TYPE ""
1082: # endif
1083:
1084: # ifndef DATAEND
1085: extern int end;
1086: # define DATAEND (&end)
1087: # endif
1088:
1089: # if defined(SVR4) && !defined(GETPAGESIZE)
1090: # include <unistd.h>
1091: # define GETPAGESIZE() sysconf(_SC_PAGESIZE)
1092: # endif
1093:
1094: # ifndef GETPAGESIZE
1095: # if defined(SUNOS5) || defined(IRIX5)
1096: # include <unistd.h>
1097: # endif
1098: # define GETPAGESIZE() getpagesize()
1099: # endif
1100:
1101: # if defined(SUNOS5) || defined(DRSNX) || defined(UTS4)
1102: /* OS has SVR4 generic features. Probably others also qualify. */
1103: # define SVR4
1104: # endif
1105:
1106: # if defined(SUNOS5) || defined(DRSNX)
1107: /* OS has SUNOS5 style semi-undocumented interface to dynamic */
1108: /* loader. */
1109: # define SUNOS5DL
1110: /* OS has SUNOS5 style signal handlers. */
1111: # define SUNOS5SIGS
1112: # endif
1113:
1.2 ! noro 1114: # if defined(HPUX)
! 1115: # define SUNOS5SIGS
! 1116: # endif
! 1117:
1.1 noro 1118: # if CPP_WORDSZ != 32 && CPP_WORDSZ != 64
1119: -> bad word size
1120: # endif
1121:
1122: # ifdef PCR
1123: # undef DYNAMIC_LOADING
1124: # undef STACKBOTTOM
1125: # undef HEURISTIC1
1126: # undef HEURISTIC2
1127: # undef PROC_VDB
1128: # undef MPROTECT_VDB
1129: # define PCR_VDB
1130: # endif
1131:
1132: # ifdef SRC_M3
1133: /* Postponed for now. */
1134: # undef PROC_VDB
1135: # undef MPROTECT_VDB
1136: # endif
1137:
1138: # ifdef SMALL_CONFIG
1139: /* Presumably not worth the space it takes. */
1140: # undef PROC_VDB
1141: # undef MPROTECT_VDB
1142: # endif
1143:
1144: # ifdef USE_MUNMAP
1145: # undef MPROTECT_VDB /* Can't deal with address space holes. */
1146: # endif
1147:
1148: # if !defined(PCR_VDB) && !defined(PROC_VDB) && !defined(MPROTECT_VDB)
1149: # define DEFAULT_VDB
1150: # endif
1151:
1152: # if defined(_SOLARIS_PTHREADS) && !defined(SOLARIS_THREADS)
1153: # define SOLARIS_THREADS
1154: # endif
1155: # if defined(IRIX_THREADS) && !defined(IRIX5)
1156: --> inconsistent configuration
1157: # endif
1158: # if defined(IRIX_JDK_THREADS) && !defined(IRIX5)
1159: --> inconsistent configuration
1160: # endif
1161: # if defined(LINUX_THREADS) && !defined(LINUX)
1162: --> inconsistent configuration
1163: # endif
1164: # if defined(SOLARIS_THREADS) && !defined(SUNOS5)
1165: --> inconsistent configuration
1166: # endif
1.2 ! noro 1167: # if defined(HPUX_THREADS) && !defined(HPUX)
! 1168: --> inconsistent configuration
! 1169: # endif
1.1 noro 1170: # if defined(PCR) || defined(SRC_M3) || \
1171: defined(SOLARIS_THREADS) || defined(WIN32_THREADS) || \
1172: defined(IRIX_THREADS) || defined(LINUX_THREADS) || \
1.2 ! noro 1173: defined(IRIX_JDK_THREADS) || defined(HPUX_THREADS)
1.1 noro 1174: # define THREADS
1175: # endif
1176:
1177: # if defined(HP_PA) || defined(M88K) || defined(POWERPC) \
1178: || (defined(I386) && defined(OS2)) || defined(UTS4) || defined(LINT)
1179: /* Use setjmp based hack to mark from callee-save registers. */
1180: # define USE_GENERIC_PUSH_REGS
1181: # endif
1182: # if defined(SPARC) && !defined(LINUX)
1183: # define SAVE_CALL_CHAIN
1184: # define ASM_CLEAR_CODE /* Stack clearing is crucial, and we */
1185: /* include assembly code to do it well. */
1186: # endif
1187:
1188: # endif
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>