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:
parent
66dd35d72c
commit
49af63b22b
|
@ -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 \
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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 */
|
||||
};
|
||||
|
||||
/*
|
||||
|
|
|
@ -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_ */
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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++) {
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
|
|
|
@ -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:
|
||||
|
|
Loading…
Reference in New Issue