176 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			176 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| diff -bcrN gc.org/doc/README.ews4800 gc/doc/README.ews4800
 | |
| *** gc.org/doc/README.ews4800	Thu Jan  1 09:00:00 1970
 | |
| --- gc/doc/README.ews4800	Wed Jul 25 17:38:57 2001
 | |
| ***************
 | |
| *** 0 ****
 | |
| --- 1,75 ----
 | |
| + GC on EWS4800
 | |
| + -------------
 | |
| + 
 | |
| + 1. About EWS4800
 | |
| +    EWS4800 is 32bit/64bit workstation.
 | |
| + 
 | |
| +      Vender: NEC Corporation
 | |
| +      OS: UX/4800 R9.* - R13.* (SystemV R4.2)
 | |
| +      CPU: R4000, R4400, R10000 (MIPS)
 | |
| + 
 | |
| + 2. Compiler
 | |
| + 
 | |
| +  32bit:
 | |
| +    Use ANSI C compiler.
 | |
| +      CC = /usr/abiccs/bin/cc
 | |
| + 
 | |
| +  64bit:
 | |
| +    Use 64bit ANSI C compiler.
 | |
| +      CC = /usr/ccs64/bin/cc
 | |
| +      AR = /usr/ccs64/bin/ar
 | |
| + 
 | |
| + 3. ELF file format
 | |
| +    *** Caution: The following infomation is empirical. ***
 | |
| + 
 | |
| +  32bit:
 | |
| +    ELF file has an unique format. (See a.out(4) and end(3C).)
 | |
| + 
 | |
| +      &_start
 | |
| +         :      text segment
 | |
| +      &etext
 | |
| +      DATASTART
 | |
| +         :      data segment (initialized)
 | |
| +      &edata
 | |
| +      DATASTART2
 | |
| +         :      data segment (uninitialized)
 | |
| +      &end
 | |
| + 
 | |
| +    Here, DATASTART and DATASTART2 are macros of GC, and are defined as
 | |
| +    the following equations. (See include/private/gcconfig.h.)
 | |
| +    The algorithm for DATASTART is similar with the function
 | |
| +    GC_SysVGetDataStart() in os_dep.c.
 | |
| + 
 | |
| +      DATASTART  = ((&etext + 0x3ffff) & ~0x3ffff) + (&etext & 0xffff)
 | |
| + 
 | |
| +     Dynamically linked:
 | |
| +      DATASTART2 = (&_gp + 0x8000 + 0x3ffff) & ~0x3ffff
 | |
| + 
 | |
| +     Statically linked:
 | |
| +      DATASTART2 = &edata
 | |
| + 
 | |
| +    GC has to check addresses both between DATASTART and &edata, and
 | |
| +    between DATASTART2 and &end. If a program accesses between &etext
 | |
| +    and DATASTART, or between &edata and DATASTART2, the segmentation
 | |
| +    error occurs and the program stops.
 | |
| + 
 | |
| +    If a program is statically linked, there is not a gap between
 | |
| +    &edata and DATASTART2. The global symbol &_DYNAMIC_LINKING is used
 | |
| +    for the detection.
 | |
| + 
 | |
| +  64bit:
 | |
| +    ELF file has a simple format. (See end(3C).)
 | |
| + 
 | |
| +      _ftext
 | |
| +         :      text segment
 | |
| +      _etext
 | |
| +      _fdata = DATASTART
 | |
| +         :      data segment (initialized)
 | |
| +      _edata
 | |
| +      _fbss
 | |
| +         :      data segment (uninitialized)
 | |
| +      _end = DATAEND
 | |
| + 
 | |
| + --
 | |
| + Hironori SAKAMOTO <hsaka@mth.biglobe.ne.jp>
 | |
| + 
 | |
| diff -bcrN gc.org/include/private/gcconfig.h gc/include/private/gcconfig.h
 | |
| *** gc.org/include/private/gcconfig.h	Sun Jul  1 06:29:27 2001
 | |
| --- gc/include/private/gcconfig.h	Wed Jul 25 17:38:57 2001
 | |
| ***************
 | |
| *** 75,83 ****
 | |
|   #    endif
 | |
|   #    define mach_type_known
 | |
|   # endif
 | |
| ! # if defined(mips) || defined(__mips)
 | |
|   #    define MIPS
 | |
| ! #    if !defined(LINUX)
 | |
|   #      if defined(ultrix) || defined(__ultrix) || defined(__NetBSD__)
 | |
|   #	 define ULTRIX
 | |
|   #      else
 | |
| --- 75,86 ----
 | |
|   #    endif
 | |
|   #    define mach_type_known
 | |
|   # endif
 | |
| ! # if defined(mips) || defined(__mips) || defined(_mips)
 | |
|   #    define MIPS
 | |
| ! #    if defined(nec_ews) || defined(_nec_ews)
 | |
| ! #      define EWS4800
 | |
| ! #    endif
 | |
| ! #    if !defined(LINUX) && !defined(EWS4800)
 | |
|   #      if defined(ultrix) || defined(__ultrix) || defined(__NetBSD__)
 | |
|   #	 define ULTRIX
 | |
|   #      else
 | |
| ***************
 | |
| *** 1083,1088 ****
 | |
| --- 1086,1114 ----
 | |
|   	/* instead. But some kernel versions seem to give the wrong	*/
 | |
|   	/* value from /proc.						*/
 | |
|   #   endif /* Linux */
 | |
| + #   ifdef EWS4800
 | |
| + #      define HEURISTIC2
 | |
| + #      if defined(_MIPS_SZPTR) && (_MIPS_SZPTR == 64)
 | |
| +          extern int _fdata[], _end[];
 | |
| + #        define DATASTART ((ptr_t)_fdata)
 | |
| + #        define DATAEND ((ptr_t)_end)
 | |
| + #        define CPP_WORDSZ _MIPS_SZPTR
 | |
| + #        define ALIGNMENT (_MIPS_SZPTR/8)
 | |
| + #      else
 | |
| +          extern int etext, edata, end;
 | |
| +          extern int _DYNAMIC_LINKING, _gp;
 | |
| + #        define DATASTART ((ptr_t)((((word)&etext + 0x3ffff) & ~0x3ffff) \
 | |
| +                + ((word)&etext & 0xffff)))
 | |
| + #        define DATAEND (&edata)
 | |
| + #        define DATASTART2 (&_DYNAMIC_LINKING \
 | |
| +                ? (ptr_t)(((word)&_gp + 0x8000 + 0x3ffff) & ~0x3ffff) \
 | |
| +                : (ptr_t)&edata)
 | |
| + #        define DATAEND2 (&end)
 | |
| + #        define ALIGNMENT 4
 | |
| + #      endif
 | |
| + #      define OS_TYPE "EWS4800"
 | |
| + #      define USE_GENERIC_PUSH_REGS 1
 | |
| + #   endif
 | |
|   #   ifdef ULTRIX
 | |
|   #	define HEURISTIC2
 | |
|   #       define DATASTART (ptr_t)0x10000000
 | |
| diff -bcrN gc.org/mach_dep.c gc/mach_dep.c
 | |
| *** gc.org/mach_dep.c	Thu Jun 28 05:54:23 2001
 | |
| --- gc/mach_dep.c	Wed Jul 25 17:38:57 2001
 | |
| ***************
 | |
| *** 429,435 ****
 | |
|   		    *i = 0;
 | |
|   		}
 | |
|   #	      if defined(POWERPC) || defined(MSWIN32) || defined(MSWINCE) \
 | |
| ! 	         || defined(UTS4) || defined(LINUX)
 | |
|   		  (void) setjmp(regs);
 | |
|   #	      else
 | |
|   	          (void) _setjmp(regs);
 | |
| --- 429,435 ----
 | |
|   		    *i = 0;
 | |
|   		}
 | |
|   #	      if defined(POWERPC) || defined(MSWIN32) || defined(MSWINCE) \
 | |
| !                 || defined(UTS4) || defined(LINUX) || defined(EWS4800)
 | |
|   		  (void) setjmp(regs);
 | |
|   #	      else
 | |
|   	          (void) _setjmp(regs);
 | |
| diff -bcrN gc.org/os_dep.c gc/os_dep.c
 | |
| *** gc.org/os_dep.c	Tue Jun 26 11:32:26 2001
 | |
| --- gc/os_dep.c	Wed Jul 25 17:38:57 2001
 | |
| ***************
 | |
| *** 1088,1093 ****
 | |
| --- 1088,1096 ----
 | |
|   	GC_add_roots_inner(DATASTART, (char *)sbrk(0), FALSE);
 | |
|   #     else
 | |
|   	GC_add_roots_inner(DATASTART, (char *)(DATAEND), FALSE);
 | |
| + #       if defined(DATASTART2)
 | |
| +          GC_add_roots_inner(DATASTART2, (char *)(DATAEND2), FALSE);
 | |
| + #       endif
 | |
|   #     endif
 | |
|   #   endif
 | |
|   #   if !defined(PCR) && (defined(NEXT) || defined(MACOSX))
 |