--- src/runtime/include/asm-base.h.orig Fri Dec 3 20:59:31 1999 +++ src/runtime/include/asm-base.h Fri Mar 9 14:53:40 2001 @@ -16,7 +16,7 @@ #define FALSE 0 #define TRUE 1 -#if (!defined(GLOBALS_HAVE_UNDERSCORE)) && (defined(OPSYS_SUNOS) || defined(OPSYS_FREEBSD) || defined(OPSYS_NETBSD) || defined(OPSYS_NEXTSTEP) || defined(OPSYS_WIN32)) +#if (!defined(GLOBALS_HAVE_UNDERSCORE)) && (defined(OPSYS_SUNOS) || (defined(OPSYS_FREEBSD) && !defined(__ELF__)) || (defined(OPSYS_NETBSD) && !defined(__ELF__))|| defined(OPSYS_NEXTSTEP) || defined(OPSYS_WIN32)) # define GLOBALS_HAVE_UNDERSCORE #endif @@ -36,6 +36,11 @@ # define _ASM # include # include +# elif defined(OPSYS_NETBSD) +# include +# define WINDOWSIZE (16*4) +# define SA(x) (((x)+7)&~7) +# define ST_INT_OVERFLOW 0x87 # endif # define GLOBAL(ID) .global CSYM(ID) # define LABEL(ID) ID: --- src/runtime/mach-dep/SPARC.prim.asm.orig Fri Dec 3 20:59:32 1999 +++ src/runtime/mach-dep/SPARC.prim.asm Wed Mar 14 18:39:43 2001 @@ -462,7 +462,7 @@ mov ALLOCPTR,LIMITPTR /* (delay slot) */ -#if defined(OPSYS_SUNOS) || defined(OPSYS_NEXTSTEP) +#if defined(OPSYS_SUNOS) || defined(OPSYS_NEXTSTEP) || defined(OPSYS_NETBSD) /* ZeroLimitPtr: * * Zero the heap limit pointer so that a trap will be generated on the next limit @@ -731,13 +731,62 @@ mov %g1,%l1 /* save %g1 which may get trashed */ mov %g2,%l2 mov %g3,%l3 +#ifdef OPSYS_NETBSD + /* NetBSDs .mul trashes these */ + mov %i4,%l4 + mov %i5,%l5 + mov %i0,%l6 + mov %i1,%l7 +#endif mov %i2,%o0 call .mul mov %i3,%o1 /* (delay slot) */ mov %l1,%g1 /* restore %g1 */ mov %l2,%g2 mov %l3,%g3 +#ifdef OPSYS_NETBSD + mov %l4,%i4 + mov %l5,%i5 + mov %l6,%i0 + mov %l7,%i1 + /* the code below is a hack: + * NetBSDs .mul does a 32x32->64 bit signed multiply + * The SML code assumes that the multiply + * overflowed (over 32bit) if the Z flag is + * clear on return from .mul + * NetBSDs .mul doesn't do that, so we have to check + * for overflow. This is done in the following way: + * - If the upper 32 bits are clear: + * + if bit 31 is set => overflow + * + if bit 31 is clear => OK + * - If the upper 32 bits are != -1 => overflow + * - If the upper 32 bits are == -1: + * + If bit 31 is clear => overflow + * + If bit 31 is set => OK + * + * I should be shot for this code ... + */ + cmp %o1,0 + bnz 4f + nop + /* is bit 31 of %o0 set ? */ + addcc %o0,%o0,%o1 + bcc 2f + nop +5: restore %o0,0,%o2 /* result in %o2 (delay slot) */ + t ST_INT_OVERFLOW /* generate overflow trap */ + + +4: cmp %o1,-1 /* upper 32 bits == -1 ? */ + bnz 5 + nop + addcc %o0,%o0,%o1 /* bit 31 clear ? */ + bcc 2f + nop +#else bnz 1f /* if z is clear, then overflow */ +#endif +2: restore %o0,0,%o2 /* result in %o2 (delay slot) */ retl nop @@ -751,7 +800,15 @@ * locals of the new window, since .div is a leaf routine. */ _ml_div: - save %sp,-SA(WINDOWSIZE),%sp +#ifdef OPSYS_NETBSD + /* hack time again: NetBSDs .div trashes too many registers + * we have to store them in the stack frame, so make room + * for six registers (o0-o5) + */ + save %sp,-SA(WINDOWSIZE+24),%sp +#else + save %sp,-SA(WINDOWSIZE+24),%sp +#endif addcc %i3,%g0,%o1 /* %o1 is divisor (and check for zero) */ bz 1f /* save %g1, %g2 and %g3 (using new window) */ @@ -759,9 +816,30 @@ mov %g1,%l1 /* (delay slot) */ mov %g2,%l2 mov %g3,%l3 +#ifdef OPSYS_NETBSD + /* save g6,g7,o0-o5, they get trashed. + Note that %o0-%o5 are now %i0-%i5, since we did a 'save' + Since %g6 is the global AllocPtr for SML, this + is rather bad :-) + */ + mov %g6,%l4 + mov %g7,%l5 + std %i0,[%fp-16] + std %i2,[%fp-24] + std %i4,[%fp-32] +#endif + call .div mov %i2,%o0 /* (delay slot) */ /* restore %g1, %g2 and %g3 */ +#ifdef OPSYS_NETBSD + mov %l4,%g6 + mov %l5,%g7 + ldd [%fp-32],%i4 + ldd [%fp-24],%i2 + ldd [%fp-16],%i0 +#endif + mov %l3,%g3 mov %l2,%g2 mov %l1,%g1 @@ -788,11 +866,24 @@ mov %g2,%l2 mov %g3,%l3 mov %i2,%o0 +#ifdef OPSYS_NETBSD + /* Save what might be trashed by NetBSDs .umul */ + mov %i4,%l4 + mov %i5,%l5 + mov %i0,%l6 + mov %i1,%l7 +#endif call .umul mov %i3,%o1 /* (delay slot) */ mov %l1,%g1 /* restore %g1 */ mov %l2,%g2 mov %l3,%g3 +#ifdef OPSYS_NETBSD + mov %l4,%i4 + mov %l5,%i5 + mov %l6,%i0 + mov %l7,%i1 +#endif ret restore %o0,0,%o2 /* result in %o2 (delay slot) */ @@ -803,7 +894,12 @@ * locals of the new window, since .div is a leaf routine. */ _ml_udiv: - save %sp,-SA(WINDOWSIZE),%sp +#ifdef OPSYS_NETBSD + /* see comment for _ml__div_ */ + save %sp,-SA(WINDOWSIZE+24),%sp +#else + save %sp,-SA(WINDOWSIZE+24),%sp +#endif addcc %i3,%g0,%o1 /* %o1 is divisor (and check for zero) */ bz 1f /* save %g1, %g2 and %g3 (using new window) */ @@ -811,9 +907,23 @@ mov %g1,%l1 /* (delay slot) */ mov %g2,%l2 mov %g3,%l3 +#ifdef OPSYS_NETBSD + mov %g6,%l4 + mov %g7,%l5 + std %i0,[%fp-16] + std %i2,[%fp-24] + std %i4,[%fp-32] +#endif call .udiv mov %i2,%o0 /* (delay slot) */ /* restore %g1, %g2 and %g3 */ +#ifdef OPSYS_NETBSD + mov %l4,%g6 + mov %l5,%g7 + ldd [%fp-32],%i4 + ldd [%fp-24],%i2 + ldd [%fp-16],%i0 +#endif mov %l3,%g3 mov %l2,%g2 mov %l1,%g1 --- src/runtime/mach-dep/signal-sysdep.h.orig Fri Dec 3 20:59:32 1999 +++ src/runtime/mach-dep/signal-sysdep.h Mon Mar 12 15:23:01 2001 @@ -151,7 +151,7 @@ /* disable all FP exceptions */ # define SIG_InitFPE() SetFSR(0) -# if defined(OPSYS_SUNOS) +# if defined(OPSYS_SUNOS) || defined(OPSYS_NETBSD) /** SPARC, SUNOS **/ # define USE_ZERO_LIMIT_PTR_FN # define SIG_FAULT1 SIGFPE --- src/runtime/objs/mk.sparc-netbsd.orig Thu Jan 1 01:00:00 1970 +++ src/runtime/objs/mk.sparc-netbsd Tue Mar 13 09:45:58 2001 @@ -0,0 +1,24 @@ +# mk.sparc-netbsd +# + +SHELL = /bin/sh + +MAKE = gmake +GCC = gcc +ARFLAGS = Trcv +CFLAGS = -O2 -Wall +LDFLAGS= +CPP = $(GCC) -x c -E -P + +#XOBJS = xmonitor.o +#LD_LIBS = -lX11 +#BASE_DEFS = -DHEAP_MONITOR -DPOLL_DEBUG +XOBJS = +XLIBS = +DEFS = $(BASE_DEFS) -DHOST_SPARC -DTARGET_SPARC -DOPSYS_UNIX -DOPSYS_NETBSD -DCALLEESAVE=3 -DUNBOXEDFLOAT=1 +TARGET = SPARC +VERSION = v-sparc-netbsd +RUNTIME = run.sparc-netbsd + +all: + ($(MAKE) RUNTIME="$(RUNTIME)" MAKE="$(MAKE)" VERSION="$(VERSION)" CC="$(CC)" CFLAGS="$(CFLAGS)" CPP="$(CPP)" AS="$(AS)" AR="$(AR)" RANLIB="$(RANLIB)" TARGET=$(TARGET) DEFS="$(DEFS)" XOBJS="$(XOBJS)" XLIBS="$(XLIBS)" LD_LIBS="$(LD_LIBS)" $(RUNTIME))