Fixup signal changes (hopefully). However SUN_COMPAT is likely broken by

this and I don't know how to fix it.

We can now exec a 64-bit init through a really ugly hack (don't ask.)
This commit is contained in:
eeh 1998-09-13 16:02:47 +00:00
parent 66dd35d72c
commit 49af63b22b
12 changed files with 175 additions and 55 deletions

View File

@ -1,4 +1,4 @@
# $NetBSD: Makefile,v 1.3 1998/09/05 23:57:24 eeh Exp $
# $NetBSD: Makefile,v 1.4 1998/09/13 16:02:47 eeh Exp $
# Makefile for sparc64 tags file and boot blocks
@ -18,9 +18,8 @@ tags:
sort -o ${TSPARC64} ${TSPARC64}
TAGS:
@find ../.. -name '*.[chsS]' -print | grep -v CVS >filist
etags `grep sparc64 filist` `grep -v arch filist`
-${RM} fillist
etags ${TSPARC64} ${SSPARC64} ${COMM} \
"--regex=/ENTRY(.*)|FUNC(.*)|SYSCALL(.*)/" ${ASPARC64}
links:
-for i in ${DSPARC64}; do \

View File

@ -1,4 +1,4 @@
# $NetBSD: NONPLUS64,v 1.1 1998/09/06 04:43:47 eeh Exp $
# $NetBSD: NONPLUS64,v 1.2 1998/09/13 16:02:47 eeh Exp $
include "arch/sparc64/conf/std.sparc64"
@ -126,7 +126,7 @@ options COMPAT_10 # NetBSD 1.0 binary compatibility
options COMPAT_11 # NetBSD 1.1 binary compatibility
options COMPAT_12 # NetBSD 1.2 binary compatibility
options COMPAT_13 # NetBSD 1.3 binary compatibility
options COMPAT_SPARC32 # NetBSD/sparc binary compatibility
#options COMPAT_SPARC32 # NetBSD/sparc binary compatibility
options COMPAT_SUNOS # SunOS 4.x binary compatibility
options COMPAT_SVR4 # SunOS 5.x binary compatibility
options EXEC_ELF32 # Exec module for SunOS 5.x binaries.

View File

@ -1,4 +1,4 @@
/* $NetBSD: asm.h,v 1.3 1998/08/13 02:10:44 eeh Exp $ */
/* $NetBSD: asm.h,v 1.4 1998/09/13 16:02:48 eeh Exp $ */
/*
* Copyright (c) 1994 Allen Briggs
@ -44,6 +44,12 @@
#ifndef _ASM_H_
#define _ASM_H_
#ifdef _LP64
#ifndef __ELF__
#define __ELF__
#endif
#endif
#ifdef __ELF__
#define _C_LABEL(name) name
#else
@ -63,10 +69,10 @@
* to work without a stack frame (doing so requires saving %o7) .
*/
#define PIC_PROLOGUE(dest,tmp) \
mov %o7,tmp; 3: call 4f; nop; 4: \
rdpr %pc, tmp; \
sethi %hi(_C_LABEL(_GLOBAL_OFFSET_TABLE_)-(3b-.)),dest; \
or dest,%lo(_C_LABEL(_GLOBAL_OFFSET_TABLE_)-(3b-.)),dest; \
add dest,%o7,dest; mov tmp,%o7
add tmp,%o7,dest
/*
* PICCY_SET() does the equivalent of a `set var, %dest' instruction in
@ -74,8 +80,7 @@
* only works for VARs defined in the same file *and* in the text segment.
*/
#define PICCY_SET(var,dest,tmp) \
mov %o7,tmp; 3: call 4f; nop; 4: \
add %o7,(var-3b),dest; mov tmp,%o7
rdpr %pc, tmp; add tmp,(var-3b),dest
#else
#define PIC_PROLOGUE(dest,tmp)
#define PICCY_OFFSET(var,dest,tmp)

View File

@ -1,4 +1,4 @@
/* $NetBSD: pmap.h,v 1.6 1998/09/09 00:07:56 thorpej Exp $ */
/* $NetBSD: pmap.h,v 1.7 1998/09/13 16:02:48 eeh Exp $ */
/*-
* Copyright (C) 1995, 1996 Wolfgang Solfrank.
@ -119,6 +119,14 @@ struct pmap {
*/
paddr_t pm_physaddr; /* physical address of pm_segs */
int64_t *pm_segs;
/* XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX */
/*
* Here's a really ugly hack: all processes now allocate
* one 8K page that is mapped little endian so we can do the
* syscall args properly.
*/
void *syscallargs;
/* XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX */
};
/*

View File

@ -1,4 +1,4 @@
/* $NetBSD: stdarg.h,v 1.3 1998/09/11 00:12:41 eeh Exp $ */
/* $NetBSD: stdarg.h,v 1.4 1998/09/13 16:02:48 eeh Exp $ */
/*
* Copyright (c) 1992, 1993
@ -49,6 +49,10 @@
#include <machine/ansi.h>
#ifdef _LP64
/*
* For sparcv9 code.
*/
#ifdef __lint__
#define __builtin_classify_type(t) (0)
#endif
@ -64,13 +68,13 @@ typedef _BSD_VA_LIST_ va_list;
#endif
#define __va_arg(ap, type) \
(*(type *)((ap) += 8, (ap) - 8))
((type)*(u_int64_t *)((ap) += 8, (ap) - 8))
/* Like __va_arg(), except when the type must be 16-byte aligned. */
#define __va_arg16(ap, type) \
(*(type *)((__alignof__(type) == 16 ? \
((type)*(u_int64_t *)((__alignof__(type) == 16 ? \
(ap) = (va_list)(((unsigned long)(ap) + 31) & -16) :\
(ap) += 16), (ap) - 16))
((ap) += 16)), (ap) - 16))
#define __REAL_TYPE_CLASS 8
#define __RECORD_TYPE_CLASS 12
@ -83,6 +87,69 @@ typedef _BSD_VA_LIST_ va_list;
(sizeof(type) <= 16 ? __va_arg16(ap, type) : \
*__va_arg(ap, type *)))))
#define va_end(ap)
#else
/*
* For sparcv8 code.
*/
#ifdef __lint__
#define __extension__(x) (0)
#define __builtin_classify_type(t) (0)
#endif
typedef _BSD_VA_LIST_ va_list;
#define __va_size(type) \
(((sizeof(type) + sizeof(long) - 1) / sizeof(long)) * sizeof(long))
#if __GNUC__ > 2 || __GNUC_MINOR__ >= 6
#define va_start(ap, last) \
(__builtin_next_arg(last), (ap) = (va_list)__builtin_saveregs())
#else
#define va_start(ap, last) \
(__builtin_next_arg(), (ap) = (va_list)__builtin_saveregs())
#endif
/*
* va_arg picks up the next argument of type `type'. Appending an
* asterisk to `type' must produce a pointer to `type' (i.e., `type'
* may not be, e.g., `int (*)()').
*
* Gcc-2.x tries to use ldd/std for double and quad_t values, but Sun's
* brain-damaged calling convention does not quad-align these. Thus, for
* 8-byte arguments, we have to pick up the actual value four bytes at a
* time, and use type punning (i.e., a union) to produce the result.
* (We could also do this with a libc function, actually, by returning
* 8 byte integers in %o0+%o1 and the same 8 bytes as a double in %f0+%f1.)
*
* Note: We don't declare __d with type `type', since in C++ the type might
* have a constructor.
*/
#if __GNUC__ == 1
#define __extension__
#endif
#define __va_8byte(ap, type) \
__extension__ ({ \
union { char __d[sizeof(type)]; int __i[2]; } __va_u; \
__va_u.__i[0] = ((int *)(void *)(ap))[0]; \
__va_u.__i[1] = ((int *)(void *)(ap))[1]; \
(ap) += 8; *(type *)(va_list)__va_u.__d; \
})
#define __va_arg(ap, type) \
(*(type *)((ap) += __va_size(type), \
(ap) - (sizeof(type) < sizeof(long) && \
sizeof(type) != __va_size(type) ? \
sizeof(type) : __va_size(type))))
#define __RECORD_TYPE_CLASS 12
#define va_arg(ap, type) \
(__builtin_classify_type(*(type *)0) >= __RECORD_TYPE_CLASS ? \
*__va_arg(ap, type *) : __va_size(type) == 8 ? \
__va_8byte(ap, type) : __va_arg(ap, type))
#define va_end(ap)
#endif
#endif /* !_SPARC64_STDARG_H_ */

View File

@ -1,4 +1,4 @@
/* $NetBSD: genassym.c,v 1.5 1998/09/06 21:53:42 eeh Exp $ */
/* $NetBSD: genassym.c,v 1.6 1998/09/13 16:02:48 eeh Exp $ */
/*
* Copyright (c) 1992, 1993
@ -155,7 +155,7 @@ main()
def("FPRS_FEF",FPRS_FEF);
/* system calls */
def("SYS_sigreturn", SYS_sigreturn);
def("SYS_sigreturn", SYS___sigreturn14);
def("SYS_execve", SYS_execve);
def("SYS_exit", SYS_exit);

View File

@ -1,4 +1,4 @@
# $NetBSD: genassym.cf,v 1.5 1998/09/05 23:57:27 eeh Exp $
# $NetBSD: genassym.cf,v 1.6 1998/09/13 16:02:48 eeh Exp $
#
# Copyright (c) 1997 The NetBSD Foundation, Inc.
@ -105,8 +105,10 @@ include <sparc64/dev/zsreg.h>
include <sparc64/dev/zsvar.h>
endif
ifdef notyet
include <dev/ic/am7930reg.h>
include <dev/ic/am7930var.h>
endif
include <sparc64/dev/fdreg.h>
include <sparc64/dev/fdvar.h>
@ -157,7 +159,7 @@ define FSR_QNE FSR_QNE
define FPRS_FEF FPRS_FEF
# system calls
define SYS_sigreturn SYS_sigreturn
define SYS_sigreturn SYS___sigreturn14
define SYS_execve SYS_execve
define SYS_exit SYS_exit

View File

@ -60,6 +60,7 @@
#include "opt_ddb.h"
#include "opt_uvm.h"
#include "opt_compat_svr4.h"
#include "opt_compat_sparc32.h"
#include "assym.h"
#include <machine/param.h>

View File

@ -1,4 +1,4 @@
/* $NetBSD: machdep.c,v 1.14 1998/09/13 12:24:18 mycroft Exp $ */
/* $NetBSD: machdep.c,v 1.15 1998/09/13 16:02:48 eeh Exp $ */
/*-
* Copyright (c) 1996, 1997, 1998 The NetBSD Foundation, Inc.
@ -132,6 +132,7 @@
#include <machine/pmap.h>
#include <machine/openfirm.h>
#include <machine/sparc64.h>
#include <machine/ctlreg.h>
#include <sparc64/sparc64/cache.h>
#include <sparc64/sparc64/vaddrs.h>
@ -504,8 +505,9 @@ setregs(p, pack, stack)
* %g1: address of PS_STRINGS (used by crt0)
* %tpc,%tnpc: entry point of program
*/
tstate = ((PSTATE_USER)<<TSTATE_PSTATE_SHIFT)
| (tf->tf_tstate & TSTATE_CWP);
tstate = (ASI_PRIMARY_NO_FAULT<<TSTATE_ASI_SHIFT) |
((PSTATE_USER)<<TSTATE_PSTATE_SHIFT) |
(tf->tf_tstate & TSTATE_CWP);
if ((fs = p->p_md.md_fpstate) != NULL) {
/*
* We hold an FPU state. If we own *the* FPU chip state
@ -548,7 +550,7 @@ int sigpid = 0;
struct sigframe {
int sf_signo; /* signal number */
int sf_code; /* code */
#ifndef __LP64
#ifndef _LP64
struct sigcontext *sf_scp; /* SunOS user addr of sigcontext */
int sf_addr; /* SunOS compat, always 0 for now */
#endif
@ -594,9 +596,10 @@ sendsig(catcher, sig, mask, code)
register struct sigacts *psp = p->p_sigacts;
register struct sigframe *fp;
register struct trapframe *tf;
vaddr_t addr, onstack;
vaddr_t addr;
struct rwindow *oldsp, *newsp, /* DEBUG */tmpwin;
struct sigframe sf;
int onstack;
#if 0
/* Make sure our D$ is not polluted w/bad data */
@ -638,7 +641,7 @@ sendsig(catcher, sig, mask, code)
*/
sf.sf_signo = sig;
sf.sf_code = code;
#ifndef __LP64
#ifndef _LP64
#ifdef COMPAT_SUNOS
sf.sf_scp = &fp->sf_sc;
#endif
@ -653,12 +656,11 @@ sendsig(catcher, sig, mask, code)
sf.sf_sc.sc_g1 = tf->tf_global[1];
sf.sf_sc.sc_o0 = tf->tf_out[0];
/* Save signal stack. */
frame.sf_sc.sc_onstack = psp->ps_sigstk.ss_flags & SS_ONSTACK;
/* Save signal mask. */
frame.sf_sc.sc_mask = *mask;
/*
* Build the signal context to be used by sigreturn.
*/
sf.sf_sc.sc_onstack = onstack;
sf.sf_sc.sc_mask = mask->__bits[0];
#ifdef COMPAT_13
/*
* XXX We always have to save an old style signal mask because
@ -668,7 +670,7 @@ sendsig(catcher, sig, mask, code)
*/
native_sigset_to_sigset13(mask, &frame.sf_sc.__sc_mask13);
#endif
/*
* Put the stack in a consistent state before we whack away
* at it. Note that write_user_windows may just dump the
@ -715,7 +717,8 @@ sendsig(catcher, sig, mask, code)
* Arrange to continue execution at the code copied out in exec().
* It needs the function to call in %g1, and a new stack pointer.
*/
#ifdef COMPAT_SUNOS
#ifdef _COMPAT_SUNOS
/* XXXXXXX FIX MEEEEEEE XXXXXXX */
if (psp->ps_usertramp & sigmask(sig)) {
addr = (vaddr_t)catcher; /* user does his own trampolining */
} else
@ -739,6 +742,20 @@ sendsig(catcher, sig, mask, code)
if (sigdebug & SDB_DDB) Debugger();
}
#endif
/* Remember that we're now on the signal stack. */
if (onstack)
psp->ps_sigstk.ss_flags |= SS_ONSTACK;
}
int compat_13_sys_sigreturn __P((struct proc *, void *, register_t *));
int
compat_13_sys_sigreturn(p, v, retval)
register struct proc *p;
void *v;
register_t *retval;
{
return sys___sigreturn14(p, v, retval);
}
/*
@ -752,12 +769,12 @@ sendsig(catcher, sig, mask, code)
*/
/* ARGSUSED */
int
sys_sigreturn(p, v, retval)
sys___sigreturn14(p, v, retval)
register struct proc *p;
void *v;
register_t *retval;
{
struct sys_sigreturn_args /* {
struct sys___sigreturn14_args /* {
syscallarg(struct sigcontext *) sigcntxp;
} */ *uap = v;
struct sigcontext *scp;

View File

@ -1,4 +1,4 @@
/* $NetBSD: pmap.c,v 1.14 1998/09/09 02:49:56 eeh Exp $ */
/* $NetBSD: pmap.c,v 1.15 1998/09/13 16:02:49 eeh Exp $ */
/* #define NO_VCACHE /* Don't forget the locked TLB in dostart */
#define HWREF
/* #define BOOT_DEBUG */
@ -1216,6 +1216,15 @@ pmap_pinit(pm)
printf("pmap_pinit: segs %p == %p\n", pm->pm_segs, (void*)page->phys_addr);
#endif
ctx_alloc(pm);
/* XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX */
/* Allocate an empty page */
pm->syscallargs = malloc(NBPG, M_TEMP, M_WAITOK);
/* Make it little endian */
pseg_set(pmap_kernel(), pm->syscallargs, pseg_get(pmap_kernel(), pm->syscallargs)|TLB_IE, NULL);
/* Flush all mappings */
tsb[ptelookup_va(pm->syscallargs)].data.data = 0LL;
tlb_flush_pte(pm->syscallargs, 0);
/* XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX */
}
#ifdef DEBUG
if (pmapdebug & PDB_CREATE)
@ -1268,6 +1277,17 @@ pmap_release(pm)
#endif
s=splimp();
/* XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX */
if (pm->syscallargs) {
/* Make it big endian again */
pseg_set(pmap_kernel(), pm->syscallargs, pseg_get(pmap_kernel(), pm->syscallargs)&(~TLB_IE), NULL);
/* Flush all mappings */
tsb[ptelookup_va(pm->syscallargs)].data.data = 0LL;
tlb_flush_pte(pm->syscallargs, 0);
/* Give it back to the system */
free(pm->syscallargs, M_TEMP);
}
/* XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX */
for(i=0; i<STSZ; i++)
if((pdir = (paddr_t *)ldxa(&pm->pm_segs[i], ASI_PHYS_CACHED))) {
for (k=0; k<PDSZ; k++) {

View File

@ -1,4 +1,4 @@
/* $NetBSD: sunos_machdep.c,v 1.1.1.1 1998/06/20 04:58:52 eeh Exp $ */
/* $NetBSD: sunos_machdep.c,v 1.2 1998/09/13 16:02:49 eeh Exp $ */
/*
* Copyright (c) 1995 Matthew R. Green
@ -60,5 +60,5 @@ sunos_sys_sigreturn(p, v, retval)
{
struct sunos_sys_sigreturn_args *uap = v;
return (sys_sigreturn(p, (struct sys_sigreturn_args *)uap, retval));
return (sys___sigreturn14(p, (struct sys_sigreturn_args *)uap, retval));
}

View File

@ -1,4 +1,4 @@
/* $NetBSD: trap.c,v 1.15 1998/09/11 00:17:00 eeh Exp $ */
/* $NetBSD: trap.c,v 1.16 1998/09/13 16:02:49 eeh Exp $ */
/*
* Copyright (c) 1996
@ -154,7 +154,7 @@ int rwindow_debug = RW_64|RW_ERR;
#define TDB_STOPCALL 0x200
#define TDB_STOPCPIO 0x400
#define TDB_SYSTOP 0x800
int trapdebug = 0/*|TDB_STOPSIG|TDB_STOPCPIO|TDB_ADDFLT|TDB_FOLLOW*/;
int trapdebug = 0/*|TDB_SYSCALL|TDB_STOPSIG|TDB_STOPCPIO|TDB_ADDFLT|TDB_FOLLOW*/;
/* #define __inline */
#endif
@ -926,7 +926,7 @@ rwindow_save(p)
rwstack.rw_local[j] = (int)rw[i].rw_local[j];
rwstack.rw_in[j] = (int)rw[i].rw_in[j];
}
if (copyout(&rwstack, rwdest, sizeof(rwstack))) {
if (copyout(&rwstack, (caddr_t)rwdest, sizeof(rwstack))) {
#ifdef DEBUG
if (rwindow_debug&RW_ERR)
printf("rwindow_save: 32-bit pcb copyout to %p failed\n", rwdest);
@ -1772,7 +1772,7 @@ syscall(code, tf, pc)
union args {
register32_t i[8];
register64_t l[8];
} args;
} args, *argsp = &args;
register_t rval[2];
u_quad_t sticks;
#ifdef DIAGNOSTIC
@ -1865,7 +1865,8 @@ syscall(code, tf, pc)
callp += p->p_emul->e_nosys;
else if (tf->tf_out[6] & 1L) {
register64_t *argp;
#ifndef __LP64
argsp = p->p_vmspace->vm_map.pmap->syscallargs;
#ifndef _LP64
#ifdef DEBUG
printf("syscall(): 64-bit stack on a 32-bit kernel????\n");
Debugger();
@ -1893,24 +1894,24 @@ syscall(code, tf, pc)
(caddr_t)&temp, (i - nap) * sizeof(register64_t));
/* Copy each to the argument array */
for (j=0; nap+j < i; j++)
args.l[nap+j] = temp[j];
argsp->l[nap+j] = temp[j];
if (error) {
#ifdef KTRACE
if (KTRPOINT(p, KTR_SYSCALL))
ktrsyscall(p->p_tracep, code,
callp->sy_argsize, (register_t*)args.i);
callp->sy_argsize, (register_t*)argsp->i);
#endif
goto bad;
}
i = nap;
}
/* Need to convert from int64 to int32 or we lose */
for (argp = &args.l[0]; i--;)
for (argp = &argsp->l[0]; i--;)
*argp++ = *ap++;
#ifdef DEBUG
if (trapdebug&(TDB_SYSCALL|TDB_FOLLOW)) {
for (i=0; i < (long)callp->sy_argsize / sizeof(register64_t); i++)
printf("arg[%d]=%x ", i, (long)(args.l[i]));
printf("arg[%d]=%x ", i, (long)(argsp->l[i]));
printf("\n");
}
if (trapdebug&(TDB_STOPCALL|TDB_SYSTOP)) {
@ -1942,33 +1943,33 @@ syscall(code, tf, pc)
(caddr_t)&temp, (i - nap) * sizeof(register32_t));
/* Copy each to the argument array */
for (j=0; nap+j < i; j++)
args.i[nap+j] = temp[j];
argsp->i[nap+j] = temp[j];
#ifdef DEBUG
if (trapdebug&(TDB_SYSCALL|TDB_FOLLOW)) {
int k;
printf("Copyin args of %d from %p:\n", j,
(caddr_t)(tf->tf_out[6] + offsetof(struct frame32, fr_argx)));
for (k=0; k<j; k++)
printf("arg %d = %p at %d val %p\n", k, (long)temp[k], nap+k, (long)args.i[nap+k]);
printf("arg %d = %p at %d val %p\n", k, (long)temp[k], nap+k, (long)argsp->i[nap+k]);
}
#endif
if (error) {
#ifdef KTRACE
if (KTRPOINT(p, KTR_SYSCALL))
ktrsyscall(p->p_tracep, code,
callp->sy_argsize, (register_t *)args.i);
callp->sy_argsize, (register_t *)argsp->i);
#endif
goto bad;
}
i = nap;
}
/* Need to convert from int64 to int32 or we lose */
for (argp = &args.i[0]; i--;)
for (argp = &argsp->i[0]; i--;)
*argp++ = *ap++;
#ifdef DEBUG
if (trapdebug&(TDB_SYSCALL|TDB_FOLLOW)) {
for (i=0; i < (long)callp->sy_argsize / sizeof(register32_t); i++)
printf("arg[%d]=%x ", i, (int)(args.i[i]));
printf("arg[%d]=%x ", i, (int)(argsp->i[i]));
printf("\n");
}
if (trapdebug&(TDB_STOPCALL|TDB_SYSTOP)) {
@ -1979,11 +1980,11 @@ syscall(code, tf, pc)
}
#ifdef KTRACE
if (KTRPOINT(p, KTR_SYSCALL))
ktrsyscall(p->p_tracep, code, callp->sy_argsize, (register_t *)args.i);
ktrsyscall(p->p_tracep, code, callp->sy_argsize, (register_t *)argsp->i);
#endif
rval[0] = 0;
rval[1] = tf->tf_out[1];
error = (*callp->sy_call)(p, &args, rval);
error = (*callp->sy_call)(p, argsp, rval);
switch (error) {
case 0: