fbsd-amd64-20050212
authorHarald Barth <haba@pdc.kth.se>
Sun, 13 Feb 2005 00:23:52 +0000 (00:23 +0000)
committerDerrick Brashear <shadow@dementia.org>
Sun, 13 Feb 2005 00:23:52 +0000 (00:23 +0000)
initial fbsd support for amd64

src/config/afs_sysnames.h
src/config/param.amd64_fbsd_53.h [new file with mode: 0644]
src/lwp/Makefile.in
src/lwp/process.amd64.s [new file with mode: 0644]
src/sys/Makefile.in

index ecd2463..bfd8e45 100644 (file)
 #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 (file)
index 0000000..79f229d
--- /dev/null
@@ -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 <sys/param.h>
+#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 <afs/afs_sysnames.h>
+
+#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 <afs/afs_sysnames.h>
+#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 <limits.h>
+#include <sys/param.h>
+#include <sys/types.h>
+#include <sys/mount.h>
+#include <sys/fcntl.h>
+#include <netinet/in.h>
+#include <sys/uio.h>
+#include <sys/socket.h>
+
+#endif /* !defined(UKERNEL) */
+
+#endif /* AFS_PARAM_H */
index c88ab6e..8345e01 100644 (file)
@@ -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 (file)
index 0000000..75afda2
--- /dev/null
@@ -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 <haba@stacken.kth.se> 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 <machine/asm.h>
+#endif
+
+#include <lwp_elf.h>
+       
+       .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)
+
index 497e413..456a0fb 100644 (file)
@@ -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; \