Author: ed
Date: Thu Oct 22 09:07:53 2015
New Revision: 289747
URL: https://svnweb.freebsd.org/changeset/base/289747

Log:
  Refactoring: move out generic bits from cloudabi64_sysvec.c.
  
  In order to make it easier to support CloudABI on ARM64, move out all of
  the bits from the AMD64 cloudabi_sysvec.c into a new file
  cloudabi_module.c that would otherwise remain identical. This reduces
  the AMD64 specific code to just ~160 lines.
  
  Reviewed by:  kib
  Differential Revision:        https://reviews.freebsd.org/D3974

Added:
  head/sys/compat/cloudabi64/cloudabi64_module.c
     - copied, changed from r289745, 
head/sys/amd64/cloudabi64/cloudabi64_sysvec.c
Modified:
  head/sys/amd64/cloudabi64/cloudabi64_sysvec.c
  head/sys/compat/cloudabi64/cloudabi64_util.h
  head/sys/conf/files
  head/sys/modules/cloudabi64/Makefile

Modified: head/sys/amd64/cloudabi64/cloudabi64_sysvec.c
==============================================================================
--- head/sys/amd64/cloudabi64/cloudabi64_sysvec.c       Thu Oct 22 08:37:11 
2015        (r289746)
+++ head/sys/amd64/cloudabi64/cloudabi64_sysvec.c       Thu Oct 22 09:07:53 
2015        (r289747)
@@ -27,107 +27,26 @@
 __FBSDID("$FreeBSD$");
 
 #include <sys/param.h>
-#include <sys/exec.h>
-#include <sys/imgact.h>
-#include <sys/imgact_elf.h>
 #include <sys/kernel.h>
-#include <sys/module.h>
 #include <sys/proc.h>
-#include <sys/smp.h>
-#include <sys/sysctl.h>
 #include <sys/sysent.h>
-#include <sys/systm.h>
 
-#include <vm/pmap.h>
 #include <vm/vm.h>
+#include <vm/pmap.h>
 
 #include <machine/frame.h>
 #include <machine/pcb.h>
 #include <machine/pmap.h>
-#include <machine/psl.h>
 #include <machine/vmparam.h>
 
 #include <compat/cloudabi/cloudabi_util.h>
 
 #include <compat/cloudabi64/cloudabi64_syscall.h>
-#include <compat/cloudabi64/cloudabi64_syscalldefs.h>
 #include <compat/cloudabi64/cloudabi64_util.h>
 
 extern const char *cloudabi64_syscallnames[];
 extern struct sysent cloudabi64_sysent[];
 
-static register_t *
-cloudabi64_copyout_strings(struct image_params *imgp)
-{
-       uintptr_t begin;
-       size_t len;
-
-       /* Copy out program arguments. */
-       len = imgp->args->begin_envv - imgp->args->begin_argv;
-       begin = rounddown2(USRSTACK - len, sizeof(register_t));
-       copyout(imgp->args->begin_argv, (void *)begin, len);
-       return ((register_t *)begin);
-}
-
-static int
-cloudabi64_fixup(register_t **stack_base, struct image_params *imgp)
-{
-       char canarybuf[64];
-       Elf64_Auxargs *args;
-       struct thread *td;
-       void *argdata, *canary;
-       size_t argdatalen;
-       int error;
-
-       /*
-        * CloudABI executables do not store the FreeBSD OS release
-        * number in their header. Set the OS release number to the
-        * latest version of FreeBSD, so that system calls behave as if
-        * called natively.
-        */
-       td = curthread;
-       td->td_proc->p_osrel = __FreeBSD_version;
-
-       /* Store canary for stack smashing protection. */
-       argdata = *stack_base;
-       arc4rand(canarybuf, sizeof(canarybuf), 0);
-       *stack_base -= howmany(sizeof(canarybuf), sizeof(register_t));
-       canary = *stack_base;
-       error = copyout(canarybuf, canary, sizeof(canarybuf));
-       if (error != 0)
-               return (error);
-
-       /*
-        * Compute length of program arguments. As the argument data is
-        * binary safe, we had to add a trailing null byte in
-        * exec_copyin_data_fds(). Undo this by reducing the length.
-        */
-       args = (Elf64_Auxargs *)imgp->auxargs;
-       argdatalen = imgp->args->begin_envv - imgp->args->begin_argv;
-       if (argdatalen > 0)
-               --argdatalen;
-
-       /* Write out an auxiliary vector. */
-       cloudabi64_auxv_t auxv[] = {
-#define        VAL(type, val)  { .a_type = (type), .a_val = (val) }
-#define        PTR(type, ptr)  { .a_type = (type), .a_ptr = (uintptr_t)(ptr) }
-               PTR(CLOUDABI_AT_ARGDATA, argdata),
-               VAL(CLOUDABI_AT_ARGDATALEN, argdatalen),
-               PTR(CLOUDABI_AT_CANARY, canary),
-               VAL(CLOUDABI_AT_CANARYLEN, sizeof(canarybuf)),
-               VAL(CLOUDABI_AT_NCPUS, mp_ncpus),
-               VAL(CLOUDABI_AT_PAGESZ, args->pagesz),
-               PTR(CLOUDABI_AT_PHDR, args->phdr),
-               VAL(CLOUDABI_AT_PHNUM, args->phnum),
-               VAL(CLOUDABI_AT_TID, td->td_tid),
-#undef VAL
-#undef PTR
-               { .a_type = CLOUDABI_AT_NULL },
-       };
-       *stack_base -= howmany(sizeof(auxv), sizeof(register_t));
-       return (copyout(auxv, *stack_base, sizeof(auxv)));
-}
-
 static int
 cloudabi64_fetch_syscall_args(struct thread *td, struct syscall_args *sa)
 {
@@ -234,43 +153,9 @@ static struct sysentvec cloudabi64_elf_s
 
 INIT_SYSENTVEC(elf_sysvec, &cloudabi64_elf_sysvec);
 
-static Elf64_Brandinfo cloudabi64_brand = {
+Elf64_Brandinfo cloudabi64_brand = {
        .brand          = ELFOSABI_CLOUDABI,
        .machine        = EM_X86_64,
        .sysvec         = &cloudabi64_elf_sysvec,
        .compat_3_brand = "CloudABI",
 };
-
-static int
-cloudabi64_modevent(module_t mod, int type, void *data)
-{
-
-       switch (type) {
-       case MOD_LOAD:
-               if (elf64_insert_brand_entry(&cloudabi64_brand) < 0) {
-                       printf("Failed to add CloudABI ELF brand handler\n");
-                       return (EINVAL);
-               }
-               return (0);
-       case MOD_UNLOAD:
-               if (elf64_brand_inuse(&cloudabi64_brand))
-                       return (EBUSY);
-               if (elf64_remove_brand_entry(&cloudabi64_brand) < 0) {
-                       printf("Failed to remove CloudABI ELF brand handler\n");
-                       return (EINVAL);
-               }
-               return (0);
-       default:
-               return (EOPNOTSUPP);
-       }
-}
-
-static moduledata_t cloudabi64_module = {
-       "cloudabi64",
-       cloudabi64_modevent,
-       NULL
-};
-
-DECLARE_MODULE_TIED(cloudabi64, cloudabi64_module, SI_SUB_EXEC, SI_ORDER_ANY);
-MODULE_DEPEND(cloudabi64, cloudabi, 1, 1, 1);
-FEATURE(cloudabi64, "CloudABI 64bit support");

Copied and modified: head/sys/compat/cloudabi64/cloudabi64_module.c (from 
r289745, head/sys/amd64/cloudabi64/cloudabi64_sysvec.c)
==============================================================================
--- head/sys/amd64/cloudabi64/cloudabi64_sysvec.c       Thu Oct 22 08:08:06 
2015        (r289745, copy source)
+++ head/sys/compat/cloudabi64/cloudabi64_module.c      Thu Oct 22 09:07:53 
2015        (r289747)
@@ -27,9 +27,7 @@
 __FBSDID("$FreeBSD$");
 
 #include <sys/param.h>
-#include <sys/exec.h>
 #include <sys/imgact.h>
-#include <sys/imgact_elf.h>
 #include <sys/kernel.h>
 #include <sys/module.h>
 #include <sys/proc.h>
@@ -38,38 +36,25 @@ __FBSDID("$FreeBSD$");
 #include <sys/sysent.h>
 #include <sys/systm.h>
 
-#include <vm/pmap.h>
-#include <vm/vm.h>
-
-#include <machine/frame.h>
-#include <machine/pcb.h>
-#include <machine/pmap.h>
-#include <machine/psl.h>
-#include <machine/vmparam.h>
-
-#include <compat/cloudabi/cloudabi_util.h>
-
-#include <compat/cloudabi64/cloudabi64_syscall.h>
 #include <compat/cloudabi64/cloudabi64_syscalldefs.h>
 #include <compat/cloudabi64/cloudabi64_util.h>
 
-extern const char *cloudabi64_syscallnames[];
-extern struct sysent cloudabi64_sysent[];
-
-static register_t *
+register_t *
 cloudabi64_copyout_strings(struct image_params *imgp)
 {
+       struct image_args *args;
        uintptr_t begin;
        size_t len;
 
        /* Copy out program arguments. */
-       len = imgp->args->begin_envv - imgp->args->begin_argv;
-       begin = rounddown2(USRSTACK - len, sizeof(register_t));
-       copyout(imgp->args->begin_argv, (void *)begin, len);
+       args = imgp->args;
+       len = args->begin_envv - args->begin_argv;
+       begin = rounddown2(imgp->sysent->sv_usrstack - len, sizeof(register_t));
+       copyout(args->begin_argv, (void *)begin, len);
        return ((register_t *)begin);
 }
 
-static int
+int
 cloudabi64_fixup(register_t **stack_base, struct image_params *imgp)
 {
        char canarybuf[64];
@@ -129,119 +114,6 @@ cloudabi64_fixup(register_t **stack_base
 }
 
 static int
-cloudabi64_fetch_syscall_args(struct thread *td, struct syscall_args *sa)
-{
-       struct trapframe *frame = td->td_frame;
-
-       /* Obtain system call number. */
-       sa->code = frame->tf_rax;
-       if (sa->code >= CLOUDABI64_SYS_MAXSYSCALL)
-               return (ENOSYS);
-       sa->callp = &cloudabi64_sysent[sa->code];
-
-       /* Fetch system call arguments. */
-       sa->args[0] = frame->tf_rdi;
-       sa->args[1] = frame->tf_rsi;
-       sa->args[2] = frame->tf_rdx;
-       sa->args[3] = frame->tf_rcx; /* Actually %r10. */
-       sa->args[4] = frame->tf_r8;
-       sa->args[5] = frame->tf_r9;
-
-       /* Default system call return values. */
-       td->td_retval[0] = 0;
-       td->td_retval[1] = frame->tf_rdx;
-       return (0);
-}
-
-static void
-cloudabi64_set_syscall_retval(struct thread *td, int error)
-{
-       struct trapframe *frame = td->td_frame;
-
-       switch (error) {
-       case 0:
-               /* System call succeeded. */
-               frame->tf_rax = td->td_retval[0];
-               frame->tf_rdx = td->td_retval[1];
-               frame->tf_rflags &= ~PSL_C;
-               break;
-       case ERESTART:
-               /* Restart system call. */
-               frame->tf_rip -= frame->tf_err;
-               frame->tf_r10 = frame->tf_rcx;
-               set_pcb_flags(td->td_pcb, PCB_FULL_IRET);
-               break;
-       case EJUSTRETURN:
-               break;
-       default:
-               /* System call returned an error. */
-               frame->tf_rax = cloudabi_convert_errno(error);
-               frame->tf_rflags |= PSL_C;
-               break;
-       }
-}
-
-static void
-cloudabi64_schedtail(struct thread *td)
-{
-       struct trapframe *frame = td->td_frame;
-
-       /* Initial register values for processes returning from fork. */
-       frame->tf_rax = CLOUDABI_PROCESS_CHILD;
-       frame->tf_rdx = td->td_tid;
-}
-
-void
-cloudabi64_thread_setregs(struct thread *td,
-    const cloudabi64_threadattr_t *attr)
-{
-       struct trapframe *frame;
-       stack_t stack;
-
-       /* Perform standard register initialization. */
-       stack.ss_sp = (void *)attr->stack;
-       stack.ss_size = attr->stack_size;
-       cpu_set_upcall_kse(td, (void *)attr->entry_point, NULL, &stack);
-
-       /*
-        * Pass in the thread ID of the new thread and the argument
-        * pointer provided by the parent thread in as arguments to the
-        * entry point.
-        */
-       frame = td->td_frame;
-       frame->tf_rdi = td->td_tid;
-       frame->tf_rsi = attr->argument;
-}
-
-static struct sysentvec cloudabi64_elf_sysvec = {
-       .sv_size                = CLOUDABI64_SYS_MAXSYSCALL,
-       .sv_table               = cloudabi64_sysent,
-       .sv_fixup               = cloudabi64_fixup,
-       .sv_name                = "CloudABI ELF64",
-       .sv_coredump            = elf64_coredump,
-       .sv_pagesize            = PAGE_SIZE,
-       .sv_minuser             = VM_MIN_ADDRESS,
-       .sv_maxuser             = VM_MAXUSER_ADDRESS,
-       .sv_usrstack            = USRSTACK,
-       .sv_stackprot           = VM_PROT_READ | VM_PROT_WRITE,
-       .sv_copyout_strings     = cloudabi64_copyout_strings,
-       .sv_flags               = SV_ABI_CLOUDABI | SV_CAPSICUM,
-       .sv_set_syscall_retval  = cloudabi64_set_syscall_retval,
-       .sv_fetch_syscall_args  = cloudabi64_fetch_syscall_args,
-       .sv_syscallnames        = cloudabi64_syscallnames,
-       .sv_schedtail           = cloudabi64_schedtail,
-};
-
-INIT_SYSENTVEC(elf_sysvec, &cloudabi64_elf_sysvec);
-
-static Elf64_Brandinfo cloudabi64_brand = {
-       .brand          = ELFOSABI_CLOUDABI,
-       .machine        = EM_X86_64,
-       .sysvec         = &cloudabi64_elf_sysvec,
-       .compat_3_brand = "CloudABI",
-};
-
-static int
 cloudabi64_modevent(module_t mod, int type, void *data)
 {
 

Modified: head/sys/compat/cloudabi64/cloudabi64_util.h
==============================================================================
--- head/sys/compat/cloudabi64/cloudabi64_util.h        Thu Oct 22 08:37:11 
2015        (r289746)
+++ head/sys/compat/cloudabi64/cloudabi64_util.h        Thu Oct 22 09:07:53 
2015        (r289747)
@@ -28,10 +28,20 @@
 #ifndef _CLOUDABI64_UTIL_H_
 #define        _CLOUDABI64_UTIL_H_
 
+#include <sys/types.h>
+#include <sys/imgact_elf.h>
+
 #include <compat/cloudabi64/cloudabi64_syscalldefs.h>
 
+struct image_params;
 struct thread;
 
+extern Elf64_Brandinfo cloudabi64_brand;
+
+/* Stack initialization during process execution. */
+register_t *cloudabi64_copyout_strings(struct image_params *);
+int    cloudabi64_fixup(register_t **, struct image_params *);
+
 void   cloudabi64_thread_setregs(struct thread *,
     const cloudabi64_threadattr_t *);
 

Modified: head/sys/conf/files
==============================================================================
--- head/sys/conf/files Thu Oct 22 08:37:11 2015        (r289746)
+++ head/sys/conf/files Thu Oct 22 09:07:53 2015        (r289747)
@@ -266,6 +266,7 @@ compat/cloudabi/cloudabi_random.c   option
 compat/cloudabi/cloudabi_sock.c                optional compat_cloudabi64
 compat/cloudabi/cloudabi_thread.c      optional compat_cloudabi64
 compat/cloudabi64/cloudabi64_fd.c      optional compat_cloudabi64
+compat/cloudabi64/cloudabi64_module.c  optional compat_cloudabi64
 compat/cloudabi64/cloudabi64_poll.c    optional compat_cloudabi64
 compat/cloudabi64/cloudabi64_sock.c    optional compat_cloudabi64
 compat/cloudabi64/cloudabi64_syscalls.c        optional compat_cloudabi64

Modified: head/sys/modules/cloudabi64/Makefile
==============================================================================
--- head/sys/modules/cloudabi64/Makefile        Thu Oct 22 08:37:11 2015        
(r289746)
+++ head/sys/modules/cloudabi64/Makefile        Thu Oct 22 09:07:53 2015        
(r289747)
@@ -4,8 +4,8 @@
 .PATH: ${.CURDIR}/../../${MACHINE}/cloudabi64
 
 KMOD=  cloudabi64
-SRCS=  cloudabi64_fd.c cloudabi64_poll.c cloudabi64_sock.c \
-       cloudabi64_syscalls.c cloudabi64_sysent.c cloudabi64_sysvec.c \
-       cloudabi64_thread.c
+SRCS=  cloudabi64_fd.c cloudabi64_module.c cloudabi64_poll.c \
+       cloudabi64_sock.c cloudabi64_syscalls.c cloudabi64_sysent.c \
+       cloudabi64_sysvec.c cloudabi64_thread.c
 
 .include <bsd.kmod.mk>
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to