fbsd-amd64-20050212

initial fbsd support for amd64
This commit is contained in:
Harald Barth 2005-02-13 00:23:52 +00:00 committed by Derrick Brashear
parent c92132eba3
commit d164b1d311
5 changed files with 371 additions and 1 deletions

View File

@ -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)

View File

@ -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 */

View 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; \

161
src/lwp/process.amd64.s Normal file
View File

@ -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)

View 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; \