/*---------------------------------------------------------------------------* * * machine.h Processor Dependent Definitions * date: 3 January 1995 * authors: Giuseppe Attardi * email: cmm@di.unipi.it * address: Dipartimento di Informatica * Corso Italia 40 * I-56125 Pisa, Italy * * Copyright (C) 1995 Giuseppe Attardi * * This file is part of the PoSSo Customizable Memory Manager (CMM). * * Permission to use, copy, and modify this software and its documentation is * hereby granted only under the following terms and conditions. Both the * above copyright notice and this permission notice must appear in all copies * of the software, derivative works or modified versions, and any portions * thereof, and both notices must appear in supporting documentation. * * Users of this software agree to the terms and conditions set forth herein, * and agree to license at no charge to all parties under these terms and * conditions any derivative works or modified versions of this software. * * This software may be distributed (but not offered for sale or transferred * for compensation) to third parties, provided such third parties agree to * abide by the terms and conditions of this notice. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE COPYRIGHT HOLDERS DISCLAIM ALL * WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE COPYRIGHT HOLDERS * BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * *---------------------------------------------------------------------------*/ #ifndef _MACHINE_H #define _MACHINE_H /*---------------------------------------------------------------------------* * -- Type Definitions *---------------------------------------------------------------------------*/ typedef unsigned char Byte; typedef unsigned long Word; typedef char * Ptr; typedef Ptr * GCP; /* Pointer to a garbage collected object */ typedef unsigned Page; /* Page number */ /*---------------------------------------------------------------------------* * -- Compatibility *---------------------------------------------------------------------------*/ #ifdef __cplusplus # define C_LANG "C" #else # define C_LANG #endif #if defined(__sun__) && !defined(__svr4__) extern C_LANG void bzero(void *, int); #else # include # define bzero(s, n) memset(s, 0, n) #endif #ifndef MIN # define MIN(a,b) (((a)<(b))?(a):(b)) #endif #ifndef MAX # define MAX(a,b) (((a)>(b))?(a):(b)) #endif #if defined(__svr4__) || defined(_WIN32) # define _setjmp(x) setjmp(x) # define _longjmp(x,y) longjmp(x,y) #endif #if !defined(__BORLANDC__) && !defined(_WIN32) # include // extern C_LANG void* sbrk(int); #endif /*---------------------------------------------------------------------------* * * Stack growth * *---------------------------------------------------------------------------*/ #ifndef hp9000s800 # define STACK_GROWS_DOWNWARD #endif /*---------------------------------------------------------------------------* * * Architectures requiring double alignement for objects * *---------------------------------------------------------------------------*/ #if defined(__mips) || defined(__sparc) || defined(__alpha) # define OBJ_ALIGNMENT 8 #else # define OBJ_ALIGNMENT 4 #endif /* * DOUBLE_ALIGN = (OBJ_ALIGNMENT != sizeof(Word)) */ #if defined(__mips) || defined(__sparc) # define DOUBLE_ALIGN #endif #define MEMALIGN (char *)memalign #if defined(__sparc) # define ARRAY_PADDING #endif /*---------------------------------------------------------------------------* * * Start of system heap * *---------------------------------------------------------------------------*/ extern void * globalHeapStart; // start of global heap /*---------------------------------------------------------------------------* * * Start of data segment * *---------------------------------------------------------------------------*/ #if defined(__alpha) # define DATASTART (0x140000000) #elif defined(__sgi) || defined(_sgi) || defined(sgi) typedef unsigned int uint; # include # define DATASTART USRDATA #elif defined(__svr4__) || defined(DGUX) extern int etext; extern char * CmmSVR4DataStart(int); # define DATASTART CmmSVR4DataStart(0x10000) #elif defined(hp9000s300) extern int etext; # define DATASTART ((((unsigned long)(&etext)) + 0xfff) & ~0xfff) #elif defined(_WIN32) # define STACKBOTTOM CmmGetStackBase() #elif defined(__i386) extern int etext; # define DATASTART ((((unsigned long)(&etext)) + 0xfff) & ~0xfff) # if defined(GO32) # define STACKBOTTOM (0x80000000) # else # define STACKBOTTOM (0xc0000000) # endif #elif defined(__mips) # include # define DATASTART USRDATA #elif defined(__hppa) extern int __data_start; # define DATASTART (&__data_start) #elif defined(ibm032) /* IBM RT */ # define DATASTART 0x10000000 #elif defined(_IBMR2) /* IBM RS/6000 */ # define DATASTART 0x20000000 # define STACKBOTTOM ((unsigned long)0x2ff80000) #elif defined(__NeXT) # define DATASTART ((unsigned long) get_etext()) # define STACKBOTTOM ((unsigned long) 0x4000000) #elif defined(ns32000) extern char **environ; # define DATASTART (&environ) #elif defined(__sparc) /* This assumes ZMAGIC, i.e. demand-loadable executables. */ # define DATASTART (*(int *)0x2004+0x2000) #elif defined(sun3) extern char etext; # define DATASTART ((((unsigned long)(&etext)) + 0x1ffff) & ~0x1ffff) #elif defined(SCO) # define DATASTART ((((unsigned long)(&etext)) + 0x3fffff) & ~0x3fffff) \ + ((unsigned long)&etext & 0xfff) #elif defined(_AUX_SOURCE) /* This only works for shared-text binaries with magic number 0413. The other sorts of SysV binaries put the data at the end of the text, in which case the default of &etext would work. Unfortunately, handling both would require having the magic-number available. -- Parag */ # define DATASTART ((((unsigned long)(&etext)) + 0x3fffff) & ~0x3fffff) \ + ((unsigned long)&etext & 0x1fff) #else /* The default case works only for contiguous text and data, such as * on a Vax. */ extern char etext; # define DATASTART (&etext) #endif #endif /* ! _MACHINE_H */