diff --git a/src/config/afs_sysnames.h b/src/config/afs_sysnames.h index ecd2463ec0..bfd8e4515e 100644 --- a/src/config/afs_sysnames.h +++ b/src/config/afs_sysnames.h @@ -222,6 +222,8 @@ #define SYS_NAME_ID_ppc64_linux24 2902 #define SYS_NAME_ID_ppc64_linux26 2903 +#define SYS_NAME_ID_amd64_fbsd_53 3008 + /* * Placeholder to keep system-wide standard flags since this file is included by all * files (i.e in afs/param.h) diff --git a/src/config/param.amd64_fbsd_53.h b/src/config/param.amd64_fbsd_53.h new file mode 100644 index 0000000000..79f229d70d --- /dev/null +++ b/src/config/param.amd64_fbsd_53.h @@ -0,0 +1,202 @@ +#ifndef AFS_PARAM_H +#define AFS_PARAM_H + +#ifndef UKERNEL +/* This section for kernel libafs compiles only */ + +#ifndef IGNORE_STDS_H +#include +#endif + +#define AFS_XBSD_ENV 1 /* {Free,Open,Net}BSD */ +#define AFS_X86_XBSD_ENV 1 + +#define AFS_NAMEI_ENV 1 /* User space interface to file system */ +#define AFS_64BIT_ENV 1 +#define AFS_64BIT_CLIENT 1 +#define AFS_64BIT_IOPS_ENV 1 /* Needed for NAMEI */ +#define AFS_FBSD_ENV 1 +#define AFS_FBSD40_ENV 1 +#define AFS_FBSD42_ENV 1 +#define AFS_FBSD43_ENV 1 +#define AFS_FBSD44_ENV 1 +#define AFS_FBSD45_ENV 1 +#define AFS_FBSD46_ENV 1 +#define AFS_FBSD47_ENV 1 +#define AFS_FBSD50_ENV 1 +#define AFS_FBSD51_ENV 1 +#define AFS_FBSD52_ENV 1 +#define AFS_FBSD53_ENV 1 +#define AFS_X86_FBSD_ENV 1 +#define AFS_X86_FBSD40_ENV 1 +#define AFS_X86_FBSD42_ENV 1 +#define AFS_X86_FBSD43_ENV 1 +#define AFS_X86_FBSD46_ENV 1 +#define AFS_X86_FBSD47_ENV 1 +#define AFS_X86_FBSD50_ENV 1 +#define AFS_X86_ENV 1 +#define AFS_NONFSTRANS 1 +#define FTRUNC O_TRUNC + +#define IUPD 0x0010 +#define IACC 0x0020 +#define ICHG 0x0040 +#define IMOD 0x0080 + +#define IN_LOCK(ip) lockmgr(&ip->i_lock, LK_EXCLUSIVE, \ + NULL, curproc) +#define IN_UNLOCK(ip) lockmgr(&ip->i_lock, LK_RELEASE, \ + NULL, curproc) + +#include + +#define AFS_VM_RDWR_ENV 1 +#define AFS_VFS_ENV 1 +#define AFS_VFSINCL_ENV 1 +#define AFS_GREEDY43_ENV 1 +#define AFS_ENV 1 + +#define AFS_SYSCALL 339 +#define AFS_MOUNT_AFS "afs" + +#ifndef MOUNT_UFS +#define MOUNT_UFS "ufs" +#endif + +#ifndef MOUNT_AFS +#define MOUNT_AFS AFS_MOUNT_AFS +#endif +#define SYS_NAME "amd64_fbsd_53" +#define SYS_NAME_ID SYS_NAME_ID_amd64_fbsd_53 + +#define AFS_HAVE_FFS 1 /* Use system's ffs. */ +#define AFS_HAVE_STATVFS 0 /* System doesn't supports statvfs */ + +#define RXK_LISTENER_ENV 1 +#define AFS_GCPAGS 0 /* if nonzero, garbage collect PAGs */ +#define AFS_USE_GETTIMEOFDAY 1 /* use gettimeofday to implement rx clock */ + +#define AFSLITTLE_ENDIAN 1 + +/* Extra kernel definitions (from kdefs file) */ +#ifdef _KERNEL +#define AFS_GLOBAL_SUNLOCK 1 +#define AFS_VFS34 1 /* What is VFS34??? */ +#define AFS_SHORTGID 0 /* are group id's short? */ +#define afsio_iov uio_iov +#define afsio_iovcnt uio_iovcnt +#define afsio_offset uio_offset +#define afsio_seg uio_segflg +#define afsio_resid uio_resid +#define AFS_UIOSYS UIO_SYSSPACE +#define AFS_UIOUSER UIO_USERSPACE +#define AFS_CLBYTES CLBYTES +#define osi_GetTime(x) microtime(x) +#define AFS_KALLOC(x) osi_fbsd_alloc((x), 1) +#undef AFS_KALLOC_NOSLEEP +#define AFS_KALLOC_NOSLEEP(x) osi_fbsd_alloc((x), 0) +#define AFS_KFREE(x,y) osi_fbsd_free((x)) +#define v_count v_usecount +#define v_vfsp v_mount +#define vfs_bsize mnt_stat.f_bsize +#define vfs_fsid mnt_stat.f_fsid +#define va_nodeid va_fileid +#define vfs_vnodecovered mnt_vnodecovered +#define direct dirent +#define vnode_t struct vnode + +#ifndef MUTEX_DEFAULT +#define MUTEX_DEFAULT 0 +#endif /* MUTEX_DEFAULT */ + +#ifndef SSYS +#define SSYS 0x00002 +#endif /* SSYS */ + +#define p_rcred p_ucred + +#if !defined(ASSEMBLER) && !defined(__LANGUAGE_ASSEMBLY__) +enum vcexcl { NONEXCL, EXCL }; + +#ifdef KERNEL +#ifndef MIN +#define MIN(A,B) ((A) < (B) ? (A) : (B)) +#endif +#ifndef MAX +#define MAX(A,B) ((A) > (B) ? (A) : (B)) +#endif +#endif /* KERNEL */ + +#endif /* ! ASSEMBLER & ! __LANGUAGE_ASSEMBLY__ */ +#endif /* _KERNEL */ + +#else /* !defined(UKERNEL) */ + +/* This section for user space compiles only */ + +#define UKERNEL 1 /* user space kernel */ +#define AFS_ENV 1 +#define AFS_VFSINCL_ENV 1 +#define AFS_USR_FBSD40_ENV 1 +#define AFS_USR_FBSD42_ENV 1 +#define AFS_USR_FBSD43_ENV 1 +#define AFS_USR_FBSD44_ENV 1 +#define AFS_USR_FBSD45_ENV 1 +#define AFS_USR_FBSD46_ENV 1 +#define AFS_USR_FBSD47_ENV 1 +#define AFS_USR_FBSD50_ENV 1 +#define AFS_USR_FBSD51_ENV 1 +#define AFS_USR_FBSD52_ENV 1 +#define AFS_USR_FBSD53_ENV 1 +#define AFS_USR_FBSD_ENV 1 +#define AFS_NONFSTRANS 1 + +#define AFS_MOUNT_AFS "afs" /* The name of the filesystem type. */ +#define AFS_SYSCALL 339 +#define AFS_NAMEI_ENV 1 /* User space interface to file system */ +#define AFS_64BIT_ENV 1 +#define AFS_64BITPOINTER_ENV 1 +#define AFS_64BIT_IOPS_ENV 1 /* Needed for NAMEI */ +#define AFS_USERSPACE_IP_ADDR 1 +#define RXK_LISTENER_ENV 1 +#define AFS_GCPAGS 0 /* if nonzero, garbage collect PAGs */ + +/* Machine / Operating system information */ +#include +#define SYS_NAME "i386_fbsd_53" +#define SYS_NAME_ID SYS_NAME_ID_i386_fbsd_53 + +#define AFSLITTLE_ENDIAN 1 +#define AFS_HAVE_FFS 1 /* Use system's ffs. */ +#define AFS_HAVE_STATVFS 1 /* System doesn't support statvfs */ +#define AFS_VM_RDWR_ENV 1 /* read/write implemented via VM */ + +#define afsio_iov uio_iov +#define afsio_iovcnt uio_iovcnt +#define afsio_offset uio_offset +#define afsio_seg uio_segflg +#define afsio_fmode uio_fmode +#define afsio_resid uio_resid +#define AFS_UIOSYS 1 +#define AFS_UIOUSER UIO_USERSPACE +#define AFS_CLBYTES MCLBYTES +#define AFS_MINCHANGE 2 +#define VATTR_NULL usr_vattr_null + +#define AFS_DIRENT +#ifndef CMSERVERPREF +#define CMSERVERPREF +#endif + +#include +#include +#include +#include +#include +#include +#include +#include + +#endif /* !defined(UKERNEL) */ + +#endif /* AFS_PARAM_H */ diff --git a/src/lwp/Makefile.in b/src/lwp/Makefile.in index c88ab6e9f4..8345e01aac 100644 --- a/src/lwp/Makefile.in +++ b/src/lwp/Makefile.in @@ -59,6 +59,11 @@ process.o : process.s process.i386.s process.c ${CCOBJ} -DIGNORE_STDS_H -E -I${srcdir} -I${TOP_INCDIR} process.S > process.ss ; \ ${AS} process.ss -o process.o ; \ $(RM) -f process.S ;;\ + amd64_*bsd*) \ + cp ${srcdir}/process.amd64.s process.S ; \ + ${CCOBJ} -DIGNORE_STDS_H -E -I${srcdir} -I${TOP_INCDIR} process.S > process.ss ; \ + ${AS} process.ss -o process.o ; \ + $(RM) -f process.S ;;\ ncrx86_* | sunx86_*) \ /usr/ccs/lib/cpp -P -D__sun -D__i386 -DIGNORE_STDS_H -I${TOP_INCDIR} -I${srcdir} ${srcdir}/process.i386.s process.ss; \ ${AS} -o process.o process.ss; \ diff --git a/src/lwp/process.amd64.s b/src/lwp/process.amd64.s new file mode 100644 index 0000000000..75afda2733 --- /dev/null +++ b/src/lwp/process.amd64.s @@ -0,0 +1,161 @@ +/* $Id$ */ + +/* + * Copyright (c) 2003,2005 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#undef RCSID + +/* x86_64 Assembly + * + * By Harald Barth after looking + * at Derek Atkins' i386 routines and realizing that + * there were some differences and it was not enough + * just renaming the registers. + */ + +#ifdef HAVE_MACHINE_ASM_H +#include +#endif + +#include + + .file "process.s" + .data + .text + +/* + * struct savearea { + * char *topstack; + * } + */ + + .set topstack,0 + +/* + * savecontext(int (*f)(), struct savearea *area1, char *newsp) + */ + +/* + * In spite of passing arguments in registers, gcc first copies the content of the + * registers onto the stack. I do not know why gcc does this, but for now I mimic + * gcc's behaviour. Here are the offsets the arguments are copied to. + */ + .set f,-8 + .set area1,-16 + .set newsp,-24 + +.globl _C_LABEL(PRE_Block) +.globl _C_LABEL(savecontext) + +ENTRY(savecontext) + pushq %rbp /* The frame setup is just like gcc */ + movq %rsp,%rbp + subq $32, %rsp /* make room for args on the stack */ + movq %rdi, f(%rbp) /* (3*8=24 but increments seem to */ + movq %rsi, area1(%rbp) /* i multiples of 24, so 32 it is) */ + movq %rdx, newsp(%rbp) /* and copy them there. */ + + movl $1,_C_LABEL(PRE_Block) /* Do not allow any interrupts */ + + pushq %rsp /* Push all registers onto the stack */ + pushq %rax /* Probably not _all_ are necessary */ + pushq %rcx /* but better one too much than one */ + pushq %rdx /* forgotten */ + pushq %rbx + pushq %rbp + pushq %rsi + pushq %rdi + pushq %r8 + pushq %r9 + pushq %r10 + pushq %r11 + pushq %r12 + pushq %r13 + pushq %r14 + pushq %r15 /* Btw, the pusha instruction is no more */ + + movq area1(%rbp),%rax /* rax = base of savearea */ + movq %rsp,topstack(%rax) /* area->topstack = rsp */ + movq newsp(%rbp),%rax /* rax = new sp */ + cmpq $0,%rax + je L1 /* if new sp is 0 then dont change rsp */ + movq %rax,%rsp /* Change rsp to the new sp */ +L1: + jmp *f(%rbp) /* jump to function pointer passed in arg */ + +/* Shouldnt be here....*/ + call _C_LABEL(abort) + +/* + * returnto(struct savearea *area2) + */ + +/* Offset where we put arg - se savecontext */ + .set area2,-8 + +.globl _C_LABEL(returnto) + +ENTRY(returnto) + pushq %rbp /* New frame, gcc style */ + movq %rsp, %rbp /* See savecontext above */ + subq $16, %rsp /* Make room for 2 args */ + movq %rdi, area2(%rbp) /* use room to copy 1 arg */ + movq area2(%rbp),%rax /* rax = area2 */ + movq topstack(%rax),%rsp /* restore rsp from place relative rbp*/ + + popq %r15 /* Restore regs */ + popq %r14 + popq %r13 + popq %r12 + popq %r11 + popq %r10 + popq %r9 + popq %r8 + popq %rdi + popq %rsi + popq %rbp + popq %rbx + popq %rdx + popq %rcx + popq %rax + popq %rsp /* See savecontext */ + + movl $0,_C_LABEL(PRE_Block) /* clear it up... */ + addq $32, %rsp /* We did rsp-32 above, correct that */ + popq %rbp + ret + +/* We never should get here, put in emergency brake as in i386 code */ + pushq $1234 + call _C_LABEL(abort) + diff --git a/src/sys/Makefile.in b/src/sys/Makefile.in index 497e4133f9..456a0fb444 100644 --- a/src/sys/Makefile.in +++ b/src/sys/Makefile.in @@ -57,7 +57,7 @@ syscall.o: syscall.s $(RM) -f syscall.ss syscall.i;; \ hp_ux11? ) \ touch syscall.o;; \ - i386_*bsd*|*nbsd*) \ + amd64_fbsd*|i386_*bsd*|*nbsd*) \ touch syscall.o;; \ *) \ /lib/cpp ${SFLAGS} ${srcdir}/syscall.s syscall.ss; \